File size: 3,655 Bytes
6df2c32
440898e
 
 
09ac632
f3b7acc
440898e
 
09ac632
440898e
 
 
09ac632
440898e
6df2c32
c009ca0
 
09ac632
c009ca0
 
 
 
a96588e
440898e
4fed00b
 
64b6538
 
440898e
a96588e
440898e
 
4fed00b
f3b7acc
09ac632
440898e
09ac632
f3b7acc
 
09ac632
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6df2c32
f3b7acc
09ac632
f3b7acc
6df2c32
 
 
 
 
09ac632
 
 
 
f3b7acc
09ac632
6df2c32
09ac632
 
f3b7acc
c009ca0
440898e
c009ca0
09ac632
440898e
c009ca0
 
 
 
 
 
440898e
 
4fed00b
f3b7acc
09ac632
 
c009ca0
09ac632
 
 
 
 
c009ca0
4fed00b
c009ca0
09ac632
a96588e
440898e
c009ca0
440898e
09ac632
c009ca0
 
 
 
09ac632
c009ca0
 
09ac632
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# app.py — V23 — QWEN2.5:0.5B + PROMPT DINÂMICO (SINTAXE CORRIGIDA)
import subprocess
import time
import requests
import json
import datetime
from flask import Flask, request, jsonify
from loguru import logger
from database import Database

app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434"
db = Database()

# MODELO LEVE, PORTUGUÊS, FINE-TUNEÁVEL
MODEL_NAME = "qwen2.5:0.5b-instruct-q4_0"

def check_ollama():
    try:
        return requests.get(f"{OLLAMA_URL}/api/tags", timeout=10).status_code == 200
    except:
        return False

def start_ollama():
    subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

@app.route("/api/generate", methods=['POST'])
def generate():
    if not check_ollama():
        return jsonify({'resposta': 'Epá, tô acordando... espera 10s!'}), 503

    data = request.get_json() or {}
    mensagem = data.get('mensagem', '').strip()
    usuario = data.get('usuario', 'anonimo')
    numero = data.get('numero', 'anonimo')

    if not mensagem:
        return jsonify({'error': 'mensagem obrigatória'}), 400

    # === PUXA DO BANCO ===
    ctx = db.carregar_contexto(numero)
    tom = db.detectar_tom(numero, mensagem)

    # Gírias do usuário
    girias = db.recuperar_girias_usuario(numero)
    if not girias:
        girias = ["epá", "kandando", "bué", "kota"]

    # Abreviações do usuário
    abrevs = db.recuperar_abreviacoes_usuario(numero)
    if not abrevs:
        abrevs = {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"}

    # Aprende novas
    for abrev, completa in abrevs.items():
        if abrev in mensagem.lower():
            db.aprender_abreviacao(numero, abrev, completa)
    for g in girias:
        if g in mensagem.lower():
            db.aprender_giria(numero, g)

    # === PROMPT DINÂMICO (CORRIGIDO) ===
    now = datetime.datetime.now().strftime('%d/%m %H:%M')
    hist_text = '\n'.join([f"Usuário: {h[0]}\nAkira: {h[1]}" for h in ctx["historico"]])

    # CORREÇÃO: Separar o f-string do \n
    historico_block = ""
    if hist_text:
        historico_block = f"### Histórico ###\n{hist_text}\n\n"

    prompt = f"""Você é Akira, angolana debochada.
Fala com gírias: {', '.join(girias)}
Abreviações: {', '.join(abrevs.keys())}
Tom: {tom}
Data/hora: {now}
### Usuário: {usuario} ({numero}) ###
{historico_block}### Mensagem ###
{mensagem}
Akira:"""

    # === GERA COM QWEN2.5:0.5B ===
    payload = {
        "model": MODEL_NAME,
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.9,
            "num_predict": 256,
            "top_k": 40,
            "top_p": 0.9
        }
    }

    try:
        resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
        resposta = resp.json().get("response", "").strip() or "Epá, kandando bué!"

        # SALVA NO BANCO
        db.salvar_mensagem(usuario, mensagem, resposta, numero)
        novo_hist = ctx["historico"] + [[mensagem, resposta]]
        db.salvar_contexto(numero, novo_hist, girias, tom)

        return jsonify({'resposta': resposta})

    except Exception as e:
        logger.error(f"Erro Ollama: {e}")
        return jsonify({'resposta': 'Epá, tô off... tenta de novo!'}), 500

if __name__ == "__main__":
    logger.info(f"AKIRA V23 — RODANDO COM {MODEL_NAME}")
    start_ollama()
    for i in range(60):
        if check_ollama():
            logger.info("Ollama pronto!")
            break
        logger.info("Aguardando Ollama...")
        time.sleep(2)
    else:
        logger.error("Ollama não respondeu após 2min!")
    app.run(host="0.0.0.0", port=7860)