Hermes Agent v0.11 - 结构升级与实战工作流解读¶
这是一次“结构级”版本,不是小修小补。重点不在单点新功能,而在可扩展性边界被整体抬高:交互层更可控、模型接入层更解耦、插件/Hook 可编排、子代理协作更可靠。
目录¶
1) 这次版本到底改了什么(结论先行)¶
1.1 一张表看懂 v0.11 重点¶
| 维度 | v0.10 及之前痛点 | v0.11 改动 | 直接收益 |
|---|---|---|---|
| 交互体验 | 长任务中输入/输出难管理 | 全新 React + Ink TUI | 观察、纠偏、追踪更顺手 |
| 运行中纠偏 | 跑偏后通常只能重跑 | /steer 中途纠偏 |
减少重跑成本 |
| 模型接入 | Provider 逻辑耦合在核心 | Pluggable Transport Layer | 新 provider 接入成本降低 |
| 企业合规 | 外部 API 路由受限 | 原生 AWS Bedrock | 更易满足内网/合规要求 |
| 插件能力 | 多是“旁路观察” | 可拦截/改写 tool call/result | 能做治理、审计、策略控制 |
| 多代理并行 | 并行写文件冲突风险 | Orchestrator + 文件协调 | 并行流水线可落地 |
1.2 版本定位¶
- 这版核心关键词:Interface + Infrastructure + Extensibility。
- 不是“多了几个 provider”这么简单,而是后续版本继续加速的“地基”。
1.3 快速判断你是否该马上升级¶
✅ 适合尽快升级: - 你有长任务(研究、代码重构、批处理) - 你要做多代理并行 - 你有企业网络/合规要求(Bedrock) - 你准备做插件治理(拦截敏感命令、审计日志)
❌ 可观望: - 你只跑非常短、一次性任务 - 没有多平台消息/插件/并行需求
2) 架构层变化:从可用到可扩展¶
2.1 新 TUI:不是“好看”,是“可操作性升级”¶
关键改动: - Sticky composer(输入区固定) - 实时流式输出 - 状态栏增加 git branch + 每轮计时 - 子代理 spawn 可视化
工程价值:在“任务中”做决策,而不是“任务后”复盘。
ASCII 流程:
[启动任务]
|
v
[TUI 实时观察输出] --发现偏离--> [/steer 注入修正]
| |
+--------------继续执行<-------------+
|
v
[完成结果 + 用时可观测]
2.2 Transport 重构:把“模型接入”从核心运行时剥离¶
过去 provider 适配逻辑散落在核心路径;现在抽象为 transport 层: - Anthropic transport - Chat Completions transport - Responses API transport - Bedrock transport
收益: 1. 新 provider 接入更快 2. 切换 provider 以配置为主,不动核心代码 3. 便于统一治理重试、限流、日志
2.3 Plugin + Hooks:从“扩展”变“策略编排”¶
新增能力重点:
- pre-tool-call 可阻断(block)
- transform_tool_result 可改写返回
- transform_terminal_output 可脱敏
- register_command / dispatch_tool
- Shell hooks(低门槛接生命周期)
示例(治理思路):
# 伪配置思路:生产环境阻断危险命令
# pre-tool-call hook:
# if command matches "rm -rf /" or "drop table" -> deny
3) 六个可直接复用的工作流¶
3.1 多代理体系:Orchestrator + 文件协调层¶
这是 v0.11 最核心的架构升级。多代理不是简单地"起多个进程跑",而是引入了结构化的层级管理和并发安全机制。
3.1.1 两个角色¶
| 角色 | 能力 | 典型用途 |
|---|---|---|
leaf(默认) |
独立完成分配的任务,不能进一步委派 | 代码评审、搜索、数据处理 |
orchestrator |
可继续 delegate_task 生成下一层子代理 |
拆解大任务、聚合多路结果 |
代理层级:
Depth 0 Parent Agent(你交互的主代理)
|
+-- delegate_task(role=orchestrator) ----+
| |
Depth 1 +--> Child A (orchestrator) +--> Child B (leaf)
| |
Depth 2 +--> Grandchild 1 (leaf) (不可再拆分)
+--> Grandchild 2 (leaf)
3.1.2 关键配置项¶
delegation:
max_concurrent_children: 5 # 最大并行子代理数(默认 5)
max_spawn_depth: 1 # 最大嵌套深度 [1-3],1=只能一层
orchestrator_enabled: true # 全局开关,false 则所有 orchestrator 降级为 leaf
subagent_auto_approve: false # 子代理危险命令是否自动放行(默认拒绝)
model: '' # 可选:子代理用不同/更便宜的模型
provider: '' # 可选:子代理走不同 provider
决策树:
需要嵌套编排吗?
├── 否 → max_spawn_depth: 1(默认)
└── 是 → 需要 2 层嵌套?
├── 是 → max_spawn_depth: 2
└── 否 → max_spawn_depth: 3
注意:每层都是 API 调用开销,
嵌套越深 token 消耗越大
3.1.3 文件协调层(FileStateRegistry)¶
核心问题:多个并行子代理可能读写同一文件,互相覆盖。
解决方案:进程级单例 FileStateRegistry,通过三个钩子跟踪文件状态:
子代理 A: read_file("config.yaml") ←── 记录 read stamp
子代理 B: write_file("config.yaml") ←── 写入 + 记录 last_writer
子代理 A: write_file("config.yaml") ←── check_stale 触发!
↓
检测到 B 在 A 读取之后修改了该文件
返回警告:"Re-read the file before writing"
三类陈旧检测:
| 检测类型 | 触发条件 | 返回给模型的提示 |
|---|---|---|
| 兄弟代理覆盖 | 其他子代理在你读取后写入了同一文件 | 告知是哪个 task_id 修改的 |
| 外部修改 | 磁盘上 mtime 变了(人工编辑或其他进程) | 提示有外部编辑 |
| 写前未读 | 你从未读过就要写(可能是新建文件) | 提示先读取 |
设计要点:
- per-path threading.Lock:同一文件的读-改-写串行化,不同文件并行
- 不阻塞,只警告:check_stale 返回提示文本给模型,由模型决定重新读取
- 写入后自动刷新:note_write 更新代理自身的 read stamp,避免自触发误报
- 可通过 HERMES_DISABLE_FILE_STATE_GUARD=1 完全关闭
3.1.4 子代理的工具隔离¶
子代理默认不能使用以下工具(硬编码阻断):
| 被阻断工具 | 原因 |
|---|---|
delegate_task |
防止递归委托(leaf 的核心限制) |
clarify |
子代理无法与用户交互 |
memory |
不能写入共享 MEMORY.md |
send_message |
防止跨平台副作用 |
execute_code |
子代理应逐步推理,而非写脚本黑箱 |
注意:当 role=orchestrator 时,delegate_task 会被重新加回,其他四个仍然阻断。
3.1.5 实战:并行代码评审¶
1. 你给主代理一个 PR diff
↓
2. 主代理(orchestrator)分析 diff,按模块拆分:
├── 子代理 1: 审查 src/payment/*.java
├── 子代理 2: 审查 src/settlement/*.java
└── 子代理 3: 审查 src/web/*.java
↓ (并行执行,受 max_concurrent_children 限制)
3. 各子代理独立运行,FileStateRegistry 确保文件写入安全
↓
4. 主代理汇总三份评审 → 生成统一报告
↓
5. 如果某个子代理的输出被另一子代理修改了父代理已读的文件,
汇总结果会附带提醒:"subagent X 修改了你之前读过的 Y 文件"
串行 vs 并行耗时对比:
| 场景 | 串行 | 并行(v0.11) |
|---|---|---|
| 3 个模块各 2 分钟 | ~6 分钟 | ~2 分钟 |
| 5 个模块各 1-4 分钟不等 | ~12 分钟 | ~4 分钟(最慢模块) |
| 文件冲突风险 | 无(天然串行) | FileStateRegistry 自动防护 |
3.1.6 实战:多数据源研究(Drug Discovery 模式)¶
可迁移到任意"多源采集 + 汇总"场景:
Orchestrator: "评估 XX 化合物"
|
+-- 并行 -->
| [ChEMBL] [PubChem] [OpenFDA] [ADMet]
| | | | |
| v v v v
| 生物活性 化学结构 监管信号 药代动力学
|
v
Orchestrator 汇总 → 单份综合评估报告
非医药领域映射:
| 领域 | 数据源 1 | 数据源 2 | 数据源 3 | 数据源 4 |
|---|---|---|---|---|
| 风控 | 交易日志 | 黑名单 | 地理位置 | 设备指纹 |
| 运维 | 监控指标 | 发布日志 | 链路追踪 | 变更记录 |
| 安全 | CVE 库 | 依赖扫描 | 配置审计 | 流量日志 |
| 支付 | 订单数据 | 渠道对账 | 结算记录 | 风控规则 |
3.1.7 常见坑与最佳实践¶
| 问题 | 建议 |
|---|---|
| 子代理任务太宽泛 | 给 context 参数传入具体文件路径/约束 |
| 并行太多 OOM/限流 | max_concurrent_children 从 3 开始,别直接开 5 |
| 子代理用了更贵的模型 | 配置 delegation.model 指定便宜模型(如 GPT-4o-mini) |
| 需要子代理有交互能力 | 不可能,改用 hermes 进程 spawn(tmux 模式) |
| 文件协调误报太多 | 确保每个子代理的 goal 指向不同文件区域 |
| 嵌套太深 token 爆炸 | max_spawn_depth 不要超过 2,orchestrator 层级越少越好 |
3.2 研究任务中途纠偏(/steer)¶
典型场景:资料已收集很多,但结论方向偏了。
- 老做法:停掉重跑(浪费)
- 新做法:/steer 注入纠偏,保留已完成工作
[研究任务进行中]
|
v
[观察 TUI 输出] → 发现方向偏了 → /steer 重新聚焦到 X 角度
| |
+------ 已有资料 + prompt cache --------+
| 全部保留,不中断 |
v
[从纠偏点继续执行,无需重跑]
与 Orchestrator 的协同:你可以在 orchestrator 汇总阶段用 /steer 调整汇总策略,而不需要等全部子代理跑完再重跑。
3.3 Webhook Direct Delivery(零 token 转发)¶
如果 payload 已经可读,不需要 LLM 推理:
Webhook Event --> Direct Delivery --> Telegram/Discord/Slack
优点:低延迟、零模型成本、告警链路更简单。
3.4 Shell Hooks 融入 CI/CD¶
可落地做法:
- on-session-start:注入分支/构建号上下文
- pre-tool-call:校验受保护路径
- post-tool-call:记录审计日志
3.5 QQBot + 多平台统一后端¶
同一 Hermes 后端可同时服务 QQ / Telegram / Discord 等入口, 共享工具与上下文,减少多套机器人运维成本。
4) 落地建议:团队怎么升级最稳¶
4.1 三步升级法¶
- 先灰度环境:只开新 TUI +
/steer - 再接入 transport 切换:验证 Bedrock/新 provider 稳定性
- 最后启用治理 hooks:阻断策略、脱敏、审计
4.2 升级验收清单¶
- 长任务中
/steer可稳定生效 - 并行子代理无文件冲突
- provider 切换仅改配置即可
- Hook 阻断策略不误伤正常命令
- 告警类 webhook 已迁移 direct delivery
4.3 一句话总结¶
v0.11 的本质是:把 Hermes Agent 从“单体可用工具”推向“可治理、可扩展、可并行编排的平台底座”。
参考资料¶
相关笔记¶
- [[Hermes Agent]]
- [[AI Agent Engineering]]
- [[多代理协作(Multi-Agent Orchestration)]]