Ashvara
Blog/AI
AI

Your app depends on a model with a retirement date

Every model you build on has a published expiry. Eight Claude model IDs stopped serving requests in the last year - here's how to make the swap routine.

S
Sahil Jain
AI · Ashvara
Jul 31, 2026
7 min read
Model lifecycle

Every AI model you build on has a published retirement date — including the one you just migrated to. A model ID is not configuration. It's a dependency with a scheduled end-of-life and breaking changes in between, and the teams that stay calm are the ones who treat the swap as routine maintenance rather than an incident. The mistake isn't picking the wrong model. It's building as though the one you picked will still answer next year.

Diagram titled "A model ID is a dependency with an expiry date". Left panel, amber, "Model as configuration": the model ID string is scattered across four call sites in the codebase, each hardcoded, with no evaluation gate, leading to a database of prompts tuned to one model - when the retirement date arrives every call site returns HTTP 404 and the app breaks. Right panel, indigo, "Model as a pinned dependency": all call sites go through one adapter holding a single pinned model ID, which passes through an eval suite gate before reaching the provider; the eval suite also runs continuously against the next candidate model, so when the retirement date arrives the swap is one file and the evals already passed. Bottom band, a retirement timeline of Claude model IDs: Oct 2025 Sonnet 3.5 (two IDs), Jan 2026 Opus 3, Feb 2026 Sonnet 3.7 and Haiku 3.5, Apr 2026 Haiku 3, Jun 2026 Opus 4 and Sonnet 4, and Aug 5 2026 Opus 4.1 - eight IDs retired in the previous twelve months, with at least 60 days notice each time. Footer note: active models carry a "not sooner than" date too, so the expiry is a property, not an event.

Why this matters now

The dates are published, and they are not hypothetical.

  • claude-opus-4-1 stops serving requests on 5 August 2026 — days from now. It was marked deprecated on 5 June, and per Anthropic's model deprecations page, "requests to models past the retirement date will fail."
  • Eight Claude model IDs retired in the twelve months to June 2026 — two Sonnet 3.5 snapshots in October, Opus 3 in January, Sonnet 3.7 and Haiku 3.5 in February, Haiku 3 in April, and both Opus 4 and Sonnet 4 in June. That's not a one-off cleanup. That's a cadence.
  • Parameters get removed, not just discouraged. temperature, top_p, and top_k now return a 400 error when set to a non-default value on Claude Opus 4.7 and later. Working code doesn't degrade — it stops.
  • The notice period is real and generous — at least 60 days for publicly released models, by policy — but 60 days is only useful to a team that reads the email and knows where its model strings live.

Every major provider runs the same treadmill. This isn't an argument about vendors; it's a property of the category.

The mechanism: the expiry is a property, not an event

Here's the part most teams miss. Look at the active models on that same page: each one carries a "not sooner than" date. Claude Opus 5 is listed as not retiring sooner than 24 July 2027. Sonnet 4.5, not sooner than 29 September 2026.

So the clock isn't started by a deprecation announcement. It was running the moment you integrated. Migrating to the newest model doesn't buy you a permanent home — it buys you a fresh timer. Any plan that treats "we just upgraded" as a resting state is a plan to do this again under pressure.

That reframing changes what you build. You don't need a migration project; you need a migration path — a route the swap takes every time, tested before you need it.

A dependency with a published end-of-life isn't a risk to monitor. It's a maintenance schedule to automate.

What actually breaks

Four distinct failure modes, and only the first is obvious:

  • The model ID 404s. Loud, immediate, and the easiest to fix — assuming you can find every place the string appears.
  • A parameter you've always sent now 400s. This bites the code that did migrate: you changed the model string, kept the request body, and the request is now invalid. Sampling parameters are the current example; the pattern recurs.
  • The output changes while the ID keeps working. If you point at a rolling alias rather than a pinned snapshot, you get the newest model automatically — and a behaviour change you didn't schedule. Prompts tuned against the old model land differently; verbosity, tool-calling eagerness, and instruction literalism all shift between generations.
  • Your cost and context baselines move. Tokenizers change between model generations, so the same input can produce a materially different token count. Budgets, max_tokens ceilings, and compaction triggers calibrated on the old model quietly stop being right — a problem we went into in the unit economics of an AI feature.

Note that three of the four are silent. A 404 wakes you up; a drift in output quality just costs you customers slowly.

How to make it routine

  1. Put the model behind one adapter. Every call site resolves the model from a single module — not a string literal scattered across services. If a swap touches more than one file, the architecture is the problem, not the deprecation.
  2. Decide pin-versus-alias deliberately, and write down why. A pinned dated snapshot gives you reproducibility and a published retirement date. A rolling alias gives you the latest capability and an unscheduled behaviour change. Both are defensible; picking by accident is not.
  3. Run your evals against the next model continuously, not at migration time. This is the whole game. If your eval suite already passes on the successor, the migration is a config change; if it doesn't, you've found out on your schedule rather than the provider's. This is the concrete payoff for having evals at all.
  4. Audit what you actually call, not what you think you call. Anthropic's Console has a Usage → Export that produces a CSV broken down by API key and model. Nothing beats a report of live traffic for finding the forgotten cron job still calling a retired snapshot.
  5. Put the dates in the same calendar as your certificate renewals. They're the same class of task: known, dated, and catastrophic only when ignored.
  6. Budget for re-tuning, not just the string swap. The rename takes minutes. Re-baselining prompts, token budgets, and effort settings takes a sprint. Teams that plan only for the former are the ones who ship a regression.

Our opinion

We'd argue the model deserves the same treatment as your database version — and almost nobody gives it that. Teams that would never let a Postgres major version reach end-of-life without a plan will happily hardcode a model string in nine services and find out via a 404. The difference isn't sophistication; it's that model retirement is new enough that it hasn't been absorbed into normal maintenance hygiene yet.

The other thing we'd push back on: "we'll just pin the old model and deal with it later" is not a strategy, because pinning has an expiry too. There is no version of this where you opt out. The only real choice is whether the swap is a Tuesday or a fire.

There's a silver lining worth naming. Because every provider publishes dates and gives months of notice, this is one of the most predictable forms of technical debt you will ever carry. Unlike a security incident or a traffic spike, you know exactly when it lands. Teams that build the path once find each subsequent migration cheaper than the last — and they end up on better models sooner, because upgrading stopped being scary.

How Ashvara helps

We build AI features with the model treated as a versioned dependency: one adapter, an explicit pin-or-alias decision, evals that run against the current and next model, and the retirement dates tracked rather than discovered. It's not glamorous work, and it's the difference between an upgrade taking an afternoon and taking a quarter.

That's part of how we approach AI solutions generally — the interesting engineering in an AI product is rarely the prompt; it's everything around it that has to keep working. If you've got a model string in production and you're not sure how many places it appears, tell us what you've built and we'll map it before the next email lands.


Sources: Anthropic, "Model deprecations" — lifecycle stages, retirement dates, 60-day notice policy, and API parameter deprecations (platform.claude.com).

Share this article
S
Sahil Jain

Founder at Ashvara, a studio that builds software end to end - mobile, web, AI, and the systems behind them. Writes about shipping products that last.

Building something? Let's talk.