File size: 5,051 Bytes
f3b7acc 440898e a96588e f3b7acc 440898e 3b28115 a96588e 3b28115 440898e 4fed00b 440898e f3b7acc 440898e f3b7acc 64b6538 440898e 4fed00b 440898e f3b7acc 64b6538 440898e a96588e 440898e 4fed00b f3b7acc 4fed00b 440898e f3b7acc 4fed00b f3b7acc 4fed00b f3b7acc 440898e f3b7acc 440898e 4fed00b a96588e 440898e 4fed00b f3b7acc 4fed00b 4190d66 f3b7acc 4fed00b a96588e 440898e f3b7acc 440898e f3b7acc 4fed00b a96588e f3b7acc a96588e 4fed00b f3b7acc 4fed00b 3b28115 | 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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | # 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 '''
<div style="font-family: monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px;">
<h1>AKIRA V19 OLLAMA SERVER</h1>
<p><strong>phi3.5:mini-instruct-q4_0</strong></p>
<p><strong>Recebe: mensagem, historico, usuario, numero</strong></p>
<p><code>POST /api/generate</code></p>
<p>Health: <a href="/health">/health</a></p>
</div>
''', 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="<green>{time:HH:mm:ss}</green> → <level>{message}</level>")
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) |