summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-19 10:32:14 -0400
committerDax Raad <[email protected]>2025-06-19 10:32:14 -0400
commitf1a2b2eba4e711fb83966143efd604ab9397eab8 (patch)
tree17e74d362e415c00d3a60256410fa50230296f59
parent4b132656df319d68ac5c88f01fd1bb3dc28f12d8 (diff)
downloadopencode-f1a2b2eba4e711fb83966143efd604ab9397eab8.tar.gz
opencode-f1a2b2eba4e711fb83966143efd604ab9397eab8.zip
support token caching for anthropic via openrouter
-rw-r--r--packages/opencode/src/provider/transform.ts24
-rw-r--r--packages/opencode/src/session/index.ts29
2 files changed, 32 insertions, 21 deletions
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
new file mode 100644
index 000000000..e2bbe92ed
--- /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 6262bba03..199d1d9a8 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,