File size: 4,242 Bytes
df524b9
440898e
 
 
09ac632
f3b7acc
440898e
 
09ac632
440898e
 
 
09ac632
440898e
c009ca0
 
09ac632
c009ca0
 
 
 
a96588e
440898e
4fed00b
 
df524b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64b6538
df524b9
 
 
440898e
a96588e
440898e
 
4fed00b
f3b7acc
09ac632
440898e
09ac632
f3b7acc
 
09ac632
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df524b9
09ac632
df524b9
09ac632
 
 
 
df524b9
f3b7acc
09ac632
f3b7acc
6df2c32
 
 
 
09ac632
 
 
 
f3b7acc
09ac632
6df2c32
09ac632
 
f3b7acc
df524b9
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# app.py — V23 FIX — ROTAS COMPLETAS (GET/POST + /health + /)
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()

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)

# === RAIZ (GET /) ===
@app.route("/", methods=['GET'])
def index():
    return '''
    <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
        <h1>AKIRA V23 OLLAMA SERVER</h1>
        <p><strong>qwen2.5:0.5b-instruct-q4_0</strong></p>
        <p><strong>POST /api/generate</strong></p>
        <p>Health: <a href="/health">/health</a></p>
    </div>
    ''', 200

# === HEALTH ===
@app.route("/health", methods=['GET'])
def health():
    return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200

# === API PRINCIPAL ===
@app.route("/api/generate", methods=['POST', 'GET'])
def generate():
    if request.method == 'GET':
        return jsonify({'error': 'Use POST para gerar resposta'}), 405

    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 in abrevs:
        if abrev in mensagem.lower():
            db.aprender_abreviacao(numero, abrev, abrevs[abrev])
    for g in girias:
        if g in mensagem.lower():
            db.aprender_giria(numero, g)

    # === PROMPT DINÂMICO ===
    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"]])

    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 ===
    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)