File size: 3,655 Bytes
6df2c32 440898e 09ac632 f3b7acc 440898e 09ac632 440898e 09ac632 440898e 6df2c32 c009ca0 09ac632 c009ca0 a96588e 440898e 4fed00b 64b6538 440898e a96588e 440898e 4fed00b f3b7acc 09ac632 440898e 09ac632 f3b7acc 09ac632 6df2c32 f3b7acc 09ac632 f3b7acc 6df2c32 09ac632 f3b7acc 09ac632 6df2c32 09ac632 f3b7acc c009ca0 440898e c009ca0 09ac632 440898e c009ca0 440898e 4fed00b f3b7acc 09ac632 c009ca0 09ac632 c009ca0 4fed00b c009ca0 09ac632 a96588e 440898e c009ca0 440898e 09ac632 c009ca0 09ac632 c009ca0 09ac632 | 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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # app.py — V23 — QWEN2.5:0.5B + PROMPT DINÂMICO (SINTAXE CORRIGIDA)
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, 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 (CORRIGIDO) ===
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"]])
# CORREÇÃO: Separar o f-string do \n
historico_block = ""
if hist_text:
historico_block = f"### Histórico ###\n{hist_text}\n\n"
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}) ###
{historico_block}### 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) |