akra35567 commited on
Commit
9ea5a21
·
1 Parent(s): 3cd345e

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +23 -86
main.py CHANGED
@@ -10,19 +10,22 @@ from loguru import logger
10
  from huggingface_hub import login
11
 
12
  # ==========================
13
- # 1. CONFIGURAÇÃO DE DIRETÓRIOS PERSISTENTES
14
  # ==========================
15
- DATA_DIR = "/app/data"
16
- MODELS_DIR = "/app/models/hermes-7b"
17
- FINETUNED_DIR = "/app/data/finetuned_hermes"
18
 
 
19
  os.makedirs(DATA_DIR, exist_ok=True)
 
20
  os.makedirs(FINETUNED_DIR, exist_ok=True)
21
 
22
- # Config global
23
  import modules.config as config
24
  config.DB_PATH = os.path.join(DATA_DIR, "akira.db")
25
  config.FINETUNED_PATH = FINETUNED_DIR
 
26
 
27
  # ==========================
28
  # 2. LOGGING (loguru com fallback)
@@ -43,7 +46,7 @@ HF_TOKEN = os.getenv("HF_TOKEN")
43
  if HF_TOKEN:
44
  try:
45
  login(token=HF_TOKEN)
46
- logger.info("HF LOGIN OK COM TOKEN DO SECRET!")
47
  except Exception as e:
48
  logger.warning(f"HF LOGIN FALHOU: {e}")
49
  else:
@@ -61,90 +64,24 @@ def ensure_hermes_model():
61
  missing = [f for f in required_files if not os.path.exists(f)]
62
  if missing:
63
  logger.error(f"MODELO INCOMPLETO: {missing}")
64
- logger.error(" RECONSTRUIR O SPACE COM DOCKERFILE ATUALIZADO!")
65
- logger.error("→ USE snapshot_download COM .safetensors FORÇADO!")
66
- raise FileNotFoundError(f"Hermes 7B incompleto em {MODELS_DIR}")
67
-
68
- shards = [f for f in os.listdir(MODELS_DIR) if f.endswith(".safetensors")]
69
- if len(shards) != 4:
70
- logger.error(f"APENAS {len(shards)} SHARDS .safetensors! ESPERADO: 4")
71
- raise FileNotFoundError("Shards faltando!")
72
-
73
- logger.info(f"Hermes 7B JÁ ESTÁ NO BUILD: {MODELS_DIR} ({len(shards)} shards)")
74
 
75
  # ==========================
76
- # 5. IMPORTA API E TREINAMENTO (ORDEM CRÍTICA!)
77
  # ==========================
78
- from modules.api import AkiraAPI
79
- from modules.treinamento import Treinamento
80
- from modules.database import Database
81
 
82
- # ==========================
83
- # 6. CRIAÇÃO DA APLICAÇÃO
84
- # ==========================
85
- def create_app():
86
- """Inicializa a aplicação Akira IA com ordem segura"""
87
- logger.info("Iniciando Akira IA com Hermes 7B (CPU 8-bit)...")
88
- logger.info(f"Banco de dados: {config.DB_PATH}")
89
- logger.info(f"Modelo: {MODELS_DIR}")
90
- logger.info(f"Fine-tune: {FINETUNED_DIR}")
91
-
92
- # 1. Garante modelo
93
- ensure_hermes_model()
94
-
95
- # 2. Inicia API → carrega local_llm → singleton global
96
- try:
97
- akira = AkiraAPI(config)
98
- app = akira.app
99
- logger.info("AkiraAPI carregada com sucesso!")
100
- except Exception as e:
101
- logger.error(f"Erro ao iniciar AkiraAPI: {e}")
102
- import traceback
103
- logger.error(traceback.format_exc())
104
- raise
105
-
106
- # 3. Só depois inicia treinamento (usa mesmo singleton!)
107
- if getattr(config, 'START_PERIODIC_TRAINER', False):
108
- try:
109
- db = Database(config.DB_PATH)
110
- trainer = Treinamento(db, interval_hours=getattr(config, 'TRAINING_INTERVAL_HOURS', 4))
111
- trainer.start_periodic_training()
112
- logger.info("Treinamento periódico iniciado (usa mesmo Hermes global!)")
113
- except Exception as e:
114
- logger.error(f"Erro ao iniciar treinamento: {e}")
115
- import traceback
116
- logger.error(traceback.format_exc())
117
-
118
- # 4. Endpoints
119
- logger.info("Endpoints:")
120
- logger.info(" POST /api/akira → Chat com Akira")
121
- logger.info(" GET /health → Health check")
122
- logger.info(" GET / → Status")
123
 
124
- return app
 
125
 
126
- # ==========================
127
- # 7. INSTÂNCIA DA APP
128
- # ==========================
129
- app = create_app()
130
-
131
- # ==========================
132
- # 8. ROTAS DE SAÚDE
133
- # ==========================
134
- @app.route("/")
135
- def index():
136
- """Página inicial de status"""
137
- return "Akira IA online! Bué fixe, kota!", 200
138
-
139
- @app.route("/health")
140
- def health():
141
- """Health check para o container"""
142
- return "OK", 200
143
 
144
- # ==========================
145
- # 9. EXECUÇÃO LOCAL (modo dev)
146
- # ==========================
147
- if __name__ == "__main__":
148
- port = int(os.environ.get("PORT", 7860))
149
- logger.info(f"Servidor rodando localmente em http://0.0.0.0:{port}")
150
- app.run(host="0.0.0.0", port=port, debug=False, use_reloader=False)
 
10
  from huggingface_hub import login
11
 
12
  # ==========================
13
+ # 1. CONFIGURAÇÃO DE DIRETÓRIOS PERSISTENTES (CORRIGIDO PARA /home/user)
14
  # ==========================
15
+ DATA_DIR = "/home/user/data"
16
+ MODELS_DIR = "/home/user/models/hermes-7b"
17
+ FINETUNED_DIR = "/home/user/data/finetuned_hermes"
18
 
19
+ # Garante que as pastas existem (agora com permissão correta)
20
  os.makedirs(DATA_DIR, exist_ok=True)
21
+ os.makedirs(MODELS_DIR, exist_ok=True)
22
  os.makedirs(FINETUNED_DIR, exist_ok=True)
23
 
24
+ # Config global (ajusta os caminhos no teu módulo config)
25
  import modules.config as config
26
  config.DB_PATH = os.path.join(DATA_DIR, "akira.db")
27
  config.FINETUNED_PATH = FINETUNED_DIR
28
+ config.MODELS_DIR = MODELS_DIR # se precisar usar em outro lugar
29
 
30
  # ==========================
31
  # 2. LOGGING (loguru com fallback)
 
46
  if HF_TOKEN:
47
  try:
48
  login(token=HF_TOKEN)
49
+ logger.info("HF LOGIN OK COM TOKEN DO SECRET! 🔑")
50
  except Exception as e:
51
  logger.warning(f"HF LOGIN FALHOU: {e}")
52
  else:
 
64
  missing = [f for f in required_files if not os.path.exists(f)]
65
  if missing:
66
  logger.error(f"MODELO INCOMPLETO: {missing}")
67
+ logger.error("Baixe o modelo no Dockerfile com snapshot_download ou coloque manualmente em /home/user/models/hermes-7b")
68
+ return False
69
+ logger.info("Hermes-7B local encontrado! Pronto para uso.")
70
+ return True
 
 
 
 
 
 
71
 
72
  # ==========================
73
+ # 5. IMPORTA E INICIA A API ( depois de tudo pronto)
74
  # ==========================
75
+ if ensure_hermes_model():
76
+ logger.info("Tudo pronto! Iniciando AkiraAPI com sotaque angolano...")
 
77
 
78
+ # Importa a app Flask/FastAPI/Gradio (ajusta conforme teu arquivo real)
79
+ from app import app # ou from api.main import app / from gradio_app import demo, etc.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
+ # Se estiver usando Gradio:
82
+ # demo.launch(server_name="0.0.0.0", server_port=7860)
83
 
84
+ # Se estiver usando Flask/FastAPI com Gunicorn → não precisa fazer nada, o CMD do Dockerfile já roda:
85
+ # gunicorn main:app
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
+ logger.info("AKIRA ONLINE E PRONTO PARA FALAR 'BUÉ FIXE, KOTA!' 🇦🇴")