OpenAI deprecation notice, 2026-10-14 · -- days left
On January 14, 2027, OpenAI turns off every fine-tuned gpt-4o and gpt-4.1 model.
If your app calls a model ID that starts with ft:gpt-4o or ft:gpt-4.1, it stops answering that day. The suggested replacement, gpt-6-luna, can't be fine-tuned.
FT Lifeboat records what your fine-tune answers while it still works, rebuilds that behavior on luna with prompting, and measures how often the two agree. It runs in your browser, on your key.
$ ftl countdown ft:gpt-4o-mini
--d --h --m --s
until 2027-01-14 00:00 UTC. after that: 404 model_not_found
01 / timeline
The dates
| 2026-10-14 | OpenAI publishes the deprecation notice. |
| 2026-10-23 | Fine-tunes of gpt-3.5-turbo, gpt-4, gpt-4.1-nano, o4-mini, babbage-002, davinci-002 stop working. |
| 2026-11-30 | Evals dashboard and API shut down (read-only from Oct 31). |
| 2027-01-06 | No new fine-tuning jobs can be created. |
| 2027-01-14 | Fine-tunes of gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini stop working, with their base models. |
Source: developers.openai.com/api/docs/deprecations. OpenAI documents no way to export fine-tuned weights.
02 / how
The drill
- 1.You load the same
.jsonlyou fine-tuned with and paste an OpenAI key. - 2.A slice of the file is held out as test cases. Each one goes to your fine-tune, and its answers are saved as
golden_outputs.jsonl. - 3.The same cases go to gpt-6-luna three ways: the bare prompt, 8 fixed examples from your file, and the 6 most similar examples per request (BM25).
- 4.You get a parity table, a case-by-case diff, and the winning setup as
replacement_prompt.jsonplus a drop-inmigrate.py.
03 / output
What you get back
This is real output from the engine, run on the synthetic fixture in the test suite: a 100-row support-ticket classifier, 40 held-out cases, against a mocked API. It shows the format. Your numbers will be different.
| Option | Agrees w/ fine-tune | Agrees w/ file | $ / 1k req |
|---|---|---|---|
| ftYour fine-tune (ft:gpt-4o-mini-2024-07-18:acme::abc123) | n/a | 100% | 0.0193 |
| luna-plainsame prompt, no examples | 38% | 38% | 0.0067 |
| luna-static8 fixed examples from your training file | 93% | 93% | 0.0096 |
| luna-dynamic← in the boat6 most similar examples per request | 93% | 93% | 0.0081 |
downloads: golden_outputs.jsonl · replacement_prompt.json · migrate.py · report.md
04 / why
Why I built this
I'm a developer. When the notice came out I looked for a way to check whether a prompt on the new model could stand in for a fine-tune, using the training file I already had. What I found were general eval platforms that want an account, a project and a pipeline before you see a number.
So this does one job. One file in, one table out, and the files you need to switch. No accounts, no server holding your data. If the numbers are bad, you learn that in October instead of on January 14.
Teuddy Cedano, CEDANO LABS LLC. Last one off the ship.
06 / faq
Questions from the deck
- Where does my OpenAI key go?
- It stays in the memory of the tab. It is not written to storage and it is never sent to ftlifeboat.dev. The page calls
api.openai.com(or the base URL you set) directly withfetch. Open DevTools, Network tab, and check. - What leaves my browser?
- Your test prompts, sent to OpenAI as chat completions. Nothing from your training file reaches my server.
- Why do I have to sign in?
- So the free tier stays free and a purchase follows you to any browser. You sign in with a one-time code sent to your email; no password. The server stores your email, when you signed up, and which plan you bought. That's all. Privacy.
- How is a match decided?
- Short labels must match exactly (case and whitespace ignored). JSON is compared field by field. Free text uses token-overlap F1. A case counts as a match at a score of 0.8 or more. Test cases are held out from the examples luna sees, and exact duplicates are removed, so the score is not inflated by leakage.
- When will gpt-6-luna not match?
- When the fine-tune learned something a few examples can't carry: a long-form house style, hundreds of labels, or facts spread over thousands of rows. The report will show that plainly. In that case keep
golden_outputs.jsonl; it's a clean training set for an open-weight model you can fine-tune somewhere else. - My fine-tune is already gone.
- Leave the model ID empty. Luna is then scored against the answers in your training file instead of live answers.
- What does a run cost?
- The plan price, plus OpenAI usage on your own key. Every test case is sent to your fine-tune once and to each luna variant once. With a small model and short prompts that is usually cents. If you enter prices, the report shows the cost per 1,000 requests for each option.