From 369aa59286d9cc0e22dd98bee225b607a26cf4af Mon Sep 17 00:00:00 2001 From: Sanyela Date: Wed, 3 Dec 2025 15:42:11 +0800 Subject: [PATCH] feat: return 400 error when no available provider in pool --- src/common.js | 21 ++++++++++++++++++--- src/service-manager.js | 21 ++++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/common.js b/src/common.js index 38c71bf..e2816d2 100644 --- a/src/common.js +++ b/src/common.js @@ -402,9 +402,24 @@ export async function handleContentGenerationRequest(req, res, service, endpoint // 2.5. 如果使用了提供商池,根据模型重新选择提供商 if (providerPoolManager && CONFIG.providerPools && CONFIG.providerPools[CONFIG.MODEL_PROVIDER]) { - const { getApiService } = await import('./service-manager.js'); - service = await getApiService(CONFIG, model); - console.log(`[Content Generation] Re-selected service adapter based on model: ${model}`); + const { getApiService, NoAvailableProviderError } = await import('./service-manager.js'); + try { + service = await getApiService(CONFIG, model); + console.log(`[Content Generation] Re-selected service adapter based on model: ${model}`); + } catch (error) { + if (error instanceof NoAvailableProviderError) { + // 号池无可用账号,返回 400 错误 + res.writeHead(400, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ + error: { + type: 'no_available_provider', + message: error.message + } + })); + return; + } + throw error; + } } // 3. Apply system prompt from file if configured. diff --git a/src/service-manager.js b/src/service-manager.js index 03ab4f5..e9d4dec 100644 --- a/src/service-manager.js +++ b/src/service-manager.js @@ -56,11 +56,28 @@ export async function initApiService(config) { return serviceInstances; // Return the collection of initialized service instances } +/** + * Custom error class for no available provider in pool + */ +export class NoAvailableProviderError extends Error { + constructor(providerType, requestedModel = null) { + const message = requestedModel + ? `号池无可用账号: ${providerType} (model: ${requestedModel})` + : `号池无可用账号: ${providerType}`; + super(message); + this.name = 'NoAvailableProviderError'; + this.providerType = providerType; + this.requestedModel = requestedModel; + this.statusCode = 400; + } +} + /** * 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. * @returns {Promise} The API service adapter + * @throws {NoAvailableProviderError} If no healthy provider is available in the pool */ export async function getApiService(config, requestedModel = null) { let serviceConfig = config; @@ -74,7 +91,9 @@ export async function getApiService(config, requestedModel = null) { config.uuid = serviceConfig.uuid; console.log(`[API Service] Using pooled configuration for ${config.MODEL_PROVIDER}: ${serviceConfig.uuid}${requestedModel ? ` (model: ${requestedModel})` : ''}`); } else { - console.warn(`[API Service] No healthy provider found in pool for ${config.MODEL_PROVIDER}${requestedModel ? ` supporting model: ${requestedModel}` : ''}. Falling back to main config.`); + // 号池没有可用账号,抛出错误 + console.error(`[API Service] 号池无可用账号: ${config.MODEL_PROVIDER}${requestedModel ? ` (model: ${requestedModel})` : ''}`); + throw new NoAvailableProviderError(config.MODEL_PROVIDER, requestedModel); } } return getServiceAdapter(serviceConfig);