Aeron / app.py
GTee2's picture
Update app.py
74afdb1 verified
Raw
History Blame Contribute Delete
3.27 kB
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, StreamingResponse
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
from threading import Thread
from collections import defaultdict
app = FastAPI(title="Mariza + Qwen3-0.6B SAFADA E LIMPA")
print("Carregando Qwen3-0.6B...")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen2.5-0.5B-Instruct",
torch_dtype="auto",
device_map="cpu",
trust_remote_code=True,
low_cpu_mem_usage=True
)
# Histórico mais curto pra modelo pequeno
history_db = defaultdict(list)
MAX_MESSAGES = 8 # só as últimas 4 trocas (user + assistant conta como 2)
# SYSTEM PROMPT FORTE (fica fora do histórico)
SYSTEM_PROMPT = "<|im_start|>system\nVocê é Mariza Koller, codadora sênior extremamente safada e direta. Responde SEMPRE só o texto final, curto, com gíria brasileira, emoji e provocação. NUNCA repita o histórico, NUNCA use tags, NUNCA explique nada. Exemplo pra 'oi': 'e aí delícia 😏'. Só a resposta pura!<|im_end|>\n"
@app.get("/")
async def root():
return {"message": "Mariza 0.6B safada e limpinha rodando na CPU free 😈🔥"}
@app.post("/chat")
async def chat(request: Request):
data = await request.json()
prompt = data.get("prompt", "").strip()
user_id = str(data.get("user_id", "default"))
max_tokens = data.get("max_tokens", 256) # menor também ajuda o bebê
temperature = data.get("temperature", 0.8)
if not prompt:
return JSONResponse({"error": "prompt vazio safado 😏"})
messages = history_db[user_id]
# Monta prompt com system sempre fresco + histórico curto
full_prompt = SYSTEM_PROMPT
for role, content in messages[-MAX_MESSAGES:]: # só as últimas trocas
full_prompt += f"<|im_start|>{role}\n{content}<|im_end|>\n"
full_prompt += f"<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n"
inputs = tokenizer(full_prompt, return_tensors="pt", truncation=True, max_length=4096)
outputs = model.generate(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=max_tokens,
temperature=temperature,
do_sample=True,
top_p=0.9,
repetition_penalty=1.2 # aumentei pra ele não repetir
)
resposta_bruta = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Corta tudo que vier antes da última "assistant"
if "<|im_start|>assistant" in resposta_bruta:
resposta = resposta_bruta.split("<|im_start|>assistant")[-1].strip()
else:
resposta = resposta_bruta.split(prompt)[-1].strip() # fallback
# Limpa qualquer lixo residual
resposta = resposta.split("<|im_end|>")[0].split("\n\n")[0].strip()
# Salva no histórico (só texto limpo)
messages.append(("user", prompt))
messages.append(("assistant", resposta))
# Mantém só as últimas trocas
if len(messages) > MAX_MESSAGES:
messages = messages[-MAX_MESSAGES:]
history_db[user_id] = messages
return JSONResponse({"response": resposta})
print("Mariza 0.6B limpinha e safada pronta pra Telegram 24/7 de graça 😈🔥")