From 85f2ef2c1ac73b9c3bc123aa3968c8fef0cf4734 Mon Sep 17 00:00:00 2001 From: mehmet turac Date: Wed, 2 Sep 2026 11:01:17 +0300 Subject: [PATCH] fix(sdk): use max instead of sum for OpenRouter cost fields usage.cost already includes upstream_inference_cost on non-BYOK routes, so summing them double-counts the upstream component. Use Math.max to pick the correct value for both BYOK (cost=0, upstream>0) and normal (cost>upstream) routes. Fixes #1164 --- sdk/src/impl/__tests__/usage-receipts.test.ts | 3 ++- sdk/src/impl/llm.ts | 20 +++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/sdk/src/impl/__tests__/usage-receipts.test.ts b/sdk/src/impl/__tests__/usage-receipts.test.ts index 7e4bba3b96..fb452891d7 100644 --- a/sdk/src/impl/__tests__/usage-receipts.test.ts +++ b/sdk/src/impl/__tests__/usage-receipts.test.ts @@ -103,7 +103,8 @@ describe('stream usage receipts', () => { }, ]) expect(costs).toHaveLength(1) - expect(costs[0]).toBeGreaterThan(0) + // max(0.01, 0.02) * 1.055 * 100 = 2.11, rounded to 2 + expect(costs[0]).toBe(2) expect(callbackOrder).toEqual(['usage', 'cost']) }) diff --git a/sdk/src/impl/llm.ts b/sdk/src/impl/llm.ts index 2ce4cdb443..98d20b20a8 100644 --- a/sdk/src/impl/llm.ts +++ b/sdk/src/impl/llm.ts @@ -392,8 +392,10 @@ export async function* promptAiSdkStream( | OpenRouterUsageAccounting | undefined const costOverrideDollars = openrouterUsage - ? (openrouterUsage.cost ?? 0) + - (openrouterUsage.costDetails?.upstreamInferenceCost ?? 0) + ? Math.max( + openrouterUsage.cost ?? 0, + openrouterUsage.costDetails?.upstreamInferenceCost ?? 0, + ) : undefined if (!params.onCostCalculated || !costOverrideDollars) return costReported = true @@ -732,9 +734,10 @@ export async function promptAiSdk( const openrouterUsage = providerMetadata.codebuff .usage as OpenRouterUsageAccounting - costOverrideDollars = - (openrouterUsage.cost ?? 0) + - (openrouterUsage.costDetails?.upstreamInferenceCost ?? 0) + costOverrideDollars = Math.max( + openrouterUsage.cost ?? 0, + openrouterUsage.costDetails?.upstreamInferenceCost ?? 0, + ) } } @@ -803,9 +806,10 @@ export async function promptAiSdkStructured( const openrouterUsage = providerMetadata.codebuff .usage as OpenRouterUsageAccounting - costOverrideDollars = - (openrouterUsage.cost ?? 0) + - (openrouterUsage.costDetails?.upstreamInferenceCost ?? 0) + costOverrideDollars = Math.max( + openrouterUsage.cost ?? 0, + openrouterUsage.costDetails?.upstreamInferenceCost ?? 0, + ) } }