Skip to content

feat(sse): add GPT-6 Sol and Luna to the Codex catalog - #14677

Merged
diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.51from
QuangBlue:feat/codex-gpt6-sol-luna
Sep 24, 2026
Merged

diegosouzapw merged 1 commit into
diegosouzapw:release/v3.8.51from
QuangBlue:feat/codex-gpt6-sol-luna

Conversation

@QuangBlue

Copy link
Copy Markdown
Contributor

Problem

The live Codex model catalog (ChatGPT OAuth, client 0.155.1) now serves GPT-6 Sol and GPT-6 Luna next to GPT-6 Astra. Model sync picks both base ids up, but the rest of the Codex path only knows Astra:

  • gpt-6-sol-max, gpt-6-sol-ultra and gpt-6-sol(ultra) are not split by splitCodexReasoningSuffix(), so they reach the upstream as unknown model ids.
  • An explicit reasoning.effort: "max" (Responses) or reasoning_effort: "max" (Chat Completions) on either model is silently clamped to xhigh: clampEffort() falls back to the legacy xhigh cap for models missing from MAX_EFFORT_BY_MODEL, and the translator's native-max pattern only matches GPT-5.6 and Astra.
  • The registry has no Sol/Luna entries, so /v1/models lists no effort variants for them and Codex usage for them is priced at nothing.
  • Catalog effort metadata only knows GPT-5.6. This covers effort_tiers in /v1/models, the VS Code picker, -max/-ultra suffix parsing and the default effort. As a result, every GPT-6 Codex model (Astra included) advertises none..max without ultra and defaults to none.

What the live catalog says

From the Codex /models response:

model supported_reasoning_levels default max_context_window
gpt-6-astra low, medium, high, xhigh, max, ultra medium 872000
gpt-6-sol low, medium, high, xhigh, max, ultra medium 872000
gpt-6-luna low, medium, high, xhigh, max medium 872000

Only ultra is described as "automatic task delegation", for both Sol and Astra. minimal_client_version is null for Sol and Luna, so the pinned Codex client version does not need a bump.

Codex credit rate card (https://developers.openai.com/codex/pricing), credits per 1M tokens (input / cached / output): Sol 50 / 5 / 250, Luna 2.5 / 0.25 / 12.5. The card also states: "Fast mode uses 2.5x the Standard credit rate for GPT-6 Astra, Sol, and Luna".

Changes

  • Registry (codex, and codex-app-server through its shared model list): gpt-6-sol plus -ultra/-max/-xhigh/-high/-medium/-low, and gpt-6-luna plus -max/-xhigh/-high/-medium/-low, with the same Codex windows as Astra.
  • reasoningSuffix.ts: Sol joins both the max and ultra alias sets; Luna joins the max set only. The new getCodexAliasEffortCap() derives the clamp cap from those sets, so MAX_EFFORT_BY_MODEL in codex.ts no longer keeps a second copy of the max/ultra-tier models. Behavior is unchanged for Astra, GPT-5.6 Sol/Terra (ultra) and GPT-5.6 Luna (max), and it keeps codex.ts under its frozen file size. The next Codex model needs one entry, not four.
  • Translator: the native max-effort pattern covers gpt-6-sol and gpt-6-luna.
  • Effort metadata: extendCodexGpt56EffortValues() and the VS Code reasoning metadata now cover gpt-6-(astra|sol|luna) for codex/cx: Luna has no ultra, and the default is medium, as in the live catalog. Kiro keeps its GPT-5.6-only max rule.
  • Pricing: cx rates at the repo's 25 credits per USD (Sol $2 / $0.20 / $10, Luna $0.10 / $0.01 / $0.50 per MTok; cache_creation = 1.25× input, as for Astra). The 2.5× Fast multiplier now applies to all three GPT-6 models.

Out of scope:

  • The public OpenAI API provider and modelSpecs: I have no API data for Sol or Luna.
  • Luna@max stays out of the Responses Lite delegation exception: the catalog describes only ultra as delegation. A test pins this.
  • Reasoning-routing rules (src/lib/reasoningRouting/policy.ts) and the bare-id list (CODEX_NATIVE_UNPREFIXED_MODELS) still name only GPT-5.6. Astra has the same gap there, so both are left for a follow-up.

#14591 (closed by its author) touched the same area together with OAuth account-binding changes. This PR covers only the catalog and effort wiring.

Tests

  • New tests/unit/codex-gpt6-sol-luna.test.ts (10 tests) covers:

    • the registry for codex and codex-app-server;
    • hyphen and parenthesized effort aliases;
    • explicit max/ultra (and the ultra→max clamp for Luna);
    • Responses Lite parallel_tool_calls for Sol ultra versus Sol max / Luna max;
    • the Chat→Codex max path;
    • catalog and VS Code effort metadata;
    • pricing (including cache_creation) and the Fast multiplier.

    Every test that covers new behavior fails on the base commit.

  • Neighbouring unit tests (138 files covering the Codex executor, registry, suffixes, pricing, effort metadata and the Responses translator): 1400 pass. The rest fail or are cancelled identically with this change reverted to the base: antigravity-oauth-postexchange-nonblocking, opencode-executor, specialty-model-catalog-routes, plus the timing-sensitive oauth-connection-test-timeout and proxyfetch-direct-response-start-timeout-10214.

  • npm run test:vitest: 482 passed.

  • ESLint (with suppressions), Prettier, check:file-size, and check:provider-consistency are clean. typecheck:core reports only the pre-existing TS2322 in src/lib/services/cliproxyAccountHealth.ts:157, which is unchanged from the base.

⚠️ base-red inherited: #14547

The live Codex model catalog (client 0.155.1) now serves gpt-6-sol
(efforts low..ultra) and gpt-6-luna (low..max) next to gpt-6-astra, but
only Astra was wired in:

- `gpt-6-sol-max` / `gpt-6-sol-ultra` / `gpt-6-sol(ultra)` were not split
  by splitCodexReasoningSuffix and reached the upstream as unknown model ids;
- an explicit `reasoning.effort: "max"` (Responses or Chat `reasoning_effort`)
  on either model was clamped to `xhigh` because clampEffort fell back to the
  legacy xhigh cap;
- the registry had no Sol/Luna entries, so no effort variants were listed and
  Codex usage for them was priced at nothing;
- catalog effort metadata (`effort_tiers` in /v1/models, the VS Code picker,
  `-max`/`-ultra` suffix parsing, default effort) only knew GPT-5.6, so every
  GPT-6 model advertised none..max without ultra and defaulted to none.

Changes:

- registry: gpt-6-sol (+ ultra/max/xhigh/high/medium/low) and gpt-6-luna
  (+ max/xhigh/high/medium/low), same Codex windows as Astra;
- reasoningSuffix: Sol joins the max+ultra alias sets, Luna the max set;
  new getCodexAliasEffortCap() derives the clamp cap from those sets, so the
  executor no longer keeps a second copy of the max/ultra-tier models;
- translator: native max effort pattern covers gpt-6-sol/luna;
- effort metadata: extendCodexGpt56EffortValues and the VS Code reasoning
  metadata cover gpt-6-(astra|sol|luna) for codex/cx (Luna without ultra,
  default medium as in the live catalog); Kiro keeps its GPT-5.6-only rule;
- pricing: cx rates from the Codex credit card (Sol 50/5/250, Luna
  2.5/0.25/12.5 credits per MTok at 25 credits per USD) and the 2.5x Fast
  multiplier the card lists for all GPT-6 models.

minimal_client_version is null for both models in the live catalog, so the
pinned Codex client version does not need a bump.

Luna@max is not added to the Responses Lite delegation exception: the live
catalog only describes `ultra` as "automatic task delegation".
@QuangBlue
QuangBlue force-pushed the feat/codex-gpt6-sol-luna branch from 5d1e9c8 to 61e922e Compare September 23, 2026 17:51
@dpozimski

Copy link
Copy Markdown
Contributor

why not use models.dev as the main source of models? this kind of responsibility can be moved out of the omniroute.. thanks of that we are able to get new models without need to get new omniroute release - @diegosouzapw

@QuangBlue

Copy link
Copy Markdown
Contributor Author

Thanks! OmniRoute already syncs models.dev for metadata (pricing, context windows,
capabilities — src/lib/modelsDevSync.ts). The gaps this PR closes on the Codex
(ChatGPT subscription) route are behavior, not catalog data: splitting the
-max/-ultra effort suffixes, the per-model effort clamp (an explicit "max" was
clamped to "xhigh"), and Codex credit-based pricing, none of which models.dev
describes. Moving the static model list itself to models.dev is a design call
for @diegosouzapw — happy to follow up if that's the direction.

@diegosouzapw

Copy link
Copy Markdown
Owner

Thanks for this — verified the Sol/Luna model ids and credit rates against the live Codex
pricing page and they match exactly, including the 2.5x Fast-mode multiplier. Ran the new test
file locally: 10/10 pass. The getCodexAliasEffortCap() consolidation is a nice cleanup on top
of the feature itself. Looks merge-ready as-is; only note is it touches codex.ts in a nearby
but non-overlapping region to #14636, so we'll sequence the merges and double-check the result.

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.

3 participants