You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: Grok (ACP) ignores selected reasoning effort: reasoningEffort is never mapped to Grok's reasoning_effort option #15251
Start a Grok thread (or a delegated Grok task) with model grok-4.6 and reasoning effort Low.
Send any prompt.
Check Grok's own session journal (~/.grok/sessions/<cwd>/<session>/chat_history.jsonl).
Expected behavior
Grok runs the turn at the selected effort (low).
Actual behavior
Grok runs at its default xhigh. The run's modelSelection is correct ({"id":"reasoningEffort","value":"low"}), but the value never reaches the ACP session.
Root cause, as far as I can see in the server bundle:
On session/new, Grok advertises effort as a config option with a different id: {"id":"reasoning_effort","category":"thought_level","type":"select","currentValue":"xhigh","options":["xhigh","high","medium","low"]}. session/set_config_option {configId:"reasoning_effort", value:"low"} works (the response shows currentValue:"low").
The generic ACP configureSession applies modelSelection.options only by exact id. reasoningEffort ≠ reasoning_effort, so it logs "ACP session does not expose requested configuration option(s)" and sets nothing.
The Grok flavor's applyModelSelection calls applyGrokAcpModelSelection without requestedReasoningEffort / currentReasoningEffort. Only the text-generation path passes them. The provider event log shows session/set_model with two fields (sessionId, modelId) and no _meta.reasoningEffort.
Impact
Major degradation or frequent failure
Every Grok turn and delegated Grok task ignores the chosen effort. This costs latency and quota, and orchestration that relies on cheap low-effort Grok workers gets xhigh runs.
provider event log (delegated Grok task): method "session/set_model", status "started", request {"valueType":"object","fieldCount":2}
modelSelection of the same run: {"instanceId":"grok","model":"grok-4.6","options":[{"id":"reasoningEffort","value":"low"}]}
Workaround
A local patch that resolves an option by category when the exact id is missing (reasoningEffort → the select option with category thought_level), then calls setConfigOption with the found option's own id. Another possible fix: pass requestedReasoningEffort and currentReasoningEffort from the Grok flavor's applyModelSelection, as the text-generation path already does.
Thanks @Birzool for the protocol trace and the two candidate fixes. I didn't find another open issue for this.
Confirmed on current main (aad732901e). Nightly 0.0.46-nightly.20261003.2623 has the same code path. A checked-in Grok session/new transcript already advertises effort as reasoning_effort (category: "thought_level", values xhigh / high / medium / low). Whatever the default is, the selected low is never written.
What I found
The composer stores the effort under the model-capability id (buildGrokModelCapabilities publishes it as reasoningEffort), not under the session-config id. Your modelSelection matches that.
Thread turns and delegated turns both go through configureSession, and two things drop the value there:
Grok's applyModelSelection calls applyGrokAcpModelSelection with only the model id. It doesn't pass requestedReasoningEffort or currentReasoningEffort. On protocol version 1, session/set_model can carry _meta.reasoningEffort, but only when those arguments are present. Without them, a model change sends { sessionId, modelId } (your fieldCount: 2), and if the session is already on that model, set_model is skipped entirely. GrokTextGeneration already passes both.
The generic option loop matches modelSelection.options by exact config id. The session exposes reasoning_effort, not reasoningEffort, so the loop logs "ACP session does not expose requested configuration option(s)" and never calls session/set_config_option.
Likely fix area
Pass the stored reasoningEffort into applyGrokAcpModelSelection, along with the current effort from session setup, the way text generation already does. On protocol version 1, that sends session/set_model with _meta.reasoningEffort, including a same-model change from the CLI default to low.
Alternatively, resolve reasoningEffort to the thought_level select and call set_config_option with that option's own id. That's a wider ACP change. It would also cover protocols newer than 1, where applyModelSelection uses setModel and drops _meta.
Activity
juliusmarminge commentedon Oct 3, 2026
Note
Grok responding on behalf of Julius.
Triage
Thanks @Birzool for the protocol trace and the two candidate fixes. I didn't find another open issue for this.
Confirmed on current
main(aad732901e). Nightly0.0.46-nightly.20261003.2623has the same code path. A checked-in Groksession/newtranscript already advertises effort asreasoning_effort(category: "thought_level", valuesxhigh/high/medium/low). Whatever the default is, the selectedlowis never written.What I found
The composer stores the effort under the model-capability id (
buildGrokModelCapabilitiespublishes it asreasoningEffort), not under the session-config id. YourmodelSelectionmatches that.Thread turns and delegated turns both go through
configureSession, and two things drop the value there:applyModelSelectioncallsapplyGrokAcpModelSelectionwith only the model id. It doesn't passrequestedReasoningEffortorcurrentReasoningEffort. On protocol version 1,session/set_modelcan carry_meta.reasoningEffort, but only when those arguments are present. Without them, a model change sends{ sessionId, modelId }(yourfieldCount: 2), and if the session is already on that model,set_modelis skipped entirely.GrokTextGenerationalready passes both.modelSelection.optionsby exact config id. The session exposesreasoning_effort, notreasoningEffort, so the loop logs "ACP session does not expose requested configuration option(s)" and never callssession/set_config_option.Likely fix area
reasoningEffortintoapplyGrokAcpModelSelection, along with the current effort from session setup, the way text generation already does. On protocol version 1, that sendssession/set_modelwith_meta.reasoningEffort, including a same-model change from the CLI default tolow.reasoningEffortto thethought_levelselect and callset_config_optionwith that option's own id. That's a wider ACP change. It would also cover protocols newer than 1, whereapplyModelSelectionusessetModeland drops_meta.A maintainer will decide on the fix direction.