无人值守的 Hermes 不再卡 5 分钟等审批:approvals.unattended_mode 新配置

凌晨三点,你给 webhook 配的内存监控批任务撞上了一条“危险命令”,然后整整卡了 300 秒——因为审批弹窗发出去之后,根本没有人能回答它。更糟的是,这个卡住的会话还把之后的一次 hermes update 网关排空堵了 5 分多钟。这是 8 月 30 日被真实修复的问题(PR #98558,源自 issue #37284):Hermes 新增了 approvals.unattended_mode 配置,默认 deny,让 webhook / msgraph_webhook / api_server 这类无人值守平台上的会话,撞上危险命令时瞬间拒绝而不是傻等一个没人回答的审批。改动目前只在 main 分支上,未进入正式发布版本。
问题:审批发给了“不存在的人”
Hermes 的审批系统会拦截危险命令(比如 rm -rf、DROP DATABASE),弹一个 /approve 等待用户确认。对聊天平台这没问题——用户就在屏幕前。但 webhook、msgraph_webhook、api_server 这三种平台绑定 HERMES_SESSION_PLATFORM 的方式和聊天网关一样,审批逻辑误以为“这是网关会话,走交互式审批”,实际上这些适配器根本没有发送审批和回复的通道。结果就是:会话阻塞 60-300 秒,然后照样失败关闭。既浪费了时间,又没有任何人曾经有机会批准。
修复:unattended_mode,默认拒绝
修复的核心是一个新配置键,语义和已有的 cron_mode 完全平行:
approvals:
mode: smart # smart | manual | off
timeout: 300
cron_mode: deny # 定时任务撞上危险命令:deny | approve
single_query_mode: deny # hermes chat -q 单次查询会话:deny | approve
unattended_mode: deny # webhook/API 无人值守会话:deny | approve(新增)
deny(默认):无人值守会话撞上危险命令时立即拒绝(实测 0.04 秒),并给出可操作的提示——“当前会话运行在无人值守平台(webhook)上,没有人能批准此操作,请换一条不触发审批的路径;如需放行,请在 config.yaml 里设置approvals.unattended_mode: approve”。approve:显式选择自动放行全部危险命令(旧版 PR #37317 的自动批准行为,现在变成可选而非默认)。
改动同时覆盖三条检查路径:_run_approval_gate(普通命令)、check_all_command_guards(tirith 安全检查)、check_execute_code_guard(execute_code 工具),也就是 api_server 上 execute_code 触发“一次性网关审批、没人能答”的那个坑(#87509)也一并填了。
怎么配
想保持默认(推荐):什么都不用做,升级后自动生效。想放行某个无人值守场景(比如完全可信的私有 webhook):
# 用 CLI 设置(等价于改 config.yaml)
hermes config set approvals.unattended_mode approve
# 或直接编辑 ~/.hermes/config.yaml
approvals:
unattended_mode: approve
顺带一提,这次还补上了 single_query_mode:hermes chat -q "..." 这类跑完一轮就退出的单次查询会话,以前同样会卡在无人回答的审批上,现在默认也是 deny 瞬间拒绝。想深入了解审批体系的完整配置,可以读我们之前的 Smart Approvals 配置指南和审批疲劳治理。
对你的批任务意味着什么
如果你用 webhook 或 API 跑自动化,这个改动的效果是:失败从“5 分钟后超时”变成“瞬间拒绝 + 明确原因”。agent 会立刻收到拒绝消息并尝试换一条路径,而不是干等。这也意味着,以前“撞上危险命令会自动放行”的隐性行为没有了——如果依赖它,需要显式设置 approvals.unattended_mode: approve。cron 任务相关的审批策略见定时任务自动化指南,webhook 的搭建见业务通知接入指南。
什么时候能用上
PR #98558 已于 8 月 30 日合入 main,不在 v0.20.6(8 月 27 日 tag)。拉最新 main 即可体验,或等下一个发布版本。已经写好 webhook 自动化、但被“审批卡死”坑过的朋友,值得第一时间升级。