What it does

Custom OpenAI-compatible endpoints

For custom providers using api: "openai-completions", a model marked reasoning: true sends reasoning_effort when thinking is enabled without needing compat.supportsReasoningEffort: true. An explicit compat.supportsReasoningEffort: false on the model disables this control. This default also applies to existing custom configurations after upgrading. If an endpoint rejects reasoning_effort, the request error points to that opt-out.

Advanced levels such as xhigh and max require a model declaration or mapping before the CLI accepts them. Use compat.supportedReasoningEfforts to declare the endpoint's accepted values, and compat.reasoningEffortMap or thinkingLevelMap to map thinking levels to those values. Requested enabled efforts are clamped to a declared ladder. Sending a level does not guarantee that the server or model distinguishes it from other levels: some models offer only binary thinking, and some servers ignore the field.

/think off omits reasoning_effort by default on custom routes, because many servers accept only low, medium, and high. Omission leaves the server's own default in effect and does not guarantee zero reasoning. If the endpoint accepts none to disable thinking, declare it explicitly on the model:

{
  reasoning: true,
  compat: {
    supportedReasoningEfforts: ["none", "low", "medium", "high"],
    reasoningEffortMap: { off: "none" },
  },
}

These defaults apply to custom routes. Bundled provider plugins retain their provider-specific thinking contracts, including native Ollama's think control.

Resolution order

  1. Inline directive on the message (applies only to that message).
  2. Session override (set by sending a directive-only message).
  3. Per-agent default (agents.entries.*.thinkingDefault in config).
  4. Per-agent model default (agents.entries.*.models["<provider>/<model>"].params.thinking in config).
  5. Shared model default (agents.defaults.models["<provider>/<model>"].params.thinking in config).
  6. Global default (agents.defaults.thinkingDefault in config).
  7. Fallback: provider-declared default when available; otherwise reasoning-capable models resolve to medium or the nearest supported non-off level for that model, and non-reasoning models stay off.

Setting a model default

Use params.thinking to set the default for one configured model without changing the default for your other models. The key must match the provider and model you actually select, including any model path exposed by a custom provider.

Replace <provider>/<model> with a configured model's full ID, then merge this entry into your existing model configuration:

{
  agents: {
    defaults: {
      models: {
        "<provider>/<model>": {
          params: { thinking: "high" },
        },
      },
    },
  },
}

The provider must already be configured, and the model must support the selected thinking level.

To change that model's default for one agent, put the same entry under agents.entries.<agent>.models. This overrides the shared model setting. Model params.thinking accepts the same aliases as /think; false and "disabled" also select off.

An inline directive, a saved session override, or a per-agent thinkingDefault still takes precedence. Send /think default to clear a saved session override; check the per-agent setting if the model default still does not take effect.

Setting a session default

Application by agent

Fast mode (/fast)

Verbose directives (/verbose or /v)

Plugin trace directives (/trace)

Reasoning visibility (/reasoning)

Malformed local-model reasoning tags are handled conservatively. Closed <think>...</think> blocks stay hidden on normal replies, and unclosed reasoning after already visible text is also hidden. If a reply ends normally and is fully wrapped in a single unclosed opening tag and would otherwise deliver as empty text, Apus removes the malformed opening tag and delivers the remaining text. A Chat Completions stream that reaches its output token limit or reports an error does not recover unfinished reasoning as answer text. If the token limit leaves no visible answer, Apus reports that the model reached its output token limit before generating an answer.

Related

Heartbeats

Web chat UI

Provider profiles