From 9f38562237f3ca4e41eb8a04fd776be3f944742e Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2026 21:27:01 -0500 Subject: [PATCH] fix(opencode): include cache writes in ACP usage (#40450) Co-authored-by: Aiden Cline --- packages/opencode/src/acp/service.ts | 2 +- packages/opencode/src/acp/usage.ts | 6 +++++- packages/opencode/test/acp/usage.test.ts | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/acp/service.ts b/packages/opencode/src/acp/service.ts index fe295918978..55fbc9681df 100644 --- a/packages/opencode/src/acp/service.ts +++ b/packages/opencode/src/acp/service.ts @@ -656,7 +656,7 @@ function makeUsageService(sdk: OpencodeClient) { sessionId: params.sessionID, update: { sessionUpdate: "usage_update", - used: message.tokens.input + message.tokens.cache.read, + used: UsageService.contextTokens(message), size, cost: { amount: UsageService.totalSessionCost(messages), currency: "USD" }, }, diff --git a/packages/opencode/src/acp/usage.ts b/packages/opencode/src/acp/usage.ts index 737275768e2..bc17447e614 100644 --- a/packages/opencode/src/acp/usage.ts +++ b/packages/opencode/src/acp/usage.ts @@ -83,6 +83,10 @@ export function messageLoaderFromSDK(sdk: SDK): MessageLoaderInterface { export const messageLoaderLayer = (sdk: SDK) => Layer.succeed(MessageLoader, messageLoaderFromSDK(sdk)) +export function contextTokens(message: AssistantTokenCost): number { + return message.tokens.input + message.tokens.cache.read + message.tokens.cache.write +} + export function buildUsage(message: AssistantTokenCost): Usage { const cachedReadTokens = message.tokens.cache.read const cachedWriteTokens = message.tokens.cache.write @@ -207,7 +211,7 @@ const layer = Layer.effect( sessionId: input.sessionID, update: { sessionUpdate: "usage_update", - used: message.tokens.input + message.tokens.cache.read, + used: contextTokens(message), size, cost: { amount: totalSessionCost(messages), currency: "USD" }, }, diff --git a/packages/opencode/test/acp/usage.test.ts b/packages/opencode/test/acp/usage.test.ts index 06ccfb1f506..e9d3b3c62e3 100644 --- a/packages/opencode/test/acp/usage.test.ts +++ b/packages/opencode/test/acp/usage.test.ts @@ -207,7 +207,7 @@ describe("acp usage", () => { ) }) - it.effect("sends ACP usage_update with context size and cumulative assistant cost", () => { + it.effect("includes cache reads and writes in ACP context usage", () => { const updates: SessionNotification[] = [] return Effect.gen(function* () { const usage = yield* UsageService.Service @@ -222,7 +222,7 @@ describe("acp usage", () => { sessionId: "ses_1", update: { sessionUpdate: "usage_update", - used: 15, + used: 22, size: 128_000, cost: { amount: 3, currency: "USD" }, }, @@ -239,7 +239,7 @@ describe("acp usage", () => { input: 10, output: 20, reasoning: 0, - cache: { read: 5, write: 0 }, + cache: { read: 5, write: 7 }, }, }), ]),