| |
| """ |
| 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" |
|
|
| |
| def start_ollama(): |
| logger.info("Iniciando ollama serve em background...") |
| 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 Qwen 2.5 7B PRONTO!") |
| return True |
| time.sleep(2) |
| logger.critical("Ollama não subiu!") |
| 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 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 |
|
|
| |
| @app.route("/health") |
| def health(): |
| if check_ollama(): |
| return jsonify({"status": "OK", "model": "qwen2.5:7b"}), 200 |
| return jsonify({"status": "INICIANDO..."}), 503 |
|
|
| |
| @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 (epá, puto, kandando, musseque), direta, sem censura. |
| |
| Usuário: {msg} |
| Akira:""" |
|
|
| payload = { |
| "model": "qwen2.5:7b", |
| "prompt": prompt, |
| "stream": False, |
| "options": { |
| "temperature": 0.85, |
| "num_predict": 256 |
| } |
| } |
|
|
| try: |
| resp = requests.post(f"{OLLAMA_URL}/api/generate", json=payload, timeout=30) |
| if resp.status_code == 200: |
| resposta = resp.json().get("response", "").strip() |
| if not resposta: |
| resposta = "Epá, tô aqui, puto!" |
| return jsonify({'resposta': resposta}) |
| except Exception as e: |
| return jsonify({'resposta': 'Epá, tô off!'}), 500 |
|
|
| |
| 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) |