DEV Community

Cover image for Every OpenAI model shutdown date until January 2027, and what replaces it
ImportStatic
ImportStatic

Posted on Originally published at importstatic.com

Every OpenAI model shutdown date until January 2027, and what replaces it

Originally published on ImportStatic.

If your code calls gpt-3.5-turbo, gpt-4, gpt-4-turbo, gpt-4.1-nano, o1, o1-pro, o3-mini, o4-mini or gpt-image-1, it has until October 23, 2026, eight days from today. On October 14 OpenAI also scheduled the GPT-4o, GPT-4o mini, GPT-4.1 and GPT-4.1 mini snapshots for shutdown on January 14, 2027, with gpt-6-luna as the replacement for all of them.

Everything below comes from OpenAI's deprecations page as of October 15, 2026. At shutdown, it says, "the model or endpoint will no longer be accessible". The page doesn't name the error you'll get, so plan for requests failing outright rather than being routed to another model.

Shutdown dates and replacements

Chat, reasoning and image models, ordered by shutdown date:

Shuts down Model IDs Replacement
2026-10-23 gpt-3.5-turbo, gpt-3.5-turbo-0125 gpt-5.6-terra
2026-10-23 gpt-4, gpt-4-0613, gpt-4-1106-preview, gpt-4-turbo, gpt-4-turbo-2024-04-09 gpt-5.6-sol
2026-10-23 gpt-4o-2024-05-13 gpt-5.6-sol
2026-10-23 o1, o1-2024-12-17, o3-mini, o3-mini-2025-01-31 gpt-5.6-sol
2026-10-23 o1-pro, o1-pro-2025-03-19 gpt-5.6-sol with reasoning.mode: pro
2026-10-23 o4-mini, o4-mini-2025-04-16 gpt-5.6-terra
2026-10-23 gpt-4.1-nano, gpt-4.1-nano-2025-04-14 gpt-5.6-luna
2026-10-23 gpt-image-1 gpt-image-2.5-sunburst or gpt-image-2.5-flare
2026-12-01 gpt-image-1-mini, gpt-image-1.5, chatgpt-image-latest gpt-image-2.5-sunburst or gpt-image-2.5-flare
2026-12-11 gpt-5-2025-08-07, o3-2025-04-16 gpt-5.6-sol
2026-12-11 gpt-5-pro-2025-10-06, o3-pro-2025-06-10 gpt-5.6-sol with reasoning.mode: pro
2026-12-11 gpt-5-mini-2025-08-07 gpt-5.6-terra
2026-12-11 gpt-5-nano-2025-08-07 gpt-5.6-luna
2027-01-14 gpt-4o-2024-08-06, gpt-4o-2024-11-20, gpt-4o-mini-2024-07-18, gpt-4.1-2025-04-14, gpt-4.1-mini-2025-04-14 gpt-6-luna

The October 23 entry also lists completions-endpoint variants (gpt-3.5-turbo-completions, gpt-4-completions and others) and the fine-tuned snapshots ft-gpt-3.5-turbo, ft-gpt-4, ft-gpt-4.1-nano-2025-04-14, ft-o4-mini-2025-04-16, ft-babbage-002 and ft-davinci-002. The audio and realtime models (gpt-realtime, gpt-audio, gpt-4o-realtime, gpt-4o-mini-audio and five more) follow on January 20, 2027, and tts-1 and tts-1-hd on January 6, 2027.

Aliases without a date

For October 23 the page lists both the alias and the snapshot (o4-mini and o4-mini-2025-04-16). The December 11 and January 14 entries list only dated snapshots, and nothing on the page says what gpt-4o-mini, gpt-4o, gpt-4.1 or gpt-5 will resolve to once their snapshots are gone. openai-go v3.78.0 has made its own call for December and marks gpt-5, gpt-5-mini, gpt-5-nano and o3 as deprecated with a December 11 shutdown. We'd treat every alias as going away with its snapshot and move off it before then.

Fine-tuned GPT-4o mini and GPT-4.1 models

The January entry says "Fine-tuned versions of these models follow the same shutdown schedule as their underlying base models", so an ft:gpt-4o-mini-2024-07-18:... model stops answering on January 14.

The gpt-6-luna model page lists fine-tuning as unsupported, and the fine-tuning guide says OpenAI "is winding down the fine-tuning platform". According to the deprecations page, existing customers can't create new fine-tuning jobs after January 6, 2027. The only base models the guide still lists for supervised fine-tuning are the three GPT-4.1 snapshots, all of which are in the table above. A product that depends on a fine-tune has three months to replace it with a prompt (with examples) on gpt-6-luna, checked against the fine-tune's outputs on its own evaluation set.

Finding the model IDs in your code

openai-go marks deprecated models with Go's standard // Deprecated: comment, which staticcheck's SA1019 check reports. Our test service names models in the ways real code does (an SDK constant, a string constant, a map of fallbacks, an environment default and a YAML config), and staticcheck 2026.2.2 reports one of them:

$ go run honnef.co/go/tools/cmd/staticcheck@latest ./app/
app/main.go:18:15: github.com/openai/openai-go/v3.ChatModelO4Mini is deprecated: Announced shutdown date: 2026-10-23. See https://developers.openai.com/api/docs/deprecations for details and recommended replacements.  (SA1019)
Enter fullscreen mode Exit fullscreen mode

The rest go unreported for two reasons. ChatModel is declared as type ChatModel = string, so a model written as a string literal is just a string, with nothing for SA1019 to attach to. And openai-go v3.78.0 came out on October 13, a day before the January deprecation was announced, so ChatModelGPT4oMini and ChatModelGPT4_1Mini have no deprecation marker yet. A later release will probably add one, but that won't help with string literals.

To catch those, we wrote a scanner that walks a tree, matches whole model IDs in .go, .py, .ts, .js, .yaml, .json, .toml and .env files, and resolves openai.ChatModel... constants by parsing shared/shared.go from the SDK's module directory. Its core is the shutdown table and a pattern that won't match gpt-4 inside gpt-4o or gpt-4.1:

func init() {
    add("2026-10-23", "gpt-5.6-terra", "gpt-3.5-turbo", "gpt-3.5-turbo-0125", "o4-mini", "o4-mini-2025-04-16")
    add("2026-10-23", "gpt-5.6-sol", "gpt-4", "gpt-4-0613", "gpt-4-1106-preview", "gpt-4-turbo",
        "gpt-4-turbo-2024-04-09", "gpt-4o-2024-05-13", "o1", "o1-2024-12-17", "o3-mini", "o3-mini-2025-01-31")
    add("2026-10-23", "gpt-5.6-luna", "gpt-4.1-nano", "gpt-4.1-nano-2025-04-14")
    // ... the rest of the table above ...
    add("2027-01-14", "gpt-6-luna", "gpt-4o-2024-08-06", "gpt-4o-2024-11-20", "gpt-4o-mini-2024-07-18",
        "gpt-4.1-2025-04-14", "gpt-4.1-mini-2025-04-14")
    alias("2027-01-14", "gpt-6-luna", "gpt-4o", "gpt-4o-mini", "gpt-4.1", "gpt-4.1-mini")
}

// idPattern matches a whole model ID: the characters around it must not be
// part of an ID, so "gpt-4" doesn't match inside "gpt-4o" or "gpt-4.1".
func idPattern() *regexp.Regexp {
    ids := make([]string, 0, len(models))
    for id := range models {
        ids = append(ids, regexp.QuoteMeta(id))
    }
    slices.SortFunc(ids, func(a, b string) int { return len(b) - len(a) })
    return regexp.MustCompile(`(?:^|[^\w.-])(` + strings.Join(ids, "|") + `)(?:$|[^\w.-])`)
}
Enter fullscreen mode Exit fullscreen mode

On the same service it finds nine references and exits with status 1, so it can gate CI:

$ go run ./scan -sdk $(go list -m -f '{{.Dir}}' github.com/openai/openai-go/v3) ./app
app/config.yaml:2: literal gpt-4o-mini shuts down 2027-01-14 -> gpt-6-luna (alias; the page lists the snapshot)
app/config.yaml:3: literal gpt-4.1-2025-04-14 shuts down 2027-01-14 -> gpt-6-luna
app/config.yaml:4: literal gpt-image-1 shuts down 2026-10-23 -> gpt-image-2.5-sunburst or -flare
app/main.go:13: literal gpt-4o-mini-2024-07-18 shuts down 2027-01-14 -> gpt-6-luna
app/main.go:16: literal gpt-4.1-nano shuts down 2026-10-23 -> gpt-5.6-luna
app/main.go:17: constant ChatModelGPT4_1Mini = gpt-4.1-mini shuts down 2027-01-14 -> gpt-6-luna (alias; the page lists the snapshot)
app/main.go:18: constant ChatModelO4Mini = o4-mini shuts down 2026-10-23 -> gpt-5.6-terra
app/main.go:25: literal gpt-4o shuts down 2027-01-14 -> gpt-6-luna (alias; the page lists the snapshot)
app/main.go:30: constant ChatModelGPT4oMini = gpt-4o-mini shuts down 2027-01-14 -> gpt-6-luna (alias; the page lists the snapshot)
9 references
Enter fullscreen mode Exit fullscreen mode

text-embedding-3-small on the next line of the YAML isn't on any list and isn't reported. A bare o1 in an unrelated YAML key would be a false positive. The scanner also can't see a model name that only exists in a deployed environment variable or a database row, so those need checking separately.

Moving a tool-calling gpt-4o-mini call to gpt-6-luna

A Chat Completions call that uses tools needs more than a new model string. The latest-model guide says "GPT-6 Sol and GPT-6 Luna support function calling in Chat Completions only with reasoning_effort: "none"", and Luna's default effort is medium. The same guide says to remove temperature, top_p and top_logprobs (and logprobs on Chat Completions) whenever effort isn't none. It doesn't say whether they're accepted at none, so we dropped temperature as well.

We built the old and new requests with openai-go and sent them to a local httptest stub that records the body; nothing went to OpenAI, since there's no API key on this machine. The new params look like this:

openai.ChatCompletionNewParams{
    Model:    openai.ChatModelGPT6Luna,
    Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("Weather in Oslo?")},
    Tools:    []openai.ChatCompletionToolUnionParam{weatherTool},
    // Function calling on Chat Completions needs "none" for gpt-6-luna.
    ReasoningEffort:     shared.ReasoningEffortNone,
    MaxCompletionTokens: openai.Int(500),
}
Enter fullscreen mode Exit fullscreen mode

The stub recorded these bodies:

before (messages and tools omitted):
{
  "max_tokens": 500,
  "model": "gpt-4o-mini",
  "temperature": 0.2
}
after (messages and tools omitted):
{
  "max_completion_tokens": 500,
  "model": "gpt-6-luna",
  "reasoning_effort": "none"
}
Enter fullscreen mode Exit fullscreen mode

The SDK's own field comment calls max_tokens deprecated in favour of max_completion_tokens, which also counts reasoning tokens. That comment isn't a // Deprecated: marker, so staticcheck didn't flag MaxTokens either. To have Luna reason and call tools in the same request, the guide says to move the call to the Responses API.

Price and context window

Per million tokens, gpt-6-luna lists $0.10 input and $0.50 output, against $0.15 and $0.60 for GPT-4o mini, and its context window is 1,050,000 tokens against 128,000, so cost is no reason to delay the move. For more on Luna's typed-answer endpoint, see our piece on the OpenAI Decisions API from Go. If you also call Claude, our Claude Sonnet 4.5 deprecation piece runs the same staticcheck test on anthropic-sdk-go, where Sonnet 4.5 retires on November 30.


Originally published on ImportStatic. This article was drafted with AI assistance; every claim was checked against the sources linked in it and the code samples were compiled and run.

Top comments (0)