TL;DR The only control that moves the needle is
/effort. The thinking switch (Option+T,alwaysThinkingEnabled) does nothing on Fable 5.MAX_THINKING_TOKENSset to anything other than0is ignored by every adaptive model, which is exactly what you're running. And of the magic words onlyultrathinksurvives, and it doesn't raise your effort either. Checked on v2.1.220.
Think about the last time you typed think hard into a prompt. Or dropped MAX_THINKING_TOKENS=8000 into your .zshrc to spend less. Neither one does what you think on the model you're running today.
Claude's thinking changed shape, and the change was communicated badly. It used to be a budget you set. It is now a decision the model makes on every step: it looks at what you asked, judges whether reasoning would improve the answer, and acts. Anthropic calls it adaptive reasoning, and the practical consequence is that the same conversation contains turns with reasoning and turns without any.
The controls are still there, in the interface and in the docs. What's no longer obvious is which of them are still wired to something.
Here's the real one, exactly as it looks when you run /effort:
Effort
Faster Smarter
────────────────●──────────────────────────┊──────────────────────
low medium high xhigh max ┊ ultracode
xhigh + workflows
←/→ to adjust · Enter to confirm · Esc to cancel
What thinking actually is
It's the reasoning Claude generates before answering: it restates the request, tries approaches, checks intermediate results, and drops the paths that don't hold up. That text arrives in thinking blocks ahead of the response.
Two consequences worth internalizing early. It's billed as output tokens, whether or not you ever see it. And it competes with the answer for room, because it counts against the request's max_tokens.
Knob 1: /effort, the one that moves the needle
Effort isn't a token limit, it's a posture. Anthropic's docs spell out level by level how much the model reasons:
| Level | Thinking behavior |
|---|---|
low |
Minimizes thinking. Skips it on simple tasks |
medium |
Moderate thinking. May skip it for simple queries |
high |
Almost always thinks. The default on every model except Opus 4.7 |
xhigh |
Always thinks deeply, with extended exploration |
max |
Always thinks, with no constraint on depth |
If the active model doesn't support the level you asked for, Claude Code falls back to the highest one it does support: xhigh runs as high on Opus 4.6. And ultracode isn't a model level at all, it's a Claude Code setting that sends xhigh and additionally orchestrates workflows.
The advice here isn't mine, it's Anthropic's: leave it where it ships. Raise it when you have a concrete reason, not as a habit. The three ways to set it (command, environment variable and settings.json) are in how to adjust the effort level, and the judgment call about when to touch it is in Sonnet 5, Opus 5 and Fable 5.
Knob 2: the on/off switch, which doesn't exist on Fable 5
There is an on/off switch, and it has two surfaces. Option+T on macOS (Alt+T on Windows and Linux) flips it for the current session. In /config the same switch has a name of its own:
Toggle thinking mode
Enable or disable thinking for this session.
❯ 1. Enabled ✓ Claude will think before responding
2. Disabled Claude will respond without extended thinking
Watch the scope, because the screen and the docs disagree. The menu says "this session", but what /config writes is alwaysThinkingEnabled in ~/.claude/settings.json, which the docs describe as the default for every session. The genuinely one-off flip is Option+T.
Now the part almost nobody knows: on Fable 5 the switch does nothing. Not Option+T, not alwaysThinkingEnabled, not the environment variable. Fable 5 always reasons, and the only thing that decides how much is the effort level. If Fable 5 is your daily driver, that switch is decoration.
On Opus 5 you can turn it off, but only up to high effort. Above that the request doesn't degrade, it returns a 400 on every turn. We ran the command and captured it, in the Opus 5 prompting tips. Turning thinking off and raising effort are mutually exclusive moves.
Knob 3: the budget, which your model ignores
This is the most widespread mistake, and I've had it published myself. The recipe you'll find everywhere is this one:
export MAX_THINKING_TOKENS=8000 # does nothing on your model
Non-zero values only apply in fixed-budget mode, and that mode no longer exists on the models you use. Fable 5, Sonnet 5 and every Opus from 4.7 onwards are always adaptive. On those, that 8000 is ignored.
The one case the variable still covers is the extreme:
export MAX_THINKING_TOKENS=0 # this one does turn thinking off
With three asterisks. It doesn't work on Fable 5 either. On third-party providers (Bedrock, Foundry, Google Cloud) it omits the thinking parameter instead, and an adaptive model may go on reasoning anyway. And CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1, which used to be the way back to a fixed budget, only applies to Opus 4.6 and Sonnet 4.6, and since v2.1.111 it has no effect on anything newer.
The magic words: one left, and it isn't what you think
ultrathink is still a keyword. Drop it anywhere in your prompt and Claude Code recognizes it, but what it does is add an in-context instruction, not change your configuration. The effort level sent to the API is identical.
think, think hard and think more are nothing now. Claude Code passes them through as ordinary prompt text.
And here's the nuance that gets lost when someone compresses this into "they stopped working": Anthropic's own docs recommend steering reasoning with natural language, and the examples they give are "Please think hard before responding" to encourage it and "Answer directly without deliberating" to suppress it. So the phrase still influences the model. What it lost is its status as a switch: it went from mechanism to suggestion. If you want guarantees, effort is the calibrated lever; prompt wording is sensitive to exactly how you phrase it.
What you pay for and never see
You're billed for all of the reasoning, not the part that reaches your screen. Collapsed, redacted or summarized, the output token count you pay is the same. On top of that, Claude Code redacts it by default, so you're paying for text that doesn't exist for you until you switch it on: the tested recipe is in how to bring back the hidden thinking, and reading it live with Ctrl+O is one of the highest-return habits with a reasoning model.
There's an indirect cost that catches people out, too: the effort level is part of the cache key. Changing it mid-conversation invalidates the cache, and that turn reprocesses the entire history at full price. If you're going to change both effort and model, the order you do it in changes the bill.
Reference: what works on which model
| Model | Effort levels | Turning thinking off | MAX_THINKING_TOKENS |
|---|---|---|---|
| Fable 5 | low to max |
Not possible | Ignored, including 0 |
| Opus 5 | low to max |
Up to high effort |
Only 0 |
| Sonnet 5 | low to max |
Yes | Only 0 |
| Opus 4.8 and 4.7 | low to max |
Yes | Only 0 |
| Opus 4.6 and Sonnet 4.6 | low, medium, high, max |
Yes | Yes, with CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1 |
One line: you have three knobs and, depending on the model, one or two of them are disconnected. The one that never fails is effort, and the official recommendation is to leave it alone.
And if you got here looking to spend less, thinking is one front out of several: the other nine are in 10 habits to save tokens.
Official docs: Model configuration: extended thinking · Thinking · Steering thinking
Requirements
- Checked on Claude Code v2.1.220.
CLAUDE_CODE_DISABLE_ADAPTIVE_THINKINGstopped applying to newer models in v2.1.111.