From 024979f3fd7bd570526d69ed56151a8b82530a56 Mon Sep 17 00:00:00 2001 From: Nicholas Hansen Date: Tue, 24 Mar 2026 18:42:20 +0000 Subject: [PATCH] feat(bedrock): Add token caching for any amazon-bedrock provider (#18959) --- packages/opencode/src/provider/transform.ts | 5 ++- .../opencode/test/provider/transform.test.ts | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 8298351ae8..c37a542a64 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -194,7 +194,10 @@ export namespace ProviderTransform { } for (const msg of unique([...system, ...final])) { - const useMessageLevelOptions = model.providerID === "anthropic" || model.providerID.includes("bedrock") + const useMessageLevelOptions = + model.providerID === "anthropic" || + model.providerID.includes("bedrock") || + model.api.npm === "@ai-sdk/amazon-bedrock" const shouldUseContentOptions = !useMessageLevelOptions && Array.isArray(msg.content) && msg.content.length > 0 if (shouldUseContentOptions) { diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 370edeed38..5ed94e27c8 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -1629,6 +1629,43 @@ describe("ProviderTransform.message - claude w/bedrock custom inference profile" }) }) +describe("ProviderTransform.message - bedrock caching with non-bedrock providerID", () => { + test("applies cache options at message level when npm package is amazon-bedrock", () => { + const model = { + id: "aws/us.anthropic.claude-opus-4-6-v1", + providerID: "aws", + api: { + id: "us.anthropic.claude-opus-4-6-v1", + url: "https://bedrock-runtime.us-east-1.amazonaws.com", + npm: "@ai-sdk/amazon-bedrock", + }, + name: "Claude Opus 4.6", + capabilities: {}, + options: {}, + headers: {}, + } as any + + const msgs = [ + { + role: "system", + content: [{ type: "text", text: "You are a helpful assistant" }], + }, + { + role: "user", + content: [{ type: "text", text: "Hello" }], + }, + ] as any[] + + const result = ProviderTransform.message(msgs, model, {}) as any[] + + // Cache should be at the message level and not the content-part level + expect(result[0].providerOptions?.bedrock).toEqual({ + cachePoint: { type: "default" }, + }) + expect(result[0].content[0].providerOptions?.bedrock).toBeUndefined() + }) +}) + describe("ProviderTransform.message - cache control on gateway", () => { const createModel = (overrides: Partial = {}) => ({