The schedule
From the Microsoft Foundry model retirement schedule (last updated September 2026):
| Model | Version | Retirement | Replacement |
|---|---|---|---|
| o1 | 2024-12-17 | 2026-11-19 | gpt-5.6-sol |
| o1-pro | 2025-03-19 | 2026-11-19 | gpt-5.6-sol |
| o3 | 2025-04-16 | 2026-11-19 | gpt-5.6-sol |
| o3-pro | 2025-06-10 | 2026-11-19 | gpt-5.6-sol |
| o3-deep-research | 2025-06-26 | 2026-11-19 | gpt-5.6-sol |
| o3-mini | 2025-01-31 | 2026-11-19 | gpt-5.6-terra |
| o4-mini | 2025-04-16 | 2026-11-19 | gpt-5.6-terra |
Retirement dates can't be extended. After retirement, inference returns 410 Gone.
(Fine-tuned o4-mini deployments follow a separate schedule: deployment retirement 2027-11-19.)
What happens to your deployments
| Deployment type | At retirement |
|---|---|
Standard / Global Standard / Data Zone Standard, upgrade option OnceNewDefaultVersionAvailable or OnceCurrentVersionExpired | Auto-upgraded to the replacement, region by region |
Same, with NoAutoUpgrade | Stops working (410) |
| Provisioned (PTU), any | Not auto-upgraded. You must migrate manually |
An auto-upgrade isn't automatically safe either: the replacement is a different model, so prompts, output format, latency and token use can change.
1. Inventory
for acct in $(az cognitiveservices account list --query "[?kind=='OpenAI' || kind=='AIServices'].id" -o tsv); do
az cognitiveservices account deployment list --ids "$acct" \
--query "[?starts_with(properties.model.name,'o1') || starts_with(properties.model.name,'o3') || starts_with(properties.model.name,'o4')].{account:'$acct', name:name, model:properties.model.name, version:properties.model.version, sku:sku.name, upgrade:properties.versionUpgradeOption}" \
-o table
done
sku tells you Standard vs Provisioned; upgrade tells you what will happen.
2. Evaluate the replacement
- Deploy the replacement (gpt-5.6-sol or gpt-5.6-terra) alongside the old deployment, with a new deployment name.
- Run your evaluation set (real prompts with expected outputs or graded criteria) through both.
- Compare quality, latency, and tokens per request. Reasoning models differ in how many reasoning tokens they use, which changes cost and rate-limit consumption.
- Check API compatibility: parameters such as
reasoning_effort,max_completion_tokens, tool calling and structured outputs. Some parameters accepted by o-series models may behave differently or not be supported.
The replacement listed is Microsoft's recommendation, not the only choice. Pick the model that performs best on your workload.
3. Migrate
Standard deployments: switch the application to the new deployment name (preferred, because you control timing), or update the existing deployment's model version yourself before 19 November. Don't wait for the automatic upgrade to happen during business hours.
Provisioned deployments, two options from the documentation:
- In-place migration: Azure moves traffic over a 20-30 minute window without downtime.
- Side-by-side: create a new provisioned deployment on the replacement, test, move traffic, delete the old one.
PTU quota is model-agnostic, but you need enough quota available for the target while both deployments exist in a side-by-side migration. Check quota early. Microsoft says the replacement becomes testable in provisioned regions about 30 days before retirement.
4. Don't forget
- Hard-coded model names in code that checks
response.model. - Prompt templates tuned for the old model.
- Token budgets and rate limits sized for the old model's usage.
- APIM policies or gateways that route by model name.
- Evaluation baselines and dashboards.
Checklist
- All o-series deployments listed with SKU and upgrade option
- Replacement evaluated on your own data (quality, latency, tokens)
- Standard deployments switched on your schedule, not at auto-upgrade
- Provisioned deployments migrated (in-place or side-by-side) with quota confirmed
- Code, prompts, budgets and gateways updated
- Done well before 19 November 2026