Skip to content

Commit 44c655f

Browse files
ClaudiaFangclaude
andcommitted
fix(pricing): add OpenAI/Codex model pricing, stop hardcoding cost to $0
Codex CLI sessions always reported $0 estimated cost because estimatedCostUsd was hardcoded in codex.ts, and the shared pricing table had no entries for any OpenAI/GPT model at all. Adds pricing for the current GPT-5.x/Codex, GPT-4.x, and o-series models, and wires codex.ts to actually calculate cost from usage. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent f34caee commit 44c655f

3 files changed

Lines changed: 53 additions & 2 deletions

File tree

cli/src/providers/codex.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as os from 'os';
44
import type { SessionProvider } from './types.js';
55
import type { ParsedSession, ParsedMessage, ToolCall, ToolResult, SessionUsage, MessageUsage } from '../types.js';
66
import { generateTitle, detectSessionCharacter } from '../parser/titles.js';
7+
import { calculateCost } from '../utils/pricing.js';
78

89
/**
910
* OpenAI Codex CLI session provider.
@@ -657,7 +658,14 @@ function buildSession(
657658
totalOutputTokens: totalOutput,
658659
cacheCreationTokens: 0,
659660
cacheReadTokens: totalCached,
660-
estimatedCostUsd: 0, // Codex pricing not public
661+
estimatedCostUsd: calculateCost([{
662+
model: model || 'unknown',
663+
usage: {
664+
input_tokens: totalInput,
665+
output_tokens: totalOutput,
666+
cache_read_input_tokens: totalCached,
667+
},
668+
}]),
661669
modelsUsed: model ? [model] : [],
662670
primaryModel: model || 'unknown',
663671
usageSource: 'jsonl',

cli/src/utils/pricing.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ describe('getModelPricing', () => {
2424
});
2525

2626
it('returns default pricing for unknown model', () => {
27-
const pricing = getModelPricing('gpt-4o-mini');
27+
const pricing = getModelPricing('some-unrecognized-model-xyz');
2828
expect(pricing).toEqual({ input: 3, output: 15 });
2929
});
3030

31+
it('returns exact match for a gpt-5.x codex model', () => {
32+
const pricing = getModelPricing('gpt-5.6-terra');
33+
expect(pricing).toEqual({ input: 2.5, output: 15 });
34+
});
35+
3136
it('returns default pricing for empty string', () => {
3237
const pricing = getModelPricing('');
3338
expect(pricing).toEqual({ input: 3, output: 15 });

cli/src/utils/pricing.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,44 @@ const MODEL_PRICING: Record<string, ModelPricing> = {
4848
'gemini-1.5-flash': { input: 0.075, output: 0.3 },
4949
'gemini-3.1-pro': { input: 3.5, output: 10.5 },
5050
'gemini-3.1-flash': { input: 0.1, output: 0.4 },
51+
52+
// OpenAI GPT-5.x family (incl. Codex CLI models) — longest/most-specific keys first
53+
'gpt-5.6-luna': { input: 1, output: 6 },
54+
'gpt-5.6-sol': { input: 5, output: 30 },
55+
'gpt-5.6-terra': { input: 2.5, output: 15 },
56+
'gpt-5.6': { input: 5, output: 30 }, // alias for gpt-5.6-sol
57+
'gpt-5.5-pro': { input: 30, output: 180 },
58+
'gpt-5.5': { input: 5, output: 30 },
59+
'gpt-5.4-mini': { input: 0.75, output: 4.5 },
60+
'gpt-5.4-nano': { input: 0.2, output: 1.25 },
61+
'gpt-5.4-pro': { input: 30, output: 180 },
62+
'gpt-5.4': { input: 2.5, output: 15 },
63+
'gpt-5.3-codex': { input: 1.75, output: 14 },
64+
'gpt-5.2': { input: 1.75, output: 14 },
65+
'gpt-5.1': { input: 1.25, output: 10 },
66+
'gpt-5-codex': { input: 1.25, output: 10 },
67+
'gpt-5-mini': { input: 0.25, output: 2 },
68+
'gpt-5-nano': { input: 0.05, output: 0.4 },
69+
'gpt-5-pro': { input: 15, output: 120 },
70+
'gpt-5': { input: 1.25, output: 10 },
71+
72+
// OpenAI GPT-4.x family
73+
'gpt-4.1-mini': { input: 0.4, output: 1.6 },
74+
'gpt-4.1-nano': { input: 0.1, output: 0.4 },
75+
'gpt-4.1': { input: 2, output: 8 },
76+
'gpt-4o-mini': { input: 0.15, output: 0.6 },
77+
'gpt-4o': { input: 2.5, output: 10 },
78+
79+
// OpenAI o-series (reasoning models)
80+
'o1-mini': { input: 1.1, output: 4.4 },
81+
'o1-pro': { input: 150, output: 600 },
82+
'o1': { input: 15, output: 60 },
83+
'o3-deep-research': { input: 10, output: 40 },
84+
'o3-mini': { input: 1.1, output: 4.4 },
85+
'o3-pro': { input: 20, output: 80 },
86+
'o3': { input: 2, output: 8 },
87+
'o4-mini-deep-research': { input: 2, output: 8 },
88+
'o4-mini': { input: 1.1, output: 4.4 },
5189
};
5290

5391
// Default fallback pricing (sonnet-level)

0 commit comments

Comments
 (0)