From e338fb0e03ffc4d6d80ce2b4bd6d714a2f2d4c08 Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 13 Aug 2025 00:05:03 +0800 Subject: [PATCH 1/5] =?UTF-8?q?Fix:=20Claude=20Console=20=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E9=99=90=E6=B5=81=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/admin-spa/src/components/accounts/AccountForm.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index 86faf2de..06dc62aa 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -1443,8 +1443,7 @@ const form = ref({ return '' })(), userAgent: props.account?.userAgent || '', - enableRateLimit: - props.account?.rateLimitDuration && props.account?.rateLimitDuration > 0 ? true : false, + enableRateLimit: props.account ? (props.account.rateLimitDuration > 0) : true, rateLimitDuration: props.account?.rateLimitDuration || 60, // Bedrock 特定字段 accessKeyId: props.account?.accessKeyId || '', From 171d35f33ef73c6ad8df28bda35c356443796b20 Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 13 Aug 2025 10:36:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?Fix:=20Claude=20Console=20=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E9=99=90=E6=B5=81=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/admin-spa/src/components/accounts/AccountForm.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index 06dc62aa..2618dd1f 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -355,8 +355,8 @@ @@ -529,8 +529,8 @@ @@ -1115,8 +1115,8 @@ @@ -1234,8 +1234,8 @@ @@ -1443,7 +1443,7 @@ const form = ref({ return '' })(), userAgent: props.account?.userAgent || '', - enableRateLimit: props.account ? (props.account.rateLimitDuration > 0) : true, + enableRateLimit: props.account ? props.account.rateLimitDuration > 0 : true, rateLimitDuration: props.account?.rateLimitDuration || 60, // Bedrock 特定字段 accessKeyId: props.account?.accessKeyId || '', From f9e8157e07e4f074a17b05b6afb5fcae267c81d3 Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 13 Aug 2025 11:24:20 +0800 Subject: [PATCH 3/5] =?UTF-8?q?Fix:=20Claude=20Console=20=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E9=99=90=E6=B5=81=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/admin.js | 4 ++-- src/services/claudeConsoleAccountService.js | 12 ++++++++---- src/services/openaiAccountService.js | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/routes/admin.js b/src/routes/admin.js index a72479c7..397c77fe 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1548,7 +1548,7 @@ router.post('/claude-console-accounts', authenticateAdmin, async (req, res) => { priority: priority || 50, supportedModels: supportedModels || [], userAgent, - rateLimitDuration: rateLimitDuration || 60, + rateLimitDuration: (rateLimitDuration !== undefined && rateLimitDuration !== null) ? rateLimitDuration : 60, proxy, accountType: accountType || 'shared' }) @@ -4628,7 +4628,7 @@ router.post('/openai-accounts', authenticateAdmin, async (req, res) => { description: description || '', accountType: accountType || 'shared', priority: priority || 50, - rateLimitDuration: rateLimitDuration || 60, + rateLimitDuration: (rateLimitDuration !== undefined && rateLimitDuration !== null) ? rateLimitDuration : 60, openaiOauth: openaiOauth || {}, accountInfo: accountInfo || {}, proxy: proxy?.enabled diff --git a/src/services/claudeConsoleAccountService.js b/src/services/claudeConsoleAccountService.js index e7385bdd..67d1a23c 100644 --- a/src/services/claudeConsoleAccountService.js +++ b/src/services/claudeConsoleAccountService.js @@ -123,7 +123,7 @@ class ClaudeConsoleAccountService { priority: parseInt(accountData.priority) || 50, supportedModels: JSON.parse(accountData.supportedModels || '[]'), userAgent: accountData.userAgent, - rateLimitDuration: parseInt(accountData.rateLimitDuration) || 60, + rateLimitDuration: (Number.isNaN(parseInt(accountData.rateLimitDuration)) ? 60 : parseInt(accountData.rateLimitDuration)), isActive: accountData.isActive === 'true', proxy: accountData.proxy ? JSON.parse(accountData.proxy) : null, accountType: accountData.accountType || 'shared', @@ -172,7 +172,10 @@ class ClaudeConsoleAccountService { accountData.supportedModels = parsedModels accountData.priority = parseInt(accountData.priority) || 50 - accountData.rateLimitDuration = parseInt(accountData.rateLimitDuration) || 60 + { + const _parsedDuration = parseInt(accountData.rateLimitDuration) + accountData.rateLimitDuration = Number.isNaN(_parsedDuration) ? 60 : _parsedDuration + } accountData.isActive = accountData.isActive === 'true' accountData.schedulable = accountData.schedulable !== 'false' // 默认为true @@ -370,7 +373,7 @@ class ClaudeConsoleAccountService { const minutesSinceRateLimit = (now - rateLimitedAt) / (1000 * 60) // 使用账户配置的限流时间 - const rateLimitDuration = account.rateLimitDuration || 60 + const rateLimitDuration = (typeof account.rateLimitDuration === 'number' && !Number.isNaN(account.rateLimitDuration)) ? account.rateLimitDuration : 60 if (minutesSinceRateLimit >= rateLimitDuration) { await this.removeAccountRateLimit(accountId) @@ -510,7 +513,8 @@ class ClaudeConsoleAccountService { const rateLimitedAt = new Date(accountData.rateLimitedAt) const now = new Date() const minutesSinceRateLimit = Math.floor((now - rateLimitedAt) / (1000 * 60)) - const rateLimitDuration = parseInt(accountData.rateLimitDuration) || 60 + const __parsedDuration = parseInt(accountData.rateLimitDuration) + const rateLimitDuration = Number.isNaN(__parsedDuration) ? 60 : __parsedDuration const minutesRemaining = Math.max(0, rateLimitDuration - minutesSinceRateLimit) return { diff --git a/src/services/openaiAccountService.js b/src/services/openaiAccountService.js index 6d242da1..06a6b919 100644 --- a/src/services/openaiAccountService.js +++ b/src/services/openaiAccountService.js @@ -146,7 +146,7 @@ async function createAccount(accountData) { accountType: accountData.accountType || 'shared', groupId: accountData.groupId || null, priority: accountData.priority || 50, - rateLimitDuration: accountData.rateLimitDuration || 60, + rateLimitDuration: (accountData.rateLimitDuration !== undefined && accountData.rateLimitDuration !== null) ? accountData.rateLimitDuration : 60, // OAuth相关字段(加密存储) idToken: encrypt(oauthData.idToken || ''), accessToken: encrypt(oauthData.accessToken || ''), From ab02acd008b22b357c740af872e8193c15841e49 Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 13 Aug 2025 15:04:47 +0800 Subject: [PATCH 4/5] Prettier format --- src/routes/admin.js | 6 ++++-- src/services/claudeConsoleAccountService.js | 9 +++++++-- src/services/openaiAccountService.js | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/routes/admin.js b/src/routes/admin.js index 397c77fe..b4a3025c 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1548,7 +1548,8 @@ router.post('/claude-console-accounts', authenticateAdmin, async (req, res) => { priority: priority || 50, supportedModels: supportedModels || [], userAgent, - rateLimitDuration: (rateLimitDuration !== undefined && rateLimitDuration !== null) ? rateLimitDuration : 60, + rateLimitDuration: + rateLimitDuration !== undefined && rateLimitDuration !== null ? rateLimitDuration : 60, proxy, accountType: accountType || 'shared' }) @@ -4628,7 +4629,8 @@ router.post('/openai-accounts', authenticateAdmin, async (req, res) => { description: description || '', accountType: accountType || 'shared', priority: priority || 50, - rateLimitDuration: (rateLimitDuration !== undefined && rateLimitDuration !== null) ? rateLimitDuration : 60, + rateLimitDuration: + rateLimitDuration !== undefined && rateLimitDuration !== null ? rateLimitDuration : 60, openaiOauth: openaiOauth || {}, accountInfo: accountInfo || {}, proxy: proxy?.enabled diff --git a/src/services/claudeConsoleAccountService.js b/src/services/claudeConsoleAccountService.js index 67d1a23c..8c43b4b6 100644 --- a/src/services/claudeConsoleAccountService.js +++ b/src/services/claudeConsoleAccountService.js @@ -123,7 +123,9 @@ class ClaudeConsoleAccountService { priority: parseInt(accountData.priority) || 50, supportedModels: JSON.parse(accountData.supportedModels || '[]'), userAgent: accountData.userAgent, - rateLimitDuration: (Number.isNaN(parseInt(accountData.rateLimitDuration)) ? 60 : parseInt(accountData.rateLimitDuration)), + rateLimitDuration: Number.isNaN(parseInt(accountData.rateLimitDuration)) + ? 60 + : parseInt(accountData.rateLimitDuration), isActive: accountData.isActive === 'true', proxy: accountData.proxy ? JSON.parse(accountData.proxy) : null, accountType: accountData.accountType || 'shared', @@ -373,7 +375,10 @@ class ClaudeConsoleAccountService { const minutesSinceRateLimit = (now - rateLimitedAt) / (1000 * 60) // 使用账户配置的限流时间 - const rateLimitDuration = (typeof account.rateLimitDuration === 'number' && !Number.isNaN(account.rateLimitDuration)) ? account.rateLimitDuration : 60 + const rateLimitDuration = + typeof account.rateLimitDuration === 'number' && !Number.isNaN(account.rateLimitDuration) + ? account.rateLimitDuration + : 60 if (minutesSinceRateLimit >= rateLimitDuration) { await this.removeAccountRateLimit(accountId) diff --git a/src/services/openaiAccountService.js b/src/services/openaiAccountService.js index 06a6b919..5e5307ff 100644 --- a/src/services/openaiAccountService.js +++ b/src/services/openaiAccountService.js @@ -146,7 +146,10 @@ async function createAccount(accountData) { accountType: accountData.accountType || 'shared', groupId: accountData.groupId || null, priority: accountData.priority || 50, - rateLimitDuration: (accountData.rateLimitDuration !== undefined && accountData.rateLimitDuration !== null) ? accountData.rateLimitDuration : 60, + rateLimitDuration: + accountData.rateLimitDuration !== undefined && accountData.rateLimitDuration !== null + ? accountData.rateLimitDuration + : 60, // OAuth相关字段(加密存储) idToken: encrypt(oauthData.idToken || ''), accessToken: encrypt(oauthData.accessToken || ''), From 8142c3356a68da75de61e5bf57da466cdb324a7b Mon Sep 17 00:00:00 2001 From: wt Date: Wed, 13 Aug 2025 17:04:47 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Claude=20Conso?= =?UTF-8?q?le=20=E8=B4=A6=E6=88=B7=E9=99=90=E6=B5=81=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E5=BC=80=E5=85=B3=20Lint=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.js | 4 ++-- src/routes/admin.js | 2 -- src/services/openaiAccountService.js | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/app.js b/src/app.js index 9af1a91e..cdebed53 100644 --- a/src/app.js +++ b/src/app.js @@ -269,8 +269,8 @@ class Application { } if (!version) { try { - const packageJson = require('../package.json') - version = packageJson.version + const { version: pkgVersion } = require('../package.json') + version = pkgVersion } catch (error) { version = '1.0.0' } diff --git a/src/routes/admin.js b/src/routes/admin.js index b4a3025c..849d40d6 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -18,7 +18,6 @@ const crypto = require('crypto') const fs = require('fs') const path = require('path') const config = require('../../config/config') -const { v4: uuidv4 } = require('uuid') const router = express.Router() @@ -4612,7 +4611,6 @@ router.post('/openai-accounts', authenticateAdmin, async (req, res) => { proxy, accountType, groupId, - dedicatedApiKeys, rateLimitDuration, priority } = req.body diff --git a/src/services/openaiAccountService.js b/src/services/openaiAccountService.js index 5e5307ff..9fb5006b 100644 --- a/src/services/openaiAccountService.js +++ b/src/services/openaiAccountService.js @@ -3,7 +3,7 @@ const { v4: uuidv4 } = require('uuid') const crypto = require('crypto') const config = require('../../config/config') const logger = require('../utils/logger') -const { maskToken } = require('../utils/tokenMask') +// const { maskToken } = require('../utils/tokenMask') const { logRefreshStart, logRefreshSuccess, @@ -11,7 +11,7 @@ const { logTokenUsage, logRefreshSkipped } = require('../utils/tokenRefreshLogger') -const tokenRefreshService = require('./tokenRefreshService') +// const tokenRefreshService = require('./tokenRefreshService') // 加密相关常量 const ALGORITHM = 'aes-256-cbc' @@ -65,7 +65,7 @@ function decrypt(text) { } // 刷新访问令牌 -async function refreshAccessToken(refreshToken) { +async function refreshAccessToken(_refreshToken) { try { // OpenAI OAuth token 刷新实现 // TODO: 实现具体的 OpenAI OAuth token 刷新逻辑