Skip to content

prompt 与 agent 钩子有了并发上限:每个会话最多同时跑 24 个 ​

钩子用得越多,越容易遇到一个隐蔽的问题:一次事件触发一堆模型驱动的钩子,子代理再各自触发一批,最后把会话拖慢甚至拖垮。CLI 2.1.312 给这类钩子加了明确的并发上限。

新规则 ​

更新说明的内容可以归纳为三点:

  1. prompt 钩子和 agent 钩子,每个会话最多同时运行 24 个,子代理触发的也算在内;
  2. 在此之外,最多再容纳 12 个已经等待超过其事件超时时间的钩子;
  3. 钩子配置里的 timeout 小于 1 秒时,按 1 秒计算。

注意这里说的是 type 为 prompt 和 agent 的钩子,也就是需要调用模型来判断或执行的那类,而不是普通的 command 钩子。

为什么要限制 ​

prompt 和 agent 钩子每次运行都要发起模型请求,成本和耗时都远高于一条 shell 命令。在多子代理并行的场景下,比如一次 fork 出好几个子代理、每个都在频繁调用工具,PreToolUse 之类的事件可能在很短时间内触发几十上百次。没有上限时,这些请求会同时堆积,挤占速率限制,还可能让主对话迟迟得不到响应。

24 个的并发上限加上 12 个「超时后仍在等」的余量,相当于给钩子系统加了一个排队机制:超出的部分等前面的完成再跑,而不是一拥而上。

关于 timeout 的变化 ​

以前有人会把 timeout 写成很小的值(比如 0.1)想让钩子「快速失败」。现在低于 1 秒一律当作 1 秒。如果你的配置里有这样的写法,行为会略有变化:钩子会多等一会儿才被判定超时。

建议 ​

  • 检查高频事件上的 prompt/agent 钩子。挂在 PreToolUse、PostToolUse 上的模型钩子最容易撞到上限,能用 command 钩子做的判断尽量用脚本完成。
  • 多子代理工作流要留意排队延迟。如果觉得子代理变慢,先看看是不是钩子在排队。
  • 把 timeout 设成合理的秒数,不要依赖亚秒级超时。

小结 ​

这条改动不需要你做任何配置,但会影响重度使用钩子的工作流:模型驱动的钩子从此有了上限和排队。升级后如果发现钩子的时序有变化,原因多半在这里。

Claude-cn.org,专注于 Claude Code 中文教程