Repository navigation
Model traits: Fast tier, update-CLI hints, signed catalog between releases (#1529) - #1551
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2ddca951a7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| model: thread.model || null, | ||
| reasoningEffort: thread.reasoningEffort || null, | ||
| webSearch: thread.webSearch === true, | ||
| fast: thread.fast === true, |
There was a problem hiding this comment.
Include Fast in the Claude reuse key
When a warm Claude process exists and the user changes the Fast toggle, this new argument is calculated but the reuse key at electron/runner.js:4917-4933 does not include thread.fast. The unchanged key causes the runner to call handle.send() on the existing process, so the new --settings {"fastMode":true} value is never applied; conversely, disabling Fast can leave the higher-usage mode active until the process is reaped. Include the Fast setting in the reuse key so changing it forces a respawn.
Useful? React with 👍 / 👎.
| if (fastIds.has(m.id)) m.fast = true; | ||
| else delete m.fast; |
There was a problem hiding this comment.
Apply live Codex traits to the runner's catalog
These live-cache mutations affect only the cloned ProviderInfo rows returned by listProviders; the runner later calls modelSupportsFast() on the unchanged global providerEntry. If Codex adds the priority tier to a model that the bundled snapshot did not mark, the picker exposes Fast but every run silently omits service_tier=priority; if a tier is removed, a persisted Fast preference can still send it. The live trait source needs to be shared with argument construction rather than applied only to the renderer copy.
Useful? React with 👍 / 👎.
…eases (#1529) Fast toggle per thread (Claude --settings fastMode, Codex service_tier=priority) gated by model; Codex follows the live models_cache for both picker and argv. Fast joins the warm Claude reuse key. Update hints from minCli/client_version and Claude model_not_found. Ed25519-signed catalog fetched from the fixed catalog release, applied only above the bundled CATALOG_REV. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2ddca95 to
55b285f
Compare
… fast trait Opus 5.5 and Opus 5 keep fast: true from #1551; the rest of the Claude modelInfo is this PR's lineup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ope table (#1553) #1545 added a coverage test that every IPC handler is classified exactly once; #1542 (answerSecret) and #1551 (setFast) landed alongside it unclassified, so main's electron suite fails. setFast is steer like setReasoningEffort; answerSecret puts a value into the agent's run env, so it stays full-only. Co-authored-by: Willem <willem@willems-mbp.home> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ope table #1545 added a coverage test that every IPC handler is classified exactly once; #1542 (answerSecret) and #1551 (setFast) landed alongside it unclassified, so main's electron suite fails. setFast is steer like setReasoningEffort; answerSecret puts a value into the agent's run env, so it stays full-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1545 added the scope table while #1551 (setFast) and #1542 (answerSecret) added channels in parallel, so main's scope-table test fails. setFast is steer, like setReasoningEffort. answerSecret is full: a device has no need to plant a secret in a run's env. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t/answerSecret web scopes #1435: bill a warm Claude process's cost growth, not its running total. #1436: worker-finished notice tells the orchestrator not to poll thread_status; saved notices with the old footer still fold. #1439: build devCoder on first use so importers don't stay alive ~4s. webScopes: threads:setFast (steer) and threads:answerSecret (full) were unclassified after #1545 landed alongside #1551 and #1542, failing main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… fast trait Opus 5.5 and Opus 5 keep fast: true from #1551; the rest of the Claude modelInfo is this PR's lineup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #1529.
Fast tier
fastflag set throughthreads.setFast, built the same way assetWebSearch. When the selected model supports a fast tier, the picker shows a Speed → Fast chip and the model button reads "· Fast".--settings {"fastMode":true}, on Opus 5 and Opus 5.5 only. Tested live on 2.1.283: the init event'sfast_mode_disabled_reasonchanges fromsdk_opt_in_requiredtoextra_usage_disabled, which means the flag is honoured and this account has no extra-usage credits for fast mode. When init reportsfast_mode_state: off, the thread gets one notice with the reason.-c service_tier=priorityon exec, app-server and workflow phases. Which models get the chip comes from the per-modelservice_tiersin~/.codex/models_cache.json."Update to use "
ModelInfo.minCli(GPT-6.1-Sol is 0.159.0) is compared with the cache'sclient_version. If Codex is too old, the picker row is disabled with "Update Codex to use GPT-6.1-Sol".model_not_foundfor a model in Solenta's catalog, the thread gets "Update Claude Code to use " instead of the generic error.Catalog updates between releases
electron/remoteCatalog.js: on launch, applies a cached copy only if its Ed25519 signature checks out, then fetches thecatalogrelease in the background (10s timeout, never blocks startup). It applies only when the revision is above both the bundledCATALOG_REVand anything applied earlier. Only data fields are copied, and a provider with malformed data keeps its bundled catalog.scripts/catalog-publish.jsand.github/workflows/catalog.ymlsign the catalog on pushes to main and upload it to a fixed, non-prerelease release created with--latest=false, so the updater never sees it. The script refuses a key that doesn't match the embedded public key, and refuses changed data published under an unbumpedCATALOG_REV.Review fixes
fastjoins the warm Claude process reuse key, so toggling Fast respawns the CLI instead of riding (or staying stuck in) the old--settings. A regression test fails without the fix.modelSupportsFastreads the live models_cache, the same source as the picker. A hidden toggle can't bill priority, and a model that only the cache marks as fast really sends it.origin/main. The earlier diff included other threads' unpushed local merges; they're gone now.CATALOG_SIGNING_KEYsecret is set.Tests
npm run typecheckclean,vite buildOK.test:electron4446/4446 on the rebased branch.electron/test/fast-tier.test.js,electron/test/remote-catalog.test.js, plus Composer and modelPicker cases.🤖 Generated with Claude Code