From 9148913ca417507db9c1c33c85b990119aaaa501 Mon Sep 17 00:00:00 2001 From: shaw Date: Thu, 2 Oct 2025 18:35:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0Oauth=20Claude?= =?UTF-8?q?=E8=B4=A6=E6=88=B7usage=E6=8E=A5=E5=8F=A3=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/admin.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/routes/admin.js b/src/routes/admin.js index 57753a4d..cd79b76f 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -2107,6 +2107,8 @@ router.get('/claude-accounts', authenticateAdmin, async (req, res) => { router.get('/claude-accounts/usage', authenticateAdmin, async (req, res) => { try { const accounts = await redis.getAllClaudeAccounts() + const now = Date.now() + const usageCacheTtlMs = 300 * 1000 // 批量并发获取所有活跃 OAuth 账户的 Usage const usagePromises = accounts.map(async (account) => { @@ -2121,6 +2123,19 @@ router.get('/claude-accounts/usage', authenticateAdmin, async (req, res) => { account.accessToken && account.status === 'active' ) { + // 若快照在 300 秒内更新,直接使用缓存避免频繁请求 + const cachedUsage = claudeAccountService.buildClaudeUsageSnapshot(account) + const lastUpdatedAt = account.claudeUsageUpdatedAt + ? new Date(account.claudeUsageUpdatedAt).getTime() + : 0 + const isCacheFresh = cachedUsage && lastUpdatedAt && now - lastUpdatedAt < usageCacheTtlMs + if (isCacheFresh) { + return { + accountId: account.id, + claudeUsage: cachedUsage + } + } + try { const usageData = await claudeAccountService.fetchOAuthUsage(account.id) if (usageData) {