前言
用过 AI 代理工具的朋友很可能遇到过这种情况:你正在观察代理执行一系列操作,发现方向不对,赶紧发了一条消息过去纠正——结果代理完全没反应,等了几分钟它做完所有事情才看到你的消息。
这正是 Busy Input Modes 要解决的问题。本文用最直观的方式讲清 Hermes Agent 的三种忙碌输入模式,以及它们分别在什么场景下使用。
问题背景
Hermes Agent 执行任务时会连续调用工具(读取文件、运行命令、搜索网络等),每一轮可能包含多个工具调用。当你在这期间发送消息时,系统需要决定如何处理这条消息——是排队等做完、插入到当前步骤之间、还是直接打断?
这个决策由两个配置共同控制:
| 配置 | 作用范围 | 可选值 |
|---|---|---|
display.busy_input_mode |
CLI 终端 + 网关全局 | queue / steer / interrupt |
display.busy_text_mode |
仅网关(Telegram 等)文字消息 | queue / interrupt |
默认值:CLI 终端为 interrupt,消息网关为 queue。
三种模式详解
📥 Queue — 排队模式
效果: 你在代理忙碌时发送的消息会排队,等到当前整轮任务完成后再处理。
你发消息 → [排队] → [排队] → [整轮完成] → 处理你的消息
特点:
- 最安全,不会干扰正在执行的操作
- 延迟最高——可能等几分钟
- 消息不会丢失,依次处理
适用场景:
- 代理在执行批量任务,你不需要中途介入
- 你只想提交一个后续请求,不着急
- 代理正在驱动多个子任务(delegate_task),打断可能导致子任务被取消
配置方式:
# config.yaml
[display]
busy_input_mode = "queue"# CLI 终端
/busy queue🎯 Steer — 引导模式
效果: 你的消息会在当前工具调用完成后立即插入处理,处理完毕后继续当前任务,不会中断整个工作流。
你发消息 → 当前 Step 完成 → [插入处理你的输入] → 继续后续任务
特点:
- 响应快——当前 step 跑完就见你的消息
- 不打断整体流程——处理完你的输入后继续干活
- CLI 和网关(Telegram 等)都支持
- 适用于"纠正方向"的场景:你发现代理走偏了,发一句话纠正,它调整后继续执行
适用场景:
- 你观察到代理方向不对,想及时纠正
- 你想在代理执行过程中补充信息
- 需要"边做边指导"的协作模式
配置方式:
# config.yaml
[display]
busy_input_mode = "steer"# CLI 终端
/busy steer也可以临时使用 /steer 命令(无需改变全局模式):
/steer 等等,这个方案不对,换一个方式
⚡ Interrupt — 打断模式
效果: 你的消息会打断当前任务,代理优先响应你的输入,当前轮任务可能提前结束。
你发消息 → 当前 Step 完成 → [打断] → 优先处理你 → 开始新轮次
特点:
- 响应最快
- 当前任务可能不完整——后续步骤被取消
- CLI 终端默认模式
- 有子任务(delegate_task)时自动降级为 queue,避免子任务被意外取消
适用场景:
- 需要紧急停止当前操作
- 发现严重错误需要立即修正
- 临时改变需求,需要代理从头开始
配置方式:
# config.yaml
[display]
busy_input_mode = "interrupt"# CLI 终端
/busy interrupt网关补充配置:busy_text_mode
对于消息平台网关(Telegram、Discord 等),还有一个额外的精细控制——display.busy_text_mode。
busy_input_mode |
busy_text_mode |
文字消息行为 |
|---|---|---|
interrupt(默认) |
queue(默认) |
文字消息依然排队 |
interrupt |
interrupt |
文字消息也打断 |
steer |
任意值 | 无视 busy_text_mode,走 steer 逻辑 |
为什么要有两个配置? 因为网关需要区分不同类型的输入。busy_input_mode 控制全局行为,busy_text_mode 专门针对文字消息做微调——这样即使在 interrupt 模式下,常规文字消息也可以选择继续排队,而不至于过于敏感。
# 设成 interrupt,让文字消息也能打断
hermes config set display.busy_text_mode interrupt
# 重启网关生效
systemctl --user restart hermes-gateway.service也可以在环境变量中覆盖:
export HERMES_GATEWAY_BUSY_TEXT_MODE=interrupt
export HERMES_GATEWAY_BUSY_INPUT_MODE=steer对比总结
| 维度 | Queue | Steer | Interrupt |
|---|---|---|---|
| 响应速度 | 慢(整轮后) | 中(step 后) | 快(step 后) |
| 任务完整性 | ✅ 完整执行 | ✅ 继续执行 | ⚠️ 可能中断 |
| 子任务保护 | ✅ 安全 | ✅ 安全 | ⚠️ 自动降级 |
| CLI 终端 | ✅ 支持 | ✅ 支持 | ✅ 默认 |
| Telegram 网关 | ✅ 默认 | ✅ 支持 | ✅ 需配置 |
| 最佳用途 | 无需干预 | 日常推荐 🇨🇳 | 紧急打断 |
新手推荐使用 Steer 模式。 它平衡了响应速度和工作连续性——你随时可以纠正方向,代理也不会丢掉正在做的事。
如何查看当前模式
# CLI 终端中
/busy status
# 或在终端中查看
grep busy_input_mode ~/.hermes/config.yaml
grep busy_text_mode ~/.hermes/config.yaml
# 当前有效状态(CLI)
# 会显示类似:Busy input mode: steer代码实现参考
如果你想了解底层实现,关键源码位置如下:
- CLI 模式定义:
cli.py第 2955-2964 行 - Gateway 模式加载:
gateway/run.py第 2994-3015 行(_load_busy_input_mode/_load_busy_text_mode) - Gateway 运行时调度:
gateway/run.py第 3200-3240 行 - Slash 命令注册:
hermes_cli/commands.py(/busyCLI-only,/steer两端可用)
核心逻辑只有几十行,感兴趣的读者可以直接阅读源码。
写在最后
Busy Input Modes 是 Hermes Agent 提供的一个非常实用的特性,它让你从被动等待变为主动引导。选对模式,能大幅提升人机协作效率。
如果你还在犹豫选哪个:先试 Steer。 它既不会错过你的消息,也不会打断正在进行的工作,是最中庸也最实用的选择。