OLLAMA / app.py
akra35567's picture
Update app.py
5c8d8f1 verified
# 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)