后台任务一多,通知就刷屏?Hermes 现在把已就绪的完成事件合并成一轮

你同时起了三个任务:一个跑测试、一个拉依赖、一个在后台生成资源。你去开了个会,回来的时候屏幕上是一串“任务完成”——每一条都单独触发了一轮模型回复,而你真正想要的只是“三个都好了,接着往下走吧”。
问题不在于通知本身,而在于每条通知都被当成了一次独立对话的起点。Hermes 最近的改动把这件事收紧了:已经就绪的后台完成事件,在交互界面上会合并成一个通知轮次。
现在的行为:就绪的完成事件合成一轮
规则很短:对话界面会把已经就绪、且属于同一个对话的连续后台完成事件,合并成一个通知轮次。失败信息和成功输出一样留在批次里,不会因为是“坏消息”就被单独拎出来。如果只有一个进程完成,它保持自己原来的文本,不会套一层批量外壳。
有一点需要说清楚,避免误解:这不是延迟合并。系统不会为了凑批而让先完成的任务多等一会儿——它只合并此刻已经就绪的那些,并且明确不承诺把不同时间完成的任务合并到一起。所以你不会遇到“测试早就跑完了,但通知拖着不发”这种情况。
什么不会被合并
合并的范围是“后台进程完成”这一类事件,有两类东西刻意留在外面:
- watch 结果(盯着某个输出变化的订阅)和异步子代理(delegation)的结果,仍然按各自原来的顺序、作为独立通知投递。
- 消息网关(Telegram、Slack 等平台上和你对话的那个 bot)继续用它自己那套按路由分组的短窗口批处理机制,这次改动没有替换它,也没有改动各适配器的发送方式。
另外,脚本化的场景不受影响:一次 API 请求、一个 ACP 客户端、一次性的 CLI 调用这些非交互消费者,不会因为这次改动多出一个“自主通知循环”。
被消费掉的进程,不再通知
这条是这次改动里最实用、也最容易被忽略的部分。
进程的“身份”会一直保留到投递那一刻。所以如果你已经显式地把某个后台进程的结果取走了——比如用 process_manage 去看日志、等待或结束它——那么即使这个进程已经离开进程注册表、排进了输入队列,CLI 也不会再为它补一条完成通知。一个整批都被消费掉的完成集合,不会启动任何轮次。
换句话说:你主动去看结果的动作,本身就等于告诉 Hermes“这条我已经知道了”。
谁在处理这件事
同一套行为在不同界面上由不同模块负责,值得知道各自的位置,排查时省时间:
| 界面 | 负责模块 | 说明 |
|---|---|---|
| 经典 CLI | hermes_cli/cli_process_notifications.py |
负责空闲/轮次结束后的排空、带压缩感知的归属判断,以及最终输入的拆包 |
| TUI 与 Desktop | tui_gateway/session_notifications.py |
在检查归属之后把轮询拿到的就绪快照分组;每个进程仍各自发自己的界面状态;忙碌会话重排的是结构化事件,而不是渲染好的批量字符串 |
| TUI 轮次结束后 | tui_gateway/prompt_turn.py |
与上面同一条路由与渲染路径;Desktop 和 dashboard 的聊天客户端共用这个后端 |
共享的渲染器是 tools/process_registry_notifications.py 里的 ProcessNotificationBatch。两个设计约束值得记住:
- 批次和投递状态都不会写进系统提示词。也就是说这些噪音不会污染模型的上下文——这恰好是省 token 的那一半。
- 有归属的事件必须能证明归属:另一个活着的会话不能“认领”它们。子代理的投递走的是它自己那套持久化的领取/完成账本,一次 delegation 投递一次,而不是每个进程批次投递一次。
想自己验证
仓库里有一个可以本地跑的探针:
python3 evals/completion_backlog_probe.py /path/to/repo /tmp/out.json
它会在临时目录里启动真实的 shell 子进程,读取它们真实的完成事件,然后驱动生产环境里的 CLI、TUI 轮询器和轮次结束后的通知路径(用一个 loopback HTTP 的轮次接收器替换掉真正发起对话的部分)。它记录的是真实发生的投递,但不包含模型推理。
要留意它的测量口径:它测的是“在通知边界上,有多少轮对话被启动”,而不是“省了多少 token”。这两件事相关但不是一回事——批次少了,自然轮次少、上下文短,但探针不会替你算出省下的字数。
小结
这类改动的价值不在于“新功能”,而在于把噪音收进一个可预期的形状里:就绪的完成事件合成一轮、失败不丢、消费过的不重复、watch 和子代理保持独立顺序、批次不进系统提示词。如果你习惯一口气起好几个后台任务,升级之后的体感就是——回来只有一条汇总,接着干活就行。
后台任务的常见起点是定时任务,可以看 hermes cron 命令参考;如果定时任务本身出问题,cron doctor 那篇更对症;子代理的实时控制与投递机制,子代理实时编排那篇讲得更细。