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
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:
- One constant or setting per use case, not model strings scattered across files.
- Pin dated snapshots on purpose, and write down their retirement date next to them.
- 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)
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.