Skip to main content

Models & providers

Reasoning & Thinking

Some models think before they answer - running an internal reasoning pass that isn't part of the final response. This section covers how Bodega One surfaces that capability, how to control it per-message or globally, and what to expect from the UI.

How reasoning works in Bodega One

When reasoning is active, the model produces a chain-of-thought before writing its response. Bodega collects those thinking tokens in a separate stream and shows them in a collapsible Reasoning block above the response - the response text itself is always clean.

Three things control whether and how much reasoning happens for a given message, resolved in this order:

  1. Per-message composer pill - overrides everything else for that one send
  2. Claude Fast Mode - suppresses Claude reasoning globally (only affects Claude models; per-message pill still wins)
  3. Per-model override - set in the expanded model card in Settings → Models & Providers → Models
  4. Global default - saved in Settings → Models & Providers → Models as llm.reasoning_effort

If none of those are set, most models get no reasoning parameters at all - they behave however the provider defaults. Two presets are exceptions because the provider itself reasons by default: on the DeepSeek preset (V4 models) and for thinking-capable Qwen models on DashScope, the untouched default is high - Bodega leaves the provider's reasoning on rather than silently disabling its headline capability. To actually turn reasoning off on those models, select Off in the composer pill (or set an explicit Off default).

Not all models support reasoning. The composer pill appears only for models that do. Non-reasoning models silently ignore the effort value - setting a global default won't cause errors.

Which models support reasoning

The per-message control is the Effort section at the top of the composer's model menu (click the model chip). The chip itself shows the effort you picked, for example Opus 5.5 · High (a dot instead of the word when the panel is narrow). Hover or focus the ? next to Effort for what it means. Under the control a line says what more effort costs: for a cloud provider, more tokens per message, so it adds up faster against your usage; for a model running on your machine, slower replies; for a custom or self-hosted endpoint, simply that replies take longer. Picking an effort leaves the menu open.

The Effort section and model cards show four states depending on the selected model:

State What you see Models
Segmented (interactive) A slider over the model's own levels (Off / Low / Medium / High, plus Minimal, Extra high or Max where the model has them); arrow keys move it Claude 3.7 Sonnet and later (claude-3.7+, claude-opus-4-x, claude-sonnet-4-x, claude-haiku-4-x); OpenAI o3, GPT-5 and GPT-6 (not gpt-5-chat); Gemini 2.5 Pro / Flash and later
Thinking switch (on/off) One Thinking switch: the model can only think or not Local models with native thinking (Ollama, llama.cpp, LM Studio and similar): qwen3, glm-4, deepseek-r1 variants; Qwen on DashScope
Automatic (non-interactive) One line: the model thinks on its own, nothing to set Always-on reasoners: deepseek-r1 (on third-party hosts), grok, kimi-thinking, qwq / qwen-qwq
Hidden Nothing All other models (GPT-4o, Claude 3.5 and earlier, most base Ollama models)

Always-on Claude models. Claude Opus 5.5 and Claude Fable 5.1 always reason and cannot turn it off, so their menu has Low and up but no Off. The ? next to Effort says why. A saved Off is moved to the lowest effort when you pick one of these models.

About deepseek-reasoner. This page used to list it as an always-on reasoner. It is not a model - on DeepSeek's own API it is an alias that serves deepseek-v4-flash, measured by calling the endpoint: the request is accepted with 200 OK and the response body reports "model": "deepseek-v4-flash", with no warning of the swap. Prefer deepseek-v4-pro or deepseek-v4-flash by name so you get the model you picked and the cost badge you expect. The alias still works, and Bodega now prices it as v4-flash (what actually runs) and logs the substitution rather than passing it over in silence. On the DeepSeek preset the control is segmented, not Automatic - V4 accepts a graded reasoning effort, and the control offers low, high and max (minimal sends low, medium sends high, and xhigh sends high; only max sends max).

Extended tiers (beta.29). Some models expose more than four levels, and each model's menu shows only the ones it accepts: GPT-5 adds Minimal below Low (answer fast, barely think), and Claude 4.6+ adaptive models (including Claude Haiku 5.5, the first Haiku with effort controls) add Extra High and Max above High. Set a tier, then switch to a model that doesn't have it, and Bodega clamps to that model's nearest level before the request leaves - a Max set on Claude becomes High on GPT-5, so the API never rejects it.

Always-on reasoners manage their own reasoning depth - you can't tune it. For local Ollama models, the reasoning control appears when Bodega detects thinking support from the model's metadata; if it doesn't appear for a model you expect to support it, make sure the model is fully pulled and reconnect Ollama.

Per-message reasoning pill

The composer has a row of controls below the text input. The reasoning pill is one of them - it looks like a brain icon with the current effort label.

  1. Type your message in the composer (Chat mode or Code mode / Agent panel).
  2. Click the brain icon button in the control row below the input.
  3. Select Off, Low, Medium, or High from the dropdown. Press Escape or click outside to close without changing.
  4. Send the message. The pill selection applies from that message onward until you change it.

What "Off" means here: it forces reasoning off for that send. Bodega sends the provider's real disable - thinking: {type: 'disabled'} on DeepSeek, enable_thinking: false on Qwen/DashScope, think: false on Ollama, reasoning_effort: "none" on Cerebras Qwen models - so an Off message is not billed for reasoning. Before you touch the pill it shows Default, which means "use my per-model/global default" (and, on DeepSeek/thinking Qwen, the provider's reason-by-default behavior). Claude Fable and Mythos models cannot disable thinking at all - their API rejects the disable field - so Bodega never sends it for them and reasoning stays adaptive.

The pill resets to Default when you reload. It persists across messages until you change it.

Global and per-model defaults

To set a default that applies to all messages without touching the composer pill each time:

Global default:

  1. Go to Settings → Models & Providers → Models → My models tab.
  2. In the Model Roles card, under Global, use the Reasoning Effort segmented control (Off / Low / Med / High).
  3. Click Save Model Settings.

The value is stored as llm.reasoning_effort (off / low / medium / high; the stored default row is off, but on the DeepSeek preset and thinking-capable Qwen models an untouched install still reasons at high - see above) and applies to every reasoning-capable model when no per-message or per-model override is set. It's a STORAGE value, not a literal wire value - each model maps it onto its own tier vocabulary (e.g. a global High becomes a managed local qwen3.8 model's Extra High, its most expensive tier).

Graded local tiers are managed-GGUF only. A model downloaded through Bodega's own catalog (Discover) can carry a graded reasoning-tier contract; a sideloaded GGUF with the same filename never inherits it, even on an exact name match. This is deliberate: a sideloaded, abliterated Qwen3.8-27B once looped for 240+ seconds after silently inheriting the official qwen3.8-27b tier contract by filename match alone. Sideloads still get the plain on/off enable_thinking toggle - only the graded Off/Low/Medium/High/Extra-High ladder is withheld, because a fine-tune or abliteration can share a filename without sharing the behavior the catalog contract describes.

Per-model override:

  1. Go to Settings → Models & Providers → Models → My models tab.
  2. Click the chevron on a model card to expand it.
  3. Find the Reasoning Effort segmented control (Off / Low / Med / High).
  4. Select the level you want for that model specifically.
  5. Save.

The per-model value (llm.model_overrides[modelName].reasoningEffort) wins over the global default for that model only. Non-reasoning models ignore both values.

Claude Fast Mode

Claude Fast Mode suppresses extended thinking on Claude models to get faster replies - same model, no quality downgrade, just no reasoning pre-pass. It sits between the per-message pill and the per-model/global defaults in the resolution chain.

Click Fast in the composer's ⋯ More options menu; it is listed for Claude models.

To override it for one message, set the composer pill to Low, Medium, or High for that send - the pill always wins.

Fast Mode has no effect on OpenAI, Gemini, or local models. It exists specifically for Claude because Anthropic's adaptive and manual thinking architecture makes the skip-for-speed trade-off meaningful there.

The Reasoning disclosure block

When a model reasons during a response, a Thinking block appears above the response text.

  • While streaming: shows Thinking… Ns with a live elapsed-seconds counter and a spinner.
  • After completion: shows Thought for Ns with a toggle (just Thought when the time is not known). The block stays with the message when you reload: the reasoning text is saved with the response, and the seconds are remembered on this computer.
  • Collapsed by default. Click the label to expand.
  • The reasoning chain renders in a scrollable monospaced block. Chains longer than 2,000 characters show a character count at the bottom.

Token metrics and thinking token count

After a response completes, a metrics row appears below the message:

↳ N tokens (M thinking) • X tok/s

The thinking token count is included only when the model produced reasoning tokens. The metrics row appears after the response is fully done - not during streaming.

Note: thinking tokens count as input tokens for billing purposes on most providers.

Local Ollama reasoning models

For local Ollama models with native thinking support (qwen3, glm-4, deepseek variants), Bodega adds think: true to the Ollama API request automatically - you don't configure this. The composer pill still appears in segmented mode so you can set the effort level, but the model's reasoning depth is ultimately decided internally.

For llama.cpp-served models that embed <think>...</think> tags directly in the content stream, Bodega's ThinkTokenStripper handles the tag-stripping before the response reaches the UI - the response text you see is always clean.

If the reasoning control doesn't appear for a local model you expect to support it, ensure the model is fully pulled (ollama pull <model>) and that Ollama is connected.

How effort maps to provider API calls

You set Off / Low / Medium / High. The backend translates that into provider-specific parameters:

Provider Low Medium High Notes
Anthropic 4.6+ (adaptive) effort: 'low' effort: 'medium' effort: 'high' thinking: {type: 'adaptive'}, temperature removed
Anthropic 3.7–4.5 (manual) budget_tokens: 2048 budget_tokens: 4096 budget_tokens: 8192 thinking: {type: 'enabled'}, temperature removed
OpenAI o-series / GPT-5 reasoning_effort: 'low' reasoning_effort: 'medium' reasoning_effort: 'high' Swaps max_tokens → max_completion_tokens, temperature removed
Gemini 2.5+ thinking_budget: 1024 thinking_budget: 4096 thinking_budget: -1 (dynamic) Via extra_body.google.thinking_config
Local Ollama think: true think: true think: true Same flag regardless of effort level; model controls depth

DeepSeek offers three levels: Low, High and Max. Minimal and Low both send low; Medium and High send high; Max sends max. Gemini 3 models no longer receive temperature, top-p or top-k, which Google has deprecated for them; Gemini 2.5 is unchanged.

Claude Opus 4.7 and 4.8 reject temperature entirely - even with reasoning off. Bodega handles this automatically: it strips temperature for those models and retries on a 400 error, so it self-heals for future Claude releases that deprecate temperature before the internal list is updated.

Upgrading from the old Extended Thinking toggle

Before beta.25, there was a boolean Extended Thinking toggle and a token budget field. Both are gone.

On first launch after upgrading, Bodega migrates your settings automatically:

  • If you had extended thinking on, your reasoning effort is now set to Medium.
  • The old token budget key is deleted - the budget is now determined internally by provider and effort level.

No action needed. If you want to adjust the level, go to Settings → Models & Providers → Models → My models tab and expand a model card, or change the global default and save.

In the CLI

--effort off|minimal|low|medium|high|xhigh|max on bodega run (and /effort in the REPL) sets reasoning effort for the turn - unset falls back to the backend's per-model default, and out-of-range values clamp per model (minimal is GPT-5-only and is clamped away for models that don't accept it). Same effort scale as the app, no separate CLI-only levels.

This page mirrors the in-app docs hub for app version 1.0.0-beta.46. Found something unclear or out of date? Tell us on Discord. New here? Download the free beta and follow along.