Hermes Agent Busy Input Modes 完全指南

一篇讲清 Queue / Steer / Interrupt 三种模式的区别、适用场景和配置方法,覆盖 CLI 终端与 Telegram 网关

前言

用过 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/busy CLI-only, /steer 两端可用)

核心逻辑只有几十行,感兴趣的读者可以直接阅读源码。


写在最后

Busy Input Modes 是 Hermes Agent 提供的一个非常实用的特性,它让你从被动等待变为主动引导。选对模式,能大幅提升人机协作效率。

如果你还在犹豫选哪个:先试 Steer。 它既不会错过你的消息,也不会打断正在进行的工作,是最中庸也最实用的选择。