Claude Code PreModelSwitch 怎么拦换模型

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

Claude Code PreModelSwitch 怎么拦换模型

claude code PreModelSwitch 怎么拦换模型:2.1.251 加了 PreModelSwitchPostModelSwitch 两个 hook。Changelog 写明可以 block、confirm,或只 annotate 一次换模型。企业若不许会话中途切到未批准的模型,应在切换发生前拦,而不是事后在账单里发现。同版本 SessionStart 的 resume hook 会收到会话是否过期,以及估计的重缓存成本。

作者CodePass 技术编辑

三个动作分别干什么

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 不触发

怎么挂一条最小规则

  1. claude --version 到 2.1.251+。
  2. 在生效的 hooks 配置里登记 PreModelSwitch,对未批准模型 ID 返回 block。
  3. 需要人点头的场景用 confirm,不要一律 block,否则 /model 会变成死门。
  4. 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 指定会盖过环境变量默认值。

参考资料