File size: 4,242 Bytes
df524b9 440898e 09ac632 f3b7acc 440898e 09ac632 440898e 09ac632 440898e c009ca0 09ac632 c009ca0 a96588e 440898e 4fed00b df524b9 64b6538 df524b9 440898e a96588e 440898e 4fed00b f3b7acc 09ac632 440898e 09ac632 f3b7acc 09ac632 df524b9 09ac632 df524b9 09ac632 df524b9 f3b7acc 09ac632 f3b7acc 6df2c32 09ac632 f3b7acc 09ac632 6df2c32 09ac632 f3b7acc df524b9 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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | # app.py — V23 FIX — ROTAS COMPLETAS (GET/POST + /health + /)
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()
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)
# === RAIZ (GET /) ===
@app.route("/", methods=['GET'])
def index():
return '''
<div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
<h1>AKIRA V23 OLLAMA SERVER</h1>
<p><strong>qwen2.5:0.5b-instruct-q4_0</strong></p>
<p><strong>POST /api/generate</strong></p>
<p>Health: <a href="/health">/health</a></p>
</div>
''', 200
# === HEALTH ===
@app.route("/health", methods=['GET'])
def health():
return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200
# === API PRINCIPAL ===
@app.route("/api/generate", methods=['POST', 'GET'])
def generate():
if request.method == 'GET':
return jsonify({'error': 'Use POST para gerar resposta'}), 405
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 in abrevs:
if abrev in mensagem.lower():
db.aprender_abreviacao(numero, abrev, abrevs[abrev])
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"]])
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 ===
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) |