From 0a66609c1b0f8bc6e815509cf3dfd4f1e6366c70 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 24 Sep 2025 16:47:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcodex=E9=99=90?= =?UTF-8?q?=E6=B5=81=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/openaiAccountService.js | 37 +++++++++++++++---------- src/services/rateLimitCleanupService.js | 10 +++---- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/services/openaiAccountService.js b/src/services/openaiAccountService.js index 6df21755..5ed3f29b 100644 --- a/src/services/openaiAccountService.js +++ b/src/services/openaiAccountService.js @@ -694,13 +694,17 @@ async function getAllAccounts() { // 添加限流状态信息(统一格式) rateLimitStatus: rateLimitInfo ? { + status: rateLimitInfo.status, isRateLimited: rateLimitInfo.isRateLimited, rateLimitedAt: rateLimitInfo.rateLimitedAt, + rateLimitResetAt: rateLimitInfo.rateLimitResetAt, minutesRemaining: rateLimitInfo.minutesRemaining } : { + status: 'normal', isRateLimited: false, rateLimitedAt: null, + rateLimitResetAt: null, minutesRemaining: 0 } }) @@ -979,34 +983,39 @@ async function getAccountRateLimitInfo(accountId) { return null } - if (account.rateLimitStatus === 'limited') { + const status = account.rateLimitStatus || 'normal' + const rateLimitedAt = account.rateLimitedAt || null + const rateLimitResetAt = account.rateLimitResetAt || null + + if (status === 'limited') { const now = Date.now() let remainingTime = 0 - // 优先使用 rateLimitResetAt 字段(精确的重置时间) - if (account.rateLimitResetAt) { - const resetAt = new Date(account.rateLimitResetAt).getTime() + if (rateLimitResetAt) { + const resetAt = new Date(rateLimitResetAt).getTime() remainingTime = Math.max(0, resetAt - now) - } - // 回退到使用 rateLimitedAt + 默认1小时 - else if (account.rateLimitedAt) { - const limitedAt = new Date(account.rateLimitedAt).getTime() + } else if (rateLimitedAt) { + const limitedAt = new Date(rateLimitedAt).getTime() const limitDuration = 60 * 60 * 1000 // 默认1小时 remainingTime = Math.max(0, limitedAt + limitDuration - now) } + const minutesRemaining = remainingTime > 0 ? Math.ceil(remainingTime / (60 * 1000)) : 0 + return { - isRateLimited: remainingTime > 0, - rateLimitedAt: account.rateLimitedAt, - rateLimitResetAt: account.rateLimitResetAt, - minutesRemaining: Math.ceil(remainingTime / (60 * 1000)) + status, + isRateLimited: minutesRemaining > 0, + rateLimitedAt, + rateLimitResetAt, + minutesRemaining } } return { + status, isRateLimited: false, - rateLimitedAt: null, - rateLimitResetAt: null, + rateLimitedAt, + rateLimitResetAt, minutesRemaining: 0 } } diff --git a/src/services/rateLimitCleanupService.js b/src/services/rateLimitCleanupService.js index 7a9cf618..9978660b 100644 --- a/src/services/rateLimitCleanupService.js +++ b/src/services/rateLimitCleanupService.js @@ -138,12 +138,12 @@ class RateLimitCleanupService { const accounts = await openaiAccountService.getAllAccounts() for (const account of accounts) { - // 检查是否处于限流状态(兼容对象和字符串格式) + const { rateLimitStatus } = account const isRateLimited = - account.rateLimitStatus === 'limited' || - (account.rateLimitStatus && - typeof account.rateLimitStatus === 'object' && - account.rateLimitStatus.status === 'limited') + rateLimitStatus === 'limited' || + (rateLimitStatus && + typeof rateLimitStatus === 'object' && + (rateLimitStatus.status === 'limited' || rateLimitStatus.isRateLimited === true)) if (isRateLimited) { result.checked++