feat(browser): support GPT-6 Astra as ChatGPT's "Latest" model - #448
feat(browser): support GPT-6 Astra as ChatGPT's "Latest" model#448malvarezcastillo wants to merge 3 commits into
Conversation
ChatGPT exposes GPT-6 Astra (released 2026-09-03) without a named picker entry: it is the "Latest" radio of the advanced picker, and "GPT-6 Pro" is that radio with the power slider at Pro (the composer pill reads "6 Pro"; with GPT-5.6 Sol it reads "5.6 Pro"). - Add `gpt-6-astra` as a known model (API: $10/$50 per 1M, same 272K base-rate window as GPT-5.6, reasoning effort/mode allowed) and the aliases `gpt-6`, `latest` and the browser-only `gpt-6-pro`, all mapped to the "Latest" picker label. `gpt-6-pro` keeps its name through normalization so it defaults to the Pro tier like `gpt-5.5-pro`. - Decide a version-less "Latest" target on evidence: the checked radio of the advanced view when the picker is open, otherwise the composer pill (`^6…`, never `5.6…`). Before, the blank composer signal passed as "already selected" while GPT-5.6 Sol was active, and the resolved label came back as "5.6Pro". Report "Latest" as the resolved label.
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: blocked before merge. Reviewed September 5, 2026, 1:55 AM ET / 05:55 UTC. ClawSweeper reviewWhat this changesAdds GPT-6 Astra aliases and API metadata, maps browser requests to ChatGPT’s Latest model with optional Pro effort, and adds selection checks, tests, and documentation. Merge readiness⛔ Blocked before merge - 5 items remain This remains useful work absent from main. Earlier findings are fixed, but new discussion and source inspection identify two remaining picker defects. The reported live browser proof remains valid, and the linked fork follow-up offers a focused repair candidate. Priority: P2 Review scores
Verification
How this fits togetherOracle converts CLI model requests into either API requests or ChatGPT browser selections. In browser mode, it selects the model and verifies the requested effort before submitting the prompt. flowchart TD
A[CLI model request] --> B[Resolve aliases]
B --> C{Selected engine}
C --> D[API model metadata]
C --> E[ChatGPT model picker]
E --> F[Verify effort tier]
F --> G[Submit prompt or report failure]
D --> H[Provider request]
Before merge
Findings
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Copy recommended automerge instructionTechnical reviewBest possible solution: Use the existing picker machinery to recognize observed Astra labels and effort controls while preserving strict Pro verification, explicit effort settings, and legacy aliases. Do we have a high-confidence way to reproduce the issue? Yes: the reported Japanese 最新 radio and Astra version-prefixed effort controls map to explicit rejection paths in the reviewed source. No runtime reproduction was executed during this read-only review. Is this the best way to solve the issue? Yes in approach: extending the existing alias and picker implementation is appropriate, but the model-label and effort-control integration needs the two focused corrections below. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against be6c92a9e4cc. LabelsLabel justifications:
EvidenceAcceptance criteria:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (3 earlier review cycles)
|
The alias matcher accepted any `gpt-6…` value not followed by a digit or period, so undeclared ids such as `gpt-6-codex` or `gpt-6-custom` were rewritten to `gpt-6-astra` before the custom/OpenRouter passthrough in resolveApiModel. Match only `gpt-6`, `gpt-6-astra`, `gpt-6-pro` (and their label forms) plus `latest`; every other id keeps its existing handling. Also declare `targetIsLatest` before getResolvedLabel can run: the picker-less path evaluated it before initialization (ReferenceError in the injected selection script). Add regression coverage for the accepted aliases, the browser-only gpt-6-pro tier, the "Latest" picker target, and unknown gpt-6-* ids passing through unchanged.
|
Addressed the review in b022dcf:
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
…hout a picker The "current" strategy calls getResolvedLabel() before the selection helpers further down the injected script are initialized, so a "Latest" target without a checked advanced radio hit a temporal-dead-zone ReferenceError on latestButtonSelected. Define that helper next to getButtonLabel, and when no picker button exists at all fall back to the generic composer-label resolution instead of returning the empty button text. Add a current-strategy test for the Latest target with a "6Pro" pill and with no signal.
|
Addressed the second-round finding in the latest commit:
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
Independent verification of head
No API/Astra inference was tested. Thanks for the existing implementation; posting the additional reproduction and account-unavailability evidence here rather than opening a duplicate Astra-support PR. |
|
Tested this head on a Japanese ChatGPT Pro UI and prepared a focused follow-up into your feature branch: malvarezcastillo#1 . This avoids opening a competing Astra-support PR against upstream main. It adds exact With the follow-up: Sol -> Latest -> already-selected, 極高 -> Pro, and two attachment consultations completed through the native select + Pro path. Full local suite: 1,964 passed / 44 skipped; check and build passed. Details and sanitized evidence are in the linked PR. No API/Astra inference was tested. Please merge/cherry-pick the follow-up if useful. |
Preserve browser-only Pro aliases through CLI engine discovery, retain model-specific API capabilities, and verify localized Latest and effort controls. Combine the compatible work from steipete#448, steipete#449, and steipete#465; release notes are deferred to the final notes PR.
Consolidate API capability validation and Latest browser selection from #449 and #448. Validate model-specific reasoning efforts, reject invalid saved defaults, recognize localized picker controls, and preserve browser-only aliases during engine discovery. Keep the default model unchanged. Real standard/Pro API calls, Latest/High and Latest/Pro browser requests, and a controlled Sol-to-Latest transition passed. Thanks @kiyo-e for the browser work incorporated into this PR. Co-authored-by: FND <fndevve@proton.me> Co-authored-by: oraclexing <xing_z@hotmail.com> Co-authored-by: nummy <6960749+malvarezcastillo@users.noreply.github.com>
|
Landed through #465, which consolidates this change with the related model work and keeps your contributor credit in the squash commit and changelog. Thank you. |
Summary
ChatGPT started serving GPT-6 Astra (2026-09-03) without a named entry in the model picker. On a Pro account today the advanced view offers the radios Latest, GPT-5.6 Sol and GPT-5.5; "GPT-6 Pro" is Latest with the power slider at Pro, and the composer pill then reads
6 Pro(with GPT-5.6 Sol it reads5.6 Pro).This PR adds first-class ids for it and makes the "Latest" target verifiable:
gpt-6-astra(known model: API pricing $10/$50 per 1M, same 272K base-rate window as GPT-5.6, reasoning effort/mode accepted), plus the aliasesgpt-6,latest, and the browser-onlygpt-6-pro. All map to theLatestpicker label;gpt-6-prois passed through normalization like the other browser-only variants so it defaults to the Pro tier (resolveDefaultBrowserThinkingTime).ensureModelSelectionnow decides a version-lessLatesttarget on real evidence: the checked radio of the advanced view when the picker is open, otherwise the composer pill (^6…, never5.6…). PreviouslybuildComposerSignalMatchersallowed a blank composer signal for that target, soLatestreportedalready-selectedwhile the tab was on GPT-5.6 Sol, with the resolved label5.6Pro. The resolved label is now reported asLatest.How it was verified
Against a live Pro account through a remote Chrome (
--remote-chrome), running the builtensureModelSelection+ensureThinkingTimein a tab, no prompt sent:GPT-5.6 Sol, proGPT-5.6 Sol, pill5.6ProLatest, pro (tab still on Sol)5.6ProLatest, pill6ProLatest, pro again5.6ProLatestAlso
oracle --engine browser --dry-run --model gpt-6-pro→target=Latest; requested=gpt-6-pro, and a real Pro request on a second account resolvedLatest+Thinking time: Proand answered.pnpm run checkandpnpm testpass. No new unit tests were added for the injected picker script (it is DOM-driven); happy to add coverage fornormalizeChatGptModelForBrowser/mapModelToBrowserLabel/resolveDefaultBrowserThinkingTimeif you want it.Not in this PR
The legacy Pro aliases (
gpt-5-pro,gpt-5.4-pro, …) still resolve to GPT-5.6 Sol + Pro (CURRENT_CHATGPT_PRO_ALIASES). If the intended semantics is "the newest Pro in ChatGPT", they should now point atgpt-6-pro; left untouched here to keep the change scoped.