summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-11-19 14:29:19 -0600
committerAiden Cline <[email protected]>2025-11-19 14:29:19 -0600
commitc472734933afb72db4f31529fd1f03ef1487a6c0 (patch)
tree814bb9121fb30667331085e4eebdbdda11105666
parent9d068c20bb1325056f435a753273acf8cda04b8f (diff)
downloadopencode-c472734933afb72db4f31529fd1f03ef1487a6c0.tar.gz
opencode-c472734933afb72db4f31529fd1f03ef1487a6c0.zip
tweak: make getUsage function handle missing usage data
-rw-r--r--packages/opencode/src/session/index.ts42
1 files changed, 25 insertions, 17 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index a9ab8ea9e..2939db780 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -382,17 +382,23 @@ export namespace Session {
const adjustedInputTokens = excludesCachedTokens
? (input.usage.inputTokens ?? 0)
: (input.usage.inputTokens ?? 0) - cachedInputTokens
+ const safe = (value: number) => {
+ if (!Number.isFinite(value)) return 0
+ return value
+ }
const tokens = {
- input: adjustedInputTokens,
- output: input.usage.outputTokens ?? 0,
- reasoning: input.usage?.reasoningTokens ?? 0,
+ input: safe(adjustedInputTokens),
+ output: safe(input.usage.outputTokens ?? 0),
+ reasoning: safe(input.usage?.reasoningTokens ?? 0),
cache: {
- write: (input.metadata?.["anthropic"]?.["cacheCreationInputTokens"] ??
- // @ts-expect-error
- input.metadata?.["bedrock"]?.["usage"]?.["cacheWriteInputTokens"] ??
- 0) as number,
- read: cachedInputTokens,
+ write: safe(
+ (input.metadata?.["anthropic"]?.["cacheCreationInputTokens"] ??
+ // @ts-expect-error
+ input.metadata?.["bedrock"]?.["usage"]?.["cacheWriteInputTokens"] ??
+ 0) as number,
+ ),
+ read: safe(cachedInputTokens),
},
}
@@ -401,15 +407,17 @@ export namespace Session {
? input.model.cost.context_over_200k
: input.model.cost
return {
- cost: new Decimal(0)
- .add(new Decimal(tokens.input).mul(costInfo?.input ?? 0).div(1_000_000))
- .add(new Decimal(tokens.output).mul(costInfo?.output ?? 0).div(1_000_000))
- .add(new Decimal(tokens.cache.read).mul(costInfo?.cache_read ?? 0).div(1_000_000))
- .add(new Decimal(tokens.cache.write).mul(costInfo?.cache_write ?? 0).div(1_000_000))
- // TODO: update models.dev to have better pricing model, for now:
- // charge reasoning tokens at the same rate as output tokens
- .add(new Decimal(tokens.reasoning).mul(costInfo?.output ?? 0).div(1_000_000))
- .toNumber(),
+ cost: safe(
+ new Decimal(0)
+ .add(new Decimal(tokens.input).mul(costInfo?.input ?? 0).div(1_000_000))
+ .add(new Decimal(tokens.output).mul(costInfo?.output ?? 0).div(1_000_000))
+ .add(new Decimal(tokens.cache.read).mul(costInfo?.cache_read ?? 0).div(1_000_000))
+ .add(new Decimal(tokens.cache.write).mul(costInfo?.cache_write ?? 0).div(1_000_000))
+ // TODO: update models.dev to have better pricing model, for now:
+ // charge reasoning tokens at the same rate as output tokens
+ .add(new Decimal(tokens.reasoning).mul(costInfo?.output ?? 0).div(1_000_000))
+ .toNumber(),
+ ),
tokens,
}
},