| |
| 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) |
|
|
| @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 |
|
|
| |
| ctx = db.carregar_contexto(numero) |
| tom = db.detectar_tom(numero, mensagem) |
|
|
| |
| girias = db.recuperar_girias_usuario(numero) |
| if not girias: |
| girias = ["epá", "kandando", "bué", "kota"] |
|
|
| |
| abrevs = db.recuperar_abreviacoes_usuario(numero) |
| if not abrevs: |
| abrevs = {"p'ra": "para", "pq": "porque", "tfx": "tudo fixe"} |
|
|
| |
| 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) |
|
|
| |
| 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:""" |
|
|
| |
| 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é!" |
|
|
| |
| 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) |