From f2c2bdf6d6e5e7859197d887c385d1650f350bb3 Mon Sep 17 00:00:00 2001 From: sczheng189 <724100151@qq.com> Date: Mon, 1 Sep 2025 21:39:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B5xx=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=86=94=E6=96=AD=E6=9C=BA=E5=88=B6=E5=92=8C=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 熔断机制优化 - 将5xx错误阈值从3次提升到10次,减少误触发 - 缩短临时错误恢复时间从60分钟到5分钟 - 支持所有5xx状态码(500-599)的统一处理 ## 重置状态功能完善 后端 resetAccountStatus 新增清除: - tempErrorAt 字段 (temp_error状态) - sessionWindowStart/sessionWindowEnd 字段 - 5xx_errors Redis计数键 前端优化: - 重置成功后强制刷新 loadAccounts(true) - 避免缓存导致的状态显示不一致 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/services/claudeAccountService.js | 9 ++++++++- src/services/claudeRelayService.js | 4 ++-- web/admin-spa/src/views/AccountsView.vue | 3 ++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/services/claudeAccountService.js b/src/services/claudeAccountService.js index 97748393..ec50f65f 100644 --- a/src/services/claudeAccountService.js +++ b/src/services/claudeAccountService.js @@ -1704,6 +1704,9 @@ class ClaudeAccountService { delete updatedAccountData.rateLimitedAt delete updatedAccountData.rateLimitStatus delete updatedAccountData.rateLimitEndAt + delete updatedAccountData.tempErrorAt + delete updatedAccountData.sessionWindowStart + delete updatedAccountData.sessionWindowEnd // 保存更新后的账户数据 await redis.setClaudeAccount(accountId, updatedAccountData) @@ -1716,6 +1719,10 @@ class ClaudeAccountService { const rateLimitKey = `ratelimit:${accountId}` await redis.client.del(rateLimitKey) + // 清除5xx错误计数 + const serverErrorKey = `claude_account:${accountId}:5xx_errors` + await redis.client.del(serverErrorKey) + logger.info( `✅ Successfully reset all error states for account ${accountData.name} (${accountId})` ) @@ -1740,7 +1747,7 @@ class ClaudeAccountService { try { const accounts = await redis.getAllClaudeAccounts() let cleanedCount = 0 - const TEMP_ERROR_RECOVERY_MINUTES = 60 // 临时错误状态恢复时间(分钟) + const TEMP_ERROR_RECOVERY_MINUTES = 5 // 临时错误状态恢复时间(分钟) for (const account of accounts) { if (account.status === 'temp_error' && account.tempErrorAt) { diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index 0ca60f1b..a8b2f5b9 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -207,7 +207,7 @@ class ClaudeRelayService { logger.info( `🔥 Account ${accountId} has ${errorCount} consecutive 5xx errors in the last 5 minutes` ) - if (errorCount >= 3) { + if (errorCount > 10) { logger.error( `❌ Account ${accountId} exceeded 5xx error threshold (${errorCount} errors), marking as temp_error` ) @@ -915,7 +915,7 @@ class ClaudeRelayService { logger.info( `🔥 [Stream] Account ${accountId} has ${errorCount} consecutive 5xx errors in the last 5 minutes` ) - if (errorCount >= 3) { + if (errorCount > 10) { logger.error( `❌ [Stream] Account ${accountId} exceeded 5xx error threshold (${errorCount} errors), marking as temp_error` ) diff --git a/web/admin-spa/src/views/AccountsView.vue b/web/admin-spa/src/views/AccountsView.vue index f0555b6e..631d2a3b 100644 --- a/web/admin-spa/src/views/AccountsView.vue +++ b/web/admin-spa/src/views/AccountsView.vue @@ -1323,7 +1323,8 @@ const resetAccountStatus = async (account) => { if (data.success) { showToast('账户状态已重置', 'success') - loadAccounts() + // 强制刷新,绕过前端缓存,确保最终一致性 + loadAccounts(true) } else { showToast(data.message || '状态重置失败', 'error') }