akira / main.py
akra35567's picture
Update main.py
d1db412 verified
# 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 ===
@app.route("/")
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> &lt;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
@app.route("/health")
def health():
"""Health check para Docker/HF Spaces"""
return "OK", 200
@app.route("/status")
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) ===
@app.route("/debug")
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
)