From 211d677d00c509c50fea67ce0de90b1540d6f279 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Thu, 4 Dec 2025 12:53:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(provider):=20=E9=81=BF=E5=85=8D=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=A2=9E=E5=8A=A0provider=E4=BD=BF=E7=94=A8=E8=AE=A1?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当从provider池重新选择服务时跳过usageCount增加,因为初次选择时已经增加过。同时优化token刷新逻辑,合并强制刷新和即将过期的检查条件。 --- src/common.js | 3 ++- src/gemini/antigravity-core.js | 19 ++++++++++--------- src/provider-pool-manager.js | 17 +++++++++-------- src/service-manager.js | 6 ++++-- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/common.js b/src/common.js index f84cf03..2925147 100644 --- a/src/common.js +++ b/src/common.js @@ -395,9 +395,10 @@ export async function handleContentGenerationRequest(req, res, service, endpoint console.log(`[Content Generation] Model: ${model}, Stream: ${isStream}`); // 2.5. 如果使用了提供商池,根据模型重新选择提供商 + // 注意:这里使用 skipUsageCount: true,因为初次选择时已经增加了 usageCount if (providerPoolManager && CONFIG.providerPools && CONFIG.providerPools[CONFIG.MODEL_PROVIDER]) { const { getApiService } = await import('./service-manager.js'); - service = await getApiService(CONFIG, model); + service = await getApiService(CONFIG, model, { skipUsageCount: true }); console.log(`[Content Generation] Re-selected service adapter based on model: ${model}`); } diff --git a/src/gemini/antigravity-core.js b/src/gemini/antigravity-core.js index 04db375..00e93d1 100644 --- a/src/gemini/antigravity-core.js +++ b/src/gemini/antigravity-core.js @@ -249,11 +249,12 @@ export class AntigravityApiService { } async initializeAuth(forceRefresh = false) { - if (this.authClient.credentials.access_token && !forceRefresh) { - // 检查 Token 是否即将过期 - if (!this.isTokenExpiringSoon()) { - return; - } + // 检查是否需要刷新 Token + const needsRefresh = forceRefresh || this.isTokenExpiringSoon(); + + if (this.authClient.credentials.access_token && !needsRefresh) { + // Token 有效且不需要刷新 + return; } // Antigravity 不支持 base64 配置,直接使用文件路径 @@ -265,13 +266,13 @@ export class AntigravityApiService { this.authClient.setCredentials(credentials); console.log('[Antigravity Auth] Authentication configured successfully from file.'); - if (forceRefresh) { - console.log('[Antigravity Auth] Forcing token refresh...'); + if (needsRefresh) { + console.log('[Antigravity Auth] Token expiring soon or force refresh requested. Refreshing token...'); const { credentials: newCredentials } = await this.authClient.refreshAccessToken(); this.authClient.setCredentials(newCredentials); - // 保存刷新后的凭证 + // 保存刷新后的凭证到文件 await fs.writeFile(credPath, JSON.stringify(newCredentials, null, 2)); - console.log('[Antigravity Auth] Token refreshed and saved successfully.'); + console.log(`[Antigravity Auth] Token refreshed and saved to ${credPath} successfully.`); } } catch (error) { console.error('[Antigravity Auth] Error initializing authentication:', error.code); diff --git a/src/provider-pool-manager.js b/src/provider-pool-manager.js index f318c01..f66292a 100644 --- a/src/provider-pool-manager.js +++ b/src/provider-pool-manager.js @@ -98,7 +98,7 @@ export class ProviderPoolManager { * @param {string} [requestedModel] - Optional. The model name to filter providers by. * @returns {object|null} The selected provider's configuration, or null if no healthy provider is found. */ - selectProvider(providerType, requestedModel = null) { + selectProvider(providerType, requestedModel = null, options = {}) { // 参数校验 if (!providerType || typeof providerType !== 'string') { this._log('error', `Invalid providerType: ${providerType}`); @@ -147,14 +147,15 @@ export class ProviderPoolManager { // 更新下次轮询的索引 this.roundRobinIndex[indexKey] = (currentIndex + 1) % availableAndHealthyProviders.length; - // 更新使用信息 - selected.config.lastUsed = new Date().toISOString(); - selected.config.usageCount++; + // 更新使用信息(除非明确跳过) + if (!options.skipUsageCount) { + selected.config.lastUsed = new Date().toISOString(); + selected.config.usageCount++; + // 使用防抖保存 + this._debouncedSave(providerType); + } - this._log('debug', `Selected provider for ${providerType} (round-robin): ${selected.config.uuid}${requestedModel ? ` for model: ${requestedModel}` : ''}`); - - // 使用防抖保存 - this._debouncedSave(providerType); + this._log('debug', `Selected provider for ${providerType} (round-robin): ${selected.config.uuid}${requestedModel ? ` for model: ${requestedModel}` : ''}${options.skipUsageCount ? ' (skip usage count)' : ''}`); return selected.config; } diff --git a/src/service-manager.js b/src/service-manager.js index 03ab4f5..de8dae0 100644 --- a/src/service-manager.js +++ b/src/service-manager.js @@ -60,13 +60,15 @@ export async function initApiService(config) { * Get API service adapter, considering provider pools * @param {Object} config - The current request configuration * @param {string} [requestedModel] - Optional. The model name to filter providers by. + * @param {Object} [options] - Optional. Additional options. + * @param {boolean} [options.skipUsageCount] - Optional. If true, skip incrementing usage count. * @returns {Promise} The API service adapter */ -export async function getApiService(config, requestedModel = null) { +export async function getApiService(config, requestedModel = null, options = {}) { let serviceConfig = config; if (providerPoolManager && config.providerPools && config.providerPools[config.MODEL_PROVIDER]) { // 如果有号池管理器,并且当前模型提供者类型有对应的号池,则从号池中选择一个提供者配置 - const selectedProviderConfig = providerPoolManager.selectProvider(config.MODEL_PROVIDER, requestedModel); + const selectedProviderConfig = providerPoolManager.selectProvider(config.MODEL_PROVIDER, requestedModel, options); if (selectedProviderConfig) { // 合并选中的提供者配置到当前请求的 config 中 serviceConfig = deepmerge(config, selectedProviderConfig);