| |
| 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 = "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 ''' |
| <div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;"> |
| <h1>AKIRA V31 — LUANDA FULL DEBOCHE</h1> |
| <p>POST /api/generate → {"mensagem": "oi kota", "usuario": "Isaac", "numero": "244937..."}</p> |
| <p>Fine-tune automático a cada 20 mensagens</p> |
| </div> |
| ''', 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 = f"""<start_of_turn>user |
| {mensagem}<end_of_turn> |
| <start_of_turn>model |
| Epá {usuario}, """ |
|
|
| payload = { |
| "model": config.OLLAMA_MODEL, |
| "prompt": prompt, |
| "stream": False, |
| "options": { |
| "temperature": 0.9, |
| "num_predict": 180, |
| "top_p": 0.9, |
| "stop": ["<end_of_turn>", "\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() |
|
|
| |
| resposta = re.sub(r'[\*\_\`\[\]\(\)\<\>]', '', resposta_bruta) |
| resposta = resposta.split("<end_of_turn>")[0].split("\n")[0].strip() |
| resposta = resposta[:280] |
|
|
| if not resposta or len(resposta) < 6: |
| resposta = "Epá, tá mbora? kkkkk" |
|
|
| |
| 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) |