diff --git a/src/services/bedrockRelayService.js b/src/services/bedrockRelayService.js index 81a6d3a7..bd8bc3d3 100644 --- a/src/services/bedrockRelayService.js +++ b/src/services/bedrockRelayService.js @@ -136,12 +136,12 @@ class BedrockRelayService { } } - const modelId = this._selectModel(requestBody, bedrockAccount) + const { modelId, isLongContext } = this._selectModel(requestBody, bedrockAccount) const region = this._selectRegion(modelId, bedrockAccount) const client = this._getBedrockClient(region, bedrockAccount) // 转换请求格式为Bedrock格式 - const bedrockPayload = this._convertToBedrockFormat(requestBody) + const bedrockPayload = this._convertToBedrockFormat(requestBody, { isLongContext }) const command = new InvokeModelCommand({ modelId, @@ -277,12 +277,12 @@ class BedrockRelayService { } } - const modelId = this._selectModel(requestBody, bedrockAccount) + const { modelId, isLongContext } = this._selectModel(requestBody, bedrockAccount) const region = this._selectRegion(modelId, bedrockAccount) const client = this._getBedrockClient(region, bedrockAccount) // 转换请求格式为Bedrock格式 - const bedrockPayload = this._convertToBedrockFormat(requestBody) + const bedrockPayload = this._convertToBedrockFormat(requestBody, { isLongContext }) const command = new InvokeModelWithResponseStreamCommand({ modelId, @@ -399,6 +399,7 @@ class BedrockRelayService { } // 选择使用的模型 + // Returns { modelId, isLongContext } _selectModel(requestBody, bedrockAccount) { let selectedModel @@ -420,15 +421,18 @@ class BedrockRelayService { logger.info(`🎯 使用系统默认模型: ${selectedModel}`, { metadata: { source: 'default' } }) } + // Detect [1m] long context variant before mapping + const isLongContext = selectedModel.includes('[1m]') + // 如果是标准Claude模型名,需要映射为Bedrock格式 const bedrockModel = this._mapToBedrockModel(selectedModel) - if (bedrockModel !== selectedModel) { + if (bedrockModel !== selectedModel.replace(/\[1m\]$/, '')) { logger.info(`🔄 模型映射: ${selectedModel} → ${bedrockModel}`, { - metadata: { originalModel: selectedModel, bedrockModel } + metadata: { originalModel: selectedModel, bedrockModel, isLongContext } }) } - return bedrockModel + return { modelId: bedrockModel, isLongContext } } // 将标准Claude模型名映射为Bedrock格式 @@ -546,13 +550,23 @@ class BedrockRelayService { } // 转换Claude格式请求到Bedrock格式 - _convertToBedrockFormat(requestBody) { + _convertToBedrockFormat(requestBody, { isLongContext = false } = {}) { const bedrockPayload = { anthropic_version: 'bedrock-2023-05-31', max_tokens: Math.min(requestBody.max_tokens || this.maxOutputTokens, this.maxOutputTokens), messages: requestBody.messages || [] } + // Enable 1M context window beta when [1m] model variant is requested + if (isLongContext) { + bedrockPayload.anthropic_beta = [ + ...(requestBody.anthropic_beta || []), + 'context-1m-2025-08-07' + ] + } else if (requestBody.anthropic_beta) { + bedrockPayload.anthropic_beta = requestBody.anthropic_beta + } + // 添加系统提示词 if (requestBody.system) { bedrockPayload.system = requestBody.system