Reasoning effort
These are the effort levels o4 knows, from least to most effort:
Each model supports its own subset. For example, most current Claude models offer
low, medium, high, extra-high and max, while DeepSeek models offer low, high and max. Models without declared levels only offer default.
In o4 0.2.74,
ultra is max under another name. o4 marks ultra as an o4-only top tier that should also turn on multi-agent orchestration, but no code acts on that, so the model gets effort: max and nothing else changes. It’s offered on the openai-codex models gpt-5.6-sol, gpt-5.6-terra, gpt-6-astra, gpt-6-luna and gpt-6-sol. If you pass --reasoning ultra for any other model, it behaves exactly like max there (see How providers apply the effort)./config, which lists only the levels the model accepts. o4 --list-models shows reasoning: yes or reasoning: no for each model, but not the levels.
Set the effort for a session
-
Press
Alt+Rto cycle through the current model’s levels, starting fromdefault. A notice such asReasoning: highconfirms the new level. For a model without levels, you see<model> does not support reasoning effortinstead. You can remap the key with thecycle_reasoningaction (see Keyboard shortcuts). -
Run
/reasoning <level>, for example/reasoning high. o4 shows a Reasoning pane with the current effort, the active model, and the levels the model offers. A level the model doesn’t offer is refused with<model> doesn't support reasoning '<level>'. Supported: …. While the model is working, the command waits until the turn finishes. -
Start o4 with
--reasoning:
--reasoning accepts any level name, even one the current model doesn’t list. Unknown names stop o4 with Unknown reasoning level. The same happens at startup if reasoning in settings.json holds an unknown name. When you switch models during a session, your reasoning level carries over to the new model.
If the level you chose isn’t one the model offers, what happens depends on the provider (see How providers apply the effort). To be sure what you get, pick a level from the model’s own list in the Reasoning tab.
Set the default effort
Run/config reasoning to open the Reasoning tab, select the Reasoning row, and press Enter to cycle through default and the levels the current model supports. The row shows the saved level, or default. o4 saves the choice as reasoning in ~/.o4/settings.json (choosing default removes the key) and applies it to the current session right away. If the saved level isn’t one the current model lists, the next Enter starts again from the model’s lowest level.
~/.o4/settings.json
--reasoning. The setup wizard also offers a starting level on its Quick Settings step. A trusted project can set its own reasoning in .o4/settings.json.
How providers apply the effort
o4 translates the level into each provider’s own setting.ultra always arrives as max.
When the level you chose isn’t one the model offers,
anthropic, claude-code, openai, openai-codex, meta and ollama models use the model’s highest level below it, or its lowest level if there is none below. google, zai and zai-coding-plan models send no effort instead. deepseek and the Kimi K3 models use the mapping in the table.
default doesn’t always mean “no reasoning”. Some models reason on every request. For example, newer Claude models keep adaptive thinking on even when you choose default, and the provider decides how much to think.
For Claude Fable, Claude Opus 4.6 and later, and Claude Sonnet 4.6 and later, o4 shows default as adaptive: the Alt+R notice reads Reasoning: adaptive, and the Reasoning pane shows adaptive with model-selected per turn. This is only a label. The setting is still default, so the Reasoning row in /config shows default, and adaptive means the same as default wherever you type a level.
For OpenAI-compatible endpoints you add yourself, o4 sends an effort only if you declare the levels in the model’s compat settings.
Show the model’s reasoning
In the interactive interface, reasoning is hidden by default. To show it:- Run
/config reasoning. - Select Thinking display and press
Enterto switch it fromofftoon. PressEnteragain to turn it off.
show_thinking in ~/.o4/display.json and applies to later sessions too.
In print mode, add -v (--verbose) to stream the reasoning as it arrives. The reasoning goes to standard error, so standard output still contains only the answer:
Prompt profiles
A prompt profile decides which version of o4’s system prompt a model gets. Newer frontier models do well with a shorter prompt. Older, smaller and local models do better with more explicit guidance.
In o4 0.2.74, the two
modern-* profiles produce the same prompt, and so do the other two. The names mark which models o4 treats alike.
Automatic selection
o4 picks a profile from the model when the session starts, and again whenever you switch models. It uses the first rule that matches:- Exact model:
claude-opus-5andclaude-fable-5usemodern-minimal. - Model family: models whose ID starts with
claude-opus-5,claude-sonnet-5,claude-haiku-5,claude-fable-5,claude-5-,gpt-5orgemini-3usemodern-guided. This covers IDs such asclaude-fable-5-1,gpt-5.5andgemini-3.5-flash. - Provider: models from
ollama,zaiandzai-coding-planuselocal-defensive. Other built-in providers uselegacy-guided. - Everything else: models from custom providers use
legacy-guided.
ollama and from custom providers get extra guidance for local models, which asks them to use one tool at a time and keep plans simple.
Override the profile
Use--prompt-profile to choose the profile for one run:
modern-minimal, modern-guided, legacy-guided and local-defensive. There is no setting that stores a profile.
See which profile is active
--print-system-prompt prints the full system prompt for the chosen model and exits without calling it. The last lines show the profile and why o4 picked it:
Selected by is override, exact-model, model-family, provider-fallback or unknown-fallback, matching the rules above.
Related
- Choosing a model
- Context and cost: higher effort uses more output tokens.
- CLI reference:
--reasoning,--prompt-profile,--verboseand--print-system-prompt.