# app.py — V23 — QWEN2.5:0.5B + PROMPT DINÂMICO COM GÍRIAS + ABREVIÇÕES DO BANCO 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() # MODELO LEVE, BOM EM PORTUGUÊS, FINE-TUNEÁVEL 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) @app.route("/api/generate", methods=['POST']) def generate(): 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, completa in abrevs.items(): if abrev in mensagem.lower(): db.aprender_abreviacao(numero, abrev, completa) 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"]]) 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}) ### {hist_text and f"### Histórico ###\n{hist_text}\n\n"} ### Mensagem ### {mensagem} Akira:""" # === GERA COM QWEN2.5:0.5B === 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)