From fdf72d27ec399b3d6b3cedbb6f192dfaa46233fe Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 27 May 2026 08:34:37 +0100 Subject: [PATCH] fix: preserve bedrock plugin region --- extensions/amazon-bedrock/index.test.ts | 30 +++++++++++++++++++ .../amazon-bedrock/register.sync.runtime.ts | 8 +++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/extensions/amazon-bedrock/index.test.ts b/extensions/amazon-bedrock/index.test.ts index 3cc11aedc31..6d24b2e2aaa 100644 --- a/extensions/amazon-bedrock/index.test.ts +++ b/extensions/amazon-bedrock/index.test.ts @@ -478,6 +478,36 @@ describe("amazon-bedrock provider plugin", () => { expect(result).not.toHaveProperty("temperature"); }); + it("uses plugin discovery region when provider URLs do not encode one", async () => { + const provider = await registerSingleProviderPlugin(amazonBedrockPlugin); + const wrapped = provider.wrapStreamFn?.({ + provider: "amazon-bedrock", + modelId: NON_ANTHROPIC_MODEL, + model: { + api: "bedrock-converse-stream", + provider: "amazon-bedrock", + id: NON_ANTHROPIC_MODEL, + baseUrl: "https://bedrock-runtime.internal.example", + }, + config: { + plugins: { + entries: { + "amazon-bedrock": { + config: { discovery: { region: "eu-central-1" } }, + }, + }, + }, + }, + streamFn: spyStreamFn, + } as never); + + const result = wrapped?.(MODEL_DESCRIPTOR, { messages: [] } as never, {}) as + | Record + | undefined; + + expectWrappedResultFields(result, { region: "eu-central-1" }); + }); + it("omits temperature for non-US Bedrock Opus 4.7 regional profiles", async () => { const provider = await registerSingleProviderPlugin(amazonBedrockPlugin); const wrapped = provider.wrapStreamFn?.({ diff --git a/extensions/amazon-bedrock/register.sync.runtime.ts b/extensions/amazon-bedrock/register.sync.runtime.ts index c36bcc8754b..e9229d6cd83 100644 --- a/extensions/amazon-bedrock/register.sync.runtime.ts +++ b/extensions/amazon-bedrock/register.sync.runtime.ts @@ -493,7 +493,8 @@ export function registerAmazonBedrockPlugin(api: OpenClawPluginApi): void { resolveConfigApiKey: ({ env }) => resolveBedrockConfigApiKey(env), ...anthropicByModelReplayHooks, wrapStreamFn: ({ modelId, config, model, streamFn, thinkingLevel, extraParams }) => { - const currentGuardrail = resolveCurrentPluginConfig(config)?.guardrail; + const currentPluginConfig = resolveCurrentPluginConfig(config); + const currentGuardrail = currentPluginConfig?.guardrail; let wrapped = (currentGuardrail?.guardrailIdentifier && currentGuardrail?.guardrailVersion ? createGuardrailWrapStreamFn(baseWrapStreamFn, currentGuardrail)({ modelId, streamFn }) @@ -506,7 +507,10 @@ export function registerAmazonBedrockPlugin(api: OpenClawPluginApi): void { wrapped = createBedrockServiceTierWrapper(wrapped, serviceTier); } - const region = resolveBedrockRegion(config) ?? extractRegionFromBaseUrl(model?.baseUrl); + const region = + resolveBedrockRegion(config) ?? + extractRegionFromBaseUrl(model?.baseUrl) ?? + currentPluginConfig?.discovery?.region; const mayNeedCacheInjection = isBedrockAppInferenceProfile(modelId) && !sharedRuntimeWouldInjectCachePoints(modelId); const shouldOmitTemperature = isOpus47BedrockModelRef(modelId);