Skip to content

fix(codex): support 272k tiered pricing for gpt-5.4#882

Open
GrayXu wants to merge 1 commit intoryoppippi:mainfrom
GrayXu:fix/codex-gpt54-tiered-pricing
Open

fix(codex): support 272k tiered pricing for gpt-5.4#882
GrayXu wants to merge 1 commit intoryoppippi:mainfrom
GrayXu:fix/codex-gpt54-tiered-pricing

Conversation

@GrayXu
Copy link

@GrayXu GrayXu commented Mar 8, 2026

Add 272k threshold support to shared LiteLLM pricing parsing and wire Codex cost calculation to use tiered model pricing metadata.

Summary by CodeRabbit

Release Notes

  • New Features
    • Added tiered pricing support, enabling different cost rates above specified token thresholds
    • Models can now configure multiple pricing tiers to optimize costs based on usage levels
    • Pricing system automatically detects and applies tier configurations when available

@coderabbitai
Copy link

coderabbitai bot commented Mar 8, 2026

📝 Walkthrough

Walkthrough

The PR extends tiered pricing support by introducing four optional fields to the ModelPricing type, implementing a tiered pricing configuration system and helper functions in both the codex and internal packages, adding a new calculateTieredCost function for per-token cost calculations, and refactoring existing cost computation logic to use tiered rates when available.

Changes

Cohort / File(s) Summary
Type Definitions
apps/codex/src/_types.ts
Adds four optional fields to ModelPricing: tieredThresholdTokens, inputCostPerMTokenAboveThreshold, cachedInputCostPerMTokenAboveThreshold, and outputCostPerMTokenAboveThreshold.
Codex Pricing Implementation
apps/codex/src/pricing.ts
Introduces TIERED_PRICING_CONFIGS array and getTieredPricing helper to extract tiered pricing metadata from LiteLLMModelPricing. Integrates tiered pricing into CodexPricingSource.getPricing by spreading getTieredPricing result into returned ModelPricing. Includes test coverage for tiered pricing preservation.
Token Cost Utilities
apps/codex/src/token-utils.ts
Adds calculateTieredCost function to compute costs with optional threshold-based rates. Refactors calculateCostUSD to use tiered pricing for non-cached input, cached input, and output tokens, with edge case handling and test coverage for both flat and tiered pricing scenarios.
Internal Pricing Support
packages/internal/src/pricing.ts
Introduces TIERED_PRICING_CONFIGS array with multiple threshold configurations (272k, 200k, 128k), updates LiteLLMModelPricing schema with new tiered fields for 272k threshold, and reworks tier detection logic to dynamically determine applicable configuration. Modifies calculateCostFromPricing and calculateTieredCost to use config-driven field lookups instead of fixed threshold values.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant CodexPricing as CodexPricingSource
    participant TieredHelper as getTieredPricing
    participant LiteLLM as LiteLLM Cache

    Client->>CodexPricing: getPricing(model)
    CodexPricing->>LiteLLM: lookup pricing
    LiteLLM-->>CodexPricing: LiteLLMModelPricing
    CodexPricing->>TieredHelper: getTieredPricing(pricing)
    TieredHelper->>TieredHelper: scan TIERED_PRICING_CONFIGS
    TieredHelper-->>CodexPricing: {tieredThresholdTokens, inputCostPerMTokenAboveThreshold, ...}
    CodexPricing->>CodexPricing: spread tiered fields into ModelPricing
    CodexPricing-->>Client: ModelPricing with tiered fields
Loading
sequenceDiagram
    participant Caller
    participant CostCalc as calculateCostUSD
    participant TieredCost as calculateTieredCost

    Caller->>CostCalc: (tokenCounts, pricing)
    CostCalc->>TieredCost: calculateTieredCost(nonCachedInput, basePriceInput, tieredPriceInput, threshold)
    TieredCost-->>CostCalc: input cost
    CostCalc->>TieredCost: calculateTieredCost(cachedInput, basePriceCache, tieredPriceCache, threshold)
    TieredCost-->>CostCalc: cached input cost
    CostCalc->>TieredCost: calculateTieredCost(outputTokens, basePriceOutput, tieredPriceOutput, threshold)
    TieredCost-->>CostCalc: output cost
    CostCalc->>CostCalc: sum costs
    CostCalc-->>Caller: total USD cost
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Poem

🐰 Thresholds crossed, the tiers ascend,
Where token costs bend and blend,
From codex base to internal cache,
Pricing tiers now flash and flash!
Hopping through configs so divine, 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding support for 272k tiered pricing for gpt-5.4, which aligns with the PR objectives and the core modifications across files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
apps/codex/src/pricing.ts (1)

14-38: Reuse the shared tier config here.

packages/internal/src/pricing.ts now carries the same threshold/field table. Keeping both copies in sync is easy to miss when LiteLLM adds the next tier, and Codex/internal pricing will drift again. Consider exporting a small shared config or lookup helper from @ccusage/internal/pricing and consuming it here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/codex/src/pricing.ts` around lines 14 - 38, Replace the duplicated
TIERED_PRICING_CONFIGS with a single shared source: import the tier table (or a
lookup helper) exported from `@ccusage/internal/pricing` and replace the local
TIERED_PRICING_CONFIGS usage with that import; ensure the imported shape matches
the existing typing (keys like thresholdTokens, inputField, cachedInputField,
outputField and the LiteLLMModelPricing key types) so callers that reference
TIERED_PRICING_CONFIGS continue to work without other changes.
apps/codex/src/token-utils.ts (1)

117-143: Add an exact 272k boundary case.

The new test proves the above-threshold path, but it does not lock down the totalTokens <= thresholdTokens edge in calculateTieredCost. A case at exactly 272_000 would catch off-by-one regressions cheaply.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/codex/src/token-utils.ts` around lines 117 - 143, Add a unit test that
covers the exact boundary where totalTokens === tieredThresholdTokens (272_000)
to prevent off-by-one regressions in the tiered pricing logic; call
calculateCostUSD with input/cached/output values summing to 272_000 and the same
pricing object used in the existing test, compute an expected cost using only
the "below threshold" rates (i.e., do not include any above-threshold
multipliers), and assert cost matches expected with toBeCloseTo; this will
validate calculateTieredCost/calculateCostUSD handles the <= threshold branch
correctly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@apps/codex/src/pricing.ts`:
- Around line 14-38: Replace the duplicated TIERED_PRICING_CONFIGS with a single
shared source: import the tier table (or a lookup helper) exported from
`@ccusage/internal/pricing` and replace the local TIERED_PRICING_CONFIGS usage
with that import; ensure the imported shape matches the existing typing (keys
like thresholdTokens, inputField, cachedInputField, outputField and the
LiteLLMModelPricing key types) so callers that reference TIERED_PRICING_CONFIGS
continue to work without other changes.

In `@apps/codex/src/token-utils.ts`:
- Around line 117-143: Add a unit test that covers the exact boundary where
totalTokens === tieredThresholdTokens (272_000) to prevent off-by-one
regressions in the tiered pricing logic; call calculateCostUSD with
input/cached/output values summing to 272_000 and the same pricing object used
in the existing test, compute an expected cost using only the "below threshold"
rates (i.e., do not include any above-threshold multipliers), and assert cost
matches expected with toBeCloseTo; this will validate
calculateTieredCost/calculateCostUSD handles the <= threshold branch correctly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e383cf4c-0a06-4d08-bafe-42fe4983eb6a

📥 Commits

Reviewing files that changed from the base of the PR and between 0adbb4f and c7d140b.

📒 Files selected for processing (4)
  • apps/codex/src/_types.ts
  • apps/codex/src/pricing.ts
  • apps/codex/src/token-utils.ts
  • packages/internal/src/pricing.ts

Add 272k threshold support to shared LiteLLM pricing parsing and wire Codex cost calculation to use tiered model pricing metadata.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
@GrayXu GrayXu force-pushed the fix/codex-gpt54-tiered-pricing branch from c7d140b to 840316c Compare March 11, 2026 13:23
@coderabbitai
Copy link

coderabbitai bot commented Mar 11, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":401,"request":{"method":"PATCH","url":"https://api.github.com/repos/ryoppippi/ccusage/issues/comments/4019802684","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: failure by coderabbit.ai -->\n\n> [!CAUTION]\n> ## Review failed\n> \n> An error occurred during the review process. Please try again later.\n\n<!-- end of auto-generated comment: failure by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe PR extends tiered pricing support by introducing four optional fields to the ModelPricing type, implementing a tiered pricing configuration system and helper functions in both the codex and internal packages, adding a new calculateTieredCost function for per-token cost calculations, and refactoring existing cost computation logic to use tiered rates when available.\n\n## Changes\n\n| Cohort / File(s) | Summary |\n|---|---|\n| **Type Definitions** <br> `apps/codex/src/_types.ts` | Adds four optional fields to ModelPricing: tieredThresholdTokens, inputCostPerMTokenAboveThreshold, cachedInputCostPerMTokenAboveThreshold, and outputCostPerMTokenAboveThreshold. |\n| **Codex Pricing Implementation** <br> `apps/codex/src/pricing.ts` | Introduces TIERED_PRICING_CONFIGS array and getTieredPricing helper to extract tiered pricing metadata from LiteLLMModelPricing. Integrates tiered pricing into CodexPricingSource.getPricing by spreading getTieredPricing result into returned ModelPricing. Includes test coverage for tiered pricing preservation. |\n| **Token Cost Utilities** <br> `apps/codex/src/token-utils.ts` | Adds calculateTieredCost function to compute costs with optional threshold-based rates. Refactors calculateCostUSD to use tiered pricing for non-cached input, cached input, and output tokens, with edge case handling and test coverage for both flat and tiered pricing scenarios. |\n| **Internal Pricing Support** <br> `packages/internal/src/pricing.ts` | Introduces TIERED_PRICING_CONFIGS array with multiple threshold configurations (272k, 200k, 128k), updates LiteLLMModelPricing schema with new tiered fields for 272k threshold, and reworks tier detection logic to dynamically determine applicable configuration. Modifies calculateCostFromPricing and calculateTieredCost to use config-driven field lookups instead of fixed threshold values. |\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant CodexPricing as CodexPricingSource\n    participant TieredHelper as getTieredPricing\n    participant LiteLLM as LiteLLM Cache\n\n    Client->>CodexPricing: getPricing(model)\n    CodexPricing->>LiteLLM: lookup pricing\n    LiteLLM-->>CodexPricing: LiteLLMModelPricing\n    CodexPricing->>TieredHelper: getTieredPricing(pricing)\n    TieredHelper->>TieredHelper: scan TIERED_PRICING_CONFIGS\n    TieredHelper-->>CodexPricing: {tieredThresholdTokens, inputCostPerMTokenAboveThreshold, ...}\n    CodexPricing->>CodexPricing: spread tiered fields into ModelPricing\n    CodexPricing-->>Client: ModelPricing with tiered fields\n```\n\n```mermaid\nsequenceDiagram\n    participant Caller\n    participant CostCalc as calculateCostUSD\n    participant TieredCost as calculateTieredCost\n\n    Caller->>CostCalc: (tokenCounts, pricing)\n    CostCalc->>TieredCost: calculateTieredCost(nonCachedInput, basePriceInput, tieredPriceInput, threshold)\n    TieredCost-->>CostCalc: input cost\n    CostCalc->>TieredCost: calculateTieredCost(cachedInput, basePriceCache, tieredPriceCache, threshold)\n    TieredCost-->>CostCalc: cached input cost\n    CostCalc->>TieredCost: calculateTieredCost(outputTokens, basePriceOutput, tieredPriceOutput, threshold)\n    TieredCost-->>CostCalc: output cost\n    CostCalc->>CostCalc: sum costs\n    CostCalc-->>Caller: total USD cost\n```\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~50 minutes\n\n## Possibly related PRs\n\n- **ryoppippi/ccusage#651**: Adds and integrates tiered pricing fields and logic across pricing schemas and token-cost utilities, modifying packages/internal/src/pricing.ts and related cost-calculation code in parallel with this PR.\n- **ryoppippi/ccusage#854**: Modifies CodexPricingSource.getPricing in apps/codex/src/pricing.ts, sharing the same function touched by this PR's tiered pricing integration.\n\n## Poem\n\n> 🐰 *Thresholds crossed, the tiers ascend,*  \n> *Where token costs bend and blend,*  \n> *From codex base to internal cache,*  \n> *Pricing tiers now flash and flash!*  \n> *Hopping through configs so divine,* 🎉\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n### ❌ Failed checks (1 warning)\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                                      |\n| :---------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                      |\n|    Title check    | ✅ Passed | The title accurately describes the main change: adding support for 272k tiered pricing for gpt-5.4, which aligns with the PR objectives and the core modifications across files. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=ryoppippi/ccusage&utm_content=882)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":1}},"response":{"url":"https://api.github.com/repos/ryoppippi/ccusage/issues/comments/4019802684","status":401,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","connection":"close","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Wed, 11 Mar 2026 13:23:23 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-media-type":"github.v3; format=json","x-github-request-id":"8023:1F139A:4F50233:1555487D:69B16CCB","x-xss-protection":"0"},"data":{"message":"Bad credentials","documentation_url":"https://docs.github.com/rest","status":"401"}}}

@GrayXu
Copy link
Author

GrayXu commented Mar 11, 2026

conflicts resolved

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant