From f851ac8bb2087461696debe5d2779d21f8a469fb Mon Sep 17 00:00:00 2001 From: hex2077 Date: Sat, 13 Dec 2025 00:45:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(provider-pool):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E8=80=85=E4=BD=BF=E7=94=A8=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E5=92=8C=E5=81=A5=E5=BA=B7=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新提供者使用计数时增加最后使用时间记录 修复流式请求和一元请求成功后的使用计数更新 移除不必要的模型映射和配置 调整服务选择时跳过使用计数的逻辑 --- src/claude/claude-kiro.js | 4 +--- src/common.js | 23 ++++++++++++++++++++--- src/ollama-handler.js | 4 ++-- src/provider-models.js | 5 ++--- src/provider-pool-manager.js | 3 +++ src/service-manager.js | 2 +- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/claude/claude-kiro.js b/src/claude/claude-kiro.js index bce1a17..5843c6a 100644 --- a/src/claude/claude-kiro.js +++ b/src/claude/claude-kiro.js @@ -35,9 +35,7 @@ const FULL_MODEL_MAPPING = { "claude-sonnet-4-5": "CLAUDE_SONNET_4_5_20250929_V1_0", "claude-sonnet-4-5-20250929": "CLAUDE_SONNET_4_5_20250929_V1_0", "claude-sonnet-4-20250514": "CLAUDE_SONNET_4_20250514_V1_0", - "claude-3-7-sonnet-20250219": "CLAUDE_3_7_SONNET_20250219_V1_0", - "amazonq-claude-sonnet-4-20250514": "CLAUDE_SONNET_4_20250514_V1_0", - "amazonq-claude-3-7-sonnet-20250219": "CLAUDE_3_7_SONNET_20250219_V1_0" + "claude-3-7-sonnet-20250219": "CLAUDE_3_7_SONNET_20250219_V1_0" }; // 只保留 KIRO_MODELS 中存在的模型映射 diff --git a/src/common.js b/src/common.js index 2925147..adcfe6a 100644 --- a/src/common.js +++ b/src/common.js @@ -233,9 +233,17 @@ export async function handleStreamRequest(res, service, model, requestBody, from // console.log(`data: ${JSON.stringify(getOpenAIStreamChunkStop(model))}\n`); } + // 流式请求成功完成,统计使用次数,错误次数重置为0 + if (providerPoolManager && pooluuid) { + console.log(`[Provider Pool] Increasing usage count for ${toProvider} (${pooluuid}) after successful stream request`); + providerPoolManager.markProviderHealthy(toProvider, { + uuid: pooluuid + }); + } + } catch (error) { console.error('\n[Server] Error during stream processing:', error.stack); - if (providerPoolManager) { + if (providerPoolManager && pooluuid) { console.log(`[Provider Pool] Marking ${toProvider} as unhealthy due to stream error`); // 如果是号池模式,并且请求处理失败,则标记当前使用的提供者为不健康 providerPoolManager.markProviderUnhealthy(toProvider, { @@ -279,9 +287,18 @@ export async function handleUnaryRequest(res, service, model, requestBody, fromP await handleUnifiedResponse(res, JSON.stringify(clientResponse), false); await logConversation('output', responseText, PROMPT_LOG_MODE, PROMPT_LOG_FILENAME); // fs.writeFile('oldResponse'+Date.now()+'.json', JSON.stringify(clientResponse)); + + // 一元请求成功完成,统计使用次数,错误次数重置为0 + if (providerPoolManager && pooluuid) { + console.log(`[Provider Pool] Increasing usage count for ${toProvider} (${pooluuid}) after successful unary request`); + providerPoolManager.markProviderHealthy(toProvider, { + uuid: pooluuid + }); + } } catch (error) { console.error('\n[Server] Error during unary processing:', error.stack); - if (providerPoolManager) { + if (providerPoolManager && pooluuid) { + console.log(`[Provider Pool] Marking ${toProvider} as unhealthy due to stream error`); // 如果是号池模式,并且请求处理失败,则标记当前使用的提供者为不健康 providerPoolManager.markProviderUnhealthy(toProvider, { uuid: pooluuid @@ -398,7 +415,7 @@ export async function handleContentGenerationRequest(req, res, service, endpoint // 注意:这里使用 skipUsageCount: true,因为初次选择时已经增加了 usageCount if (providerPoolManager && CONFIG.providerPools && CONFIG.providerPools[CONFIG.MODEL_PROVIDER]) { const { getApiService } = await import('./service-manager.js'); - service = await getApiService(CONFIG, model, { skipUsageCount: true }); + service = await getApiService(CONFIG, model); console.log(`[Content Generation] Re-selected service adapter based on model: ${model}`); } diff --git a/src/ollama-handler.js b/src/ollama-handler.js index b2b2eca..d427e97 100644 --- a/src/ollama-handler.js +++ b/src/ollama-handler.js @@ -505,7 +505,7 @@ export async function handleOllamaChat(req, res, apiService, currentConfig, prov if (detectedProvider !== currentConfig.MODEL_PROVIDER && providerPoolManager) { // Select provider from pool - const providerConfig = providerPoolManager.selectProvider(detectedProvider, modelName); + const providerConfig = providerPoolManager.selectProvider(detectedProvider, modelName, { skipUsageCount: true }); if (providerConfig) { actualConfig = { ...currentConfig, @@ -601,7 +601,7 @@ export async function handleOllamaGenerate(req, res, apiService, currentConfig, if (detectedProvider !== currentConfig.MODEL_PROVIDER && providerPoolManager) { // Select provider from pool - const providerConfig = providerPoolManager.selectProvider(detectedProvider, modelName); + const providerConfig = providerPoolManager.selectProvider(detectedProvider, modelName, { skipUsageCount: true }); if (providerConfig) { actualConfig = { ...currentConfig, diff --git a/src/provider-models.js b/src/provider-models.js index f2de251..4f3ed77 100644 --- a/src/provider-models.js +++ b/src/provider-models.js @@ -23,13 +23,12 @@ export const PROVIDER_MODELS = { 'claude-custom': [], 'claude-kiro-oauth': [ 'claude-opus-4-5', + 'claude-opus-4-5-20251101', 'claude-haiku-4-5', 'claude-sonnet-4-5', 'claude-sonnet-4-5-20250929', 'claude-sonnet-4-20250514', - 'claude-3-7-sonnet-20250219', - 'amazonq-claude-sonnet-4-20250514', - 'amazonq-claude-3-7-sonnet-20250219' + 'claude-3-7-sonnet-20250219' ], 'openai-custom': [], 'openaiResponses-custom': [], diff --git a/src/provider-pool-manager.js b/src/provider-pool-manager.js index 106ec84..119ca42 100644 --- a/src/provider-pool-manager.js +++ b/src/provider-pool-manager.js @@ -231,6 +231,9 @@ export class ProviderPoolManager { // 只有在明确要求重置使用计数时才重置 if (resetUsageCount) { provider.config.usageCount = 0; + }else{ + provider.config.usageCount++; + provider.config.lastUsed = new Date().toISOString(); } this._log('info', `Marked provider as healthy: ${provider.config.uuid} for type ${providerType}${resetUsageCount ? ' (usage count reset)' : ''}`); diff --git a/src/service-manager.js b/src/service-manager.js index 9677cd6..0440284 100644 --- a/src/service-manager.js +++ b/src/service-manager.js @@ -220,7 +220,7 @@ 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, options); + const selectedProviderConfig = providerPoolManager.selectProvider(config.MODEL_PROVIDER, requestedModel, { skipUsageCount: true }); if (selectedProviderConfig) { // 合并选中的提供者配置到当前请求的 config 中 serviceConfig = deepmerge(config, selectedProviderConfig);