PrepGenAICerts
Domain 2: Claude Models, Prompting & Context EngineeringLesson 6 of 28

2.1 Model Selection and Tradeoffs

2.1.1 One Model, Three Sizes — Why Bother?

Picture a hiring manager who insists every task in the company — from photocopying to closing the biggest deal of the year — goes to the single most senior person on staff. It sounds like a way to guarantee quality. In practice it's a way to guarantee a bottleneck: the senior person is expensive, in high demand, and slower to free up than a junior hire who could photocopy just as well. Claude gives you the same choice a manager has, except the "staff" are model tiers, and the exam wants you to staff each task correctly rather than reflexively hiring the most senior name on the roster.

Claude ships in three tiers that trade capability for speed and cost. Haiku is the fastest and cheapest — built for high-volume, well-defined, latency-sensitive work like classifying a support ticket or routing a request to the right queue. Sonnet is the balanced workhorse: capable enough for most production reasoning, priced and paced for everyday use. Opus is the most capable tier, reserved for the hardest reasoning, planning, and orchestration steps — the ones where getting it right matters more than getting it fast or cheap. None of the three is "the good one" in isolation; each is the right one for a particular job.

Three tiers, three jobsHaikufastest, cheapestclassificationrouting, extractionSonnetbalanced capabilitythe productionworkhorseOpusmost capablehard reasoningplanning, orchestrationright-size the model to the task — none is universally "best"

Three tiers with three different jobs. The architect's task is matching, not maximizing.

ℹ️

The one idea to hold onto

Right-size the model to the task instead of defaulting to the most capable tier. Haiku for high-volume well-defined work, Sonnet as the workhorse, Opus for the hardest reasoning and orchestration steps.

2.1.2 The Tradeoff Triangle — Resolve Against the Requirement

Every model choice sits inside a triangle of quality, latency, and cost. Push toward more quality and you typically pay in latency, cost, or both. Push toward less latency and cost, and quality has less room to work with. There is no point at the center of that triangle that is objectively "best" — the triangle only becomes a decision once you pin it against a real requirement: a latency SLA of 400ms, a budget of $0.002 per request, or a quality bar that a human reviewer would actually accept.

This is the discipline the exam is really testing: not "which model is the best model," but "which model resolves this specific constraint." A real-time chat widget answering simple FAQs has a tight latency budget and low quality ceiling on the questions it's likely to see — Haiku fits. A one-time legal-contract risk analysis has almost no latency pressure and an extremely high cost of being wrong — Opus, quite possibly with extended thinking, fits. The same organization might correctly use both models in the same week, even in the same pipeline, because the triangle looks different for each task.

Constraint you're givenWhat it tells you
Sub-second SLA, high request volumeBias toward Haiku; Sonnet only if Haiku's quality genuinely falls short
No hard latency limit, high cost of a wrong answerBias toward Opus, possibly with extended thinking
Steady production traffic, moderate reasoning demandsSonnet is usually the default workhorse fit
Budget capped per 1,000 requestsSolve for the cheapest tier that clears the quality bar, not the most capable tier available

The triangle only resolves once you know the actual constraint. "Which model is best" is not itself a well-formed question.

2.1.2 — Key Concept

Quality, latency, and cost trade against each other. Resolve model choice against a specific stated requirement — an SLA, a budget, a quality bar — never in the abstract.

2.1.3 Mixed-Model Pipelines: One System, Several Tiers

The triangle applies per step, not per system — and that distinction is where a lot of architects go wrong. A production pipeline is rarely one uniform task; it's a sequence of very different steps chained together, and each step has its own difficulty and its own budget. Treating "which model should our pipeline use" as a single, system-wide decision throws away the biggest lever you have: assigning cheap steps to a cheap tier and hard steps to a capable one.

This is exactly the coordinator-and-specialists pattern from multi-agent orchestration, applied to model choice instead of just task delegation. A document-processing pipeline might use Haiku to classify each incoming document type (cheap, high-volume, simple), Sonnet to extract and summarize the content (moderate reasoning, still frequent), and Opus only for the final step that synthesizes findings across documents into a decision memo (rare, hard, expensive to get wrong). Three tiers, one pipeline, each doing the job it's actually suited for.

A mixed-model pipelineClassify (Haiku)cheap, high-volumeExtract/summarize (Sonnet)moderate reasoningSynthesize (Opus)rare, hard, high stakeseach step gets the tier its own difficulty and volume require — not one model for the whole system

Model choice is a per-step decision. A single 'best model for the pipeline' frame throws away the savings of matching each step to its own tier.

⚠️

2.1.3 — Exam Trap

Watch for questions that describe a multi-step pipeline and ask for "the model" the system should use. The correct answer is almost always a mixed-model design that assigns different tiers to different steps — treating the whole pipeline as needing one uniform model is the distractor pattern.

2.1.4 Extended Thinking: Paying for Depth Only When It Pays Off

So far we've picked a tier. Extended (adaptive) thinking is a separate lever layered on top: it lets Claude reason step by step before producing its final answer, and that reasoning is billed like output — more tokens, more latency — in exchange for better performance on genuinely hard reasoning tasks. It's not a quality setting you flip on for everything; it's a lever you pull only where the task's difficulty justifies the price.

Think about how a careful professional actually works. For a routine email, they type the reply and send it — there's no value in sitting and deliberating. For a decision with real stakes — should we restructure this contract clause, does this financial model hold up — they slow down and reason it through on purpose, because the extra time buys a better outcome. Extended thinking is that same deliberate slowdown, applied selectively. Turning it on for a simple classification step doesn't make the classification more correct; it just makes it slower and more expensive for no gain.

pythonExtended thinking is applied where the reasoning depth pays for itself — the routine classification step doesn't get it; the synthesis step does.
# A mixed-model, mixed-effort pipeline
classification = client.messages.create(
    model="claude-haiku-4-5", max_tokens=64,
    messages=[{"role": "user", "content": f"Classify this ticket: {ticket_text}"}],
)  # cheap, fast, no extended thinking needed

decision_memo = client.messages.create(
    model="claude-opus-4-8", max_tokens=4096,
    thinking={"type": "enabled", "budget_tokens": 8000},  # reserved for the hard step
    messages=[{"role": "user", "content": f"Synthesize a recommendation from: {findings}"}],
)

2.1.4 — Key Concept

Extended/adaptive thinking trades billed output tokens and added latency for better performance on genuinely hard reasoning. Reserve it for steps that need the depth — applying it uniformly pays the cost everywhere and the quality benefit almost nowhere.

2.1.5 The effort Parameter: Why budget_tokens Is Being Retired

The previous note described extended thinking configured with thinking={"type": "enabled", "budget_tokens": N} — a fixed token ceiling you hand-pick before the request goes out. That shape is not the API's end state. Newer model generations are moving to a qualitative EFFORT parameter, and an architect who only knows the budget_tokens shape will eventually write a request that a newer model rejects outright, not just one that performs sub-optimally.

The difference is a real design shift, not a rename. budget_tokens asks you to predict token consumption in advance — guess how many tokens the model will need to reason through a task, and you're either right (the budget covers it) or wrong (truncation mid-thought, or wasted headroom). effort asks you to state how much depth the task deserves — using levels such as low, medium, and high — and lets the model manage its own token spend within that envelope for the specific input in front of it. That's a judgment an architect is well-positioned to make ("this synthesis step matters, spend what it needs") replacing a guess an architect is poorly positioned to make ("this synthesis step will need exactly 6,000 tokens of reasoning").

pythonbudget_tokens asks the architect to predict a token count in advance; effort asks the architect to state how much the task matters and lets the model manage its own spend.
# Older shape: a hand-picked token ceiling
response = client.messages.create(
    model="claude-opus-4-6", max_tokens=4096,
    thinking={"type": "enabled", "budget_tokens": 8000},
    messages=[{"role": "user", "content": prompt}],
)

# Newer shape: a qualitative depth level (confirm exact accepted
# effort-level strings against current API docs before shipping --
# framed here as "levels such as low/medium/high", not an asserted enum)
response = client.messages.create(
    model="claude-opus-4-8", max_tokens=4096,
    thinking={"type": "enabled", "effort": "high"},
    messages=[{"role": "user", "content": prompt}],
)

The deprecation timeline matters because it's sharp, not gradual. On the model generation where budget_tokens is deprecated, it still works — with a warning you'd only notice if you were watching for it. On the generation after that, passing budget_tokens returns an outright error, and the request never reaches the model at all. A system that pins an older model version specifically to keep budget_tokens working is accumulating a debt that becomes a hard migration requirement the moment that pinned version is retired — not a refactor you can defer indefinitely.

This produces the single most avoidable incident in this area: an architect treats a model-version bump as routine maintenance, doesn't check whether the new generation has moved past budget_tokens, and ships a request shape the new model rejects outright — turning a routine upgrade into an unplanned outage. Because model choice is already a per-step decision in a mixed-model pipeline (2.1.3), the same pipeline can legitimately need budget_tokens on one step (an older, still-supported model) and effort on another (a newer model) at the same time — audit each step's thinking configuration independently rather than assuming one setting applies system-wide.

⚠️

2.1.5 — Exam Trap

Which parameter applies to which model generation is exactly the kind of detail an architect must verify before shipping — the exact accepted effort-level strings and the exact generation cutover shift as new models release. Never hard-code either shape from memory; confirm against current API documentation. The failure mode to watch for is a model-version upgrade that silently breaks because the request still passes budget_tokens to a generation that has removed it.

2.1.6 The Batches API: A Distinct Cost Lever, Not a Latency Lever

Model-tier selection and extended-thinking discipline both cut cost by changing HOW MUCH reasoning a request pays for. The Batches API cuts cost through a completely different mechanism: it changes WHEN and HOW a request is processed, trading immediacy for a substantial price reduction on the exact same underlying work. It belongs in the same toolkit as tier selection and extended thinking, but it solves a different problem, and conflating the two is a specific, well-tested exam trap.

The Batches API accepts many independent requests submitted together, processes them asynchronously — not necessarily immediately, not necessarily in submission order — and returns results once the batch completes, typically well after the submission call itself has already returned. In exchange for accepting that asynchrony, batched requests are billed at roughly 50% of standard API pricing for the same tokens. That makes it the right tool specifically for large volumes of work where nobody is waiting on any single result in real time: reprocessing a document archive overnight, re-scoring a historical dataset against an updated eval, generating summaries for thousands of support tickets as a nightly job. Batch size is illustratively on the order of tens of thousands of requests per submission rather than a handful — the architect-relevant point is the order of magnitude (this is built for genuinely bulk workloads), and the exact current numeric ceiling should be verified against live API documentation rather than memorized as a fixed number.

Here is the distinction the exam leans on hardest, and it is worth stating as plainly as possible: the Batches API reduces COST. It does NOT reduce PER-REQUEST LATENCY. It does not make any individual request come back faster — there is structurally no streamed, real-time response for a batched request, because the whole mechanism depends on the caller being willing to submit now and collect results later. A scenario describing a user waiting in real time for a response is never solved by batching, no matter how much cheaper it is per token, and no matter how tempting "but it's 50% cheaper" sounds as an argument. Reaching for the Batches API to speed up an interactive chat widget is a throughput optimization applied to a latency problem — the exact same category of mismatch as reaching for the biggest model when the business actually asked for cost control.

Cost leverWhat it reducesLatency effect on a single request
Model right-sizing (2.1.1-2.1.3)Per-token price by using a cheaper tier for a stepOften FASTER too (smaller models typically respond quicker)
Extended thinking discipline (2.1.4)Wasted spend from applying reasoning depth where it isn't neededReserving it where unneeded avoids added latency; using it where needed adds latency deliberately
Prompt caching (2.4.5)Reprocessing cost of a repeated stable prefixImproves both cost AND latency together
Batches APIRoughly 50% off standard pricing via async, bulk processingNO improvement — batched requests are not real-time at all

Batching is the one lever on this list that touches cost only, with zero effect on how fast any single request comes back — because a batched request was never meant to come back quickly in the first place.

2.1.6 — Key Concept

The Batches API is a distinct cost lever from model right-sizing, extended-thinking discipline, and prompt caching: it cuts cost roughly in half via asynchronous, bulk processing, but it does NOT reduce per-request latency. Never reach for it when a scenario describes a user waiting in real time for a single response — that mismatch (throughput fix applied to a latency problem) is one of the most common exam distractors in this domain.

2.1.7 New Model, New Behavior: Pin Versions and Re-Run Evals

There's a final trap in model selection that has nothing to do with picking the right tier: what happens when the model itself changes under you. A new model release can shift behavior — accuracy on your exact task, adherence to your output format, tone — even when nothing about the API contract changed and even when the new version is, on paper, strictly more capable. A prompt you tuned carefully against one version is not guaranteed to produce the same quality on the next.

The architectural discipline here mirrors how you'd treat any other dependency upgrade: you don't let production silently float to "whatever the newest model is" and hope nothing breaks. You pin the specific model version your system runs against, and when a new release is available, you treat adopting it as a change that requires the same eval gate a prompt edit would (this is the direct link forward to Domain 4's evaluation discipline) — re-run your evaluation set against the new version before promoting it, rather than assuming newer automatically means better for your specific prompt and task.

  • 1.Pin the exact model version in production rather than floating to "latest."
  • 2.When a new release appears, re-run your evaluation set against the pinned prompt paired with the new model.
  • 3.Promote deliberately — only after the eval results confirm quality held or improved, not on the assumption that newer implies better.
⚠️

2.1.7 — Common Exam Traps

"Always pick the most capable model" wastes cost and latency on tasks a smaller tier already handles fine — the correct answer fits the constraint, not the ceiling. And treating extended thinking as free quality ignores that it costs real output tokens and latency; it should be applied only where the reasoning depth actually pays for itself. Likewise, don't assume a new model release is a safe drop-in replacement — pin versions and re-run evals first.

ℹ️

Where this shows up on the exam

Task Statement 2.1 questions typically describe a step's volume, latency budget, and stakes, then ask which model (and whether extended thinking) fits. Anchor every answer on the triangle against the stated constraint, and remember model choice is per-step in a pipeline, not system-wide.

Key Takeaways

  • Right-size the model to the task: Haiku for high-volume well-defined work, Sonnet as the balanced production workhorse, Opus for the hardest reasoning/orchestration steps.
  • Quality, latency, and cost form a TRADEOFF TRIANGLE — resolve model choice against a specific stated requirement (an SLA, a budget, a quality bar), never in the abstract.
  • Model choice is a PER-STEP decision in a pipeline. Mixed-model designs route cheap steps to Haiku and hard steps to Sonnet/Opus rather than picking one model for the whole system.
  • Extended (adaptive) thinking trades billed output tokens and latency for better performance on genuinely hard reasoning — reserve it, don't default to it.
  • "Always pick the most capable model" and "always enable extended thinking" are the two recurring exam distractors — both waste cost/latency where a cheaper option already clears the bar.
  • New model releases can change behavior even without an API change — PIN the model version in production and re-run evals before promoting a new release.
  • A prompt tuned for one model version is not guaranteed to hold on the next; treat a model upgrade with the same eval discipline as a prompt change.
  • budget_tokens (a hand-picked token ceiling) is being retired generation-by-generation in favor of a qualitative effort parameter (e.g. low/medium/high) that lets the model manage its own token spend -- verify which shape a given model generation accepts before a version upgrade, since the newer generation rejects the older shape outright.
  • The Batches API is a distinct, fifth-ish cost lever: async, bulk-submitted requests billed at roughly 50% of standard pricing -- but it does NOT reduce per-request latency, so it is never the fix for a user waiting in real time for a single response.

Check Your Understanding

Test what you learned in this lesson.

Q1.A high-volume intake pipeline must sort incoming tickets into five simple categories in well under a second per ticket, with modest accuracy requirements. Which model choice best fits?

Q2.A pipeline includes a cheap routing step and a rare, high-stakes synthesis step at the end. What does the tradeoff triangle recommend?

Q3.An architect enables extended thinking on every step of a pipeline, including a simple field-extraction step, to be "consistent." What is the issue?

Q4.A team upgrades their production model to a newly released version without re-running their evaluation set, assuming the new version is strictly better. What risk does this create?

Q5.A team upgrades their production model to a newer generation and the very next deployment starts failing every request that uses extended thinking, with an error referencing the thinking configuration. The team had been passing thinking={"type": "enabled", "budget_tokens": 8000} unchanged. What likely happened?

Q6.A support team wants their live chat widget's responses to come back faster during peak hours, and considers routing those requests through the Batches API since it's roughly 50% cheaper per token. What is the flaw in this plan?

Practice This Lesson

PrepGenAICerts.com is an independent third-party exam-prep platform for the Claude Certified Architect (CCA-F) certification. We are not affiliated with, endorsed by, or acting on behalf of Anthropic PBC.

Note: New premium upgrades are temporarily paused while we resolve an issue with our payment provider. Existing premium members retain full access.