> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open4rena.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Reasoning and prompt profiles

> Control how hard a model thinks, and which prompt profile o4 uses.

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:

| Level | Meaning |
| - | - |
| `default` | o4 sends no effort, and the provider uses its own default. Also accepted as `auto`, `off`, `none` and `adaptive`. |
| `minimal` | The least reasoning the model supports. Also accepted as `min`. |
| `low`, `medium`, `high` | Increasing effort. `medium` is also accepted as `med`. |
| `extra-high` | Above `high`. Also accepted as `xhigh`, `x-high` and `extrahigh`. |
| `max` | The provider's highest effort. |
| `ultra` | Offered only by some `openai-codex` models. It sends exactly the same request as `max`. |

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`.

<Note>
  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](#how-providers-apply-the-effort)).
</Note>

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](/reference/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`:

  ```bash theme={null}
  o4 --reasoning high
  ```

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](#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.

```json ~/.o4/settings.json theme={null}
{
  "reasoning": "high"
}
```

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`.

| Provider | What o4 sends |
| - | - |
| `anthropic`, `claude-code` | Claude Opus 4.6 and later, Sonnet 4.6 and later, and Fable models get adaptive thinking plus the effort setting with the level's name. `claude-haiku-4-5-20251001` declares no levels and gets no effort. An older Claude model you add in `~/.o4/models.toml` with declared levels gets a thinking budget instead: 1,000 tokens for `minimal`, 4,000 for `low`, 16,000 for `medium`, 64,000 for `high`, and 120,000 for `extra-high` and `max`, capped below the output limit. |
| `openai`, `openai-codex`, `meta` | The reasoning effort with the level's name (`xhigh` for `extra-high`). |
| `google` | The thinking level (`minimal`, `low`, `medium` or `high`). Gemini has no `extra-high` or `max`. |
| `deepseek` | `low` for `minimal` and `low`, `high` for `medium`, `high` and `extra-high`, `max` for `max`. |
| `kimi-coding` | The Kimi K3 models map `minimal` and `low` to `low`, `medium` and `high` to `high`, and `extra-high` and `max` to `max`. Other Kimi models take no effort. |
| `zai`, `zai-coding-plan` | The reasoning effort (`low`, `high` or `max`) on the GLM models that declare it, with thinking turned on. |
| `ollama` | The reasoning effort (`low`, `medium`, `high` or `max`). |
| `xai`, `amazon-bedrock` | No effort. The provider's default applies. |

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](/models/openai-compatible#reasoning) 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](/guides/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:

```bash theme={null}
o4 -p "Why does this test fail?" -v 2> reasoning.log
```

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.

| Profile | System prompt |
| - | - |
| `modern-minimal` | The shorter prompt, for the newest frontier models. |
| `modern-guided` | The same shorter prompt, for current frontier model families. |
| `legacy-guided` | The full prompt, with detailed sections on subagents and git workflows. |
| `local-defensive` | The full prompt, for local and open-weight models. |

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](/models/openai-compatible) 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:

```bash theme={null}
o4 -m ollama:qwen3-coder:30b --prompt-profile modern-guided
```

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:

```bash theme={null}
o4 -m openai:gpt-5.5 --print-system-prompt
```

```text theme={null}
--- Prompt diagnostics ---
Prompt profile: modern-guided
Selected by: model-family
Profile version: 1
...
```

`Selected by` is `override`, `exact-model`, `model-family`, `provider-fallback` or `unknown-fallback`, matching the rules above.

## Related

* [Choosing a model](/models/overview)
* [Context and cost](/guides/context-and-cost): higher effort uses more output tokens.
* [CLI reference](/reference/cli): `--reasoning`, `--prompt-profile`, `--verbose` and `--print-system-prompt`.
