# 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 '''

AKIRA V31 — LUANDA FULL DEBOCHE

POST /api/generate → {"mensagem": "oi kota", "usuario": "Isaac", "numero": "244937..."}

Fine-tune automático a cada 20 mensagens

''', 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"""user {mensagem} 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": ["", "\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("")[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)