Spaces:
Sleeping
Sleeping
| # main.py — AKIRA V21 ULTIMATE CORRIGIDO (Dezembro 2025) | |
| """ | |
| Entry point Flask API para Akira IA V21 | |
| - Multi-API com fallback (6 provedores) | |
| - Suporte a .env para secrets | |
| - Otimizado para Hugging Face Spaces | |
| - CORREÇÃO: AkiraAPI não aceita parâmetros no __init__ | |
| """ | |
| import os | |
| import sys | |
| from flask import Flask | |
| from loguru import logger | |
| import datetime | |
| # Carregar variáveis de ambiente (.env) | |
| try: | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| logger.info("Variáveis de ambiente carregadas de .env") | |
| except ImportError: | |
| logger.warning("python-dotenv não instalado, usando apenas env vars do sistema") | |
| # === LOGS ULTRA DETALHADOS === | |
| logger.remove() | |
| logger.add( | |
| sys.stderr, | |
| format="<green>{time:HH:mm:ss}</green> | <level>{level}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan> → <level>{message}</level>", | |
| colorize=True, | |
| backtrace=True, | |
| diagnose=True, | |
| level="INFO" | |
| ) | |
| # === FLASK APP === | |
| app = Flask(__name__) | |
| # === ROTAS BÁSICAS === | |
| def index(): | |
| """Página inicial com status""" | |
| apis_configuradas = [] | |
| # Verifica quais APIs estão configuradas | |
| if os.getenv("MISTRAL_API_KEY"): | |
| apis_configuradas.append("Mistral") | |
| if os.getenv("GEMINI_API_KEY"): | |
| apis_configuradas.append("Gemini") | |
| if os.getenv("GROQ_API_KEY"): | |
| apis_configuradas.append("Groq") | |
| if os.getenv("COHERE_API_KEY"): | |
| apis_configuradas.append("Cohere") | |
| if os.getenv("TOGETHER_API_KEY"): | |
| apis_configuradas.append("Together") | |
| if os.getenv("HF_API_KEY"): | |
| apis_configuradas.append("HuggingFace") | |
| apis_texto = ", ".join(apis_configuradas) if apis_configuradas else "Nenhuma (configure em .env)" | |
| return f''' | |
| <div style="font-family: 'Courier New', monospace; text-align: center; margin: 50px; background: #000; color: #0f0; padding: 40px; border: 2px solid #0f0;"> | |
| <h1>🔥 AKIRA V21 ULTIMATE ONLINE! 🔥</h1> | |
| <p><strong>Multi-API System com 6 Provedores</strong></p> | |
| <p><strong>APIs Configuradas:</strong> {apis_texto}</p> | |
| <p><strong>Respostas:</strong> <5s (média)</p> | |
| <p><strong>Endpoint:</strong> POST /api/akira</p> | |
| <p><strong>Compatibilidade:</strong> ✅ Total com index.js V21</p> | |
| <p><strong>Contexto:</strong> ✅ Otimizado (sem repetições)</p> | |
| <hr style="border-color: #0f0;"> | |
| <p><em>Luanda, Angola — Softedge Corporation</em></p> | |
| <p style="font-size: 0.8em; color: #0a0;">Isaac Quarenta | Personalidade BRUTAL sem filtro</p> | |
| </div> | |
| ''', 200 | |
| def health(): | |
| """Health check para Docker/HF Spaces""" | |
| return "OK", 200 | |
| def status(): | |
| """Status detalhado das APIs""" | |
| import modules.config as config | |
| status_info = { | |
| "timestamp": datetime.datetime.now().isoformat(), | |
| "versao": "V21 ULTIMATE (Dezembro 2025)", | |
| "apis_disponiveis": [], | |
| "fallback_order": config.API_FALLBACK_ORDER, | |
| "compatibilidade": { | |
| "index_js": True, | |
| "reply_info": True, | |
| "contexto_otimizado": True, | |
| "audio_stt": True, | |
| "tts": True | |
| } | |
| } | |
| # Verifica cada API | |
| if config.MISTRAL_API_KEY: | |
| status_info["apis_disponiveis"].append("mistral") | |
| if config.GEMINI_API_KEY: | |
| status_info["apis_disponiveis"].append("gemini") | |
| if config.GROQ_API_KEY: | |
| status_info["apis_disponiveis"].append("groq") | |
| if config.COHERE_API_KEY: | |
| status_info["apis_disponiveis"].append("cohere") | |
| if config.TOGETHER_API_KEY: | |
| status_info["apis_disponiveis"].append("together") | |
| if config.HF_API_KEY: | |
| status_info["apis_disponiveis"].append("huggingface") | |
| from flask import jsonify | |
| return jsonify(status_info), 200 | |
| # === INTEGRAÇÃO DA API === | |
| try: | |
| from modules.api import AkiraAPI | |
| import modules.config as config | |
| # Valida config | |
| if hasattr(config, 'validate_config'): | |
| config.validate_config() | |
| else: | |
| logger.warning("validate_config não encontrado em config.py") | |
| # 🔥 CORREÇÃO CRÍTICA: AkiraAPI não aceita parâmetros | |
| # Versão CORRETA: | |
| akira_api = AkiraAPI() # ✅ SEM PARÂMETROS! | |
| # Versão ERRADA (causa o erro): | |
| # akira_api = AkiraAPI(config) # ❌ NÃO FAÇA ISSO! | |
| app.register_blueprint(akira_api.get_blueprint(), url_prefix="/api") | |
| logger.success("✓ API V21 integrada com sucesso → /api/akira") | |
| # Log de APIs configuradas | |
| apis_ok = [] | |
| if config.MISTRAL_API_KEY: | |
| apis_ok.append("Mistral") | |
| if config.GEMINI_API_KEY: | |
| apis_ok.append("Gemini") | |
| if config.GROQ_API_KEY: | |
| apis_ok.append("Groq") | |
| if config.COHERE_API_KEY: | |
| apis_ok.append("Cohere") | |
| if config.TOGETHER_API_KEY: | |
| apis_ok.append("Together") | |
| if config.HF_API_KEY: | |
| apis_ok.append("HuggingFace") | |
| if apis_ok: | |
| logger.info(f"✅ APIs configuradas: {', '.join(apis_ok)}") | |
| else: | |
| logger.warning("⚠️ NENHUMA API CONFIGURADA! Configure pelo menos Mistral + Gemini") | |
| except ImportError as e: | |
| logger.critical(f"❌ ERRO DE IMPORTAÇÃO: {e}") | |
| logger.critical("Certifique-se de que todos os módulos estão instalados:") | |
| logger.critical("pip install flask loguru python-dotenv requests") | |
| sys.exit(1) | |
| except Exception as e: | |
| logger.critical(f"❌ FALHA AO CARREGAR API: {e}") | |
| import traceback | |
| logger.critical(traceback.format_exc()) | |
| sys.exit(1) | |
| # === ROTA DE FALLBACK (para debugging) === | |
| def debug(): | |
| """Página de debugging para verificar configurações""" | |
| import modules.config as config | |
| debug_info = { | |
| "python_version": sys.version, | |
| "apis_keys_present": { | |
| "MISTRAL_API_KEY": bool(config.MISTRAL_API_KEY), | |
| "GEMINI_API_KEY": bool(config.GEMINI_API_KEY), | |
| "GROQ_API_KEY": bool(config.GROQ_API_KEY), | |
| "COHERE_API_KEY": bool(config.COHERE_API_KEY), | |
| "TOGETHER_API_KEY": bool(config.TOGETHER_API_KEY), | |
| "HF_API_KEY": bool(config.HF_API_KEY) | |
| }, | |
| "working_directory": os.getcwd(), | |
| "files_in_modules": os.listdir("modules") if os.path.exists("modules") else [] | |
| } | |
| from flask import jsonify | |
| return jsonify(debug_info), 200 | |
| # === INÍCIO DO SERVIDOR === | |
| if __name__ == "__main__": | |
| logger.info("=" * 80) | |
| logger.info("🔥 AKIRA V21 ULTIMATE — SISTEMA MULTI-API 🔥") | |
| logger.info("=" * 80) | |
| logger.info(f"Data/hora local: {datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')}") | |
| logger.info(f"Servidor: http://{config.API_HOST}:{config.API_PORT}") | |
| logger.info("Endpoints:") | |
| logger.info(" - GET / → Página inicial") | |
| logger.info(" - GET /health → Health check") | |
| logger.info(" - GET /status → Status das APIs") | |
| logger.info(" - GET /debug → Debugging") | |
| logger.info(" - POST /api/akira → Endpoint principal") | |
| logger.info("=" * 80) | |
| logger.info("✅ Sistema pronto!") | |
| logger.info("✅ Contexto otimizado (sem repetições)") | |
| logger.info("✅ Compatibilidade total com index.js V21") | |
| logger.info("✅ STT Deepgram + TTS Google") | |
| logger.info("✅ Comandos restritos: Apenas Isaac Quarenta") | |
| logger.info("=" * 80) | |
| logger.info("Aguardando conexões... (Ctrl+C para parar)") | |
| # Modo de execução | |
| if os.getenv("PRODUCTION", "false").lower() == "true": | |
| # Produção: usar Gunicorn (via Dockerfile CMD) | |
| logger.info("Modo: PRODUÇÃO (Gunicorn)") | |
| else: | |
| # Desenvolvimento: usar Flask dev server | |
| logger.info("Modo: DESENVOLVIMENTO (Flask)") | |
| app.run( | |
| host=config.API_HOST, | |
| port=config.API_PORT, | |
| debug=False, | |
| use_reloader=False | |
| ) |