Skip to content

Commit 532e0db

Browse files
committed
LLM-25262 Account for cached input tokens separately
1 parent 4a4748d commit 532e0db

4 files changed

Lines changed: 15 additions & 6 deletions

File tree

src/CodexCommands.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,9 @@ export class CodexCommands {
245245
}
246246
const total = this.formatTokenCount(usage.totalTokens);
247247
const input = this.formatTokenCount(usage.inputTokens);
248+
const cachedInput = this.formatTokenCount(usage.cachedInputTokens);
248249
const output = this.formatTokenCount(usage.outputTokens);
249-
return `${total} total (${input} input + ${output} output)`;
250+
return `${total} total (${input} input + ${cachedInput} cached input, ${output} output)`;
250251
}
251252

252253
private formatContextWindow(usage: TokenCount | null, contextWindow: number | null): string {

src/TokenCount.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ import type {TokenUsageBreakdown} from "./app-server/v2";
33
/**
44
* Token usage information for a turn.
55
* This interface decouples our API from Codex's internal types.
6+
*
7+
* [totalTokens]: total number of tokens used (the sum of all other fields)
8+
* [inputTokens]: number of non-cached input tokens
9+
* [cachedInputTokens]: number of cached input tokens
10+
* [outputTokens]: number of output tokens (including reasoning output tokens)
11+
* [reasoningOutputTokens]: number of reasoning output tokens
612
*/
713
export interface TokenCount {
814
totalTokens: number;
@@ -15,11 +21,13 @@ export interface TokenCount {
1521
/**
1622
* Maps Codex's TokenUsageBreakdown to our TokenCount interface.
1723
* This explicit mapping ensures compile-time errors if Codex changes their types.
24+
* Note: Codex includes cached input tokens in the input token count, so they are subtracted here.
1825
*/
1926
export function toTokenCount(usage: TokenUsageBreakdown): TokenCount {
27+
2028
return {
2129
totalTokens: usage.totalTokens,
22-
inputTokens: usage.inputTokens,
30+
inputTokens: usage.inputTokens - usage.cachedInputTokens,
2331
cachedInputTokens: usage.cachedInputTokens,
2432
outputTokens: usage.outputTokens,
2533
reasoningOutputTokens: usage.reasoningOutputTokens,

src/__tests__/CodexACPAgent/data/token-usage-end-turn.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"quota": {
55
"token_count": {
66
"totalTokens": 2500,
7-
"inputTokens": 2000,
7+
"inputTokens": 1500,
88
"cachedInputTokens": 500,
99
"outputTokens": 450,
1010
"reasoningOutputTokens": 50
@@ -14,7 +14,7 @@
1414
"model": "model-id",
1515
"token_count": {
1616
"totalTokens": 2500,
17-
"inputTokens": 2000,
17+
"inputTokens": 1500,
1818
"cachedInputTokens": 500,
1919
"outputTokens": 450,
2020
"reasoningOutputTokens": 50

src/__tests__/CodexACPAgent/data/token-usage-multiple-updates.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"quota": {
55
"token_count": {
66
"totalTokens": 1500,
7-
"inputTokens": 1200,
7+
"inputTokens": 700,
88
"cachedInputTokens": 500,
99
"outputTokens": 200,
1010
"reasoningOutputTokens": 100
@@ -14,7 +14,7 @@
1414
"model": "model-id",
1515
"token_count": {
1616
"totalTokens": 1500,
17-
"inputTokens": 1200,
17+
"inputTokens": 700,
1818
"cachedInputTokens": 500,
1919
"outputTokens": 200,
2020
"reasoningOutputTokens": 100

0 commit comments

Comments
 (0)