Whetstone.
Configuration, Platforms, and LifecycleDeprecations, retirements, and the 400 wall
Module 5, Lesson 324 min

Deprecations, retirements, and the 400 wall

Everything in this lesson is a request that used to work. That is what makes it dangerous and what makes it examinable: your code did not change, the model did.

The four 400s

Notice the pattern in the boundaries, because it is the thing questions are built out of. Prefill dies at 4.6. Extended thinking is only deprecated at 4.6 and dies at 4.7. Two features, two adjacent versions, opposite states at the same version number. That is a deliberately confusable pair and it is worth ten seconds of extra attention now.

And learn each boundary in both directions. A question that shows you a perfectly legal request on 4.6 and invites you to condemn it is exactly as common as one showing you a broken request, and by the time you have read a list of four failures the instinct to find a fifth is strong.

Why hard rejection is the right call

It reads as hostile the first time. Your working service points at a newer model and immediately throws.

But compare it to the alternative. A silently ignored temperature means you ship believing you have determinism you do not have. A silently downgraded thinking budget means quality moves and nothing tells you. Both of those are found weeks later by a customer.

A 400 is found in about four minutes, by you, at integration time.

The counter-example sits one module back: the prompt cache minimum, which fails silently and quietly costs you money forever. Having seen both, the loud one is obviously better, and that framing is a genuinely useful thing to carry out of this course and into your own API design. When you get to choose your own failure direction, choose the one that cannot be ignored.

Retirements are a lifecycle commitment

Model ids do not live forever. claude-opus-4-1-20250805 retires on 2026-08-05, and it is the concrete example of a mechanism that applies to every dated id you pin.

The trade is clean. A dated id gives you a stable snapshot, which is what evaluation and reproducibility need, and it comes with an expiry date. An undated current id such as claude-sonnet-5 never expires and instead moves under you, which is fine for exploratory work and awkward for anything whose behaviour you have measured and promised.

Pin dated ids where behaviour matters. Then put the retirement date somewhere that will interrupt you.

A migration checklist worth keeping

Before repointing any service at a newer model, four greps:

thinking or budget_tokens anywhere in your request construction. Replace with output_config.effort and let adaptive thinking do its job.

temperature, top_p, top_k, including defaults baked into wrapper libraries and shared helpers, which is where they hide.

A request builder that can append an assistant message last. Formatting hacks live here. Replace with output_config.format.

Any request that sets both citations and a structured output format. Split it into two calls.

Four greps, and they cover every hard failure this course has named. That is a genuinely good afternoon of work before an upgrade, and it is also, not coincidentally, a very good revision exercise the night before an exam.

Practice

Try it yourself

Recall

The four 400s, from memory

If you learn one card in this whole course, learn this one. Four requests that fail outright, with the exact version boundary on each.

Name the four request patterns that return 400 and the model versions each applies to.

Reveal answer

One, extended thinking (thinking.type enabled plus budget_tokens) is deprecated on Claude 4.6 and REJECTED WITH 400 on 4.7 and later. Two, temperature, top_p and top_k at non-default values return 400 on Opus 4.7 and later. Three, assistant prefill on the LAST assistant turn returns 400 on Claude 4.6 and later; prefill earlier in the conversation is fine. Four, citations combined with structured outputs returns 400, on any model that supports both.

Quiz

The retirement on the calendar

Which model id has a published retirement date of 2026-08-05?

  1. Aclaude-opus-4-5-20251101
  2. Bclaude-sonnet-4-5-20250929
  3. Cclaude-haiku-4-5-20251001
  4. Dclaude-opus-4-1-20250805
Show answer

Correct answer: D — claude-opus-4-1-20250805

claude-opus-4-1-20250805 retires on 2026-08-05. Note the pleasing detail that its own id encodes 2025-08-05, so it retires almost exactly a year after the snapshot date in its name. The other three are all current, active, dated ids, which is what makes them plausible distractors: they look exactly like the kind of id that would be on a retirement list.

Quiz

Which boundary is 4.6

Two of the four 400 behaviours have a version boundary. Which behaviour starts failing at 4.6 rather than 4.7?

  1. AAssistant prefill on the last turn
  2. BNon-default temperature
  3. CExtended thinking parameters
  4. DCitations plus structured outputs
Show answer

Correct answer: A — Assistant prefill on the last turn

Last-turn prefill returns 400 from Claude 4.6 onward. Extended thinking is the near-miss, because 4.6 is where it becomes DEPRECATED but it still works there, only becoming a 400 at 4.7 and later. Non-default sampling parameters start failing at Opus 4.7. Citations plus structured outputs has no version boundary at all, it simply does not combine.

Quiz

Read this one carefully before you condemn it

Sent to claude-opus-4-6, exactly as written.

The request
{
  "model": "claude-opus-4-6",
  "max_tokens": 1024,
  "temperature": 0.3,
  "thinking": { "type": "enabled", "budget_tokens": 4000 },
  "messages": [
    { "role": "user", "content": "Review this contract clause." },
    { "role": "assistant", "content": "The indemnity is uncapped." },
    { "role": "user", "content": "Draft a replacement." }
  ]
}
  1. AIt returns 400, because temperature at a non-default value is rejected from 4.6 onward
  2. BIt runs; on 4.6 none of these three is a hard failure, though the thinking parameters are deprecated there
  3. CIt returns 400, because an assistant message in the array triggers the prefill rejection on 4.6
  4. DIt returns 400, because the thinking parameters stopped being accepted when 4.6 shipped
Show answer

Correct answer: B — It runs; on 4.6 none of these three is a hard failure, though the thinking parameters are deprecated there

Every rule in this lesson has a boundary and this request sits on the permissive side of all three. Sampling parameters start failing at Opus 4.7, so 4.6 accepts temperature. The thinking parameters are deprecated at 4.6 rather than rejected, so they still function. And the assistant message is in the middle of the array rather than at the end, which is ordinary conversation history. The condemning answers are tempting precisely because this lesson is a list of failures, and after reading four of them the instinct is to find one here. Getting a version boundary right in both directions is the skill being tested, and calling a valid request invalid loses exactly as many marks as the reverse.

Quiz

Count the failures in one body

Sent to claude-opus-4-7. How many of the four documented 400 conditions does this single request trigger?

The request
{
  "model": "claude-opus-4-7",
  "max_tokens": 1024,
  "temperature": 0.7,
  "thinking": { "type": "enabled", "budget_tokens": 4000 },
  "messages": [
    { "role": "user", "content": "List three risks as JSON." },
    { "role": "assistant", "content": "[" }
  ]
}
  1. AOne
  2. BTwo
  3. CThree
  4. DAll four
Show answer

Correct answer: C — Three

Three. Non-default temperature fails on Opus 4.7 and later. The extended thinking parameters fail on 4.7 and later. The final message has role assistant, which is last-turn prefill and fails from 4.6 onward. The fourth condition, citations combined with structured outputs, is not present in this body at all, which is why all four is the tempting answer for anyone counting rules rather than reading the request. Worth noticing that the fix for each one is different: drop the sampling parameter, move to output_config.effort, and replace the prefill with output_config.format.

Check

Assess one service for migration readiness

Take any service that calls Claude and check it against the four 400s.

You should see

You can state, for each of the four, whether the service is exposed, and for every exposure you have named the replacement, structured outputs for prefill, adaptive thinking plus effort for extended thinking, removing the sampling parameter for temperature, and splitting the call for citations plus structured outputs.

Sign in to track your progress →