-
Notifications
You must be signed in to change notification settings - Fork 26
/
config.py
113 lines (96 loc) · 4.27 KB
/
config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import logging
import redis
import os
# Configuração de logging com cores e formatação melhorada
class ColoredFormatter(logging.Formatter):
"""Formatter personalizado que adiciona cores aos logs."""
COLORS = {
logging.DEBUG: "\x1b[38;5;39m", # Azul
logging.INFO: "\x1b[38;21m", # Cinza
logging.WARNING: "\x1b[38;5;226m", # Amarelo
logging.ERROR: "\x1b[38;5;196m", # Vermelho
logging.CRITICAL: "\x1b[31;1m", # Vermelho forte
}
RESET = "\x1b[0m"
def format(self, record):
color = self.COLORS.get(record.levelno, self.RESET)
log_fmt = f"{color}%(asctime)s - %(name)s - %(levelname)s - %(message)s{self.RESET}"
formatter = logging.Formatter(log_fmt)
return formatter.format(record)
# Configuração inicial do logging
logger = logging.getLogger("TranscreveZAP")
handler = logging.StreamHandler()
handler.setFormatter(ColoredFormatter())
logger.addHandler(handler)
# Nível de log inicial (pode ser ajustado após o carregamento de configurações)
logger.setLevel(logging.INFO)
# Conexão com o Redis
redis_client = redis.Redis(
host=os.getenv('REDIS_HOST', 'localhost'),
port=int(os.getenv('REDIS_PORT', 6380)),
db=0,
decode_responses=True
)
class Settings:
"""Classe para gerenciar configurações do sistema."""
def __init__(self):
"""Inicializa as configurações."""
logger.debug("Carregando configurações do Redis...")
self.GROQ_API_KEY = self.get_redis_value("GROQ_API_KEY", "gsk_default_key")
self.BUSINESS_MESSAGE = self.get_redis_value("BUSINESS_MESSAGE", "*Impacte AI* Premium Services")
self.PROCESS_GROUP_MESSAGES = self.get_redis_value("PROCESS_GROUP_MESSAGES", "false").lower() == "true"
self.PROCESS_SELF_MESSAGES = self.get_redis_value("PROCESS_SELF_MESSAGES", "true").lower() == "true"
self.DEBUG_MODE = os.getenv("DEBUG_MODE", "false").lower() == "true"
self.LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO").upper()
self.TRANSCRIPTION_LANGUAGE = self.get_redis_value("TRANSCRIPTION_LANGUAGE", "pt")
# Mascarar chave ao logar
if self.GROQ_API_KEY:
masked_key = f"{self.GROQ_API_KEY[:10]}...{self.GROQ_API_KEY[-4:]}"
logger.debug(f"GROQ_API_KEY carregada: {masked_key}")
else:
logger.error("GROQ_API_KEY não encontrada!")
logger.debug(
f"Configurações carregadas: LOG_LEVEL={self.LOG_LEVEL}, "
f"PROCESS_GROUP_MESSAGES={self.PROCESS_GROUP_MESSAGES}, "
f"PROCESS_SELF_MESSAGES={self.PROCESS_SELF_MESSAGES}"
)
def get_redis_value(self, key, default):
"""Obtém um valor do Redis com fallback para o valor padrão."""
value = redis_client.get(key)
if value is None:
logger.warning(f"Configuração '{key}' não encontrada no Redis. Usando padrão: {default}")
return default
return value
def set_redis_value(self, key, value):
"""Define um valor no Redis."""
redis_client.set(key, value)
logger.debug(f"Configuração '{key}' atualizada no Redis")
def validate(self):
"""Validação detalhada das configurações críticas."""
logger.debug("Validando configurações...")
errors = []
if not self.GROQ_API_KEY:
errors.append("GROQ_API_KEY não está definida.")
elif not self.GROQ_API_KEY.startswith("gsk_"):
errors.append("GROQ_API_KEY inválida: deve começar com 'gsk_'.")
if errors:
for error in errors:
logger.error(error)
return False
logger.info("Todas as configurações foram validadas com sucesso!")
return True
# Instância única de configurações
settings = Settings()
if not settings.validate():
logger.critical("Configurações inválidas detectadas durante a inicialização.")
settings = None # Evita que seja referenciado como 'NoneType'
def load_settings():
"""
Recarrega as configurações do Redis.
"""
global settings
settings = Settings()
# Ajustar nível de log
log_level = getattr(logging, settings.LOG_LEVEL, logging.INFO)
logger.setLevel(log_level)
logger.info(f"Nível de log ajustado para: {logging.getLevelName(log_level)}")