|
|
|
|
|
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) |