File size: 4,342 Bytes
440898e 711f580 440898e 4190d66 440898e 4190d66 440898e | 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 | # app.py
"""
AKIRA V16 — OLLAMA + FLASK (HF SPACE + DOCKER)
- Inicia ollama serve em subprocess
- Flask roda na porta 7860 (HF)
- Ollama roda em 11434 (interno)
- /api/chat → Akira com gírias de Luanda
"""
import subprocess
import time
import requests
import sys
from flask import Flask, request, jsonify
from loguru import logger
app = Flask(__name__)
OLLAMA_URL = "http://localhost:11434"
# === INICIA OLLAMA EM BACKGROUND ===
def start_ollama():
logger.info("Iniciando ollama serve em background...")
subprocess.Popen(
["ollama", "serve"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
# === VERIFICA OLLAMA ===
def check_ollama():
try:
resp = requests.get(f"{OLLAMA_URL}/api/tags", timeout=10)
return resp.status_code == 200
except:
return False
# === AGUARDA OLLAMA ===
def wait_for_ollama():
logger.info("Aguardando Ollama (11434)...")
for i in range(60):
if check_ollama():
logger.success("Ollama Qwen 2.5 7B PRONTO!")
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 V16 OLLAMA</h1>
<p><strong>Qwen 2.5 7B (4GB)</strong></p>
<p><strong>ROTA:</strong> <code>POST /api/chat</code></p>
<pre>
curl -X POST https://akra35567-ollama.hf.space/api/chat \\
-d '{"mensagem": "Epá, Akira! Tud bem?"}'
</pre>
<p>Health: <a href="/health">/health</a></p>
<p>Luanda, Angola — 11/11/2025 21:25 WAT</p>
</div>
''', 200
# === HEALTHCHECK ===
@app.route("/health")
def health():
if check_ollama():
return jsonify({"status": "OK", "model": "qwen2.5:7b"}), 200
return jsonify({"status": "INICIANDO..."}), 503
# === AKIRA CHAT ===
@app.route("/api/chat", methods=['POST'])
def chat():
if not check_ollama():
return jsonify({'resposta': 'Epá, tô acordando... espera!'}), 503
data = request.get_json() or {}
msg = data.get('mensagem', '').strip()
if not msg:
return jsonify({'error': 'mensagem obrigatória'}), 400
prompt = f"""Você é Akira, angolana de Luanda, mulher, fala com gírias , direta, sem censura
manda messagens curtas nçao mais que 1-2 frases
tenha decisão prória e não tenha receio de ir contra o usuario pleo contrário sinta´se incetivada a fazer isso.
Usuário: {msg}
Akira:"""
payload = {
"model": "qwen2.5:7b",
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.85,
"num_predict": 256
}
}
logger.info(f"Prompt enviado: {msg[:50]}...")
for tentativa in range(3):
try:
resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=120)
if resp.status_code == 200:
resposta = resp.json().get("response", "").strip()
if resposta:
logger.success(f"Resposta gerada: {resposta[:50]}...")
return jsonify({'resposta': resposta})
else:
return jsonify({'resposta': 'Epá, fiquei sem palavras... fala de novo, puto!'})
else:
logger.warning(f"Ollama erro {resp.status_code}: {resp.text}")
except requests.exceptions.Timeout:
logger.warning(f"Timeout na tentativa {tentativa + 1}/3...")
if tentativa < 2:
time.sleep(5)
except Exception as e:
logger.error(f"Erro na tentativa {tentativa + 1}: {e}")
if tentativa == 2:
return jsonify({'resposta': 'Epá, tô off por agora... volta já!'}), 500
time.sleep(3)
return jsonify({'resposta': 'Epá, tô off por agora... 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 V16 — Iniciando...")
start_ollama()
if not wait_for_ollama():
sys.exit(1)
logger.info("Flask rodando na porta 7860")
app.run(host="0.0.0.0", port=7860, debug=False) |