Skip to content

Commit 8cb2532

Browse files
ryoppippirzv-me
andauthored
fix(codex): price recorded Ultrafast requests at Ultrafast rates (#1989)
* fix(codex): price recorded Ultrafast requests at Ultrafast rates Codex rollouts can record `service_tier: "ultrafast"` in `thread_settings_applied` events, but ccusage left that value unclassified, so with a Standard config fallback those requests were priced at Standard rates. Recognize the recorded tier and track it in its own usage bucket, so the tier stays per request: when a thread switches back to Standard, earlier requests keep their Ultrafast pricing and token totals are unchanged. Ultrafast rates come from OpenAI's API pricing table, which publishes them for GPT-6.1 Sol and GPT-6 Astra only, at exactly 6x Standard for every input, cached input, cache write and output rate, short and long context. The embedded models.dev snapshot's GPT-6.1 Sol Ultrafast entry agrees. Models without a published Ultrafast rate keep Standard pricing. Fixes #1987 Co-authored-by: Razvan Aurariu <[email protected]> * fix(codex): keep Ultrafast through tier merges and model aliases When copied records disagree, prefer Ultrafast over Fast and Flex so a duplicate does not drop its 6x pricing; Standard still wins any conflict. Resolve the Ultrafast multiplier through the same model identity that Standard pricing uses (model aliases and `.`/`@` separator variants), so a recorded `gpt-6-1-sol` gets the published `gpt-6.1-sol` rate instead of falling back to Standard. Document the `ultrafast` service-tier mapping in the adapter README. Co-authored-by: Razvan Aurariu <[email protected]> * fix(pricing): resolve the Ultrafast multiplier with the Standard entry The Ultrafast multiplier was looked up from the recorded model name separately from the Standard rates, so the two could disagree. Provider spellings such as `openai@gpt-6-1-sol` fell back to Standard, and a model aliased to Sol while an exact entry of its own existed (e.g. `gpt-6.1-terra`) was billed Terra rates at Sol's 6x. Store the published Ultrafast multiplier on each `Pricing` entry, as Fast and Flex already are, so one `PricingMap::find`/`find_at` resolution supplies both the Standard rates and the multiplier. Co-authored-by: Razvan Aurariu <[email protected]> * fix(pricing): keep the Ultrafast multiplier for user price overrides Resolve an override's base entry through model aliases, and derive the published Ultrafast multiplier from the override name when no base exists. Load the Ultrafast allowlist alongside the Fast and Flex ones in every loader, including built-in entries, instead of a lazy global. Co-authored-by: Razvan Aurariu <[email protected]> * test(codex): cover Ultrafast across speed policies and duplicate merges Add Ultrafast to the rollout tier table, including forced Standard and Fast overriding recorded Ultrafast usage, and to duplicate-compaction tier merging. Pin that a configured ultrafast tier is not used for unclassified usage, and document that Ultrafast only comes from recorded rollout tiers. Co-authored-by: Razvan Aurariu <[email protected]> * fix(pricing): resolve published speed multipliers for unmatched overrides When a price override has no base entry, take the published Fast, Flex and Ultrafast multipliers for the override name or its alias target, so an alias to a dated Sol name keeps Ultrafast pricing. Document the alias base and the published multiplier defaults. Co-authored-by: Razvan Aurariu <[email protected]> * test(codex): assert duplicate copies land in exactly one tier bucket Co-authored-by: Razvan Aurariu <[email protected]> * fix(pricing): apply target overrides before aliases built from them Pricing overrides arrive in key order, so an alias key sorting before its overridden target was built from the target's pre-override entry. Order overrides by alias dependency depth, which keeps key order for independent entries and cycles. Test the alias-to-dated-target multiplier fallback with only the alias overridden. Co-authored-by: Razvan Aurariu <[email protected]> * docs(config): note that the Ultrafast multiplier cannot be overridden Co-authored-by: Razvan Aurariu <[email protected]> * fix(pricing): order aliases into override cycles after the cycle A capped dependency depth let an alias pointing into an alias cycle tie with the cycle and apply before it. Walk each override's alias chain, detect a revisited key, and sort looping chains after acyclic ones by the links leading into the loop. Restore the pricing_alias doc comment to its function. Co-authored-by: Razvan Aurariu <[email protected]> --------- Co-authored-by: Razvan Aurariu <[email protected]>
1 parent 71e022a commit 8cb2532

15 files changed

Lines changed: 647 additions & 77 deletions

File tree

‎docs/guide/codex/index.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ These views support `--json`, `--compact`, `--offline`, and `--speed auto|standa
5050
- **Per-model grouping** – The active `turn_context` specifies the model for newly counted usage. Replayed parent contexts in current MultiAgent V2 subagent prefixes remain inherited history and do not add model usage to the child. We aggregate tokens per day/month and per model. Sessions lacking model metadata (seen in early September 2025 builds) are skipped.
5151
- **Pricing** – Rates come from LiteLLM's pricing dataset via the shared `LiteLLMPricingFetcher`. Codex's internal review label uses the manually curated, date-based fallback timeline below and remains marked as approximate.
5252
- **Scheduled pricing** – DeepSeek V4 Flash and Pro use each event's timestamp: legacy rates apply before `2026-08-16T16:00:00Z`, and the later rates use UTC weekday peak windows of `01:00–04:00` and `06:00–10:00` (endpoints excluded). Cache creation follows the scheduled input rate.
53-
- **Speed pricing** uses `--speed auto` by default. For rollouts written by Codex CLI 0.144.0 and later, ccusage applies recorded `thread_settings_applied` tier changes chronologically. `priority` and legacy `fast` use Fast pricing, `flex` uses Flex pricing, and `default` or `standard` uses Standard pricing. Unmarked usage falls back to `config.toml` detection. Pass `--speed standard`, `--speed flex`, or `--speed fast` to override every recorded tier. Fast and Flex pricing use model-specific multipliers only when one is available; otherwise, ccusage keeps standard pricing rather than inventing a rate.
53+
- **Speed pricing** uses `--speed auto` by default. For rollouts written by Codex CLI 0.144.0 and later, ccusage applies recorded `thread_settings_applied` tier changes chronologically. `priority` and legacy `fast` use Fast pricing, `ultrafast` uses Ultrafast pricing, `flex` uses Flex pricing, and `default` or `standard` uses Standard pricing. Unmarked usage falls back to `config.toml` detection. Pass `--speed standard`, `--speed flex`, or `--speed fast` to override every recorded tier. Ultrafast pricing applies only to usage recorded with the `ultrafast` tier; there is no `--speed ultrafast` option or `ultrafastMultiplier` pricing override. Fast and Flex pricing use model-specific multipliers only when one is available; otherwise, ccusage keeps standard pricing rather than inventing a rate.
5454
- **Legacy fallback** – Early September 2025 logs that never recorded `turn_context` metadata are still included; the CLI assumes `gpt-5` for pricing so you can review the tokens even though the model tag is missing (the JSON output also marks these rows with `"isFallback": true`).
5555
- **Cost formula** – Non-cached input uses the standard input price; cached input uses the cache-read price (falling back to the input price when missing); and output tokens are billed at the output price. All prices are per million tokens. Reasoning tokens may be shown for reference, but they are part of the output charge and are not billed separately.
5656
- **Totals and reports** – Daily, monthly, and session views display per-model breakdowns, overall totals, and optional JSON for automation.
@@ -68,13 +68,13 @@ When Codex emits a model alias, the CLI automatically resolves it through the Li
6868

6969
## Speed Pricing
7070

71-
By default, `ccusage codex` uses `--speed auto`. Codex CLI 0.144.0 and later can persist `thread_settings_applied` events in session rollouts. ccusage associates each token event with the most recent recognized setting. `service_tier = "priority"` or legacy `"fast"` is Fast, `"flex"` is Flex, and `"default"` or `"standard"` is Standard. This supports sessions that switch modes over time instead of applying one multiplier to the entire day or session.
71+
By default, `ccusage codex` uses `--speed auto`. Codex CLI 0.144.0 and later can persist `thread_settings_applied` events in session rollouts. ccusage associates each token event with the most recent recognized setting. `service_tier = "priority"` or legacy `"fast"` is Fast, `"ultrafast"` is Ultrafast, `"flex"` is Flex, and `"default"` or `"standard"` is Standard. This supports sessions that switch modes over time instead of applying one multiplier to the entire day or session.
7272

73-
Some usage remains unclassified, including older rollouts, saved headless `codex exec --json` output, and startup usage before the first persisted settings event. For only that unclassified portion, auto mode reads `config.toml` from each `CODEX_HOME` root and uses Fast when any root has `service_tier = "priority"` or legacy `service_tier = "fast"`. If no root requests Fast and a root requests `service_tier = "flex"`, it uses Flex. Otherwise it uses Standard. An unsupported recorded tier is also left unclassified rather than inheriting a stale tier. Explicit `--speed standard`, `--speed flex`, and `--speed fast` override all recorded and fallback tiers.
73+
Some usage remains unclassified, including older rollouts, saved headless `codex exec --json` output, and startup usage before the first persisted settings event. For only that unclassified portion, auto mode reads `config.toml` from each `CODEX_HOME` root and uses Fast when any root has `service_tier = "priority"` or legacy `service_tier = "fast"`. If no root requests Fast and a root requests `service_tier = "flex"`, it uses Flex. Otherwise it uses Standard. A configured `service_tier = "ultrafast"` is ignored for unclassified usage, so it stays Standard unless another root requests Fast or Flex. An unsupported recorded tier is also left unclassified rather than inheriting a stale tier. Explicit `--speed standard`, `--speed flex`, and `--speed fast` override all recorded and fallback tiers.
7474

7575
Fallback detection reads the top-level `service_tier` and lets a named profile override it only when `profile = "name"` selects that profile in `config.toml`. Inactive profiles are ignored, and a selected profile without its own tier inherits the top-level setting. If Codex selected a profile through `--profile` or another configuration file, use an explicit `--speed` for unclassified usage because ccusage cannot infer that selection from `config.toml`.
7676

77-
Fast and Flex pricing use model-specific multipliers only when one is published. GPT-5.6 Sol, Terra, and Luna use the [documented 2× API Priority rate](https://learn.chatgpt.com/docs/agent-configuration/speed#fast-mode), and GPT-6 [Astra](https://developers.openai.com/api/docs/models/gpt-6-astra), [Sol](https://developers.openai.com/api/docs/models/gpt-6-sol), and [Luna](https://developers.openai.com/api/docs/models/gpt-6-luna) and GPT-6.1 [Sol](https://developers.openai.com/api/docs/models/gpt-6.1-sol) and [Terra](https://developers.openai.com/api/docs/models/gpt-6.1-terra) use their documented 2× Fast rates. Models listed in OpenAI's [Flex pricing table](https://developers.openai.com/api/docs/pricing) use 0.5× Standard pricing, including dated and provider-qualified names. These are distinct from ChatGPT credit-consumption rates. ccusage's `costUSD` is an API-equivalent estimate, not a ChatGPT credit balance. When a model's Fast or Flex rate is unknown, ccusage reports standard pricing rather than assuming a multiplier, which may underestimate Fast usage or overestimate Flex usage.
77+
Fast and Flex pricing use model-specific multipliers only when one is published. GPT-5.6 Sol, Terra, and Luna use the [documented 2× API Priority rate](https://learn.chatgpt.com/docs/agent-configuration/speed#fast-mode), and GPT-6 [Astra](https://developers.openai.com/api/docs/models/gpt-6-astra), [Sol](https://developers.openai.com/api/docs/models/gpt-6-sol), and [Luna](https://developers.openai.com/api/docs/models/gpt-6-luna) and GPT-6.1 [Sol](https://developers.openai.com/api/docs/models/gpt-6.1-sol) and [Terra](https://developers.openai.com/api/docs/models/gpt-6.1-terra) use their documented 2× Fast rates. Models listed in OpenAI's [Flex pricing table](https://developers.openai.com/api/docs/pricing) use 0.5× Standard pricing, including dated and provider-qualified names. Recorded Ultrafast usage uses the 6× Standard rates in the same table's Ultrafast section, which covers GPT-6.1 Sol and GPT-6 Astra; other models keep Standard pricing for Ultrafast requests. These are distinct from ChatGPT credit-consumption rates. ccusage's `costUSD` is an API-equivalent estimate, not a ChatGPT credit balance. When a model's Fast or Flex rate is unknown, ccusage reports standard pricing rather than assuming a multiplier, which may underestimate Fast usage or overestimate Flex usage.
7878

7979
Use [`pricingOverrides`](/guide/config-files#pricing-overrides) to configure a model's `fastMultiplier` or `flexMultiplier`.
8080

‎docs/guide/config-files.md‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,10 +443,11 @@ Keys in `pricingOverrides` should match the model label reported by ccusage, inc
443443

444444
To find the exact name, run `ccusage <agent> daily --json` and look at the `model` field in the per-row breakdown.
445445
Pi also accepts a bare model name as an override key; that key applies to the default store and any named Pi store using the same model. Use the prefixed label to price one store separately.
446+
If a key has no pricing entry of its own but is a model alias, unspecified fields come from the alias target's entry.
446447

447448
### Supported Fields
448449

449-
All fields are optional. Unspecified fields keep existing values. Without a pricing entry, token rates default to `0.0` and speed multipliers to `1.0`.
450+
All fields are optional. Unspecified fields keep existing values. Without a pricing entry, token rates default to `0.0`, and speed multipliers use the published Fast, Flex, or Ultrafast rate for that model name or its alias target, or `1.0` if none is published.
450451

451452
- `inputCostPerToken`, `outputCostPerToken` — base per-token rates
452453
- `cacheCreationInputTokenCost`, `cacheReadInputTokenCost` — cache pricing
@@ -455,6 +456,8 @@ All fields are optional. Unspecified fields keep existing values. Without a pric
455456
- `fastMultiplier` applies when Codex usage uses Fast pricing.
456457
- `flexMultiplier` applies when Codex usage uses Flex pricing.
457458

459+
The Ultrafast multiplier comes only from published rates and cannot be set in `pricingOverrides`; there is no `ultrafastMultiplier` field.
460+
458461
### Overrides vs Offline Mode
459462

460463
`--offline` and `pricingOverrides` are independent:

‎nix/cargo-artifacts.nix‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ let
8888
lib.optionals (lib.elem "ccusage-core" names) [
8989
(rustRoot + /crates/ccusage-core/src/fast-multiplier-overrides.json)
9090
(rustRoot + /crates/ccusage-core/src/flex-multiplier-overrides.json)
91+
(rustRoot + /crates/ccusage-core/src/ultrafast-multiplier-overrides.json)
9192
]
9293
++ lib.optionals (lib.elem "ccusage-adapter-codex" names) [
9394
(rustRoot + /adapters/codex/src/codex-auto-review-fallbacks.json)

‎package.nix‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ let
2727
|| lib.hasSuffix "/cli-commands.json" path
2828
|| lib.hasSuffix "/fast-multiplier-overrides.json" path
2929
|| lib.hasSuffix "/flex-multiplier-overrides.json" path
30+
|| lib.hasSuffix "/ultrafast-multiplier-overrides.json" path
3031
|| lib.hasSuffix "/models-dev-pricing.json" path
3132
|| lib.hasSuffix "/models-dev-catalog-rules.json" path
3233
|| lib.hasSuffix "/codex-auto-review-fallbacks.json" path;

‎rust/adapters/codex/src/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Relevant speed-setting event in Codex CLI 0.144.0 and later:
3636
- `payload.type === "thread_settings_applied"`
3737
- `payload.thread_settings.service_tier === "priority"` (or legacy `"fast"`) selects Fast.
3838
- `payload.thread_settings.service_tier === "flex"` selects Flex.
39+
- `payload.thread_settings.service_tier === "ultrafast"` selects Ultrafast.
3940
- `payload.thread_settings.service_tier === "default"` selects Standard. Codex Desktop spells the same tier `"standard"`; both appear in the same CLI version, so this is a value mapping and not a version split.
4041
- Token usage inherits the latest recognized setting in the rollout. A settings event without a `service_tier` key leaves the previous tier in place (auto-review threads emit these); a tier that is present but unrecognized clears it so a stale value is not inherited.
4142
- `thread_settings_applied` is not emitted per turn, so short rollouts carry no tier at all and stay unclassified for report policy to resolve.

‎rust/adapters/codex/src/aggregate.rs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,9 @@ fn accumulate_codex_event_into_model_usage(
502502
}
503503
Some(CodexServiceTier::Fast) => Some(&mut timestamped_usage.recorded_fast_usage),
504504
Some(CodexServiceTier::Flex) => Some(&mut timestamped_usage.recorded_flex_usage),
505+
Some(CodexServiceTier::Ultrafast) => {
506+
Some(&mut timestamped_usage.recorded_ultrafast_usage)
507+
}
505508
None => None,
506509
};
507510
if let Some(recorded_usage) = recorded_usage {
@@ -514,6 +517,7 @@ fn accumulate_codex_event_into_model_usage(
514517
Some(CodexServiceTier::Standard) => Some(&mut model_usage.recorded_standard_usage),
515518
Some(CodexServiceTier::Fast) => Some(&mut model_usage.recorded_fast_usage),
516519
Some(CodexServiceTier::Flex) => Some(&mut model_usage.recorded_flex_usage),
520+
Some(CodexServiceTier::Ultrafast) => Some(&mut model_usage.recorded_ultrafast_usage),
517521
None => None,
518522
};
519523
if let Some(recorded_usage) = recorded_usage {
@@ -562,6 +566,7 @@ fn merge_recorded_codex_usage(
562566
CodexServiceTier::Standard => &mut model_usage.recorded_standard_usage,
563567
CodexServiceTier::Fast => &mut model_usage.recorded_fast_usage,
564568
CodexServiceTier::Flex => &mut model_usage.recorded_flex_usage,
569+
CodexServiceTier::Ultrafast => &mut model_usage.recorded_ultrafast_usage,
565570
};
566571
merge_codex_usage_bucket(recorded_usage, usage);
567572

@@ -574,6 +579,7 @@ fn merge_recorded_codex_usage(
574579
CodexServiceTier::Standard => &mut timestamped_usage.recorded_standard_usage,
575580
CodexServiceTier::Fast => &mut timestamped_usage.recorded_fast_usage,
576581
CodexServiceTier::Flex => &mut timestamped_usage.recorded_flex_usage,
582+
CodexServiceTier::Ultrafast => &mut timestamped_usage.recorded_ultrafast_usage,
577583
};
578584
merge_codex_usage_bucket(recorded_usage, usage);
579585
}
@@ -826,6 +832,10 @@ fn merge_codex_model_usage(target: &mut crate::CodexModelUsage, source: crate::C
826832
);
827833
merge_codex_usage_bucket(&mut target.recorded_fast_usage, source.recorded_fast_usage);
828834
merge_codex_usage_bucket(&mut target.recorded_flex_usage, source.recorded_flex_usage);
835+
merge_codex_usage_bucket(
836+
&mut target.recorded_ultrafast_usage,
837+
source.recorded_ultrafast_usage,
838+
);
829839
for (timestamp, usage) in source.timestamped_usage {
830840
let target_usage = target.timestamped_usage.entry(timestamp).or_default();
831841
merge_codex_usage_bucket(&mut target_usage.usage, usage.usage);
@@ -841,6 +851,10 @@ fn merge_codex_model_usage(target: &mut crate::CodexModelUsage, source: crate::C
841851
&mut target_usage.recorded_flex_usage,
842852
usage.recorded_flex_usage,
843853
);
854+
merge_codex_usage_bucket(
855+
&mut target_usage.recorded_ultrafast_usage,
856+
usage.recorded_ultrafast_usage,
857+
);
844858
}
845859
target.is_fallback |= source.is_fallback;
846860
}

‎rust/adapters/codex/src/compaction_tests.rs‎

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ use crate::{
88
load_codex_events_from_directory,
99
parser::visit_codex_session_file,
1010
report::report_from_groups,
11-
types::CodexRawUsage,
11+
types::{
12+
CodexRawUsage,
13+
CodexServiceTier::{Fast, Flex, Standard, Ultrafast},
14+
CodexTokenUsageEvent,
15+
},
1216
};
1317

1418
fn compaction_log(timestamp: &str, model: &str, input_tokens: u64) -> String {
@@ -232,21 +236,58 @@ fn direct_reports_merge_recorded_tiers_of_duplicate_compactions() {
232236
let fixture = fs_fixture!({
233237
"first.jsonl": compaction_log("2026-09-01T00:00:01Z", "gpt-5", 300),
234238
});
235-
let first = load_codex_events_from_directory(fixture.root(), true)
239+
let loaded = load_codex_events_from_directory(fixture.root(), true)
236240
.unwrap()
237241
.remove(0);
238-
let mut duplicate = first.clone();
239-
duplicate.session_id = "copied-session".into();
240-
duplicate.service_tier = Some(crate::CodexServiceTier::Fast);
241-
let groups =
242-
aggregate_events(&[first, duplicate], AgentReportKind::Session, Some("UTC")).unwrap();
243-
assert_eq!(groups.len(), 1);
244-
assert_eq!(
245-
groups["first"].models["gpt-5"]
246-
.recorded_fast_usage
247-
.input_tokens,
248-
300
249-
);
242+
for (first_tier, copy_tier, merged_tier) in [
243+
(None, Fast, Fast),
244+
(None, Ultrafast, Ultrafast),
245+
(Some(Fast), Ultrafast, Ultrafast),
246+
(Some(Ultrafast), Flex, Ultrafast),
247+
(Some(Ultrafast), Standard, Standard),
248+
(Some(Standard), Ultrafast, Standard),
249+
] {
250+
let first = CodexTokenUsageEvent {
251+
service_tier: first_tier,
252+
..loaded.clone()
253+
};
254+
let duplicate = CodexTokenUsageEvent {
255+
session_id: "copied-session".into(),
256+
service_tier: Some(copy_tier),
257+
..loaded.clone()
258+
};
259+
let groups =
260+
aggregate_events(&[first, duplicate], AgentReportKind::Session, Some("UTC")).unwrap();
261+
assert_eq!(groups.len(), 1);
262+
let usage = &groups["first"].models["gpt-5"];
263+
let recorded = [
264+
(Standard, usage.recorded_standard_usage),
265+
(Fast, usage.recorded_fast_usage),
266+
(Flex, usage.recorded_flex_usage),
267+
(Ultrafast, usage.recorded_ultrafast_usage),
268+
];
269+
let input_tokens = |tier| {
270+
recorded
271+
.iter()
272+
.filter(|(recorded_tier, _)| *recorded_tier == tier)
273+
.map(|(_, bucket)| bucket.input_tokens)
274+
.sum::<u64>()
275+
};
276+
assert_eq!(
277+
input_tokens(merged_tier),
278+
300,
279+
"{first_tier:?} + {copy_tier:?}"
280+
);
281+
assert_eq!(
282+
recorded
283+
.iter()
284+
.map(|(_, bucket)| bucket.input_tokens)
285+
.sum::<u64>(),
286+
300,
287+
"{first_tier:?} + {copy_tier:?}"
288+
);
289+
assert_eq!(usage.input_tokens, 300);
290+
}
250291
}
251292

252293
#[test]

0 commit comments

Comments
 (0)