Claude Code PreModelSwitch 怎么拦换模型
2.1.251 新增 PreModelSwitch 与 PostModelSwitch 钩子,可拦截、确认或批注一次换模型;恢复会话时还会带上是否过期以及重缓存成本估价。

claude code PreModelSwitch 怎么拦换模型:2.1.251 加了 PreModelSwitch 和 PostModelSwitch 两个 hook。Changelog 写明可以 block、confirm,或只 annotate 一次换模型。企业若不许会话中途切到未批准的模型,应在切换发生前拦,而不是事后在账单里发现。同版本 SessionStart 的 resume hook 会收到会话是否过期,以及估计的重缓存成本。
三个动作分别干什么
block:hook 拒绝,模型保持切换前的那个。confirm:弹出或走你们 hook 协议里的确认,人点过才换。annotate:放行,但给会话留一条注释,方便审计「谁在何时切到了哪」。
/model、fast-mode 提示、以及脚本里改模型,只要走官方切换通道,都应打到这对事件。Changelog 没列出「所有内部回退是否也触发」。自写的 ANTHROPIC_MODEL 环境变量在启动时生效,不一定经过 PreModelSwitch;启动默认模型仍用环境变量或托管设置,见 ANTHROPIC_DEFAULT_MODEL。
Resume 时多了两列数
SessionStart 在 resume 路径上会带 session staleness 和 estimated re-cache cost。长会话停了一小时再 --resume,缓存可能已经冷了,这一估价让 hook 决定要不要先警告「接着聊会重新付一截输入」。它不是 /cost 里那行命中率,那是事后记账。
钩子不触发时的排法没变,仍先看 settings 层有没有被托管源盖掉,见 hooks 不触发。
怎么挂一条最小规则
claude --version到 2.1.251+。- 在生效的 hooks 配置里登记
PreModelSwitch,对未批准模型 ID 返回 block。 - 需要人点头的场景用 confirm,不要一律 block,否则
/model会变成死门。 PostModelSwitch只做日志或 annotate,不要在这里再改一次模型,避免来回切。
项目级 .claude/settings.json 在 2.1.251 里被收紧:不能再靠它打开详细 beta 追踪或裸 API body 日志。换模型审计应走 hook 注释,不要把请求体打到本地文件。
不该拦的情况
CI 里用固定模型跑 claude -p,没有人切换,挂 PreModelSwitch 也没事件。子代理自己的 model: 字段走的是生成时的选择,和用户在主会话按 /model 不是同一条路。子代理默认模型的环境变量优先级见同日 changelog 对 CLAUDE_CODE_SUBAGENT_MODEL 的改动:定义里的 model: 和单次 spawn 指定会盖过环境变量默认值。