# 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 '''

AKIRA V16 OLLAMA

Qwen 2.5 7B (4GB)

ROTA: POST /api/chat

curl -X POST https://akra35567-ollama.hf.space/api/chat \\
  -d '{"mensagem": "Epá, Akira! Tud bem?"}'
        

Health: /health

Luanda, Angola — 11/11/2025 21:25 WAT

''', 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="{time:HH:mm:ss}{message}") 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)