Spaces:
Running
Running
| """ | |
| main.py - Entry point oficial para Hugging Face Spaces | |
| Akira com OpenHermes GGUF + LoRA angolano + APIs + DB persistente | |
| TUDO FUNCIONANDO NO HF SPACES CPU FREE! | |
| """ | |
| import os | |
| import logging | |
| from loguru import logger | |
| from huggingface_hub import login | |
| # ========================== | |
| # 1. DIRETÓRIOS PERSISTENTES | |
| # ========================== | |
| DATA_DIR = "/home/user/data" | |
| FINETUNED_DIR = "/home/user/data/finetuned_hermes" | |
| os.makedirs(DATA_DIR, exist_ok=True) | |
| os.makedirs(FINETUNED_DIR, exist_ok=True) | |
| # ========================== | |
| # 2. CONFIG GLOBAL | |
| # ========================== | |
| import modules.config as config | |
| config.DB_PATH = os.path.join(DATA_DIR, "akira.db") | |
| config.FINETUNED_PATH = FINETUNED_DIR | |
| # ========================== | |
| # 3. HF LOGIN (SECRET) | |
| # ========================== | |
| HF_TOKEN = os.getenv("HF_TOKEN") | |
| if HF_TOKEN: | |
| try: | |
| login(token=HF_TOKEN) | |
| logger.info("HF LOGIN OK COM TOKEN DO SECRET!") | |
| except Exception as e: | |
| logger.warning(f"HF LOGIN FALHOU: {e}") | |
| else: | |
| logger.info("Sem HF_TOKEN → modelos públicos OK") | |
| # ========================== | |
| # 4. LOGS BONITOS | |
| # ========================== | |
| logger.info("GGUF OpenHermes Q4_K_M já baixado no build → TUDO PRONTO!") | |
| logger.info("Akira com sotaque de Luanda carregando...") | |
| # ========================== | |
| # 5. CARREGA O LOCAL LLM (GGUF + LoRA) | |
| # ========================== | |
| from modules.local_llm import HermesLLM | |
| if HermesLLM.is_available(): | |
| logger.info("OpenHermes 2.5 Q4_K_M + LoRA → ONLINE EM 4.8 GB!") | |
| logger.info("AKIRA COM SOTAQUE DE LUANDA 100% ATIVA!") | |
| else: | |
| logger.warning("Modelo local off → usando APIs (Mistral/Gemini)") | |
| # ========================== | |
| # 6. INICIA BANCO DE DADOS | |
| # ========================== | |
| from modules.database import Database | |
| db = Database(config.DB_PATH) | |
| # ========================== | |
| # 7. INICIA TREINAMENTO PERIÓDICO | |
| # ========================== | |
| from modules.treinamento import Treinamento | |
| treino = Treinamento(db, interval_hours=4) | |
| if getattr(config, "START_PERIODIC_TRAINER", True): | |
| treino.start_periodic_training() | |
| logger.info("Treinamento LoRA angolano ativo a cada 4h!") | |
| # ========================== | |
| # 8. CRIA A APLICAÇÃO FLASK (COM AkiraAPI) | |
| # ========================== | |
| from modules.api import AkiraAPI | |
| def create_app(): | |
| logger.info("Iniciando AkiraAPI com OpenHermes GGUF + LoRA angolano...") | |
| try: | |
| akira = AkiraAPI(config) | |
| logger.info("AKIRAAPI CARREGADA COM SUCESSO!") | |
| return akira.app | |
| except Exception as e: | |
| logger.exception(f"ERRO AO INICIAR AkiraAPI: {e}") | |
| raise | |
| app = create_app() | |
| # ========================== | |
| # ROTAS DE SAÚDE | |
| # ========================== | |
| def index(): | |
| return "AKIRA IA ONLINE! Bué fixe, kota! Vamos kandandar!", 200 | |
| def health(): | |
| return "OK", 200 | |
| # ========================== | |
| # EXECUÇÃO (NUNCA MAIS LOOP INFINITO AQUI!) | |
| # ========================== | |
| if __name__ == "__main__": | |
| logger.info("SERVIDOR FLASK RODANDO EM http://0.0.0.0:7860") | |
| app.run(host="0.0.0.0", port=7860, debug=False, threaded=True) |