Prompt Regression CheckGuide

GPT-4o and GPT-4.1 leave the API on 14 January 2027: what to test before you switch

Updated 2026-10-17 ยท by Hieu Tran, written with AI agents and checked against the sources below

On 14 October 2026 OpenAI told developers that GPT-4o, GPT-4o mini, GPT-4.1 and GPT-4.1 mini will be removed from the API on 14 January 2027, and fine-tuned versions of them on the same day. The recommended replacement for all four is gpt-6-luna. It costs less per token, but it isn't a drop-in swap: it's a reasoning model, so the same prompt can come back slower, longer or in a different shape.

Free tool: Export all your evals in your browser: bundle JSON, dataset JSONL and a promptfoo config

Paste an API key; the page calls api.openai.com directly from your browser and gives you the files. Nothing goes through our servers.

The models and the date

Separate notices from 1 October 2026: the text-to-speech models tts-1, tts-1-hd and both gpt-4o-mini-tts snapshots stop on 6 January 2027, and GPT-5.1, GPT-5.3-Codex and GPT-5.4-Nano on 1 April 2027.

What's different about gpt-6-luna

Find every place you use them

  1. Search code and config: grep -rnE "gpt-4o|gpt-4\.1" ., then environment variables, feature flags and any model name stored in a database or admin setting.
  2. Fine-tuned models have ids that start with ft:gpt-4o or ft:gpt-4.1.
  3. Ask the API: GET /v1/models now returns an optional shutdown_date (YYYY-MM-DD) on each model, or null if none is announced. A scheduled check of the models you call will also catch the next notice.

Test old and new side by side

Run the inputs you already care about (real requests, past failures, the cases a customer complained about) through the old model and the replacement, with the same checks on both. With promptfoo, one config does it:

# promptfooconfig.yaml: same prompts and tests, current model vs replacement
prompts:
  - file://prompt.txt
providers:
  - id: openai:chat:gpt-4o-2024-08-06
    label: gpt-4o (current)
  - id: openai:chat:gpt-6-luna
    label: gpt-6-luna, default effort
  - id: openai:chat:gpt-6-luna
    label: gpt-6-luna, effort none
    config:
      reasoning_effort: none
tests: file://tests.yaml   # your cases, each with its own assertions
defaultTest:
  assert:
    - type: latency
      threshold: 5000      # milliseconds
    - type: cost
      threshold: 0.002     # USD per call
# run: npx promptfoo@latest eval, then npx promptfoo@latest view

Look for what a quick spot check misses: JSON or other formats that no longer parse (is-json), answers that got longer, latency at the default effort, cost per call once reasoning tokens are counted, and tool calls that stop firing. Keep the cases that fail as your regression set for the next model change.

Free tool: Export all your evals in your browser: bundle JSON, dataset JSONL and a promptfoo config

Paste an API key; the page calls api.openai.com directly from your browser and gives you the files. Nothing goes through our servers.

The last time you changed the model behind a feature, what broke, and how did you find out?

We're researching this problem and read every answer. Tell us what happened (4 short questions, no sign-up; AI tools help us read the answers).

More guides

Part of Ops Fixes: free checks and fix guides for small teams.