diff --git a/src-tauri/src/proxy/provider_router.rs b/src-tauri/src/proxy/provider_router.rs index 248873f66..1cbae1a65 100644 --- a/src-tauri/src/proxy/provider_router.rs +++ b/src-tauri/src/proxy/provider_router.rs @@ -137,9 +137,16 @@ impl ProviderRouter { success: bool, error_msg: Option, ) -> Result<(), AppError> { - // 1. 获取熔断器配置(用于更新健康状态和判断是否禁用) - let config = self.db.get_circuit_breaker_config().await.ok(); - let failure_threshold = config.map(|c| c.failure_threshold).unwrap_or(5); + // 1. 按应用独立获取熔断器配置(用于更新健康状态和判断是否禁用) + let failure_threshold = match self.db.get_proxy_config_for_app(app_type).await { + Ok(app_config) => app_config.circuit_failure_threshold, + Err(e) => { + log::warn!( + "Failed to load circuit config for {app_type}, using default threshold: {e}" + ); + 5 // 默认值 + } + }; // 2. 更新熔断器状态 let circuit_key = format!("{app_type}:{provider_id}"); @@ -236,12 +243,34 @@ impl ProviderRouter { return breaker.clone(); } - // 从数据库加载配置 - let config = self - .db - .get_circuit_breaker_config() - .await - .unwrap_or_default(); + // 从 key 中提取 app_type (格式: "app_type:provider_id") + let app_type = key.split(':').next().unwrap_or("claude"); + + // 按应用独立读取熔断器配置 + let config = match self.db.get_proxy_config_for_app(app_type).await { + Ok(app_config) => { + log::debug!( + "Loading circuit breaker config for {key} (app={app_type}): \ + failure_threshold={}, success_threshold={}, timeout={}s", + app_config.circuit_failure_threshold, + app_config.circuit_success_threshold, + app_config.circuit_timeout_seconds + ); + crate::proxy::circuit_breaker::CircuitBreakerConfig { + failure_threshold: app_config.circuit_failure_threshold, + success_threshold: app_config.circuit_success_threshold, + timeout_seconds: app_config.circuit_timeout_seconds as u64, + error_rate_threshold: app_config.circuit_error_rate_threshold, + min_requests: app_config.circuit_min_requests, + } + } + Err(e) => { + log::warn!( + "Failed to load circuit breaker config for {key} (app={app_type}): {e}, using default" + ); + crate::proxy::circuit_breaker::CircuitBreakerConfig::default() + } + }; log::debug!("Creating new circuit breaker for {key} with config: {config:?}");