Regression in 0.146.0: gpt-4o-mini sends unsupported reasoning.effort=none
What version of Codex CLI is running?
codex-cli 0.146.0
What subscription do you have?
API key
Which model were you using?
gpt-4o-mini
What platform is your computer?
Microsoft Windows NT 10.0.26200.0 x64
What terminal emulator and version are you using (if applicable)?
PowerShell
Codex doctor report
{
"schemaVersion": 1,
"codexVersion": "0.146.0",
"installation": "npm",
"platform": "windows-x86_64",
"wireApi": "responses",
"provider": "custom OpenAI-compatible provider"
}
The full doctor report was not included because it contains local filesystem paths and a private network URL.
What issue are you seeing?
Codex CLI 0.146.0 sends reasoning.effort: "none" when using the non-reasoning model gpt-4o-mini.
The request fails with:
{
"error": {
"message": "Unsupported parameter: 'reasoning.effort' is not supported with this model.",
"type": "invalid_request_error",
"param": "reasoning.effort",
"code": "unsupported_parameter"
}
}
The same model, Responses API provider, and configuration worked correctly with Codex CLI 0.144.6 and produced a normal response without reasoning.
The observed request used an OpenAI-compatible Responses API gateway. No credentials, gateway addresses, private network information, thread IDs, or full rollout logs are included in this report.
What steps can reproduce the bug?
- Install Codex CLI 0.146.0.
- Configure Codex with:
model = "gpt-4o-mini"
model_reasoning_effort = "none"
- Run:
codex exec "just say 1"
- The request fails with HTTP 400 because
reasoning.effortis unsupported.
With Codex CLI 0.144.6, the same setup succeeds.
What is the expected behavior?
For models that do not support reasoning, Codex should omit the entire reasoning parameter instead of sending:
{
"reasoning": {
"effort": "none"
}
}
Additional information
This appears to be a regression of #837:
https://github.com/openai/codex/issues/837
In 0.144.6, build_reasoning() returned None when the model did not support reasoning summaries.
In 0.146.0, build_reasoning() always returns a Reasoning object and the request always sets:
reasoning: Some(reasoning)
It also unconditionally includes:
["reasoning.encrypted_content"]
Source comparison:
https://github.com/openai/codex/blob/rust-v0.144.6/codex-rs/core/src/client.rs
https://github.com/openai/codex/blob/rust-v0.146.0/codex-rs/core/src/client.rs