diff options
| author | Dax Raad <[email protected]> | 2025-06-20 22:43:04 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-06-20 22:43:04 -0400 |
| commit | 1684042fb6ca1ff1e9d323469a9d913821b5af2e (patch) | |
| tree | 840ef1f001601fbaedc92c9810d23cf0a6321291 | |
| parent | 59f0004d346e6cc4178c9ed2b8e8a78df8c9b3a9 (diff) | |
| download | opencode-1684042fb6ca1ff1e9d323469a9d913821b5af2e.tar.gz opencode-1684042fb6ca1ff1e9d323469a9d913821b5af2e.zip | |
huge optimization for token usage with anthropic
| -rw-r--r-- | packages/opencode/src/provider/transform.ts | 29 | ||||
| -rw-r--r-- | packages/opencode/src/session/index.ts | 27 |
2 files changed, 35 insertions, 21 deletions
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index e2bbe92ed..95a8faf18 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1,24 +1,25 @@ -import type { CoreMessage } from "ai" +import type { CoreMessage, LanguageModelV1Prompt } from "ai" +import { unique } from "remeda" export namespace ProviderTransform { export function message( - msg: CoreMessage, - index: number, + msgs: LanguageModelV1Prompt, providerID: string, modelID: string, ) { - if ( - (providerID === "anthropic" || modelID.includes("anthropic")) && - index < 4 - ) { - msg.providerOptions = { - ...msg.providerOptions, - anthropic: { - cacheControl: { type: "ephemeral" }, - }, + if (providerID === "anthropic" || modelID.includes("anthropic")) { + const system = msgs.filter((msg) => msg.role === "system").slice(0, 2) + const final = msgs.filter((msg) => msg.role !== "system").slice(-2) + + for (const msg of unique([...system, ...final])) { + msg.providerMetadata = { + ...msg.providerMetadata, + anthropic: { + cacheControl: { type: "ephemeral" }, + }, + } } } - - return msg + return msgs } } diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index db427cb7a..211cbc044 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -14,6 +14,7 @@ import { type CoreMessage, type UIMessage, type ProviderMetadata, + wrapLanguageModel, } from "ai" import { z, ZodSchema } from "zod" import { Decimal } from "decimal.js" @@ -285,9 +286,7 @@ export namespace Session { parts: toParts(input.parts), }, ]), - ].map((msg, i) => - ProviderTransform.message(msg, i, input.providerID, input.modelID), - ), + ], model: model.language, }) .then((result) => { @@ -527,12 +526,26 @@ export namespace Session { ...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: model.info.tool_call === false ? undefined : tools, - model: model.language, + model: wrapLanguageModel({ + model: model.language, + middleware: [ + { + async transformParams(args) { + if (args.type === "stream") { + args.params.prompt = ProviderTransform.message( + args.params.prompt, + input.providerID, + input.modelID, + ) + } + return args.params + }, + }, + ], + }), }) try { for await (const value of result.fullStream) { |
