From d11a12a746f2fc05ce1a51a6552df2d0a3fc26fe Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Tue, 16 Dec 2025 18:09:19 +0800 Subject: [PATCH] Merge branch 'main' into feature/error-request-logging --- src-tauri/src/database/dao/failover.rs | 13 +++---------- src-tauri/src/lib.rs | 4 +--- src-tauri/src/proxy/circuit_breaker.rs | 4 +--- src-tauri/src/proxy/failover_switch.rs | 12 +++--------- src-tauri/src/proxy/forwarder.rs | 5 ++--- src-tauri/src/proxy/handlers.rs | 14 ++++++++------ src-tauri/src/services/proxy.rs | 8 ++------ src-tauri/src/services/speedtest.rs | 5 +---- 8 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src-tauri/src/database/dao/failover.rs b/src-tauri/src/database/dao/failover.rs index 66e24f92d..41cff95ff 100644 --- a/src-tauri/src/database/dao/failover.rs +++ b/src-tauri/src/database/dao/failover.rs @@ -69,11 +69,7 @@ impl Database { } /// 添加供应商到故障转移队列末尾 - pub fn add_to_failover_queue( - &self, - app_type: &str, - provider_id: &str, - ) -> Result<(), AppError> { + pub fn add_to_failover_queue(&self, app_type: &str, provider_id: &str) -> Result<(), AppError> { let conn = lock_conn!(self.conn); // 获取当前最大 queue_order @@ -199,11 +195,8 @@ impl Database { pub fn clear_failover_queue(&self, app_type: &str) -> Result<(), AppError> { let conn = lock_conn!(self.conn); - conn.execute( - "DELETE FROM failover_queue WHERE app_type = ?1", - [app_type], - ) - .map_err(|e| AppError::Database(e.to_string()))?; + conn.execute("DELETE FROM failover_queue WHERE app_type = ?1", [app_type]) + .map_err(|e| AppError::Database(e.to_string()))?; Ok(()) } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 147bffd37..75894186a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -333,9 +333,7 @@ pub fn run() { let app_state = AppState::new(db); // 设置 AppHandle 用于代理故障转移时的 UI 更新 - app_state - .proxy_service - .set_app_handle(app.handle().clone()); + app_state.proxy_service.set_app_handle(app.handle().clone()); // ============================================================ // 按表独立判断的导入逻辑(各类数据独立检查,互不影响) diff --git a/src-tauri/src/proxy/circuit_breaker.rs b/src-tauri/src/proxy/circuit_breaker.rs index 9f35b00bd..b448e38ce 100644 --- a/src-tauri/src/proxy/circuit_breaker.rs +++ b/src-tauri/src/proxy/circuit_breaker.rs @@ -238,9 +238,7 @@ impl CircuitBreaker { self.half_open_requests.fetch_sub(1, Ordering::SeqCst); // HalfOpen 状态下失败,立即转为 Open - log::warn!( - "Circuit breaker HalfOpen probe failed, transitioning to Open" - ); + log::warn!("Circuit breaker HalfOpen probe failed, transitioning to Open"); drop(config); self.transition_to_open().await; } diff --git a/src-tauri/src/proxy/failover_switch.rs b/src-tauri/src/proxy/failover_switch.rs index fd84f0395..b1ac5b746 100644 --- a/src-tauri/src/proxy/failover_switch.rs +++ b/src-tauri/src/proxy/failover_switch.rs @@ -54,9 +54,7 @@ impl FailoverSwitchManager { { let mut pending = self.pending_switches.write().await; if pending.contains(&switch_key) { - log::debug!( - "[Failover] 切换已在进行中,跳过: {app_type} -> {provider_id}" - ); + log::debug!("[Failover] 切换已在进行中,跳过: {app_type} -> {provider_id}"); return Ok(false); } pending.insert(switch_key.clone()); @@ -83,9 +81,7 @@ impl FailoverSwitchManager { provider_id: &str, provider_name: &str, ) -> Result { - log::info!( - "[Failover] 开始切换供应商: {app_type} -> {provider_name} ({provider_id})" - ); + log::info!("[Failover] 开始切换供应商: {app_type} -> {provider_name} ({provider_id})"); // 1. 更新数据库 is_current self.db.set_current_provider(app_type, provider_id)?; @@ -131,9 +127,7 @@ impl FailoverSwitchManager { } } - log::info!( - "[Failover] 供应商切换完成: {app_type} -> {provider_name} ({provider_id})" - ); + log::info!("[Failover] 供应商切换完成: {app_type} -> {provider_name} ({provider_id})"); Ok(true) } diff --git a/src-tauri/src/proxy/forwarder.rs b/src-tauri/src/proxy/forwarder.rs index 8d2300008..18a88e3c2 100644 --- a/src-tauri/src/proxy/forwarder.rs +++ b/src-tauri/src/proxy/forwarder.rs @@ -330,9 +330,8 @@ impl RequestForwarder { status.failed_requests += 1; status.last_error = Some("所有供应商暂时不可用(熔断器限制)".to_string()); if status.total_requests > 0 { - status.success_rate = (status.success_requests as f32 - / status.total_requests as f32) - * 100.0; + status.success_rate = + (status.success_requests as f32 / status.total_requests as f32) * 100.0; } } return Err(ProxyError::NoAvailableProvider); diff --git a/src-tauri/src/proxy/handlers.rs b/src-tauri/src/proxy/handlers.rs index b9ad927c1..029671dfc 100644 --- a/src-tauri/src/proxy/handlers.rs +++ b/src-tauri/src/proxy/handlers.rs @@ -14,9 +14,7 @@ use super::{ }, handler_context::RequestContext, providers::{get_adapter, streaming::create_anthropic_sse_stream, transform}, - response_processor::{ - create_logged_passthrough_stream, process_response, SseUsageCollector, - }, + response_processor::{create_logged_passthrough_stream, process_response, SseUsageCollector}, server::ProxyState, types::*, usage::parser::TokenUsage, @@ -63,8 +61,7 @@ pub async fn handle_messages( headers: axum::http::HeaderMap, Json(body): Json, ) -> Result { - let ctx = - RequestContext::new(&state, &body, AppType::Claude, "Claude", "claude").await?; + let ctx = RequestContext::new(&state, &body, AppType::Claude, "Claude", "claude").await?; // 检查是否需要格式转换(OpenRouter 等中转服务) let adapter = get_adapter(&AppType::Claude); @@ -426,7 +423,12 @@ pub async fn handle_gemini( // 使用量记录(保留用于 Claude 转换逻辑) // ============================================================================ -fn log_forward_error(state: &ProxyState, ctx: &RequestContext, is_streaming: bool, error: &ProxyError) { +fn log_forward_error( + state: &ProxyState, + ctx: &RequestContext, + is_streaming: bool, + error: &ProxyError, +) { use super::usage::logger::UsageLogger; let logger = UsageLogger::new(&state.db); diff --git a/src-tauri/src/services/proxy.rs b/src-tauri/src/services/proxy.rs index 407c86c13..b5e9fe448 100644 --- a/src-tauri/src/services/proxy.rs +++ b/src-tauri/src/services/proxy.rs @@ -510,9 +510,7 @@ impl ProxyService { .set_current_provider(app_type_enum.as_str(), provider_id) .map_err(|e| format!("更新当前供应商失败: {e}"))?; - log::info!( - "代理模式:已切换 {app_type} 的目标供应商为 {provider_id}" - ); + log::info!("代理模式:已切换 {app_type} 的目标供应商为 {provider_id}"); Ok(()) } @@ -716,9 +714,7 @@ impl ProxyService { server .reset_provider_circuit_breaker(provider_id, app_type) .await; - log::info!( - "已重置 Provider {provider_id} (app: {app_type}) 的熔断器" - ); + log::info!("已重置 Provider {provider_id} (app: {app_type}) 的熔断器"); } Ok(()) } diff --git a/src-tauri/src/services/speedtest.rs b/src-tauri/src/services/speedtest.rs index d24336f01..57916e98d 100644 --- a/src-tauri/src/services/speedtest.rs +++ b/src-tauri/src/services/speedtest.rs @@ -61,10 +61,7 @@ impl SpeedtestService { } if valid_targets.is_empty() { - return Ok(results - .into_iter() - .flatten() - .collect::>()); + return Ok(results.into_iter().flatten().collect::>()); } let timeout = Self::sanitize_timeout(timeout_secs);