diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 3fcdab5238c..a844557255b 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -416,11 +416,24 @@ export namespace Session { metadata: z.custom().optional(), }), (input) => { - const cachedInputTokens = input.usage.cachedInputTokens ?? 0 + const usage = input.usage as LanguageModelUsage + let inputTokens = usage.inputTokens ?? 0 + let cachedInputTokens = usage.cachedInputTokens ?? 0 + + // If input tokens are 0 and anthropic metadata usage exists, try to read from anthropic usage + const anthUsageRec = input.metadata?.["anthropic"]?.["usage"] + if (anthUsageRec) { + const anthUsage = anthUsageRec as Record + if (inputTokens === 0 && anthUsage) { + inputTokens = (anthUsage["input_tokens"] ?? 0) as number + cachedInputTokens = (anthUsage["cache_read_input_tokens"] ?? 0) as number + } + } + const excludesCachedTokens = !!(input.metadata?.["anthropic"] || input.metadata?.["bedrock"]) const adjustedInputTokens = excludesCachedTokens - ? (input.usage.inputTokens ?? 0) - : (input.usage.inputTokens ?? 0) - cachedInputTokens + ? inputTokens + : inputTokens - cachedInputTokens const safe = (value: number) => { if (!Number.isFinite(value)) return 0 return value