File size: 3,183 Bytes
5c8d8f1
4380c35
5c8d8f1
 
4380c35
440898e
 
5c8d8f1
 
 
440898e
 
4380c35
5c8d8f1
440898e
4380c35
5c8d8f1
 
 
 
2be1180
 
5c8d8f1
2be1180
5c8d8f1
a96588e
4380c35
5c8d8f1
 
 
 
 
 
 
 
 
 
 
 
01d7ba2
4380c35
01d7ba2
5c8d8f1
 
 
440898e
4380c35
2be1180
5c8d8f1
eefa006
09ac632
5c8d8f1
 
 
 
 
 
 
eefa006
5c8d8f1
 
 
 
 
 
 
 
 
 
 
 
eefa006
4fed00b
5c8d8f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eefa006
4380c35
eefa006
4fed00b
5c8d8f1
 
 
eefa006
440898e
5c8d8f1
2be1180
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
# app.py — AKIRA V31 — Gemma2:2b + Fine-tune automático (HF Space otimizado)
import re
import json
import datetime
import requests
from flask import Flask, request, jsonify
from loguru import logger
import config
from database import Database
from treinamento import Treinamento

app = Flask(__name__)

# Ollama URL (HF Space já tem Ollama instalado)
OLLAMA_URL = "http://localhost:11434"

db = Database("/app/akira.db")
treinamento = Treinamento(db, min_interactions=20, interval_hours=3)

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

@app.route("/")
def index():
    return '''
    <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
        <h1>AKIRA V31 — LUANDA FULL DEBOCHE</h1>
        <p>POST /api/generate → {"mensagem": "oi kota", "usuario": "Isaac", "numero": "244937..."}</p>
        <p>Fine-tune automático a cada 20 mensagens</p>
    </div>
    ''', 200

@app.route("/health")
def health():
    return jsonify({"status": "OK" if check_ollama() else "Ollama acordando..."}), 200

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

    data = request.get_json() or {}
    mensagem = data.get("mensagem", "").strip()
    usuario = data.get("usuario", "kota").split()[0]
    numero = data.get("numero", "244999999999")

    if not mensagem:
        return jsonify({"error": "manda a mensagem puto"}), 400

    # Prompt ULTRA FORÇADO (Gemma2:2b só obedece assim)
    prompt = f"""<start_of_turn>user
{mensagem}<end_of_turn>
<start_of_turn>model
Epá {usuario}, """

    payload = {
        "model": config.OLLAMA_MODEL,  # muda automaticamente quando fine-tune roda
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.9,
            "num_predict": 180,
            "top_p": 0.9,
            "stop": ["<end_of_turn>", "\n\n", "user:", "<|eot_id|>"],
            "num_ctx": 4096
        }
    }

    try:
        r = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
        r.raise_for_status()
        resposta_bruta = r.json().get("response", "").strip()

        # Limpeza pesada (nunca deixa escapar merda)
        resposta = re.sub(r'[\*\_\`\[\]\(\)\<\>]', '', resposta_bruta)
        resposta = resposta.split("<end_of_turn>")[0].split("\n")[0].strip()
        resposta = resposta[:280]

        if not resposta or len(resposta) < 6:
            resposta = "Epá, tá mbora? kkkkk"

        # Salva e treina
        db.salvar_mensagem(usuario, mensagem, resposta, numero)
        treinamento.registrar_interacao(usuario, mensagem, resposta, numero)

        return jsonify({"resposta": resposta})

    except Exception as e:
        logger.error(f"Ollama erro: {e}")
        return jsonify({"resposta": "Puto o servidor tá na merda agora, tenta já já."}), 500


if __name__ == "__main__":
    logger.info("AKIRA V31 — INICIANDO")
    app.run(host="0.0.0.0", port=7860)