akra35567 commited on
Commit
d63e7ff
·
1 Parent(s): 2243217

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +58 -16
main.py CHANGED
@@ -1,12 +1,15 @@
1
  """
2
  main.py - Entry point oficial para Hugging Face Spaces
3
- Inicializa AkiraAPI com persistência, logging limpo e health checks
4
  """
5
-
6
  import os
7
  import logging
 
8
  from modules.api import AkiraAPI
9
  import modules.config as config
 
 
 
10
 
11
  # ==========================
12
  # Configuração de Diretório Persistente (HF Spaces)
@@ -16,51 +19,92 @@ os.makedirs(DATA_DIR, exist_ok=True)
16
  config.DB_PATH = os.path.join(DATA_DIR, "akira.db") # Banco persiste entre rebuilds!
17
 
18
  # ==========================
19
- # Logging (usando loguru do api.py, mas com fallback)
20
  # ==========================
21
  try:
22
  from loguru import logger
23
  except ImportError:
24
- # Fallback se loguru não estiver instalado
25
  logging.basicConfig(
26
  level=logging.INFO,
27
  format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
28
  )
29
  logger = logging.getLogger("AkiraMain")
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  # ==========================
32
  # Criação da Aplicação
33
  # ==========================
34
  def create_app():
35
- """Inicializa a aplicação Akira IA com persistência e logging"""
36
- logger.info("Iniciando Akira IA com Llama 3.1 8B (CPU 8-bit)...")
37
  logger.info(f"Banco de dados: {config.DB_PATH}")
38
 
 
 
 
39
  try:
40
  akira = AkiraAPI(config)
41
  app = akira.app
42
-
43
  logger.info("AkiraAPI carregada com sucesso!")
44
  logger.info("Endpoints:")
45
- logger.info(" POST /api/akira → Chat com Akira")
46
- logger.info(" GET /health → Health check")
47
- logger.info(" GET / → Status")
48
-
49
  return app
50
-
51
  except Exception as e:
52
  logger.error(f"Erro ao iniciar AkiraAPI: {e}")
53
  import traceback
54
  logger.error(traceback.format_exc())
55
  raise
56
 
57
-
58
  # ==========================
59
  # Instância da App
60
  # ==========================
61
  app = create_app()
62
 
63
-
64
  # ==========================
65
  # Rotas de Saúde
66
  # ==========================
@@ -69,13 +113,11 @@ def index():
69
  """Página inicial de status"""
70
  return "Akira IA online! Bué fixe, puto!", 200
71
 
72
-
73
  @app.route("/health")
74
  def health():
75
  """Health check para o container"""
76
  return "OK", 200
77
 
78
-
79
  # ==========================
80
  # Execução Local (modo dev)
81
  # ==========================
 
1
  """
2
  main.py - Entry point oficial para Hugging Face Spaces
3
+ Inicializa AkiraAPI com persistência, logging limpo, health checks + HF LOGIN
4
  """
 
5
  import os
6
  import logging
7
+ import shutil
8
  from modules.api import AkiraAPI
9
  import modules.config as config
10
+ from loguru import logger
11
+ from huggingface_hub import login
12
+ from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
13
 
14
  # ==========================
15
  # Configuração de Diretório Persistente (HF Spaces)
 
19
  config.DB_PATH = os.path.join(DATA_DIR, "akira.db") # Banco persiste entre rebuilds!
20
 
21
  # ==========================
22
+ # Logging (loguru com fallback)
23
  # ==========================
24
  try:
25
  from loguru import logger
26
  except ImportError:
 
27
  logging.basicConfig(
28
  level=logging.INFO,
29
  format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
30
  )
31
  logger = logging.getLogger("AkiraMain")
32
 
33
+ # ==========================
34
+ # HF TOKEN LOGIN (SECRET NO HF SPACES)
35
+ # ==========================
36
+ HF_TOKEN = os.getenv("HF_TOKEN")
37
+ if HF_TOKEN:
38
+ try:
39
+ login(token=HF_TOKEN)
40
+ logger.info("HF LOGIN OK COM TOKEN DO SECRET!")
41
+ except Exception as e:
42
+ logger.warning(f"HF LOGIN FALHOU: {e}")
43
+ else:
44
+ logger.warning("HF_TOKEN NÃO ENCONTRADO → MODELOS PÚBLICOS OK, PRIVADOS NÃO!")
45
+
46
+ # ==========================
47
+ # VERIFICA / BAIXA HERMES 7B LOCAL (4-BIT)
48
+ # ==========================
49
+ MODEL_DIR = "/app/models/hermes-7b"
50
+ FINETUNED_DIR = "/app/data/finetuned_hermes"
51
+
52
+ def ensure_hermes_model():
53
+ """Baixa Hermes 7B 4-bit se não existir"""
54
+ if os.path.exists(f"{MODEL_DIR}/config.json"):
55
+ logger.info(f"Hermes 7B já existe em: {MODEL_DIR}")
56
+ return
57
+
58
+ logger.info("Hermes 7B NÃO ENCONTRADO → BAIXANDO 4-BIT...")
59
+ try:
60
+ quantization_config = BitsAndBytesConfig(load_in_4bit=True)
61
+ tokenizer = AutoTokenizer.from_pretrained("NousResearch/Hermes-2-Pro-Mistral-7B")
62
+ model = AutoModelForCausalLM.from_pretrained(
63
+ "NousResearch/Hermes-2-Pro-Mistral-7B",
64
+ device_map="cpu",
65
+ quantization_config=quantization_config,
66
+ low_cpu_mem_usage=True,
67
+ torch_dtype="auto"
68
+ )
69
+ os.makedirs(MODEL_DIR, exist_ok=True)
70
+ tokenizer.save_pretrained(MODEL_DIR)
71
+ model.save_pretrained(MODEL_DIR)
72
+ logger.info("HERMES 7B 4-BIT BAIXADO E SALVO LOCALMENTE!")
73
+ except Exception as e:
74
+ logger.error(f"ERRO AO BAIXAR HERMES: {e}")
75
+ logger.error("Tente adicionar HF_TOKEN como Secret no HF Spaces!")
76
+
77
  # ==========================
78
  # Criação da Aplicação
79
  # ==========================
80
  def create_app():
81
+ """Inicializa a aplicação Akira IA"""
82
+ logger.info("Iniciando Akira IA com Hermes 7B (CPU 4-bit)...")
83
  logger.info(f"Banco de dados: {config.DB_PATH}")
84
 
85
+ # Garante modelo local
86
+ ensure_hermes_model()
87
+
88
  try:
89
  akira = AkiraAPI(config)
90
  app = akira.app
 
91
  logger.info("AkiraAPI carregada com sucesso!")
92
  logger.info("Endpoints:")
93
+ logger.info(" POST /api/akira → Chat com Akira")
94
+ logger.info(" GET /health → Health check")
95
+ logger.info(" GET / → Status")
 
96
  return app
 
97
  except Exception as e:
98
  logger.error(f"Erro ao iniciar AkiraAPI: {e}")
99
  import traceback
100
  logger.error(traceback.format_exc())
101
  raise
102
 
 
103
  # ==========================
104
  # Instância da App
105
  # ==========================
106
  app = create_app()
107
 
 
108
  # ==========================
109
  # Rotas de Saúde
110
  # ==========================
 
113
  """Página inicial de status"""
114
  return "Akira IA online! Bué fixe, puto!", 200
115
 
 
116
  @app.route("/health")
117
  def health():
118
  """Health check para o container"""
119
  return "OK", 200
120
 
 
121
  # ==========================
122
  # Execução Local (modo dev)
123
  # ==========================