ykumar2020/gaia-final-assignment
0
1"""Environment-only runtime configuration for the GAIA agent."""
2
3from __future__ import annotations
4
5import os
6from dataclasses import dataclass
7from pathlib import Path
8
9
10def _int(name: str, default: int) -> int:
11 try:
12 return int(os.getenv(name, str(default)))
13 except ValueError as exc:
14 raise ValueError(f"{name} must be an integer") from exc
15
16
17def _float(name: str, default: float) -> float:
18 try:
19 return float(os.getenv(name, str(default)))
20 except ValueError as exc:
21 raise ValueError(f"{name} must be a number") from exc
22
23
24def _bool(name: str, default: bool) -> bool:
25 value = os.getenv(name)
26 if value is None:
27 return default
28 return value.strip().lower() in {"1", "true", "yes", "on"}
29
30
31@dataclass(frozen=True)
32class Settings:
33 api_url: str
34 hf_token: str | None
35 model_id: str
36 vision_model_id: str
37 inference_provider: str | None
38 asr_model_id: str
39 cache_dir: Path
40 request_timeout: float
41 retries: int
42 backoff_seconds: float
43 max_steps: int
44 use_cache: bool
45 stockfish_path: str | None
46 fallback_model_id: str | None = None
47 fallback_provider: str | None = None
48 worker_limit: int = 3
49 model_requests_per_minute: float = 20.0
50 search_requests_per_minute: float = 30.0
51 user_agent: str = "GAIA-Level1-Agent/1.0 (public Hugging Face Space)"
52 agent_code_url: str | None = None
53 allow_inline_agent_code: bool = False
54 local_model_id: str | None = None
55 local_model_url: str = "http://127.0.0.1:11434/v1"
56 prefer_local_model: bool = False
57
58 @classmethod
59 def from_env(cls) -> Settings:
60 root = Path(os.getenv("GAIA_CACHE_DIR", "data"))
61 provider = (
62 os.getenv("HF_PROVIDER") or os.getenv("HF_INFERENCE_PROVIDER") or None
63 )
64 return cls(
65 api_url=os.getenv(
66 "GAIA_API_URL", "https://agents-course-unit4-scoring.hf.space"
67 ).rstrip("/"),
68 hf_token=os.getenv("HF_TOKEN") or None,
69 model_id=os.getenv("MODEL_ID")
70 or os.getenv("GAIA_MODEL_ID", "openai/gpt-oss-120b"),
71 vision_model_id=os.getenv(
72 "GAIA_VISION_MODEL_ID", "Qwen/Qwen3-VL-235B-A22B-Instruct"
73 ),
74 inference_provider=provider,
75 asr_model_id=os.getenv("GAIA_ASR_MODEL_ID", "openai/whisper-large-v3"),
76 cache_dir=root,
77 request_timeout=_float("GAIA_REQUEST_TIMEOUT", 60.0),
78 retries=max(1, _int("GAIA_RETRIES", 3)),
79 backoff_seconds=max(0.0, _float("GAIA_BACKOFF_SECONDS", 1.0)),
80 max_steps=max(1, _int("GAIA_MAX_STEPS", 10)),
81 use_cache=_bool("GAIA_USE_CACHE", True),
82 stockfish_path=os.getenv("STOCKFISH_PATH") or None,
83 fallback_model_id=os.getenv("FALLBACK_MODEL_ID") or "openai/gpt-oss-20b",
84 fallback_provider=os.getenv("HF_FALLBACK_PROVIDER") or None,
85 worker_limit=max(1, _int("GAIA_WORKERS", 3)),
86 model_requests_per_minute=max(
87 1.0, _float("GAIA_MODEL_REQUESTS_PER_MINUTE", 20.0)
88 ),
89 search_requests_per_minute=max(
90 1.0, _float("GAIA_SEARCH_REQUESTS_PER_MINUTE", 30.0)
91 ),
92 user_agent=os.getenv(
93 "GAIA_USER_AGENT",
94 "GAIA-Level1-Agent/1.0 (public Hugging Face Space)",
95 ),
96 agent_code_url=os.getenv("GAIA_AGENT_CODE_URL") or None,
97 allow_inline_agent_code=_bool("GAIA_ALLOW_INLINE_AGENT_CODE", False),
98 local_model_id=os.getenv("GAIA_LOCAL_MODEL_ID") or None,
99 local_model_url=os.getenv(
100 "GAIA_LOCAL_MODEL_URL", "http://127.0.0.1:11434/v1"
101 ).rstrip("/"),
102 prefer_local_model=_bool("GAIA_PREFER_LOCAL_MODEL", False),
103 )
104
105 def require_hf_token(self) -> str:
106 if not self.hf_token:
107 raise RuntimeError(
108 "HF_TOKEN is required for inference. Add it as a Hugging Face Space secret."
109 )
110 return self.hf_token
111 