From f1a2b2eba4e711fb83966143efd604ab9397eab8 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 19 Jun 2025 10:32:14 -0400 Subject: [PATCH] support token caching for anthropic via openrouter --- packages/opencode/src/provider/transform.ts | 24 +++++++++++++++++ packages/opencode/src/session/index.ts | 29 ++++++--------------- 2 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 packages/opencode/src/provider/transform.ts diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts new file mode 100644 index 00000000..e2bbe92e --- /dev/null +++ b/packages/opencode/src/provider/transform.ts @@ -0,0 +1,24 @@ +import type { CoreMessage } from "ai" + +export namespace ProviderTransform { + export function message( + msg: CoreMessage, + index: number, + providerID: string, + modelID: string, + ) { + if ( + (providerID === "anthropic" || modelID.includes("anthropic")) && + index < 4 + ) { + msg.providerOptions = { + ...msg.providerOptions, + anthropic: { + cacheControl: { type: "ephemeral" }, + }, + } + } + + return msg + } +} diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 6262bba0..199d1d9a 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -32,6 +32,7 @@ import { Flag } from "../flag/flag" import type { ModelsDev } from "../provider/models" import { Installation } from "../installation" import { Config } from "../config/config" +import { ProviderTransform } from "../provider/transform" export namespace Session { const log = Log.create({ service: "session" }) @@ -266,15 +267,6 @@ export namespace Session { (x): CoreMessage => ({ role: "system", content: x, - providerOptions: { - ...(input.providerID === "anthropic" - ? { - anthropic: { - cacheControl: { type: "ephemeral" }, - }, - } - : {}), - }, }), ), ...convertToCoreMessages([ @@ -284,7 +276,9 @@ export namespace Session { parts: toParts(input.parts), }, ]), - ], + ].map((msg, i) => + ProviderTransform.message(msg, i, input.providerID, input.modelID), + ), model: model.language, }) .then((result) => { @@ -515,24 +509,17 @@ export namespace Session { maxSteps: 1000, messages: [ ...system.map( - (x, index): CoreMessage => ({ + (x): CoreMessage => ({ role: "system", content: x, - providerOptions: { - ...(input.providerID === "anthropic" && index < 4 - ? { - anthropic: { - cacheControl: { type: "ephemeral" }, - }, - } - : {}), - }, }), ), ...convertToCoreMessages( msgs.map(toUIMessage).filter((x) => x.parts.length > 0), ), - ], + ].map((msg, i) => + ProviderTransform.message(msg, i, input.providerID, input.modelID), + ), temperature: model.info.temperature ? 0 : undefined, tools: { ...tools,