From 03ad2027a4855c3284e434196c589550875452bb Mon Sep 17 00:00:00 2001 From: Kimi Agent Date: Fri, 20 Mar 2026 17:48:08 -0400 Subject: [PATCH] refactor: break up _load_config into helpers (#656) Co-authored-by: Kimi Agent Co-committed-by: Kimi Agent --- src/infrastructure/router/cascade.py | 95 +++++++++++++--------------- 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/src/infrastructure/router/cascade.py b/src/infrastructure/router/cascade.py index fae8afe6..e9ec675e 100644 --- a/src/infrastructure/router/cascade.py +++ b/src/infrastructure/router/cascade.py @@ -221,65 +221,56 @@ class CascadeRouter: raise RuntimeError("PyYAML not installed") content = self.config_path.read_text() - # Expand environment variables content = self._expand_env_vars(content) data = yaml.safe_load(content) - # Load cascade settings - cascade = data.get("cascade", {}) - - # Load fallback chains - fallback_chains = data.get("fallback_chains", {}) - - # Load multi-modal settings - multimodal = data.get("multimodal", {}) - - self.config = RouterConfig( - timeout_seconds=cascade.get("timeout_seconds", 30), - max_retries_per_provider=cascade.get("max_retries_per_provider", 2), - retry_delay_seconds=cascade.get("retry_delay_seconds", 1), - circuit_breaker_failure_threshold=cascade.get("circuit_breaker", {}).get( - "failure_threshold", 5 - ), - circuit_breaker_recovery_timeout=cascade.get("circuit_breaker", {}).get( - "recovery_timeout", 60 - ), - circuit_breaker_half_open_max_calls=cascade.get("circuit_breaker", {}).get( - "half_open_max_calls", 2 - ), - auto_pull_models=multimodal.get("auto_pull", True), - fallback_chains=fallback_chains, - ) - - # Load providers - for p_data in data.get("providers", []): - # Skip disabled providers - if not p_data.get("enabled", False): - continue - - provider = Provider( - name=p_data["name"], - type=p_data["type"], - enabled=p_data.get("enabled", True), - priority=p_data.get("priority", 99), - url=p_data.get("url"), - api_key=p_data.get("api_key"), - base_url=p_data.get("base_url"), - models=p_data.get("models", []), - ) - - # Check if provider is actually available - if self._check_provider_available(provider): - self.providers.append(provider) - else: - logger.warning("Provider %s not available, skipping", provider.name) - - # Sort by priority - self.providers.sort(key=lambda p: p.priority) + self.config = self._parse_router_config(data) + self._load_providers(data) except Exception as exc: logger.error("Failed to load config: %s", exc) + def _parse_router_config(self, data: dict) -> RouterConfig: + """Build a RouterConfig from parsed YAML data.""" + cascade = data.get("cascade", {}) + cb = cascade.get("circuit_breaker", {}) + multimodal = data.get("multimodal", {}) + + return RouterConfig( + timeout_seconds=cascade.get("timeout_seconds", 30), + max_retries_per_provider=cascade.get("max_retries_per_provider", 2), + retry_delay_seconds=cascade.get("retry_delay_seconds", 1), + circuit_breaker_failure_threshold=cb.get("failure_threshold", 5), + circuit_breaker_recovery_timeout=cb.get("recovery_timeout", 60), + circuit_breaker_half_open_max_calls=cb.get("half_open_max_calls", 2), + auto_pull_models=multimodal.get("auto_pull", True), + fallback_chains=data.get("fallback_chains", {}), + ) + + def _load_providers(self, data: dict) -> None: + """Load, filter, and sort providers from parsed YAML data.""" + for p_data in data.get("providers", []): + if not p_data.get("enabled", False): + continue + + provider = Provider( + name=p_data["name"], + type=p_data["type"], + enabled=p_data.get("enabled", True), + priority=p_data.get("priority", 99), + url=p_data.get("url"), + api_key=p_data.get("api_key"), + base_url=p_data.get("base_url"), + models=p_data.get("models", []), + ) + + if self._check_provider_available(provider): + self.providers.append(provider) + else: + logger.warning("Provider %s not available, skipping", provider.name) + + self.providers.sort(key=lambda p: p.priority) + def _expand_env_vars(self, content: str) -> str: """Expand ${VAR} syntax in YAML content.