From 2ad5d02468594e477a8d5202efd08300649969d4 Mon Sep 17 00:00:00 2001 From: shaw Date: Mon, 4 Aug 2025 17:35:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Gemini=20=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=8A=9F=E8=83=BD=E7=9A=84=E5=A4=9A=E4=B8=AA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要修复: 1. geminiRoutes.js 主端点现在使用统一调度器(unifiedGeminiScheduler) - 支持模型过滤 - 支持账户调度控制 - 与 Claude 保持一致的调度逻辑 2. 修复 Gemini 账户统计数据获取 - admin 路由现在正确获取 Gemini 账户的使用统计 - 使用 redis.getAccountUsageStats 获取真实数据 - 与 Claude 账户统计逻辑保持一致 这些修复确保了 Gemini 服务的数据统计功能正常工作,包括: - 请求次数统计 - Token 使用量统计 - 模型级别的统计数据 - API Keys 页面和账户管理页面的数据显示 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/routes/admin.js | 30 +++++++++++++++++++++++------- src/routes/geminiRoutes.js | 27 +++++++++++++++++++++------ 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/routes/admin.js b/src/routes/admin.js index a57572ec..45746eb5 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1423,13 +1423,29 @@ router.get('/gemini-accounts', authenticateAdmin, async (req, res) => { try { const accounts = await geminiAccountService.getAllAccounts(); - // 为Gemini账户添加空的使用统计(暂时) - const accountsWithStats = accounts.map(account => ({ - ...account, - usage: { - daily: { tokens: 0, requests: 0, allTokens: 0 }, - total: { tokens: 0, requests: 0, allTokens: 0 }, - averages: { rpm: 0, tpm: 0 } + // 为每个账户添加使用统计信息(与Claude账户相同的逻辑) + const accountsWithStats = await Promise.all(accounts.map(async (account) => { + try { + const usageStats = await redis.getAccountUsageStats(account.id); + return { + ...account, + usage: { + daily: usageStats.daily, + total: usageStats.total, + averages: usageStats.averages + } + }; + } catch (statsError) { + logger.warn(`⚠️ Failed to get usage stats for Gemini account ${account.id}:`, statsError.message); + // 如果获取统计失败,返回空统计 + return { + ...account, + usage: { + daily: { tokens: 0, requests: 0, allTokens: 0 }, + total: { tokens: 0, requests: 0, allTokens: 0 }, + averages: { rpm: 0, tpm: 0 } + } + }; } })); diff --git a/src/routes/geminiRoutes.js b/src/routes/geminiRoutes.js index c92b5a48..eefc48a9 100644 --- a/src/routes/geminiRoutes.js +++ b/src/routes/geminiRoutes.js @@ -66,16 +66,31 @@ router.post('/messages', authenticateApiKey, async (req, res) => { // 生成会话哈希用于粘性会话 const sessionHash = generateSessionHash(req); - // 选择可用的 Gemini 账户 - const account = await geminiAccountService.selectAvailableAccount( - apiKeyData.id, - sessionHash - ); + // 使用统一调度选择可用的 Gemini 账户(传递请求的模型) + let accountId; + try { + const schedulerResult = await unifiedGeminiScheduler.selectAccountForApiKey( + apiKeyData, + sessionHash, + model // 传递请求的模型进行过滤 + ); + accountId = schedulerResult.accountId; + } catch (error) { + logger.error('Failed to select Gemini account:', error); + return res.status(503).json({ + error: { + message: error.message || 'No available Gemini accounts', + type: 'service_unavailable' + } + }); + } + // 获取账户详情 + const account = await geminiAccountService.getAccount(accountId); if (!account) { return res.status(503).json({ error: { - message: 'No available Gemini accounts', + message: 'Selected account not found', type: 'service_unavailable' } });