| """ |
| Configuration Management |
| Author: @mangubee |
| Date: 2026-01-01 |
| |
| Loads environment variables and defines configuration constants for GAIA agent. |
| Based on Level 5 (Component Selection) and Level 6 (Implementation Framework) decisions. |
| """ |
|
|
| import os |
| from typing import Literal |
| from dotenv import load_dotenv |
|
|
| |
| load_dotenv() |
|
|
| |
| |
| |
|
|
| |
| ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY", "") |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY", "") |
| HF_TOKEN = os.getenv("HF_TOKEN", "") |
| HF_VISION_MODEL = os.getenv("HF_VISION_MODEL", "google/gemma-3-27b-it:scaleway") |
| DEFAULT_LLM_MODEL: Literal["gemini", "claude"] = os.getenv("DEFAULT_LLM_MODEL", "gemini") |
|
|
| |
| EXA_API_KEY = os.getenv("EXA_API_KEY", "") |
| TAVILY_API_KEY = os.getenv("TAVILY_API_KEY", "") |
| DEFAULT_SEARCH_TOOL: Literal["tavily", "exa"] = os.getenv("DEFAULT_SEARCH_TOOL", "tavily") |
|
|
| |
| DEFAULT_API_URL = os.getenv("DEFAULT_API_URL", "https://huggingface.co/api/evals") |
| SPACE_ID = os.getenv("SPACE_ID", "") |
|
|
| |
| MAX_RETRIES = int(os.getenv("MAX_RETRIES", "3")) |
| QUESTION_TIMEOUT = int(os.getenv("QUESTION_TIMEOUT", "1020")) |
| TOOL_TIMEOUT = int(os.getenv("TOOL_TIMEOUT", "60")) |
|
|
| |
| GRAPH_RECURSION_LIMIT = 25 |
|
|
| |
|
|
|
|
| class Settings: |
| """ |
| Configuration settings manager for GAIA agent. |
| |
| Provides access to all configuration constants and validates API keys. |
| """ |
|
|
| def __init__(self): |
| self.anthropic_api_key = ANTHROPIC_API_KEY |
| self.google_api_key = GOOGLE_API_KEY |
| self.hf_token = HF_TOKEN |
| self.hf_vision_model = HF_VISION_MODEL |
| self.default_llm_model = DEFAULT_LLM_MODEL |
|
|
| self.exa_api_key = EXA_API_KEY |
| self.tavily_api_key = TAVILY_API_KEY |
| self.default_search_tool = DEFAULT_SEARCH_TOOL |
|
|
| self.default_api_url = DEFAULT_API_URL |
| self.space_id = SPACE_ID |
|
|
| self.max_retries = MAX_RETRIES |
| self.question_timeout = QUESTION_TIMEOUT |
| self.tool_timeout = TOOL_TIMEOUT |
| self.graph_recursion_limit = GRAPH_RECURSION_LIMIT |
|
|
| def validate_api_keys(self) -> dict[str, bool]: |
| """ |
| Validate that required API keys are present. |
| |
| Returns: |
| Dict mapping service name to whether API key is present |
| """ |
| return { |
| "anthropic": bool(self.anthropic_api_key), |
| "google": bool(self.google_api_key), |
| "huggingface": bool(self.hf_token), |
| "exa": bool(self.exa_api_key), |
| "tavily": bool(self.tavily_api_key), |
| } |
|
|
| def get_llm_api_key(self) -> str: |
| """ |
| Get API key for the currently selected LLM model. |
| |
| Returns: |
| API key string for the selected model |
| |
| Raises: |
| ValueError: If selected model's API key is not configured |
| """ |
| if self.default_llm_model == "claude": |
| if not self.anthropic_api_key: |
| raise ValueError("ANTHROPIC_API_KEY not configured") |
| return self.anthropic_api_key |
| elif self.default_llm_model == "gemini": |
| if not self.google_api_key: |
| raise ValueError("GOOGLE_API_KEY not configured") |
| return self.google_api_key |
| else: |
| raise ValueError(f"Unknown LLM model: {self.default_llm_model}") |
|
|
| def get_search_api_key(self) -> str: |
| """ |
| Get API key for the currently selected search tool. |
| |
| Returns: |
| API key string for the selected search tool |
| |
| Raises: |
| ValueError: If selected search tool's API key is not configured |
| """ |
| if self.default_search_tool == "tavily": |
| if not self.tavily_api_key: |
| raise ValueError("TAVILY_API_KEY not configured") |
| return self.tavily_api_key |
| elif self.default_search_tool == "exa": |
| if not self.exa_api_key: |
| raise ValueError("EXA_API_KEY not configured") |
| return self.exa_api_key |
| else: |
| raise ValueError(f"Unknown search tool: {self.default_search_tool}") |
|
|
|
|
| |
| settings = Settings() |
|
|