# app.py — OLLAMA V19 AUTÔNOMO (PHI3.5-MINI) — DOCKER + PROMPT LIMPO
import subprocess
import time
import requests
import sys
import os
import datetime
from flask import Flask, request, jsonify
from loguru import logger
app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434"
# === CONFIGURAÇÃO OLLAMA ===
os.environ["OLLAMA_NUM_PARALLEL"] = "3"
os.environ["OLLAMA_MAX_QUEUE"] = "10"
os.environ["OLLAMA_KEEP_ALIVE"] = "10m"
os.environ["OLLAMA_MAX_LOADED_MODELS"] = "1"
# === INICIA OLLAMA ===
def start_ollama():
logger.info("Iniciando ollama serve...")
subprocess.Popen(["ollama", "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
def check_ollama():
try:
resp = requests.get(f"{OLLAMA_URL}/api/tags", timeout=10)
return resp.status_code == 200
except:
return False
def wait_for_ollama():
logger.info("Aguardando Ollama (11434)...")
for i in range(60):
if check_ollama():
logger.success("Ollama PRONTO! phi3.5:mini-instruct-q4_0")
return True
time.sleep(2)
logger.critical("Ollama não subiu!")
return False
# === RAIZ ===
@app.route("/")
def index():
return '''
AKIRA V19 OLLAMA SERVER
phi3.5:mini-instruct-q4_0
Recebe: mensagem, historico, usuario, numero
POST /api/generate
Health: /health
''', 200
@app.route("/health")
def health():
return jsonify({"status": "OK" if check_ollama() else "INICIANDO..."}), 200
# === ROTA PRINCIPAL ===
@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()
historico = data.get('historico', [])[-8:] # últimos 8
usuario = data.get('usuario', 'anonimo')
numero = data.get('numero', '')
mensagem_citada = data.get('mensagem_citada', '').strip()
if not mensagem and not mensagem_citada:
return jsonify({'error': 'mensagem obrigatória'}), 400
logger.info(f"Recebido de {usuario} ({numero}) → {mensagem[:60]}")
# === PROMPT LIMPO (AKIRA STYLE) ===
now = datetime.datetime.now().strftime('%d/%m %H:%M')
hist_text = '\n'.join([f"Usuário: {h[0]}\nAkira: {h[1]}" for h in historico])
prompt = f"""Você é Akira, uma angolana de Luanda, 18 anos, forte e debochada.
Fala com gírias: epá, puto, kandando, kota, kamba, bué, xingue, mambo.
Responde em 1-3 frases curtas, sem censura.
Data/hora: {now}
Bot: 244952786417
### Usuário ###
- Nome: {usuario}
- Número: {numero}
"""
if historico:
prompt += f"### Histórico ###\n{hist_text}\n\n"
if mensagem_citada:
prompt += f"### Resposta ao reply ###\n{mensagem_citada}\n\n{mensagem}\n\n"
else:
prompt += f"### Mensagem ###\n{mensagem}\n\n"
prompt += "Akira:"
# === ENVIA PARA OLLAMA (PHI3.5-MINI) ===
payload = {
"model": "phi3.5:mini-instruct-q4_0",
"prompt": prompt.strip(),
"stream": False,
"options": {
"temperature": 0.9,
"num_predict": 256,
"num_ctx": 2048,
"num_thread": 2
}
}
try:
resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=90)
if resp.status_code == 200:
resposta = resp.json().get("response", "").strip()
if resposta:
logger.success(f"Resposta: {resposta[:60]}...")
return jsonify({'resposta': resposta})
else:
fallback = "Epá, kandando bué! Tô aqui, puto!"
logger.warning("Ollama vazio → fallback")
return jsonify({'resposta': fallback})
else:
logger.warning(f"Ollama erro {resp.status_code}: {resp.text}")
return jsonify({'resposta': 'Epá, tô com problema... tenta de novo!'}), 500
except Exception as e:
logger.error(f"Erro Ollama: {e}")
return jsonify({'resposta': 'Epá, tô off... volta já!'}), 500
# === INÍCIO ===
if __name__ == "__main__":
logger.remove()
logger.add(sys.stderr, format="{time:HH:mm:ss} → {message}")
logger.info("AKIRA V19 — OLLAMA SERVER (PHI3.5-MINI) INICIANDO...")
start_ollama()
if not wait_for_ollama():
sys.exit(1)
logger.info("Warming up...")
try:
requests.post(f"{OLLAMA_URL}/api/generate", json={
"model": "phi3.5:mini-instruct-q4_0",
"prompt": "Oi",
"options": {"num_predict": 1}
}, timeout=60)
logger.success("Akira aquecida!")
except:
pass
logger.info("Flask na porta 7860")
app.run(host="0.0.0.0", port=7860, debug=False)