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