o1's API dies on Oct 23 — six days from now. Not deprecated-with-a-warning. Shutdown: calls to the model ID fail, no grace traffic, no automatic remap.
And it's not just o1. Three cliffs, all sourced from valueaddvc's "OpenAI API Pricing 2026" (Oct 15 2026), citing OpenAI's deprecations page:
- Oct 23, 2026 — o1, o1-pro, o3-mini, o4-mini
- Dec 11, 2026 — o3, o3-pro, gpt-5 family
- Jan 14, 2027 — gpt-4o, gpt-4o-mini
The failure mode is always the same: a model ID hardcoded somewhere — app code, a worker config, a fallback chain — and nobody finds it until the API starts 404ing.
The scanner
The naive approach is grep -r "o1". The problem with naive grep:
-
gpt-4omatches insidegpt-4o-mini(double report) -
o1matches insideo1-pro(split token) -
gpt-5.6must never read asgpt-5
The fix is one compiled regex: alternation ordered longest-first, strict token boundaries, plus a dot-digit guard:
import re
MODEL_RE = re.compile(
r"(?<![\w])(?:gpt-4o-mini|gpt-5-[\w.-]+|gpt-4o|o1-pro|o3-pro|o3-mini|o4-mini|gpt-5|o1|o3)(?![\w-])(?!\.\d)",
re.IGNORECASE,
)
-
(?<![\w])/(?![\w-])— the match must start/end on a token boundary, soo1never fires insideo1-pro(longest-first ordering handles that too) andgpt-4onever fires insidegpt-4o-mini. -
(?!\.\d)— the dot-digit guard:gpt-5.6must never read asgpt-5. -
re.IGNORECASE— becauseO1-PROin a config file is the same cliff.
Then map each hit to its cliff:
# Shutdown cliffs. Dates: valueaddvc.com "OpenAI API Pricing 2026" (Oct 15 2026),
# citing OpenAI's deprecations page. None = no OpenAI-named target: you pick, then verify.
CLIFFS = {
"o1": ("2026-10-23", "GPT-5.6 Sol"),
"o1-pro": ("2026-10-23", "GPT-5.6 Sol"),
"o3-mini": ("2026-10-23", "GPT-5.6 Sol"),
"o4-mini": ("2026-10-23", "GPT-5.6 Terra"),
"o3": ("2026-12-11", "GPT-5.6 Sol"),
"o3-pro": ("2026-12-11", "GPT-5.6 Sol"),
"gpt-5": ("2026-12-11", None),
"gpt-4o": ("2027-01-14", "GPT-6 Luna"),
"gpt-4o-mini": ("2027-01-14", None),
}
def canonical(hit: str) -> str:
h = hit.lower()
return "gpt-5" if h.startswith("gpt-5-") else h
def scan(text: str):
"""One hit per dying model ID: shutdown date + OpenAI-named replacement."""
hits, seen = [], set()
for m in MODEL_RE.finditer(text):
if m.start() in seen:
continue
seen.add(m.start())
key = canonical(m.group(0))
shutdown, replacement = CLIFFS[key]
hits.append({
"match": m.group(0),
"model": key,
"shutdown": shutdown,
"replacement": replacement,
})
return hits
Edge cases, tested:
-
gpt-4o-mini→ one hit (gpt-4o-mini, Jan 14). Never double-reports asgpt-4o. -
O1-PRO→ one hit (o1-pro, Oct 23). Case-insensitive. -
gpt-5.6 Sol→ zero hits. The dot-digit guard holds.
And a thin API wrapper if you want it behind HTTP:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ScanRequest(BaseModel):
text: str
@app.post("/scan")
def scan_endpoint(req: ScanRequest):
return {"hits": scan(req.text)}
POST a codebase or config dump, get per-hit shutdown dates and the OpenAI-named replacement.
The replacement math
OpenAI named the replacements itself:
- o1 / o3-mini / o3 (+ pro variants) → GPT-5.6 Sol
- o4-mini → GPT-5.6 Terra
- gpt-4o → GPT-6 Luna at $0.10/$0.50 per 1M
- gpt-5 snapshots and gpt-4o-mini got no named target — you pick, then verify.
Worked at 10M input / 10M output tokens per month (rates: valueaddvc, Oct 15 2026):
- o1 → Sol: $750 → $240 (−$510/mo)
- gpt-4o → Luna: $125 → $6
o3 → Sol looks like $100 → $240 on sticker — up — but the hidden-thinking line item disappears, so the real bill usually drops hard.
The bill-killer nobody budgets: hidden reasoning tokens. o1/o3 burn 5K–20K per answer — invisible, billed at output rate. o3 can cost 10–15x GPT-4o for the same question once hidden reasoning tokens hit the bill.
One more trap: GPT-5.6 Sol is on promo — $4/$20 per 1M through Nov 21, 2026, then list $5/$30. Budget the migration at list. The promo is a gift, not a plan.
Verification checklist
- Confirm every rate and date against OpenAI's live pricing and deprecations pages. The kit is an Oct 15 snapshot, not a live feed.
- Budget Sol at list ($5/$30), not promo ($4/$20 through Nov 21, 2026).
- Diarize the promo cliffs too: Nov 21 (Sol), Dec 1 (Gemini 4 Argon $2/$10 → $4/$20), Jan 1 (Gemini 3.8 Flash $0.75/$3.75 → $1.50/$7.50).
- Eval the replacement on staging before prod — reasoning models aren't drop-in.
- Set a spend guard post-migration: O(1) budget check, hard 402 cutoff, kill switch, fail closed on unpriced models.
Disclaimer: dates/rates from valueaddvc.com "OpenAI API Pricing 2026" (Oct 15 2026), citing OpenAI docs. It's a snapshot, not a live feed — verify against OpenAI's live pricing page before migrating. Evidence kit, not financial advice.
The full kit — scanner, replacement map, 72-hour Oct-23 checklist, spend-guard pattern — is $29 one-time: https://vittoriali.gumroad.com/l/cutoff
Top comments (0)