文章援引 OpenAI 弃用页面称,部分 GPT-4o、GPT-4o mini 和 GPT-4.1 模型将于 2027 年 1 月 14 日退出 API,推荐替代为 gpt-6-luna。涉及范围包含具体模型快照,依赖这些版本的应用需要核对并安排迁移。
书籍:Ship It —— 务实的创业公司技术栈
我的另一套书:Thinking in Go(两册系列)—— Go 编程完全指南 + Go 中的六边形架构
我的项目:Hermes IDE | GitHub —— 为使用 Claude Code 和其他 AI 编程工具交付产品的开发者打造的 IDE
关于我:xgabriel.com | GitHub
如果你代码里的模型字符串以 gpt-4o 或 gpt-4.1 开头,现在它就有了到期日。2026 年 10 月 14 日,OpenAI 的弃用页面新增了一条记录:“2026 年 10 月 14 日,我们通知了使用部分 GPT-4 系列模型的开发者,这些模型将被弃用。”这些模型将于 2027 年 1 月 14 日从 API 中移除。
从通知到关闭,只有 92 天。对于名单上的每个模型,OpenAI 指定的替代模型都是 gpt-6-luna。
如果你在过去两年里,用 OpenAI 的小模型上线过分类器、信息提取器或客服工单路由功能,检查一下具体用的是哪个模型。某个功能背后的那次小小的调用,可能从上线后就没人再碰过,它会一直正常运行到 1 月 14 日。然后就停了。
10 月 14 日的记录包含四行,关闭日期和替代模型都相同:
这条记录还补充了一句话,如果你训练过模型,这句话很关键:“这些模型的 fine-tuned 版本,将遵循其底层基础模型相同的关闭时间表。”所以,经过 fine-tuning 的 4o mini 也会在同一天停用。
表格列出的是带日期的快照,而不是不带日期的 gpt-4o 别名。GPT-4o 的模型页面将 gpt-4o-2024-08-06 列为默认快照,而这个快照就在名单上。别以为别名会比它活得更久。检查你调用的确切 ID;下文的 grep 和 API 检查可以帮你找到它。
在这次通知之前,已有两个 GPT-4 系列快照进入了退役流程。同一个页面列出,gpt-4o-2024-05-13 和 gpt-4.1-nano 将于 2026 年 10 月 23 日关闭,相关通知发布于 4 月 22 日。如果你固定使用的是其中任何一个,留给你的时间只有九天,而不是 92 天。
旧版 GPT-4o audio 和 realtime 模型不在这条记录里。它们有各自的关闭日期,最早从 2027 年 1 月 20 日开始。
弃用页面有一个专门说明通知期限的部分。对于正式可用的模型,它写的是:“至少 6 个月。”这些模型的专用变体是“至少 3 个月”。Preview 模型“可能在短得多的通知期后退役,例如 2 周”。整份列表的前提是“除非安全或合规方面的考虑要求采用更快的时间表”;在这种情况下,OpenAI 表示会“在合理可行的范围内,尽可能提前通知”(OpenAI)。
从 10 月 14 日到 1 月 14 日,是三个月。10 月 14 日的记录没有说明这些快照属于哪一类,也没有解释为什么采用这个时间表。它也没有附上迁移指南。
对比一下紧挨着它下面的那条记录。10 月 1 日,OpenAI 宣布 gpt-5.1 和 gpt-5.3-codex 将于 2027 年 4 月 1 日关闭,提前了六个月。也就是说,更新的模型获得了两倍的迁移时间(OpenAI)。
如果你通过 Azure 使用这些模型,你的时间表就不是 OpenAI 的时间表。Microsoft 的模型退役时间表将这五个快照的退役日期都列为 2027 年 4 月 14 日,而且 fine-tuned 部署还能运行更久:gpt-4o 和 gpt-4o-mini 可以运行到 2027 年 10 月 1 日,gpt-4.1 和 gpt-4.1-mini 可以运行到 2027 年 10 月 14 日。该页面最后更新于 9 月下旬,早于 OpenAI 的通知,因此要留意后续变动。
按每个 token 的价格计算,Luna 比它替代的所有模型都便宜。以下数据来自 OpenAI 的定价页面,采用 Standard 档位,单位为每百万 token:
不过,每个 token 的成本并不等于每个任务的成本。Luna 模型页面上的三点,会改变你现有调用的行为:
默认会进行推理。 除非你设置 reasoning.effort,否则推理默认开启,强度为 medium。可选级别从 none 到 max。4o mini 分类器会直接给出答案,而默认强度下的 Luna 会先思考。
使用工具时,优先采用 Responses API。 在 Chat Completions 中,只有 reasoning effort 为 none 时,function calling 才能工作。要使用内置工具,请用 Responses API。
不支持 fine-tuning。 Luna 不支持这项能力。如果你在生产环境中使用的是经过 fine-tuning 的 4o mini,就没有 fine-tuned Luna 可以直接迁移过去。OpenAI 自 2026 年 5 月起就已限制新建 fine-tuning 任务,现有客户也将在 2027 年 1 月 6 日失去创建这些任务的能力。
长 prompt 的费用也更高。当输入超过 272K token 时,Luna 会对整个请求按输入价格的 2 倍、输出价格的 1.5 倍收费(OpenAI)。
对于以前交给 4o mini 的快速、低成本调用,最接近原有行为的起点,是通过 OpenAI Node SDK 调用 Luna,并关闭推理:
import OpenAI from "openai";
const client = new OpenAI();
const res = await client.responses.create({
model: "gpt-6-luna",
reasoning: { effort: "none" },
input: "Label this ticket: refund not received",
});
console.log(res.output_text);
然后,在正式切换之前,用你的 eval set 跑一遍。我自己还没有用 4o mini 的工作负载测试过 Luna,OpenAI 的通知也没有对这次替换后的质量作出任何承诺。如果你还没有 eval set,这 92 天就是建立它的时间。
先从你自己的代码开始。git grep 只搜索 Git 跟踪的文件,因此通常会跳过 node_modules 和构建产物:
git grep -nE "gpt-4(o|\.1)"
这个模式也会匹配 audio、realtime、TTS 和 transcribe 变体,以及 4 月通知中的那两个快照。它们的关闭日期不同,所以要逐条查看匹配结果,不能只数数量。然后检查 grep 看不到的地方:环境变量、配置服务、功能开关,以及存有模型名称的数据库记录。
接着查询 API。OpenAI 表示,List models endpoint 现在包含一个可选的 shutdown_date 字段:“如果存在,该字段会以 YYYY-MM-DD 字符串的形式包含关闭日期”;如果尚未宣布关闭日期,则为 null(OpenAI)。配合 jq,下面的命令会打印你账户中所有带有关闭日期的模型,并按日期从近到远排序:
curl -s https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" \
| jq -r '.data[]
| select(.shutdown_date != null)
| "\(.shutdown_date) \(.id)"' \
| sort
Retrieve a model endpoint 也有同一个字段(OpenAI),因此只需几行 shell,就能在部署所用的模型已有关闭日期时,让流水线失败:
#!/usr/bin/env bash
# Fail CI when the model we call has a shutdown date.
set -euo pipefail
model="${OPENAI_MODEL:?set OPENAI_MODEL}"
url="https://api.openai.com/v1/models/$model"
shutdown=$(curl -sSf "$url" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
| jq -r '.shutdown_date // empty')
if [ -n "$shutdown" ]; then
echo "::error::$model shuts down on $shutdown"
exit 1
fi
echo "$model: no shutdown date announced"
::error:: 前缀是 GitHub Actions 的 workflow command,会在运行结果中显示为一条注解。模型一旦被移除,curl -f 就会因错误响应而失败,脚本仍会以非零状态退出。请将 OPENAI_MODEL 设置为带日期的快照,而不是别名,因为弃用表格列出的是快照;否则,即使模型即将停用,这项检查也可能通过。
只要宣布了关闭日期就让构建失败,这种严格是刻意的:你的团队会通过一次标红的构建得知下一次弃用,而不是靠一封已被归档的邮件。如果你觉得这样过于频繁,可以将关闭日期与一个时间窗口比较,只在进入窗口后让构建失败。
把模型 ID 当作 runtime 版本或数据库引擎来管理:它是一个依赖,有着你无法控制的生命周期。将它集中放在一处配置里,并保留一套 eval set,让你能在一个下午内判断替代模型是否够用。
模型关闭属于那种生产环境杂务:在供应商定下日期之前,没人会提前规划。Ship It 是我为小团队写的一本书,讲的是从 localhost 到生产环境之间的所有事情:托管、部署、支付、认证、CI/CD 和监控,让上面这样的检查有个合适的位置。
我也在开发 Hermes IDE。这是一个免费、源码可用的 IDE,能在 macOS、Windows 和 Linux 上并排运行 Claude Code、Codex 和其他命令行 Agent,每个 Agent 都有自己的终端和 worktree。考虑是否使用时,也请把它是我自己的产品这一点算进去。你可以下载它,或在 GitHub 上给它点个 Star。

如果还想采取进一步行动,你可以考虑屏蔽此人,或举报滥用行为。