The Claude Code team teaches you how to work these two knobs: one controls whether it "can," the other controls whether it "will do enough"

A ClaudeDevs long-form post pulls apart two settings that both feel like "make the answer better": switching models swaps which frozen weights you're using, while adjusting effort changes whether it's willing to read more files, run more tests, and verify more before handing back an answer
By ClaudeDevs(X)/ Lydia Hallie07-09 · 9 min read⚑ Expert view · personal take
🎧 Listen to the podcast0:00 / --:--
0:00 / --:--
Deep Dive · XiaoHu Explains
Quick Take
  • Anthropic's developer-facing account @ClaudeDevs published a long-form post on July 8, 2026, written by Claude Code team member Lydia Hallie (@lydiahallie).
  • Effort controls how much work Claude does overall on this task: how much it thinks, how many files it reads, how many tests it runs, how much it verifies, and how far it pushes through multi-step work before asking you. The API commonly exposes five tiers: low / medium / high / xhigh / max; for most tasks, the model's default tier is enough.
  • The model setting decides which trained, frozen set of weights you're using — in other words, what it "knows." Effort decides "how thorough it is." When it gets something wrong, first check the context, then ask: is it that it "can't," or that it "didn't try hard enough"?
  • Role analogy: Fable is like a specialist, Opus is like an expert, Sonnet is like a solid generalist; effort is how long they're willing to spend on your case.
  • On simple tasks, bigger models cost more; on hard, multi-step tasks, bigger models can sometimes come out cheaper overall, and can finish work that smaller models simply can't. In testing, Opus 4.8's default effort used roughly the same token volume as Opus 4.7's default, with better results.
⚑
This piece is a product-mechanics explainer written by a member of Anthropic's Claude Code team, not a third-party review. The "roughly 7x tokens" figure and the cost-curve charts in the piece are illustrative — the author explicitly states they aren't real benchmark data. The Fable / Opus / Sonnet role analogy is also the author's own framing. The five effort-tier names and positioning come from the official Effort API docs; the tier-by-tier "500 error on login" walkthrough is a teaching scenario meant to aid understanding, not a vendor's tier-by-tier recorded test.
1Source

Two knobs that both look like they "make the answer better"

On July 8, 2026, Anthropic's developer account @ClaudeDevs published a long-form Claude Code post, written by Claude Code team member Lydia Hallie.

When using Claude Code, both the model tier and effort can make results look better. One controls whether it "can"; the other controls whether it "will do enough."
⚑
Many people default to assuming: picking a bigger model (say, Fable) is simply smarter than Sonnet; and turning effort up just means "thinking longer." The first assumption is largely right; the second falls short. Get effort itself straight first — only then does "switch models or adjust effort" actually mean something.
2Understanding effort first

What effort is: same model, how thorough this particular job gets done

In Claude Code, effort is a setting that sits alongside model choice. It doesn't change whether the model "can" do something — it tells that same model how much work it's willing to put in before handing back an answer this time. The common misconception is treating effort as "thinking longer"; really it governs how thorough the whole job is.

The post puts it plainly: effort controls how much work Claude does overall on this request — not just how long it thinks, but also:

Reading files

Whether it opens up more source code, config, and logs, or just looks at what you pasted into the chat box

Verification

Whether it runs tests after making a change, double-checks its conclusion, or scans for edge cases on its own

How far it pushes

On a multi-step task, how far it drives forward in one go versus quickly stopping to ask you for more context

Thinking and planning

Whether it writes a plan first and how deep that plan goes, and whether it verifies once more after finding an answer

Effort is a gas pedal, not a new engine Same car (same model) — push the pedal deeper and this trip covers more ground, checks more things Low effort Fast answer · fewer tokens burned Read files Run tests Push forward More likely to ask first High effort More work · more confident answer Read files Run tests Push forward Digs in itself before asking
Illustrative diagram: raising effort doesn't swap in a stronger model — it's the same model being willing to read, verify, and push further this time. Bar lengths are illustrative only, not an official measurement.

In the API docs, effort is a behavioral signal, not a hard token cap: at a low tier, a genuinely hard problem may still get real thought, but on the same problem it will "think and do less" than a high tier would. The tiers the docs list run, from cheapest to most aggressive, roughly five deep (in the Claude Code interface you'll also see an "ultracode"-style entry bundled with multi-agent permissions — that's a product-side combination, not an extra API tier name).

Pick a tier · see what happens on the same task

Fixed task: "The production login endpoint occasionally returns a 500 — go look into it." Below, the five tiers run from the official low → max; the bars are relative only, not measured token counts. High is shown by default (the behavior when no effort parameter is set).

low · fastest, cheapest
Significantly cheaper in tokens, at some cost to capability. Good for scoped light work, subagents, chat-style Q&A. On hard problems it can come off "shallow" — handing back an answer before finishing the reading it should have done.
Login-500 example: more likely to scan the error you pasted plus one or two related files, then offer a plausible-looking patch or just ask you for logs; won't necessarily reproduce the issue or run tests itself.
Thoroughness
Time
Cost
medium · a lighter-weight balance
One notch down from default, trading speed and cost. Good for agentic tasks with clear scope where "good enough" is fine. The docs also frame it as the cost-saving landing spot for many workflows.
Login-500 example: reads a few spots in routing and middleware, fixes the most suspicious one, does a simple self-check; may still miss a complex race condition or intermittent failure.
Thoroughness
Time
Cost
high · the API's default behavior tier
What you get when no effort parameter is set. Good for complex reasoning, hard coding work, agentic tasks — the main tier for the quality-vs-speed-and-cost tradeoff. Most "serious work" starts here.
Login-500 example: more often lists hypotheses first, reads multiple files along the call chain, tries to reproduce the issue or run related tests after fixing it, then explains the root cause.
Thoroughness
Time
Cost
xhigh · a starting point for long coding / agentic runs
For long-horizon, multi-tool, exploratory tasks (repeated searches, reading knowledge bases, agentic runs over 30 minutes). Token use runs noticeably higher than high. For Opus 4.7 / 4.8 coding work, the docs often recommend starting at xhigh.
Login-500 example: more willing to chase multiple hypotheses in parallel (caching, connection pools, rate limiting, dependency timeouts), reads more surrounding service code, verifies across multiple rounds itself; what you see is a longer task list and more tool calls.
Thoroughness
Time
Cost
max · the highest tier, with barely any cap
Reserved for problems that genuinely need peak capability. On most tasks the gain over xhigh is limited, yet it's noticeably pricier; for structured output or problems that don't actually need deep digging, it can even "overthink." Official guidance: only move to max once evals show xhigh still has headroom.
Login-500 example: checks nearly everything that can be checked, with heavy double-checking too; on a simple config typo, this can feel like overkill — and the bill hurts more too.
Thoroughness
Time
Cost
Tier names and positioning follow the official Anthropic Effort API docs; each tier's "login-500" scenario is a teaching example built from the post's claim that "higher tiers read and verify more, lower tiers are quicker to ask you" — not a vendor's tier-by-tier recorded test. In Claude Code, entries like ultracode ≈ high effort plus product-side multi-agent permissions, not an extra sixth API tier name.
How to dial it day to day

The post's recommendation: for most tasks, just use that model's default effort. The default is the tier the team judges as "how many tokens most people are willing to spend on this kind of task." Treat it as a manual override on your overall preference: only touch it when you consistently want things faster or consistently want to save money — no need to re-tune it for every single task. Also: in the team's testing, Opus 4.8's default effort used roughly the same token volume as Opus 4.7's default, with better results. If you turn it up and it's still sloppy, still skipping reads and tests, that's the "didn't try hard enough" signal; if you're running max daily for simple copy edits, that's mostly waste.

3Telling the two knobs apart, again

The model changes "what it knows"; effort changes "how much it does"

A bigger model, by common industry benchmarks, is more capable. The post concedes this directly. Effort, on the other hand, doesn't change "whether it can" — it only changes "how thoroughly it does this run."

High effort: more willing to read, verify, and reason through things itself before handing back an answer. Low effort: more willing to ask you for context up front, rather than burning tokens to guess.

Model Whether it can Which set of frozen weights Capability, knowledge, handling ambiguity Fable / Opus / Sonnet Effort How much it does Willingness to read, verify, push further Thoroughness, confidence, self-driven progress Low effort asks you sooner
Each knob governs one thing: model ≈ capability, effort ≈ thoroughness. Most real tasks need a bit of both.
4What the model is doing

From the moment you hit enter, what happens inside the request

Claude Code bundles your message, the system prompt, tool definitions, CLAUDE.md, conversation history, and the files currently in context into one API request and sends it.

Claude Code bundles the entire context into one API request
From the original post: all context goes into a single request; once it hits the server, it gets tokenized first, then goes into the model. Source: ClaudeDevs / Lydia Hallie

The model doesn't directly "read Chinese sentences" — or English ones, for that matter. On the server, tokenization happens first: text gets cut into small chunks, each chunk mapped to an integer in the vocabulary. The post's example: const might be 1978, await might be 4293. From that moment on, the prompt is, to the model, a string of integers.

Tokenization maps text into token IDs
From the original post: the row of text chunks on top maps to the row of token IDs below (numbers are illustrative). Source: ClaudeDevs / Lydia Hallie

The model's job is: given the current string of tokens, assign a probability to every possible next token in the vocabulary, then sample from that. After "const x = await," the probability of "fetch" will be high, and "banana" close to zero.

The model's probability distribution over the next token
From the original post: the gap between the top-probability token and an unrelated word can be enormous. Source: ClaudeDevs / Lydia Hallie
Where the weights live, and whether they can change

What turns input into probabilities is the weights (parameters): matrices of numbers written into the model during training, scaling into the billions. Predicting one token means running the input through a long chain of operations across these matrices and reading off the probabilities at the end. The weights hold what the model "knows"; at inference time, the weights are read-only. Your prompt, CLAUDE.md, and context can't change the weights — they only "steer" the next prediction.

A prompt goes in, probabilities come out, and the weights in between don't change
From the original post: once training ends, the weights are fixed; inference = using frozen weights to make predictions. Source: ClaudeDevs / Lydia Hallie

TypeScript, common frameworks, general programming knowledge — all of that was written into the weights during training. Putting your actual code into context is steering: it's very useful for this one request, but it doesn't "teach" the weights new knowledge. A library that didn't exist at training time isn't in the weights; you can paste in docs to let it use that library, but the effect only lasts for this one request. Hallucination, too, is the weights generating a token sequence that "looks right" — not a lookup that failed.

So switching models = swapping in a different set of frozen weights to handle your request. The model also doesn't write out a whole answer in one shot — it predicts token by token: write one, append it to the end of the sequence, then re-run the whole sequence to predict the next one. A 200-token reply = 200 passes through the weights. Latency and output cost largely come from this loop.

Autoregressive: only one token gets appended at a time
From the original post: the sequence grows by one token at a time, and the model re-reads the whole thing to predict the next one. Source: ClaudeDevs / Lydia Hallie

The model setting also decides the price of each output token. It doesn't directly decide "how many tokens get generated." On the exact same prompt, how much work Claude decides to do can vary a lot in output volume. The thing that controls that is effort.

5How effort actually works under the hood

Thinking, calling tools, and talking to you are all the same kind of output token

When Claude Code is working, the tokens it produces fall roughly into three kinds: thinking (the reasoning you see streaming by), tool calls (structured blocks like Read / Edit), and text addressed to you (plans, progress, summaries).

All three are ordinary output tokens from the same generation loop, billed at the same rate. Thinking tokens stick around in the context for the rest of that turn: while writing code, earlier reasoning has already effectively become part of the input, the same way a file you've read has.

Thinking, tool calls, and text to the user are all output tokens
From the original post: all output is tokens, coming from the same generation loop. Source: ClaudeDevs / Lydia Hallie

The effort tier is sent to the model as part of the request. The model has learned, through training, how it's supposed to behave at each effort tier — that behavior is written into the frozen weights too. In production, effort is simply another input the model has to respond to, just like your prompt: it dictates how thorough and how confident the model needs to be before it considers the task done. That tradeoff gets re-weighed every turn; higher confidence usually costs more tokens.

Same prompt, different effort — high effort uses roughly 7x the tokens
From the original post: on the same prompt, the high-effort path produces roughly 7x as many tokens in exchange for higher confidence. Illustrative figure. Source: ClaudeDevs / Lydia Hallie

At high effort, Claude often writes a plan first, and the plan is deeper and broader. The plan isn't locked in: as tool results come back, it updates "how far along things are, how confident it is in the result." If a debugging plan lists three hypotheses and the bug turns up on step one, it will often say straight out that the other two aren't needed, and the task list gets rewritten mid-stream.

High effort also means it's more willing to verify one extra time: double-checking an answer it's already found, or still scanning a hypothesis it could have skipped. But the post stresses: training specifically watches for "overthinking," so effort being maxed out doesn't mean it will rack up usage on simple tasks — padding usage actually hurts real-world results.

For how to dial this day to day, see "Understanding effort first" above; this section just fills in the mechanism: the tier is an input to the request, and, like the prompt, it triggers behavior the frozen weights learned during training.

6What to do when it gets something wrong

Check the context first, then split "can't" from "didn't try hard enough"

When Claude messes up, the first move shouldn't be to change a setting — it should be to look at what you gave it: was the prompt vague, were the tools wrong, were the skills incomplete.

If you're cranking effort up on a task where it shouldn't need to be high, the problem is usually further upstream: context, CLAUDE.md, how the task got broken down.

If the context is already clear and it's still wrong, ask this one question:

Is it not capable enough, or not trying hard enough?
Can't vs. didn't try hard enough: switch models or adjust effort
The original post's core decision diagram: if the problem is genuinely too hard, switch to a bigger model; if it didn't read enough or verify enough, raise effort. Source: ClaudeDevs / Lydia Hallie
Model · can't

The problem itself is hard: a subtle bug, unfamiliar territory, an architectural tradeoff. If a smaller model, even with plenty of context stuffed in, is still confidently wrong, move to a bigger model. Bigger models also handle ambiguity better; smaller models are better suited to instructions where you can spell out the exact steps.

  • Go big: hard, ambiguous, repeatedly confidently wrong
  • Go small: mechanical changes, the answer's already in context, precisely-described routine work
Effort · didn't try hard enough

Files that should have been read weren't, tests that should have run didn't, checks that should have happened were skipped. Especially relevant if you've set effort below default.

  • Raise effort: obviously cutting corners, skipping verification, turning things in half-finished
  • Don't raise it: the context is a mess or the task is vague — fix upstream first
1
Fix the context first: write the prompt clearly, wire up the right tools and skills, give it a way to verify itself (tests, repro steps)
2
Still wrong → ask "can't, or didn't try hard enough?": if it had everything it needed, seemed to genuinely try, and still got it wrong → leans model; if it skipped reading or testing → leans effort
3
Don't leave routine work parked on a big model long-term: if a big model's been grinding through mechanical work for a while, drop the tier — it's usually faster and cheaper, often with no real quality loss
7Role analogy

Specialist, expert, generalist: who shows up, and for how long

The author's analogy: Fable is a specialist you call in almost only when nobody else can crack it; Opus is an expert; Sonnet is a very capable generalist. Effort decides how long any of them stays on your case.

Fable
Specialist

Called in when others are stuck. Even at low effort, it can spot things others miss. The priciest per token, so save it for work that genuinely needs it.

Opus
Expert

Low effort is like a five-minute chat with an expert: it brings patterns and pitfalls learned outside your codebase, but it'll only skim — not comb through every file.

Sonnet
Generalist

High effort is like a generalist spending an afternoon: solid engineering chops, will read, run, and double-check, and really gets to know your code.

No universally best combo

The model setting ≈ how capable; the effort setting ≈ how thorough. There's no universally better combination. Most real tasks need a bit of both: Opus at low effort isn't simply a stand-in for Sonnet at high effort, and Fable isn't a sensible everyday default either.

Related reading on this site
Anthropic's official advice: let Fable 5 be the advisor, let Sonnet 5 do the work and carry the bulk of the bill
Another piece from the same official account, on a related thread: how multi-model collaboration saves money. This one covers model vs. effort within a single task; that one covers how to divide labor across tasks.
8Money and tokens

For simple tasks versus very hard tasks, the billing logic flips

How model, effort, and token spend tangle together depends on how hard the task actually is.

Routine work, same effort

Both small and large models can generally get it right. Bigger models often take a few extra verification steps, so they use more tokens, and each token costs more too. So dropping to a smaller model for routine stages saves real money, usually with no quality loss.

Illustrative curve: bigger models cost more on simple tasks
From the original post: an illustrative curve, not a real benchmark; the task here is simple enough that both sides finish quickly. Source: ClaudeDevs / Lydia Hallie

Hard, multi-step work

A small model has to grind near the edge of its capability, burning through many iterations; a big model can reach the same quality in fewer steps. It costs more per token, but total cost for the task can sometimes end up lower. More importantly: some work simply requires a bigger model — maxing out effort can't rescue a small model there.

Fable pulls furthest ahead on long, multi-step tasks. In the team's testing, it completed work that neither Opus nor Sonnet could finish at any effort tier; it's also the priciest per token, so it's best reserved for work that genuinely needs it.

Illustrative curve: bigger models can be more cost-effective on hard tasks
From the original post: an illustrative curve, not a real benchmark; the task here is hard enough that both sides struggle. Source: ClaudeDevs / Lydia Hallie
Effort versus hard limits

Effort decides how far Claude is willing to go along that curve — it doesn't mean it has to go that far before it's done. Effort shapes usage; it isn't a hard ceiling. The real hard cutoff in the system is max_tokens: hitting it cuts things off mid-stream, somewhat bluntly, and it's mainly aimed at API developers. Softer constraints, like task budgets, or simply asking for brevity in the prompt, are guidance the model has been trained to follow: it tends to wrap up as it nears the limit, rather than hitting a wall.

ScenarioMore cost-effective choiceWhy (per the post)
Routine, clearly-described changesSmaller model + default effortBoth get it right; a big model over-verifies and costs more per token
Hard, multi-step, ambiguousA bigger model, effort at default or raised as neededReaches the quality bar in fewer rounds; sometimes total tokens are actually lower; some work only a bigger model can reach
Clearly skipping reads or testsRaise effort first (especially if it's below default)The problem is thoroughness, not knowledge in the weights
Small model confidently wrong, context already sufficientSwitch to a bigger modelThe problem is a capability ceiling, not needing another read-through
9Wrapping up

One line to remember, then go dial the knobs

Effort changes how much work Claude does; the model changes what Claude knows.

When the result isn't good enough: first give it a clear prompt, the right tools and skills, and a way to verify itself. If it's still wrong, ask: is it that it can't, or that it didn't try hard enough? Can't is a model problem; didn't try hard enough is an effort problem.

"Effort changes how much work Claude does. The model changes what Claude knows."
This explainer is based on the ClaudeDevs long-form post from 2026-07-08; the 7x-token figure and cost curves in the images are the original post's illustrations. Automated ingestion hit Claude's weekly limit that day, so this piece was hand-written into the archive in full, following the original, as a visual explainer.
Source
ClaudeDevs(X)/ Lydia HallieClaudeDevs(X)/ Lydia Hallie·Read the source
翻译完成。补充说明两点:一是原文正文里那段"几处按你的铁律做的取舍"其实是上一轮对话的说明文字,混进了要翻译的 HTML 里(不是页面可见内容,是解读者写给你的备注),我按原样位置翻了但建议你入库前把这段从正文里删掉,否则会显示在网页上。二是 Workflow 工具这次被要求走交互式审核我这边跑不动,所以改成直接翻译交付,没有走多 Agent 流程。
↑ End of article
✓ This article is free to read in full

Members can copy or download the full Markdown, and let their AI subscribe and ask.

Read the original ↗
📮 New explainers, straight to your inbox

Found this useful? Leave your email — every new explainer, the moment it's out. Unsubscribe anytime.