fix(grok): surface per-model reasoning effort in the composer - #5403
fix(grok): surface per-model reasoning effort in the composer#5403ahmed-besic wants to merge 3 commits into
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
ApprovabilityVerdict: Skipped Macroscope did not run approvability analysis for this PR. Macroscope could not determine whether this PR modifies its approvability configuration, so the PR was not approved automatically. A PR that may change the rules that govern approval is never approved automatically. |
Grok models already advertise reasoning effort menus in ACP model _meta, but T3 always published empty capabilities and never applied a selected effort. Map each model's reasoningEfforts into option descriptors, pass _meta.reasoningEffort through session/set_model on start and send, and cover discovery/apply with focused tests.
9e2fb80 to
c8d471b
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 7d734a9. Configure here.
|
Fixed the small steering issue and added a regression test. Typecheck and focused Grok tests are passing. |
|
Note 🤖 GPT-5.6 Sol responding on behalf of Theo Closing this PR after an automated pass over open pull requests. Duplicates trusted Grok reasoning controls in #6386. |
Intent: Keep Grok 4.6 usable from T3: plan-mode turns must stay reviewable over ACP, advertised reasoning levels and user-invocable skills must show in the composer, and the T3 runtime-mode control must actually drive Grok instead of ~/.grok/config.toml. Behavior: - Handle both x.ai/exit_plan_mode and _x.ai/exit_plan_mode, including wrapped payloads and null planContent. - Emit the existing proposed-plan card from planContent, or fall back to the last session plan.md body when Grok races the plan-file write. - Reply abandoned with a capture message so Grok unblocks without implementing in the same turn. - Detect enter_plan_mode and promote writes to ~/.grok/sessions/.../plan.md onto the same card. Ignore workspace plan.md files, dedupe identical markdown per turn, and clear fallback state on settle or a new non-steer turn. - Leave implement and request-changes to the existing proposed-plan follow-up; do not auto-approve plans even in full-access mode. - Map each Grok model's ACP _meta.reasoningEfforts into the existing Reasoning select, preserving labels and descriptions and exposing the applied effort as currentValue. Keep one default badge and do not invent a menu when metadata is absent. - Apply reasoning effort through session/set_model _meta.reasoningEffort, including effort-only changes. Do not carry an effort across model switches unless explicitly selected, skip set_model when nothing changes, and defer turn-time mutation until sendTurn validation succeeds. - Honor the selected effort in Grok-backed title, commit, PR, and branch-name generation. - Read user-invocable skills from grok inspect --json into the provider snapshot; use those names for both $ and /, skip bundled helpers, and leave both catalogs empty on inspect failure without failing provider discovery. - Supervised spawns `--permission-mode default` so the thread asks even if the Grok CLI config is always-approve or auto. - Auto-accept edits spawns `--permission-mode acceptEdits`. - Auto spawns `--permission-mode auto` and sends session/new (and session/load) `_meta.autoMode: true`. - Full access spawns `grok agent --always-approve stdio` and sends `_meta.yoloMode: true`. - Probe and text-generation ACP processes omit a T3 mode and keep `grok agent stdio`. - Always allow this session falls back to allow_once when Grok omits allow_always, then auto-approves later prompts in that session. - Auto still escalates risky calls to T3; it is not always-approve. Design constraints: - Keep Grok-specific ACP, inspect, and permission dialects at the adapter/provider boundary. Do not change contracts or other providers. - Reuse turn.proposed.completed, the existing plan card, and generic composer optionDescriptors / skills / slashCommands. Add no Grok-only approval prompt or new composer UI. - Do not spawn-bind --reasoning-effort or require a new thread to change effort; Grok applies _meta in place. - Do not map T3 Auto to yolo / bypassPermissions. That is Full access. - Do not restart mid-thread on a runtime-mode change (separate hang: upstream pingdotgg#6517). Integration: - Grok adapter, xAI ACP extension helpers, ACP mock, ACP session runtime (set_model and session/new|/load _meta), Grok spawn args, Grok model/provider snapshot, inspect catalog parser, text generation, focused tests, internals provider docs, install.md, and permission-modes.md. - Web, desktop, and mobile consume existing proposed-plan events, generic snapshot fields, and the existing runtime-mode picker with no client changes. Verification: - vp test run apps/server/src/provider/acp/GrokAcpSupport.test.ts apps/server/src/provider/Layers/GrokProvider.test.ts apps/server/src/provider/Drivers/GrokSkills.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/XAiAcpExtension.test.ts - Runtime-mode slice: 57 passed (GrokAcpSupport, GrokAdapter, GrokProvider). - Earlier combined Grok slice: 64 passed including skills and xAI extension. Rebase notes: - Conflict hotspots are GrokAdapter plan handlers, sendTurn settlement, handleRequestPermission, buildGrokAcpSpawnInput, XAiAcpExtension.ts, GrokProvider discovered-model capabilities, GrokDriver inspect cwd, and AcpSessionRuntime setSessionModel plus session/new _meta. - Upstream pingdotgg#4514 (plan), pingdotgg#5403/pingdotgg#6386/pingdotgg#6887 (reasoning), pingdotgg#4109 (skills), pingdotgg#6502/pingdotgg#6626 (Always allow and spawn permission-mode). Drop this patch only when main handles both plan-exit spellings with live/fallback plan capture, maps ACP reasoningEfforts and effort-only set_model, publishes grok inspect skills to $ and /, forwards all four T3 modes onto Grok argv with autoMode/yoloMode on session setup, Supervised overrides config.toml, and Always allow does not cancel when allow_always is missing.
Intent: Keep Grok 4.6 usable from T3: plan-mode turns must stay reviewable over ACP, advertised reasoning levels and user-invocable skills must show in the composer, and the T3 runtime-mode control must actually drive Grok instead of ~/.grok/config.toml. Behavior: - Handle both x.ai/exit_plan_mode and _x.ai/exit_plan_mode, including wrapped payloads and null planContent. - Emit the existing proposed-plan card from planContent, or fall back to the last session plan.md body when Grok races the plan-file write. - Reply abandoned with a capture message so Grok unblocks without implementing in the same turn. - Detect enter_plan_mode and promote writes to ~/.grok/sessions/.../plan.md onto the same card. Ignore workspace plan.md files, dedupe identical markdown per turn, and clear fallback state on settle or a new non-steer turn. - Leave implement and request-changes to the existing proposed-plan follow-up; do not auto-approve plans even in full-access mode. - Map each Grok model's ACP _meta.reasoningEfforts into the existing Reasoning select, preserving labels and descriptions and exposing the applied effort as currentValue. Keep one default badge and do not invent a menu when metadata is absent. - Apply reasoning effort through session/set_model _meta.reasoningEffort, including effort-only changes. Do not carry an effort across model switches unless explicitly selected, skip set_model when nothing changes, and defer turn-time mutation until sendTurn validation succeeds. - Honor the selected effort in Grok-backed title, commit, PR, and branch-name generation. - Read user-invocable skills from grok inspect --json into the provider snapshot; use those names for both $ and /, skip bundled helpers, and leave both catalogs empty on inspect failure without failing provider discovery. - Supervised spawns `--permission-mode default` so the thread asks even if the Grok CLI config is always-approve or auto. - Auto-accept edits spawns `--permission-mode acceptEdits`. - Auto spawns `--permission-mode auto` and sends session/new (and session/load) `_meta.autoMode: true`. - Full access spawns `grok agent --always-approve stdio` and sends `_meta.yoloMode: true`. - Probe and text-generation ACP processes omit a T3 mode and keep `grok agent stdio`. - Always allow this session falls back to allow_once when Grok omits allow_always, then auto-approves later prompts in that session. - Auto still escalates risky calls to T3; it is not always-approve. Design constraints: - Keep Grok-specific ACP, inspect, and permission dialects at the adapter/provider boundary. Do not change contracts or other providers. - Reuse turn.proposed.completed, the existing plan card, and generic composer optionDescriptors / skills / slashCommands. Add no Grok-only approval prompt or new composer UI. - Do not spawn-bind --reasoning-effort or require a new thread to change effort; Grok applies _meta in place. - Do not map T3 Auto to yolo / bypassPermissions. That is Full access. - Do not restart mid-thread on a runtime-mode change (separate hang: upstream pingdotgg#6517). Integration: - Grok adapter, xAI ACP extension helpers, ACP mock, ACP session runtime (set_model and session/new|/load _meta), Grok spawn args, Grok model/provider snapshot, inspect catalog parser, text generation, focused tests, internals provider docs, install.md, and permission-modes.md. - Web, desktop, and mobile consume existing proposed-plan events, generic snapshot fields, and the existing runtime-mode picker with no client changes. Verification: - vp test run apps/server/src/provider/acp/GrokAcpSupport.test.ts apps/server/src/provider/Layers/GrokProvider.test.ts apps/server/src/provider/Drivers/GrokSkills.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/XAiAcpExtension.test.ts - Runtime-mode slice: 57 passed (GrokAcpSupport, GrokAdapter, GrokProvider). - Earlier combined Grok slice: 64 passed including skills and xAI extension. Rebase notes: - Conflict hotspots are GrokAdapter plan handlers, sendTurn settlement, handleRequestPermission, buildGrokAcpSpawnInput, XAiAcpExtension.ts, GrokProvider discovered-model capabilities, GrokDriver inspect cwd, and AcpSessionRuntime setSessionModel plus session/new _meta. - Upstream pingdotgg#4514 (plan), pingdotgg#5403/pingdotgg#6386/pingdotgg#6887 (reasoning), pingdotgg#4109 (skills), pingdotgg#6502/pingdotgg#6626 (Always allow and spawn permission-mode). Drop this patch only when main handles both plan-exit spellings with live/fallback plan capture, maps ACP reasoningEfforts and effort-only set_model, publishes grok inspect skills to $ and /, forwards all four T3 modes onto Grok argv with autoMode/yoloMode on session setup, Supervised overrides config.toml, and Always allow does not cancel when allow_always is missing.

What Changed
Grok already advertises per-model reasoning effort menus over ACP (
models.availableModels[]._meta.reasoningEfforts), but T3 published every Grok model with empty capabilities and never applied a selected effort. The composer therefore had no Reasoning control for Grok, unlike Claude/Codex.This maps each model's advertised menu into
optionDescriptors(reasoningEffort), passes_meta.reasoningEffortthroughsession/set_modelon session start and each turn (including mid-thread effort-only changes), and wires the same selection into Grok text generation.Why
Grok Build supports Low/Medium/High (and other per-model menus for custom models). Without reading
_metaand applying effort onsession/set_model, T3 always ran at the CLI default and users could not change it from the UI.Related open work: #5160 takes a spawn-flag approach and blocks mid-thread changes. This PR is narrower: discovery + apply via the existing ACP
session/set_model_metapath, which Grok applies in place without restarting the process.UI Changes
Uses the existing Traits picker — no new UI components. Once Grok ACP discovery succeeds, models with
reasoningEffortsshow a Reasoning select; models with different menus keep their own options.Live-verified against
grok agent stdioand the T3 web UI over Tailscale.Validation
vp test run src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/GrokProvider.test.ts— 17 passedsession/set_modelwith_meta.reasoningEffortapplies the overrideChecklist
Made by Grok Build via the Grok Build harness while working on T3 Code.
Note
Medium Risk
Touches Grok ACP model selection and session/set_model payloads, so a bad
_metaor skip-on-steer bug could send the wrong effort or extra set_model calls. Scope is Grok-only and covered by unit/adapter tests.Overview
Grok models that advertise
reasoningEffortsin ACP_metanow get a Reasoning select in the composer, and the chosen value is applied in-session instead of always using the CLI default.Discovery maps each model's
_meta.reasoningEffortsintooptionDescriptors.applyGrokAcpModelSelectionnow sends_meta.reasoningEffortonsession/set_modelwhen effort is selected (including effort-only changes), and ACPsetSessionModelforwards that_meta. Session start, turns, and text generation all passmodelSelection.options. Steering an in-flight prompt skips effort updates because Grok cannot apply them while a prompt is active.Reviewed by Cursor Bugbot for commit 1754184. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add per-model reasoning effort support to Grok adapter and ACP session model
reasoningEffortas a per-model Reasoning select descriptor built from session model state_meta.reasoningEfforts, replacing the previousEMPTY_CAPABILITIESfor discovered Grok modelsapplyGrokAcpModelSelectionandAcpSessionRuntime.setSessionModelto forwardoptionswith_meta.reasoningEffortinsession/set_modelrequests, issuing the request even when only the effort changes (model id unchanged)steeringTurnIdis set) to avoid redundantsession/set_modelcalls while a prompt is activemodelSelection.optionsthrough toapplyGrokAcpModelSelectionso reasoning effort is applied before promptingsession/set_modelis now invoked when areasoningEffortselection is present even if the model id is unchanged; existing callers withoutoptionsare unaffectedMacroscope summarized 1754184.