DEV Community

Haku
Haku

Posted on

o1's API dies in 6 days — here's the scanner and the 72-hour runbook

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-4o matches inside gpt-4o-mini (double report)
  • o1 matches inside o1-pro (split token)
  • gpt-5.6 must never read as gpt-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,
)
Enter fullscreen mode Exit fullscreen mode
  • (?<![\w]) / (?![\w-]) — the match must start/end on a token boundary, so o1 never fires inside o1-pro (longest-first ordering handles that too) and gpt-4o never fires inside gpt-4o-mini.
  • (?!\.\d) — the dot-digit guard: gpt-5.6 must never read as gpt-5.
  • re.IGNORECASE — because O1-PRO in 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
Enter fullscreen mode Exit fullscreen mode

Edge cases, tested:

  • gpt-4o-mini → one hit (gpt-4o-mini, Jan 14). Never double-reports as gpt-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)}
Enter fullscreen mode Exit fullscreen mode

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)