66from dataclasses import dataclass
77
88
9+ def _parse_bool (value : str | None , default : bool = False ) -> bool :
10+ """Parse a boolean value from a string.
11+
12+ Handles: true/false, 1/0, yes/no, on/off (case-insensitive).
13+ Returns default if value is None or cannot be parsed.
14+ """
15+ if value is None :
16+ return default
17+ normalized = value .strip ().lower ()
18+ true_values = {"true" , "1" , "yes" , "on" }
19+ false_values = {"false" , "0" , "no" , "off" }
20+ if normalized in true_values :
21+ return True
22+ if normalized in false_values :
23+ return False
24+ return default
25+
26+
927@dataclass
1028class Config :
1129 api_key : str | None = None
@@ -15,7 +33,35 @@ class Config:
1533 max_payload_kb : int = 100
1634 mode : str = "local" # "local" or "cloud"
1735
36+ def validate (self ) -> None :
37+ """Validate configuration values.
38+
39+ Raises:
40+ ValueError: If any configuration value is invalid.
41+ """
42+ if not self .endpoint :
43+ raise ValueError ("endpoint_url must be non-empty" )
44+
45+ if not self .endpoint .startswith (("http://" , "https://" )):
46+ raise ValueError (
47+ f"endpoint_url must start with http:// or https://, got: { self .endpoint } "
48+ )
49+
50+ if not isinstance (self .max_payload_kb , int ) or self .max_payload_kb <= 0 :
51+ raise ValueError (
52+ f"max_payload_kb must be a positive integer, got: { self .max_payload_kb } "
53+ )
54+
55+ if self .max_payload_kb > 10000 :
56+ raise ValueError (
57+ f"max_payload_kb must be at most 10000, got: { self .max_payload_kb } "
58+ )
59+
60+ if not isinstance (self .enabled , bool ):
61+ raise ValueError (f"enabled must be a boolean, got: { type (self .enabled ).__name__ } " )
62+
1863 def __post_init__ (self ):
64+ self .validate ()
1965 if self .api_key :
2066 self .mode = "cloud"
2167 if self .endpoint == "http://localhost:8000" :
@@ -47,13 +93,13 @@ def init(
4793 or ("https://api.agentdebugger.dev" if resolved_key else "http://localhost:8000" )
4894 )
4995
50- resolved_enabled = enabled and os .environ .get ("AGENT_DEBUGGER_ENABLED" , "true" ). lower () != "false"
96+ resolved_enabled = enabled and _parse_bool ( os .environ .get ("AGENT_DEBUGGER_ENABLED" ), default = True )
5197
5298 _global_config = Config (
5399 api_key = resolved_key ,
54100 endpoint = resolved_endpoint ,
55101 enabled = resolved_enabled ,
56- redact_prompts = os .environ .get ("AGENT_DEBUGGER_REDACT_PROMPTS" , str ( redact_prompts )). lower () == "true" ,
102+ redact_prompts = _parse_bool ( os .environ .get ("AGENT_DEBUGGER_REDACT_PROMPTS" ), default = redact_prompts ),
57103 max_payload_kb = int (os .environ .get ("AGENT_DEBUGGER_MAX_PAYLOAD_KB" , max_payload_kb )),
58104 )
59105 return _global_config
0 commit comments