2026 年 8 月 31 日集中发生了三件事:Claude Sonnet 5 的 API 费率从 2 与 10 美元恢复到 3 与 15 美元,GPT-5.4 与 GPT-5.4 mini 对 ChatGPT 登录的 Codex 用户停止提供,月之暗面的 kimi-k2.5 与 moonshot-v1 同日下线。这三类变更的处理方式完全不同,但很多团队用同一套动作去应对,结果是要么过度反应,要么反应不足。这篇给一套四步流程:先分类,再盘点,再迁移,最后重算计量与加监控。
先说边界:本文事实基于 aitoolsrecap 2026-08-31 当日汇总、腾讯 AI 日报 2026-08-31 条目、TheRouter.ai 于 2026-08-24 检索的各平台定价与弃用公告,以及一份逐页复核官方定价页的速查表(2026-08-24 复核、8-28 再复核)。价格为 2026-08-31 快照,随时可能变动,执行前请以自己账户所在区域的官方定价页与官方公告为准。文中的命令与配置示例为通用做法示意,需按你的技术栈调整。涉及具体模型 ID 的迁移目标,请以厂商公告为准,本文不给未经核实的替代建议。
一、第 0 步:先分清你遇到的是哪一类变更
这一步最容易被跳过,但它决定了后面所有动作的优先级。三类变更的紧迫性完全不同。
| 类型 | 表现 | 紧迫性 | 不处理的后果 |
|---|---|---|---|
| 下线(sunset) | 旧模型 ID 停止响应 | 立即,当天 | 调用直接失败,业务中断 |
| 替换(replacement) | 入口还在,模型被换掉 | 本周内 | 输出风格与能力变化,需回归 |
| 涨价(repricing) | ID 不变,单价变化 | 本月内 | 成本上升,不中断 |
今天的三个事件刚好对应三类:kimi-k2.5 与 moonshot-v1 是下线,必须当天处理;GPT-5.4 退出 Codex 是替换,你的调用不会报错,但拿到的模型变了,需要回归测试;Sonnet 5 恢复标准价是涨价,业务不中断,但要重算成本。
把它们混为一谈会造成两种浪费:把涨价当成下线,会触发不必要的紧急迁移;把下线当成涨价,则会等到线上报错才动手。判断方法很简单,去厂商公告里找两个词——写 sunset 或 deprecated 的是下线,写 replace 或 default 变更的是替换,只写 pricing 的是涨价。
二、第 1 步:依赖盘点,把模型 ID 从代码里捞出来
绝大多数团队在第一次遇到下线时才会发现,自己根本说不清用了多少个模型 ID、分布在哪几个服务里。先把这件事做完。
第一步是全库扫描。 在项目根目录执行一条递归搜索,把常见的模型名前缀都匹配一遍,排除依赖目录:
grep -rnE "(gpt-|claude-|kimi-|moonshot|qwen|deepseek|glm-|doubao|gemini|grok|mimo)" \
--include="*.ts" --include="*.tsx" --include="*.py" --include="*.js" \
--include="*.json" --include="*.yaml" --include="*.yml" --include="*.env*" . \
| grep -v node_modules | grep -v ".next" > model-inventory.txt别只搜源码。模型 ID 经常藏在三个容易被忽略的地方:环境变量文件里的默认模型、配置文件里的 fallback 链、以及数据库或缓存里存的历史会话记录。最后这一类最麻烦,因为它们是运行时数据,改代码不会自动生效,需要写迁移脚本。
第二步是建一张登记表,并给它加上到期日字段。 建议把散落的字符串收敛到一处配置,形如:
export const MODELS = {
chat: {
id: 'kimi-k3',
provider: 'moonshot',
sunset: null,
migratedFrom: 'kimi-k2.5',
note: '2026-08-31 由 k2.5 迁移,定价以账户所在区域官方页为准',
},
reason: {
id: 'deepseek-v4-pro',
provider: 'deepseek',
sunset: '2026-10-24',
migratedFrom: 'deepseek-reasoner',
note: '峰谷计价:工作日 9-12 与 14-18 为高峰,闲时减半',
},
cheap: {
id: 'gpt-5.6-luna',
provider: 'openai',
sunset: null,
migratedFrom: null,
note: '高吞吐简单任务分流用,永久价 0.20 / 1.20 美元',
},
} as const这个结构的价值不在优雅,而在于把"到期日"变成了一个显式字段。有了它,下次公告来临时你要改的是一行配置,而不是翻遍整个代码库去找散落的字符串。顺带提醒:把这张表接进 CI,写一条检查规则,凡是引用了已过 sunset 日期的模型 ID 就直接让构建失败,比任何文档提醒都管用。
三、第 2 步:迁移,三类变更各自的切换动作
下线类:立即切,且要验证。 今天下线的 kimi-k2.5 与 moonshot-v1,迁移目标是 kimi-k3。切换动作本身只是改一个 ID,但有两件事要做在前面:一是确认新 ID 在你账户所在区域的定价,不同来源给出的 kimi-k3 数字差异不小(有按美元报 3 与 15 的,也有按人民币报 20 与 100 的),别拿别人的账单当自己的预算;二是跑一轮回归,因为模型换了,输出分布一定变,凡是 downstream 有解析逻辑的地方都要重测。
替换类:两条路,选一条。 GPT-5.4 离开 Codex 影响的是用 ChatGPT 账号登录的那批用户,被 GPT-5.6 Terra(2 与 12 美元)与 Luna(0.20 与 1.20 美元)取代。你有两个选择:接受新模型并跑回归,或者改用 API key 认证以继续用原模型。前者省事但要承担行为变化,后者稳定但要把 key 管理纳入你的密钥体系。判断依据是这两个模型在你的核心任务上差异有多大,测一轮就知道,别靠猜。
提前排期类:把已知的到期日一次性排进去。 已经公告的还有一串:9 月 14 日 Claude Code 永久周限额生效、10 月 10 日 DashScope 一轮 sunset 退役 30 多个旧模型 ID(含 qwen-turbo、qwen-vl-plus、qwen-audio-turbo 与若干早期 Qwen3 快照)、10 月 24 日 deepseek-chat 与 deepseek-reasoner 弃用、11 月 12 日 OpenAI 模型离开 Cursor、约 11 月 21 日 GPT-5.6 Sol 促销价结束(4 与 20 回到 5 与 30)。这些都应该现在就进排期,而不是等到公告周。
四、第 3 步:计量重算,三个系数决定你的真实账单
迁移完成后,成本账单和迁移前不可直接比较,因为计量口径可能变了。有三个系数必须重算。
系数一:分词放大。 Sonnet 5 换了分词器,相同输入映射的 token 数变成原来的 1.0 到 1.35 倍,具体倍数随内容类型浮动。官方没有给细分,所以最可靠的办法是拿自己的真实语料,用新旧分词器各数一次,得到自己的实际系数。这件事成本极低,但比任何估算都准。
系数二:峰谷时段。 DeepSeek 自 8 月 17 日起峰谷计价,工作日 9:00–12:00 与 14:00–18:00 是高峰价,闲时减半,周末全天按闲时计。可异步的工作负载应尽量调度到闲时,这是一倍价差,且不需要任何技术改动。注意别用过期的旧价做预算:8 月 13 日发布时记的是未命中输入 3 元、输出 6 元,峰谷改革后高峰已变为 9 元与 27 元。
系数三:缓存命中率。 各平台对命中前缀缓存的输入 token 给远低于标准的单价,部分模型的缓存命中价只有标准输入价的几十分之一。这一层变量在你手里:把稳定的系统提示放在最前面、让多轮对话复用历史前缀,命中率就能上去。建议在日志里单独记一个缓存命中 token 数,否则你永远不知道自己吃了多少折扣。
把三个系数合进一个公式,得到可复用的月度成本估算:
月度成本 ≈ 输入 token × 放大系数 × 输入单价 × (1 − 缓存命中率)
+ 输入 token × 放大系数 × 缓存单价 × 缓存命中率
+ 输出 token × 输出单价需要提醒的是,输入与输出的比重会显著改变结论:输出单价通常是输入的三到五倍,凡是按"各占一半"做过粗估的预算,今天起都应按真实比重重算。具体的折算示例与排序变化,见本批横评篇 /zh/posts/post-aug31-token-cost-comparison-review。
五、第 4 步:监控与止血,限额、告警、降级
限额变化要提前知道。 Anthropic 已公告 9 月 14 日起永久上调 Claude Code 每周限额 25%,当前的 50% 临时扩容保持到 9 月 13 日。把三个时点指数化后是:5 月前基线 100,现在 150,9 月 14 日起 125。也就是说相对旧标准涨 25%,相对你现在正在用的水平降 17%。如果你依赖 Claude Code 的周额度做重度开发,9 月 13 日之前仍是扩容期,之后可用容量会低于现在,工作排期要按新的量排。
告警要按模型分账。 建议至少设三条:单模型日成本超过预算阈值的告警、单模型 token 量环比突增的告警、以及缓存命中率跌破预期的告警。第三条最容易被忽略,但缓存命中率下跌往往意味着有人改了提示词结构,成本会在你不知情的情况下悄悄翻倍。
降级路径要预先铺好。 最省钱的模型不是挑出来的,是分流出来的。以每百万 token 输入 0.20 美元、输出 1.20 美元的 GPT-5.6 Luna 为例,它的综合单价是 0.7 美元,约为 Sonnet 5 的十三分之一。把分类、抽取、格式化、路由这类高吞吐简单任务从旗舰模型摘下来放上去,通常比换一家供应商省得多,而且不影响核心环节的质量。
六、一份可复制的检查清单
按执行顺序排,可以直接抄走:
- 全库扫描模型 ID,含环境变量、配置文件与运行时数据,产出登记表
- 给每个 ID 标注类型(在用 / 已弃用 / 待迁移)与到期日
- 把 ID 收敛到一处配置,接进 CI 做过期检查
- 下线类:今天切换,切前确认新 ID 在自己区域的定价,切后跑回归
- 替换类:二选一(接受新模型跑回归,或改走 API key 保原模型)
- 已知到期日:9-14、10-10、10-24、11-12、11-21 一次性进排期
- 用真实语料测出分词放大系数
- 可异步任务调度到闲时
- 日志加缓存命中 token 计数,设命中率告警
- 按模型分账,设日成本与突增告警
- 给简单任务铺一条到廉价模型的降级路径
七、七个踩坑点
只看标价不看分词。 这是本次最容易踩的一坑。Sonnet 5 费率涨 50%,但代码负载叠上分词变更后实际涨幅在 65% 到 100% 之间。你的账单涨了多少,跟你输入的是什么内容直接相关。
把促销价当永久价建模。 GPT-5.6 Sol 的 4 与 20 美元是促销,约 11 月 21 日后回到 5 与 30,综合单价从 12 跳到 17.5。任何需要工程投入的迁移,都应该按到期后的价格算回报,三个月的差价通常覆盖不了迁移成本。
模型 ID 散落在代码里。 改一处漏三处,是迁移事故最常见的直接原因。集中配置加 CI 检查能一次性解决。
忽略输入输出比重。 输出单价是输入的三到五倍,用 1:1 估算的预算与实际可能差很远。
不监控缓存命中率。 命中率是个沉默变量,掉了不会报错,只会在月底账单上体现。
订阅额度与 API 混算。 这次 Sonnet 5 的定价变化只影响 API,Consumer 订阅不受影响。两类成本的口径不同,别放在一张表上比。
没有降级路径。 等到要省钱的时候才发现没有廉价模型可切,就只能全量降级或硬扛成本。降级路径应该在成本健康的时候铺好。
最后说一句关于节奏的话。这一轮变更看着密集,拆开看每一件其实都给了提前量:Sonnet 5 的标准价在两个月前发布时就写在定价说明里,Claude Code 的限额调整提前了半个月公告,DashScope 的十月退役更是留了六周窗口。真正让人措手不及的从来不是公告本身,而是没有把模型 ID 当成会过期的依赖来管理。把第 1 步那张登记表建起来、接进 CI,往后每一次公告对你来说,就只是改一行配置的事。
常见问题
Q1:模型 ID 散落在几十个文件里,怎么一次性捞干净?
A1:先用一条 grep 把候选全扫出来,再人工确认。命令:grep -rnE "(gpt-|claude-|kimi-|moonshot|qwen|deepseek|glm-|doubao|gemini|grok|mimo)" --include="*.ts" --include="*.py" --include="*.json" --include="*.yaml" .。扫出来之后不是逐个改,而是收敛到一处集中配置(见第 1 步的 MODELS 示例),再让业务代码只引用常量。改完之后把这条 grep 接进 CI,作为一条会失败的检查——这样下次有新 ID 硬编码进代码,CI 会拦住它。
Q2:迁移到新模型后,提示词要不要重新调? A2:要,但要分清轻重。同一厂商同系列的换代(比如 kimi-k2.5 到 kimi-k3)通常不需要重写提示词,只需回归测试;跨厂商迁移(比如 DeepSeek 换 GLM)就必须重跑一遍提示词与工具调用 schema 的回归。最容易被忽略的是分词差异——同样的提示词在不同 tokenizer 下 token 数不同,直接影响成本与上下文占用,这一点在迁移前后各测一次就能量化。
Q3:怎么估算迁移后的账单变化,避免上线才发现超预算? A3:按第 3 步的公式算三个系数:分词放大系数(同一批样本在新旧 tokenizer 下各测一次取比值)、峰谷时段占比(异步负载能调度到闲时的比例)、缓存命中率(生产流量上实测)。月度成本约等于输入 token 乘以放大系数再乘以输入单价乘以(1 减缓存命中率),加上缓存部分的成本,再加上输出 token 乘以输出单价。三个系数里任何一个用默认值而非实测值,估算就会偏。
Q4:缓存命中率掉了怎么发现? A4:它不会报错,只会在月底账单上体现,所以必须主动监控。做法是把每次调用的缓存读写 token 数打到日志,按小时聚合算命中率,然后设一条阈值告警(比如低于基线 20 个百分点就告警)。最常见的掉命中原因不是模型侧问题,而是有人往提示词前缀里塞了时间戳、请求 ID 或随机顺序的检索片段——把前缀污染了。
Q5:降级路径怎么设计才算合格? A5:三个条件。第一,廉价备选模型要在成本健康的时候就接入并通过回归,不能等到要省钱时才第一次调。第二,切换开关必须是配置级别的一行改动,而不是改代码再发版。第三,降级后的输出质量要有可接受的下限——如果降级会导致功能不可用,那它不是降级路径,是故障路径。本次 Sonnet 5 只影响 API、订阅不受影响,正好说明两类额度的降级策略也要分开设计。