Skip to content

Commit 89433ad

Browse files
committed
cost calculation fix
1 parent 24be6b0 commit 89433ad

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

frontend/packages/agent/src/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ app.post("/api/v1/projects/:projectId/sessions/:sessionId/messages", async (c) =
163163
// Accumulate token usage across all message_end events (tool-use loops)
164164
let totalInputTokens = 0;
165165
let totalOutputTokens = 0;
166+
let totalCacheReadTokens = 0;
167+
let totalCacheWriteTokens = 0;
166168
let totalCost = 0;
167169
let responseModel: string | undefined;
168170
let responseProvider: string | undefined;
@@ -200,6 +202,8 @@ app.post("/api/v1/projects/:projectId/sessions/:sessionId/messages", async (c) =
200202
if (usage) {
201203
totalInputTokens += usage.input ?? usage.inputTokens ?? 0;
202204
totalOutputTokens += usage.output ?? usage.outputTokens ?? 0;
205+
totalCacheReadTokens += usage.cacheRead ?? 0;
206+
totalCacheWriteTokens += usage.cacheWrite ?? 0;
203207
totalCost += usage.cost?.total ?? 0;
204208
}
205209
if (msg?.model) responseModel = msg.model;
@@ -237,7 +241,13 @@ app.post("/api/v1/projects/:projectId/sessions/:sessionId/messages", async (c) =
237241
totalCost > 0
238242
? totalCost
239243
: responseModel
240-
? calculateModelCost(responseModel, totalInputTokens, totalOutputTokens)
244+
? calculateModelCost(
245+
responseModel,
246+
totalInputTokens,
247+
totalOutputTokens,
248+
totalCacheReadTokens,
249+
totalCacheWriteTokens,
250+
)
241251
: 0;
242252
const tokenUsage = responseModel
243253
? {

frontend/packages/core/src/llm-providers.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,40 @@ export interface LLMModelDef {
5252
}
5353

5454
/** Pricing table for system models (USD per 1M tokens) */
55-
export const MODEL_PRICING: Record<string, { input: number; output: number }> = {
56-
"claude-opus-4-6": { input: 15, output: 75 },
57-
"claude-sonnet-4-6": { input: 3, output: 15 },
58-
"claude-opus-4-5": { input: 15, output: 75 },
59-
"claude-sonnet-4-5": { input: 3, output: 15 },
60-
"claude-haiku-4-5": { input: 0.8, output: 4 },
61-
"gpt-5": { input: 2, output: 10 },
62-
"gpt-5-mini": { input: 0.4, output: 1.6 },
63-
o3: { input: 2, output: 10 },
64-
"o4-mini": { input: 1.1, output: 4.4 },
55+
export const MODEL_PRICING: Record<
56+
string,
57+
{ input: number; output: number; cacheRead: number; cacheWrite: number }
58+
> = {
59+
// Anthropic: cacheRead = 10% of input, cacheWrite = 125% of input
60+
"claude-opus-4-6": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 },
61+
"claude-sonnet-4-6": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
62+
"claude-opus-4-5": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 },
63+
"claude-sonnet-4-5": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
64+
"claude-haiku-4-5": { input: 0.8, output: 4, cacheRead: 0.08, cacheWrite: 1 },
65+
// OpenAI: cacheRead = 50% of input, no cacheWrite
66+
"gpt-5": { input: 2, output: 10, cacheRead: 1, cacheWrite: 2 },
67+
"gpt-5-mini": { input: 0.4, output: 1.6, cacheRead: 0.2, cacheWrite: 0.4 },
68+
o3: { input: 2, output: 10, cacheRead: 1, cacheWrite: 2 },
69+
"o4-mini": { input: 1.1, output: 4.4, cacheRead: 0.55, cacheWrite: 1.1 },
6570
};
6671

6772
/** Calculate cost in USD given model ID and token counts */
6873
export function calculateModelCost(
6974
modelId: string,
7075
inputTokens: number,
7176
outputTokens: number,
77+
cacheReadTokens: number = 0,
78+
cacheWriteTokens: number = 0,
7279
): number {
7380
const pricing = MODEL_PRICING[modelId];
7481
if (!pricing) return 0;
75-
return (inputTokens * pricing.input + outputTokens * pricing.output) / 1_000_000;
82+
return (
83+
(inputTokens * pricing.input +
84+
outputTokens * pricing.output +
85+
cacheReadTokens * pricing.cacheRead +
86+
cacheWriteTokens * pricing.cacheWrite) /
87+
1_000_000
88+
);
7689
}
7790

7891
// ──────────────────────────────────────────────

0 commit comments

Comments
 (0)