Skip to main content
Many models can reason before they answer. More reasoning usually means better results on hard problems, but slower and more expensive replies. In o4 you can choose how much effort the model spends on reasoning, and you can show the reasoning in the conversation. This page also covers prompt profiles: o4 adjusts its system prompt to the model you choose, and you can override that choice.

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).
To see what the current model supports, open the Reasoning tab in /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+R to cycle through the current model’s levels, starting from default. A notice such as Reasoning: high confirms the new level. For a model without levels, you see <model> does not support reasoning effort instead. You can remap the key with the cycle_reasoning action (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:
These change the current session only. --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
New sessions start with this level unless you pass --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:
  1. Run /config reasoning.
  2. Select Thinking display and press Enter to switch it from off to on. Press Enter again to turn it off.
When it’s on, o4 shows the model’s thinking blocks in the conversation, when the model sends them. The setting is saved as 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:
Some providers send only a summary of the reasoning, or none at all, so what you see depends on the model.

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:
  1. Exact model: claude-opus-5 and claude-fable-5 use modern-minimal.
  2. Model family: models whose ID starts with claude-opus-5, claude-sonnet-5, claude-haiku-5, claude-fable-5, claude-5-, gpt-5 or gemini-3 use modern-guided. This covers IDs such as claude-fable-5-1, gpt-5.5 and gemini-3.5-flash.
  3. Provider: models from ollama, zai and zai-coding-plan use local-defensive. Other built-in providers use legacy-guided.
  4. Everything else: models from custom providers use legacy-guided.
The model’s provider also adds a short provider-specific section to the prompt. Models from 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:
The override applies to every model you use in that session, including after a switch. Accepted values are 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.