File size: 3,270 Bytes
a909106
 
dd95682
a909106
 
 
74afdb1
a909106
74afdb1
40bdbb6
8366339
7efd208
a909106
26bd17a
240f866
a909106
40bdbb6
8a4701f
a909106
 
74afdb1
a909106
74afdb1
 
 
 
a909106
 
 
74afdb1
a909106
 
 
 
 
 
74afdb1
 
a909106
 
74afdb1
a909106
 
6a5e9d6
74afdb1
 
 
6a5e9d6
a909106
 
 
 
74afdb1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a4701f
74afdb1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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 😈🔥")