feat(server): add a reasoning effort picker for Grok - #6887
Conversation
Grok advertises per-model reasoning levels over ACP in `ModelInfo._meta.reasoningEfforts`, and applies one through `session/set_model` with `_meta.reasoningEffort`. T3 ignored both, so Grok models shipped with empty capabilities and no picker, while Codex, Claude, and Cursor all have one. Read the levels off the discovered models so the existing composer traits menu renders them, and carry the selection through session start and each turn. Levels are per model (Grok 4.6 offers xhigh/high/medium/ low, Grok 4.5 offers high/medium/low), so nothing is hardcoded. Grok flags more than one level as `default`, so the level currently applied to the model wins and the `default` flags are a fallback. An effort-only change resends the model Grok already has selected, since `session/set_model` is what carries the effort. Models that fail ACP discovery keep empty capabilities rather than being given an invented level list. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
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 |
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 c7b7a54. Configure here.
ApprovabilityVerdict: Needs human review This PR introduces a new user-facing feature (reasoning effort picker for Grok) that modifies core model selection interfaces and propagates new configuration through multiple code paths. New feature enablement with behavioral changes warrants human review. You can customize Macroscope's approvability policy. Learn more. |
Reasoning levels differ per Grok model, so carrying the current effort onto a different model can send a level the target never advertised. Probing `grok 1.0.4`, `session/set_model` accepts `grok-4.5` with `xhigh` without error, applies it, and leaves the session config with no effort selected at all. Fall back to the target model's own default when the model changes and no effort was explicitly requested. An explicit request is still always sent, including when it matches the effort already applied — deciding this on `shouldSwitchReasoningEffort` alone would silently drop a requested level that happened to equal the previous model's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
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. |

What changed
Grok models now show the same reasoning picker Codex, Claude, and Cursor already have. The levels come from the Grok CLI itself, not from a hardcoded list.
Grok advertises them per model over ACP in
ModelInfo._meta.reasoningEfforts, along with the level currently applied in_meta.reasoningEffort. It applies one throughsession/set_modelwith_meta: { reasoningEffort: "<level>" }. T3 was ignoring both, so every Grok model shipped with empty capabilities and the composer traits menu showed only the Access section.acp/GrokAcpSupport.ts_meta, read the session's applied effort, and extendapplyGrokAcpModelSelectionto carry an effortLayers/GrokProvider.tsreasoningEffortselect descriptor instead of empty capabilitiesLayers/GrokAdapter.tsacp/AcpSessionRuntime.tssetSessionModeltakes optional request_metaNo client changes were needed — web and mobile both render the picker generically from
optionDescriptors, with no per-provider branching.Before / after
The composer traits menu on Grok 4.6.
Levels are genuinely per model, so Grok 4.5 gets its own shorter list rather than 4.6's:
Decisions worth reviewing
Which level is marked default. Grok flags more than one level as
default(4.6 marks bothxhighandhigh), so the flags alone are ambiguous. The level actually applied to the model wins, anddefaultis only the fallback.Effort-only changes resend the model.
session/set_modelis what carries the effort, so changing effort without changing model re-sends the model Grok already has selected.session/set_modeand model-id suffixes (grok-4.5:low) do not work — I probed both againstgrok 1.0.4and only the_metaroute applies.Models that fail discovery get nothing. The
grok-buildfallback used when ACP discovery fails keeps empty capabilities. The levels are per model, and inventing a list for a model we could not probe risks sending an effort it does not accept.Changing effort mid-thread is allowed. Only the model is gated behind
requiresNewThreadForModelChange, which this does not touch.Verification
checkGrokProviderStatusagainst the real CLI returns Grok 4.6 with xhigh/high/medium/low (medium default) and Grok 4.5 with high/medium/low (high default).~/.grok/sessions/.../chat_history.jsonl) stamps each assistant message with the effort it ran at —low→medium→highacross turns, exactly tracking the picker. The persisted thread selection reads{"id":"reasoningEffort","value":"low"}andsession/set_modelgoes out with the_metafield present.vp run -r typecheck,vp lint, and the server provider suite (563 tests) all pass.Note that asking Grok what effort it is running at is not a valid check — it has no tool for that and will answer from
~/.grok/config.toml, which the per-session override deliberately does not rewrite.Follow-up, not included here
Separately and pre-existing: we create the ACP session on Grok's default model and then call
session/set_model, but Grok renders its system prompt at session creation, so it keeps saying "You are Grok 4.6" while routing 4.5.session/newaccepts_meta.modelId(verified — the resulting session's stored prompt says "You are Grok 4.5"), which would fix it. Left out to keep this PR to one thing; happy to send it separately if wanted.Disclosure
This was written by Claude Opus 5 running in Claude Code, at medium reasoning effort with fast mode on, driven and reviewed by me. The protocol findings above (what Grok advertises, what actually applies an effort, what does not) come from probing the installed
grok 1.0.4CLI directly, not from documentation or guesswork. The before/after screenshots are real captures of this branch versusmain.Note
Medium Risk
Changes Grok session model configuration and ACP
set_modelbehavior at start and per turn; logic is covered by tests but incorrect effort handling could affect live Grok runs.Overview
Grok models can now expose a Reasoning select in the composer traits menu, aligned with other providers. Levels are read from Grok ACP
ModelInfo._meta(reasoningEfforts/reasoningEffort) instead of hardcoded empty capabilities.applyGrokAcpModelSelectionnow takes current and requested reasoning effort, returns{ modelId, reasoningEffort }, and callssession/set_modelwhen either the model or effort changes. Effort is sent as_meta.reasoningEffort; effort-only updates re-send the current model id. On model switches without an explicit effort, prior effort is not carried over so unsupported levels are not applied to the target model.GrokAdaptertrackscurrentReasoningEfforton the session and applies user selections at session start and on each turn via provider optionreasoningEffort.AcpSessionRuntime.setSessionModelaccepts optional request_metafor that payload. Discovered Grok models get capabilities frombuildGrokModelCapabilities. Unit tests cover metadata parsing, default resolution, and set_model paths.Reviewed by Cursor Bugbot for commit 11f2f17. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add reasoning effort picker for Grok models
Reasoningselect option to Grok model capability descriptors for models that advertise reasoning levels, sourced from model_metaviagrokReasoningEffortLevelsFromModelMeta.applyGrokAcpModelSelectionto accept and returnreasoningEffort; triggerssession/set_modelfor effort-only changes and attachesreasoningEffortin request_meta.currentReasoningEffortinGrokSessionContextso each turn can update effort independently of model ID changes.AcpSessionRuntime.setSessionModelto forward an optionalmetaobject as_metain the request payload.Macroscope summarized 11f2f17.