diff --git a/src/services/apiKeyService.js b/src/services/apiKeyService.js index 6b80eaff..d696a623 100644 --- a/src/services/apiKeyService.js +++ b/src/services/apiKeyService.js @@ -108,6 +108,14 @@ class ApiKeyService { logger.api(`🔓 API key validated successfully: ${keyData.id}`); + // 解析限制模型数据 + let restrictedModels = []; + try { + restrictedModels = keyData.restrictedModels ? JSON.parse(keyData.restrictedModels) : []; + } catch (e) { + restrictedModels = []; + } + return { valid: true, keyData: { @@ -115,7 +123,9 @@ class ApiKeyService { name: keyData.name, claudeAccountId: keyData.claudeAccountId, tokenLimit: parseInt(keyData.tokenLimit), - concurrencyLimit: parseInt(keyData.concurrencyLimit || 0), + concurrencyLimit: parseInt(keyData.concurrencyLimit || 0), + enableModelRestriction: keyData.enableModelRestriction === 'true', + restrictedModels: restrictedModels, usage } }; diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index f9091757..67179f2b 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -22,9 +22,19 @@ class ClaudeRelayService { let upstreamRequest = null; try { + // 调试日志:查看API Key数据 + logger.info(`🔍 API Key data received:`, { + apiKeyName: apiKeyData.name, + enableModelRestriction: apiKeyData.enableModelRestriction, + restrictedModels: apiKeyData.restrictedModels, + requestedModel: requestBody.model + }); + // 检查模型限制 if (apiKeyData.enableModelRestriction && apiKeyData.restrictedModels && apiKeyData.restrictedModels.length > 0) { const requestedModel = requestBody.model; + logger.info(`🔒 Model restriction check - Requested model: ${requestedModel}, Restricted models: ${JSON.stringify(apiKeyData.restrictedModels)}`); + if (requestedModel && apiKeyData.restrictedModels.includes(requestedModel)) { logger.warn(`🚫 Model restriction violation for key ${apiKeyData.name}: Attempted to use restricted model ${requestedModel}`); return { @@ -437,9 +447,19 @@ class ClaudeRelayService { // 🌊 处理流式响应(带usage数据捕获) async relayStreamRequestWithUsageCapture(requestBody, apiKeyData, responseStream, clientHeaders, usageCallback) { try { + // 调试日志:查看API Key数据(流式请求) + logger.info(`🔍 [Stream] API Key data received:`, { + apiKeyName: apiKeyData.name, + enableModelRestriction: apiKeyData.enableModelRestriction, + restrictedModels: apiKeyData.restrictedModels, + requestedModel: requestBody.model + }); + // 检查模型限制 if (apiKeyData.enableModelRestriction && apiKeyData.restrictedModels && apiKeyData.restrictedModels.length > 0) { const requestedModel = requestBody.model; + logger.info(`🔒 [Stream] Model restriction check - Requested model: ${requestedModel}, Restricted models: ${JSON.stringify(apiKeyData.restrictedModels)}`); + if (requestedModel && apiKeyData.restrictedModels.includes(requestedModel)) { logger.warn(`🚫 Model restriction violation for key ${apiKeyData.name}: Attempted to use restricted model ${requestedModel}`);