DataGraph / utils /config.py
rwayz's picture
ss
7094511
"""
Configurações e constantes do projeto AgentGraph
"""
import os
from dotenv import load_dotenv
import logging
# Carrega variáveis de ambiente
load_dotenv()
# Configurações de API
HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
# Configurações do LangSmith (observabilidade)
LANGSMITH_API_KEY = os.getenv("LANGSMITH_API_KEY")
LANGSMITH_TRACING = os.getenv("LANGSMITH_TRACING", "false").lower() == "true"
LANGSMITH_ENDPOINT = os.getenv("LANGSMITH_ENDPOINT", "https://api.smith.langchain.com")
LANGSMITH_PROJECT = os.getenv("LANGSMITH_PROJECT", "agentgraph-project")
# Configurações de arquivos e diretórios
UPLOAD_DIR = os.getenv("UPLOAD_DIR", "uploaded_data")
DEFAULT_CSV_PATH = os.getenv("DEFAULT_CSV_PATH", "tabela.csv")
SQL_DB_PATH = os.getenv("SQL_DB_PATH", "data.db")
UPLOADED_CSV_PATH = os.path.join(UPLOAD_DIR, "tabela.csv")
# Modelos disponíveis para seleção (usados no agentSQL)
AVAILABLE_MODELS = {
"GPT-o3-mini": "o3-mini",
"GPT-4o-mini": "gpt-4o-mini",
"GPT-4o": "gpt-4o",
"Claude-3.5-Sonnet": "claude-3-5-sonnet-20241022",
"Gemini-1.5-Pro": "gemini-1.5-pro",
"Gemini-2.0-Flash": "gemini-2.0-flash"
}
# Modelos para refinamento (apenas uso interno)
REFINEMENT_MODELS = {
"LLaMA 70B": "meta-llama/Llama-3.3-70B-Instruct",
"LlaMA 8B": "meta-llama/Llama-3.1-8B-Instruct",
"DeepSeek-R1": "deepseek-ai/DeepSeek-R1-0528"
}
# Mapeamento completo de modelos (para compatibilidade)
LLAMA_MODELS = {**AVAILABLE_MODELS, **REFINEMENT_MODELS}
MAX_TOKENS_MAP = {
# Modelos de refinamento
"meta-llama/Llama-3.3-70B-Instruct": 900,
"meta-llama/Llama-3.1-8B-Instruct": 700,
"deepseek-ai/DeepSeek-R1-0528": 8192,
# Modelos do agentSQL
"o3-mini": 4096,
"gpt-4o-mini": 4096,
"gpt-4o": 4096,
"claude-3-5-sonnet-20241022": 1024,
"gemini-1.5-pro": 4096,
"gemini-2.0-flash": 4096
}
# Modelos que usam OpenAI (GPT)
OPENAI_MODELS = {
"o3-mini",
"gpt-4o-mini",
"gpt-4o",
}
# Modelos que usam Anthropic (Claude)
ANTHROPIC_MODELS = {
"claude-3-5-sonnet-20241022"
}
# Modelos que usam Google (Gemini)
GOOGLE_MODELS = {
"gemini-1.5-pro",
"gemini-2.0-flash"
}
# Modelos que usam HuggingFace (para refinamento)
HUGGINGFACE_MODELS = {
"meta-llama/Llama-3.3-70B-Instruct",
"meta-llama/Llama-3.1-8B-Instruct",
"deepseek-ai/DeepSeek-R1-0528"
}
# Configurações do agente
DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "GPT-4o-mini")
MAX_ITERATIONS = int(os.getenv("MAX_ITERATIONS", "40"))
TEMPERATURE = float(os.getenv("TEMPERATURE", "0"))
# Configurações do Gradio
GRADIO_SHARE = os.getenv("GRADIO_SHARE", "False").lower() == "true"
GRADIO_PORT = int(os.getenv("GRADIO_PORT", "7860"))
# Configurações de logging
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
# Configuração do logging
logging.basicConfig(
level=getattr(logging, LOG_LEVEL.upper()),
format='%(asctime)s - %(levelname)s - %(message)s'
)
# Cria diretório de upload se não existir
os.makedirs(UPLOAD_DIR, exist_ok=True)
# Configuração das variáveis de ambiente para OpenAI
if OPENAI_API_KEY:
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
# Configuração das variáveis de ambiente para Google
if GOOGLE_API_KEY:
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY
# Configuração das variáveis de ambiente para Anthropic
if ANTHROPIC_API_KEY:
os.environ["ANTHROPIC_API_KEY"] = ANTHROPIC_API_KEY
# Configuração das variáveis de ambiente para LangSmith
if LANGSMITH_API_KEY:
os.environ["LANGSMITH_API_KEY"] = LANGSMITH_API_KEY
os.environ["LANGSMITH_TRACING"] = str(LANGSMITH_TRACING).lower()
os.environ["LANGSMITH_ENDPOINT"] = LANGSMITH_ENDPOINT
os.environ["LANGSMITH_PROJECT"] = LANGSMITH_PROJECT
logging.info(f"LangSmith configurado: projeto='{LANGSMITH_PROJECT}', tracing={LANGSMITH_TRACING}")
else:
logging.info("LangSmith não configurado (LANGSMITH_API_KEY não encontrada)")
def get_active_csv_path():
"""Retorna o CSV ativo: o carregado ou o padrão."""
if os.path.exists(UPLOADED_CSV_PATH):
logging.info(f"[CSV] Usando arquivo CSV carregado: {UPLOADED_CSV_PATH}")
return UPLOADED_CSV_PATH
else:
logging.info(f"[CSV] Usando arquivo CSV padrão: {DEFAULT_CSV_PATH}")
return DEFAULT_CSV_PATH
def validate_config():
"""Valida se as configurações necessárias estão presentes."""
errors = []
warnings = []
if not HUGGINGFACE_API_KEY:
errors.append("HUGGINGFACE_API_KEY não configurada")
if not OPENAI_API_KEY:
errors.append("OPENAI_API_KEY não configurada")
if not ANTHROPIC_API_KEY:
errors.append("ANTHROPIC_API_KEY não configurada")
if not os.path.exists(DEFAULT_CSV_PATH):
errors.append(f"Arquivo CSV padrão não encontrado: {DEFAULT_CSV_PATH}")
# LangSmith é opcional - apenas aviso se não configurado
if not LANGSMITH_API_KEY:
warnings.append("LANGSMITH_API_KEY não configurada - observabilidade desabilitada")
if errors:
raise ValueError(f"Erros de configuração: {', '.join(errors)}")
if warnings:
for warning in warnings:
logging.warning(warning)
logging.info("Configurações validadas com sucesso")
return True
def is_langsmith_enabled() -> bool:
"""
Verifica se o LangSmith está habilitado e configurado
Returns:
True se LangSmith estiver habilitado, False caso contrário
"""
return bool(LANGSMITH_API_KEY and LANGSMITH_TRACING)
def get_langsmith_metadata() -> dict:
"""
Retorna metadados padrão para traces do LangSmith
Returns:
Dicionário com metadados do projeto
"""
if not is_langsmith_enabled():
return {}
return {
"project": LANGSMITH_PROJECT,
"application": "AgentGraph",
"version": "1.0.0",
"environment": "production"
}