DEV Community

Cover image for AI model deprecations: 4 shutdown dates and how to find model IDs in your code
Versyka
Versyka

Posted on AI-assisted

AI model deprecations: 4 shutdown dates and how to find model IDs in your code

On October 23, OpenAI retired gpt-4-0613. Code that still asked for it started getting errors that day.

More dates are coming:

Date Model Replacement
Nov 30, 2026 claude-sonnet-4-5-20250929 claude-sonnet-5-5
Dec 11, 2026 gpt-5-2025-08-07, o3-2025-04-16 gpt-5.6-sol
Jan 14, 2027 gpt-4o-2024-08-06, gpt-4o-2024-11-20, gpt-4o-mini-2024-07-18, gpt-4.1-2025-04-14, gpt-4.1-mini-2025-04-14 gpt-6-luna
Feb 26, 2027 whisper-1, gpt-4o-transcribe, gpt-4o-mini-transcribe, gpt-4o-transcribe-diarize gpt-live-transcribe or gpt-transcribe

Why this one slips through

Most breaking changes are caught by a compiler, a type checker or a test. A retired model isn't:

  • The model ID is a string. Nothing type-checks it.
  • It often lives in config: an environment variable, a YAML file, a database row.
  • Tests usually mock the LLM call, so they keep passing.

So the first sign is a production error from the provider, the day after the date.

Find the model IDs in your repo

grep -RInoE \
  "(gpt-[0-9a-z.\-]+|o[134](-mini)?(-[0-9]{4}-[0-9]{2}-[0-9]{2})?|claude-[a-z0-9.\-]+|whisper-[0-9]|text-embedding-[a-z0-9\-]+|gemini-[a-z0-9.\-]+)" \
  --include=*.py --include=*.ts --include=*.js --include=*.go --include=*.java \
  --include=*.yml --include=*.yaml --include=*.json --include=*.env* --include=*.toml \
  . | grep -v node_modules | sort -u
Enter fullscreen mode Exit fullscreen mode

Then check each one against its provider's deprecation page. Also check where your model names come from at runtime: if they're in environment variables or a settings table, grep won't see them.

Make the model name easy to change

A few habits that turn a retirement into a one-line change:

  1. One constant or setting per use case, not model strings scattered across files.
  2. Pin dated snapshots on purpose, and write down their retirement date next to them.
  3. Test the real model name at least once in CI, even if everything else is mocked: a single cheap smoke call catches a retired ID.

The calendar, maintained

We keep the full list at versyka.com/model-retirements, with dates from OpenAI, Anthropic, Google, Mistral, Cohere, AWS Bedrock, Azure, Groq and Together AI. There's also a .ics feed you can add to your calendar. No sign-up.

If you connect a repository, Versyka runs that scan daily and opens a tested pull request that swaps in the replacement model before the date.

Top comments (1)

Collapse
 
shuttlewright profile image
Shuttlewright •

The mocked-tests point has a useful flip side: your mocks, fixtures and VCR cassettes are a census of every model the team has ever called, including the ones nobody remembers. Grep those first and you get the historical exposure list before you touch the app code. The gap grep can never close is model names set outside the repo entirely - a remote feature-flag service, a Retool app, a Zapier step configured in a web UI. Static search has no visibility there; only the provider's usage view, which shows what your org actually called, catches those. So the order that works: usage view for the truth, grep for the location, mocks for the history. And the whisper-1 date deserves its own alarm - audio pipelines tend to live in a different service from the chat stack and get audited last, if at all.