diff --git a/src-tauri/src/modules/quota.rs b/src-tauri/src/modules/quota.rs index a7b8f76cc..164c33b56 100755 --- a/src-tauri/src/modules/quota.rs +++ b/src-tauri/src/modules/quota.rs @@ -226,11 +226,13 @@ pub async fn fetch_quota_with_cache( // ✅ Special handling for 403 Forbidden - return directly, no retry if status == rquest::StatusCode::FORBIDDEN { + let body = response.text().await.unwrap_or_default(); crate::modules::logger::log_warn(&format!( - "Account unauthorized (403 Forbidden), marking as forbidden" + "Account unauthorized (403 Forbidden): {}", body )); let mut q = QuotaData::new(); q.is_forbidden = true; + q.forbidden_reason = Some(if body.is_empty() { "403 Forbidden".to_string() } else { body }); q.subscription_tier = subscription_tier.clone(); return Ok((q, project_id.clone())); } @@ -453,7 +455,8 @@ pub async fn warm_up_all_accounts() -> Result { "[Warmup] Account {} returned 403 Forbidden during quota fetch, marking as forbidden", email )); - let _ = crate::modules::account::mark_account_forbidden(&id, "Warmup: 403 Forbidden - quota fetch denied"); + let reason = fresh_quota.forbidden_reason.as_deref().unwrap_or("403 Forbidden - quota fetch denied"); + let _ = crate::modules::account::mark_account_forbidden(&id, reason); continue; } let mut account_warmed_series = std::collections::HashSet::new(); @@ -582,9 +585,9 @@ pub async fn warm_up_account(account_id: &str) -> Result { "[Warmup] Account {} returned 403 Forbidden during quota fetch, marking as forbidden", email )); - let reason = "Warmup: 403 Forbidden - quota fetch denied"; + let reason = fresh_quota.forbidden_reason.as_deref().unwrap_or("403 Forbidden - quota fetch denied"); let _ = crate::modules::account::mark_account_forbidden(account_id, reason); - return Err("Account is forbidden (403)".to_string()); + return Err(format!("Account is forbidden: {}", reason)); } let mut models_to_warm = Vec::new(); diff --git a/src-tauri/src/modules/scheduler.rs b/src-tauri/src/modules/scheduler.rs index 20c71c6b9..a57001f1e 100644 --- a/src-tauri/src/modules/scheduler.rs +++ b/src-tauri/src/modules/scheduler.rs @@ -106,7 +106,8 @@ pub fn start_scheduler(app_handle: Option, proxy_state: crate: "[Scheduler] Account {} returned 403 Forbidden during quota fetch, marking as forbidden", account.email )); - let _ = account::mark_account_forbidden(&account.id, "Scheduler: 403 Forbidden - quota fetch denied"); + let reason = fresh_quota.forbidden_reason.as_deref().unwrap_or("403 Forbidden - quota fetch denied"); + let _ = account::mark_account_forbidden(&account.id, reason); continue; } @@ -289,7 +290,8 @@ pub async fn trigger_warmup_for_account(account: &Account) { "[Scheduler] Account {} returned 403 Forbidden during quota fetch, marking as forbidden", account.email )); - let _ = account::mark_account_forbidden(&account.id, "Scheduler: 403 Forbidden - quota fetch denied"); + let reason = fresh_quota.forbidden_reason.as_deref().unwrap_or("403 Forbidden - quota fetch denied"); + let _ = account::mark_account_forbidden(&account.id, reason); return; } diff --git a/src-tauri/src/proxy/handlers/claude.rs b/src-tauri/src/proxy/handlers/claude.rs index 08c735f5f..3365d8f10 100644 --- a/src-tauri/src/proxy/handlers/claude.rs +++ b/src-tauri/src/proxy/handlers/claude.rs @@ -1295,7 +1295,7 @@ pub async fn handle_messages( if let Err(e) = token_manager.set_forbidden(&account_id, &error_text).await { tracing::error!("Failed to set forbidden status for {}: {}", email, e); } else { - tracing::warn!("[Claude] Account {} marked as forbidden due to 403", email); + tracing::warn!("[Claude] Account {} marked as forbidden due to 403: {}", email, &error_text[..error_text.len().min(500)]); } }