|
|
""" |
|
|
Configurações e constantes do projeto AgentGraph |
|
|
""" |
|
|
import os |
|
|
from dotenv import load_dotenv |
|
|
import logging |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
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" |
|
|
} |
|
|
|
|
|
|
|
|
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" |
|
|
} |
|
|
|
|
|
|
|
|
LLAMA_MODELS = {**AVAILABLE_MODELS, **REFINEMENT_MODELS} |
|
|
|
|
|
MAX_TOKENS_MAP = { |
|
|
|
|
|
"meta-llama/Llama-3.3-70B-Instruct": 900, |
|
|
"meta-llama/Llama-3.1-8B-Instruct": 700, |
|
|
"deepseek-ai/DeepSeek-R1-0528": 8192, |
|
|
|
|
|
"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 |
|
|
} |
|
|
|
|
|
|
|
|
OPENAI_MODELS = { |
|
|
"o3-mini", |
|
|
"gpt-4o-mini", |
|
|
"gpt-4o", |
|
|
} |
|
|
|
|
|
|
|
|
ANTHROPIC_MODELS = { |
|
|
"claude-3-5-sonnet-20241022" |
|
|
} |
|
|
|
|
|
|
|
|
GOOGLE_MODELS = { |
|
|
"gemini-1.5-pro", |
|
|
"gemini-2.0-flash" |
|
|
} |
|
|
|
|
|
|
|
|
HUGGINGFACE_MODELS = { |
|
|
"meta-llama/Llama-3.3-70B-Instruct", |
|
|
"meta-llama/Llama-3.1-8B-Instruct", |
|
|
"deepseek-ai/DeepSeek-R1-0528" |
|
|
} |
|
|
|
|
|
|
|
|
DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "GPT-4o-mini") |
|
|
MAX_ITERATIONS = int(os.getenv("MAX_ITERATIONS", "40")) |
|
|
TEMPERATURE = float(os.getenv("TEMPERATURE", "0")) |
|
|
|
|
|
|
|
|
GRADIO_SHARE = os.getenv("GRADIO_SHARE", "False").lower() == "true" |
|
|
GRADIO_PORT = int(os.getenv("GRADIO_PORT", "7860")) |
|
|
|
|
|
|
|
|
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") |
|
|
|
|
|
|
|
|
logging.basicConfig( |
|
|
level=getattr(logging, LOG_LEVEL.upper()), |
|
|
format='%(asctime)s - %(levelname)s - %(message)s' |
|
|
) |
|
|
|
|
|
|
|
|
os.makedirs(UPLOAD_DIR, exist_ok=True) |
|
|
|
|
|
|
|
|
if OPENAI_API_KEY: |
|
|
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY |
|
|
|
|
|
|
|
|
if GOOGLE_API_KEY: |
|
|
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY |
|
|
|
|
|
|
|
|
if ANTHROPIC_API_KEY: |
|
|
os.environ["ANTHROPIC_API_KEY"] = ANTHROPIC_API_KEY |
|
|
|
|
|
|
|
|
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}") |
|
|
|
|
|
|
|
|
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" |
|
|
} |
|
|
|