AI 不缺聊天助手,缺的是编排器:Hermes 能同时调度多个 Claude Code 实例

AI 不缺聊天助手,缺的是编排器:Hermes 能同时调度多个 Claude Code 实例
你可能已经习惯了这样的工作流:打开 Claude Code,让它读代码、修 bug、改测试,然后再追问几轮。
01太长不看
-
Hermes 不只是”又一个 AI 聊天助手”,它的核心差异是代理编排(Agent Orchestration) -
通过 delegate_task,你可以一键启动多个 Claude Code / Codex 实例并行工作 -
子代理运行在独立的终端会话、独立的会话历史中,互不干扰 -
父子代理可以用完全不同的 LLM:父代理用本地模型规划,子代理用云端 Claude 执行 -
与 OpenClaw 等网关型工具形成互补:Hermes 管调度,OpenClaw 管消息入口
02先看一个具体场景
假设你要重构一个 800 行的 auth.py 模块。正常情况下,你会打开 Claude Code,一步步让它改。
但如果你希望三个方向同时推进呢?
-
一个子代理审安全,重点看 SQL 注入、XSS、CSRF -
一个子代理审性能,重点看数据库查询、缓存策略、N+1 问题 -
一个子代理审规范,重点看 PEP 8、type hints、函数长度
在 Hermes 里,可以这样委派:
Hermes 会启动三个独立的子代理,通过线程池并行执行。每个子代理都有自己的终端会话、工作目录和工具集。三边审查完成后,结果再汇总给父代理。
这就是”编排器”和”聊天助手”的差别。聊天助手负责回答你;编排器负责把任务拆开、派出去、收回来。

03两种调度模式
Hermes 调度外部编码代理有两条路径。理解这两条路径,基本就理解了 Hermes 的定位。
模式一:AIAgent 子进程模式
第一种是 Hermes 内部创建 AIAgent 对象。它共享运行时环境,启动开销低,适合快速委派轻量任务。子代理继承父代理的配置,包括 provider、model 和工具集。
这类模式更像 Hermes 自己内部的任务拆分。轻,快,但隔离性没有外部进程那么强。
模式二:ACP 外部代理模式
第二种才是 Hermes 能调度 Claude Code / Codex 的关键。
ACP(Agent Communication Protocol)是一种基于 stdin/stdout 的进程间通信协议。Hermes 通过 acp_command 参数 fork 一个外部进程,然后和这个进程通过标准输入输出交换 JSON 消息。
具体流程是:
-
Hermes调用 delegate_task(acp_command="claude", acp_args=["--acp", "--stdio", ...]) -
Hermes fork 一个子进程,执行 claude --acp --stdio --model claude-sonnet-4-20250514 -
Hermes 通过 stdin 发送 goal 和 context,Claude Code 读取后开始工作 -
Claude Code 每做一个工具调用,比如读文件、写文件、执行命令,都通过 stdout 回传请求 -
Hermes 执行工具、回传结果,循环直到 Claude Code 完成任务 -
Claude Code 退出,Hermes 收集 summary

调度 OpenAI Codex CLI 也走 ACP 模式:
两种模式的区别可以压缩成这张表:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
什么时候选 ACP?当你需要 Claude Code / Codex 的完整编码能力时,比如它自己的工具链、文件编辑、终端执行能力,ACP 模式更合适。AIAgent 模式则更适合 Hermes 内部的轻量任务拆分。
04子代理如何创建、隔离和回收
delegate_task 的实现在 tools/delegate_tool.py,约 2168 行。拆开看,它主要做三件事:创建、隔离、回收。
创建阶段
每次委派,Hermes 会经历这些步骤:
- 暂停检查
— TUI 紧急制动开关,防止不受控的委派 - 深度限制
— max_spawn_depth(默认 2)防止无限递归委派 - 凭证解析
— 三级降级策略: delegation.base_url→delegation.provider→ 继承父代理 - 构建子代理
— 每个子代理独立的会话 ID、终端会话、工具集
这里有个很实用的设计:子代理可以用和父代理完全不同的 LLM。比如父代理用本地 Qwen 做规划,子代理用云端 Claude 做重推理。
配置里大概是这样:
隔离机制
每个子代理在四个维度上被隔离:
|
|
|
|---|---|
|
|
session_id,不共享对话历史 |
|
|
terminal_session,单独的工作目录和进程状态 |
|
|
delegate_task、clarify、memory、send_message、execute_code |
|
|
|
最值得注意的是 delegate_task 被默认阻断。这个限制是为了防止子代理继续委派孙子代理,最后变成无限递归。如果确实需要多层委派,就要显式设置 role: "orchestrator",并调高 max_spawn_depth。
并行执行与中断安全
批量任务使用 ThreadPoolExecutor,默认 max_workers=3。
这里有个细节:Hermes 不用 as_completed() 收集结果,而是用 wait(timeout=0.5, return_when=FIRST_COMPLETED) 每 500ms 轮询一次。
原因很直接:as_completed() 会阻塞到 future 完成。如果某个子代理卡死,父代理也会一直等。轮询之后,父代理可以每 500ms 检查一次 _interrupt_requested 标志。你按 Ctrl+C 时,已完成的结果照常收集,没完成的标记为 interrupted。
收尾阶段
子代理结束后,会触发 subagent_stop 钩子。这个钩子运行在主线程,插件作者不用自己处理并发问题。
同时,Hermes 会通知父代理的文件缓存。如果子代理修改了父代理已经读过的文件,父代理会自动刷新缓存。这个细节很小,但对多代理协作很关键:父代理不会拿着旧文件继续推理。
05配置方法
最小可用配置:
TUI 管理命令:
06Hermes vs OpenClaw:编排器 vs 网关
OpenClaw 也是一个经常被提到的项目。它覆盖 20+ 消息平台,有 5400+ Skills 生态,但它不支持代理编排。
两者不是同一类东西。
- Hermes
是编排器:多代理树结构,父子代理独立运行,支持并行执行和外部代理调度 - OpenClaw
是网关:单代理实例,核心能力是消息路由和多平台统一入口
如果你需要复杂编码任务、多代理协作、调度 Claude Code,Hermes 更对口。
如果你需要多平台消息统一入口、日常个人助手,OpenClaw 更像入口层。
07判断
Hermes 的 delegate_task 机制解决的是一个真实的工程问题:复杂任务不一定要交给一个代理串行处理,很多时候可以拆成多个维度并行推进。
它适合并行代码审查、跨 LLM 混合调度、复杂重构。
它不适合日常问答,也不适合简单脚本生成。那类任务直接开 Claude Code 更快。
所以我会把 Hermes 看成一个更靠近“Agent 调度层”的工具:它不负责替代 Claude Code,而是负责把 Claude Code / Codex 这类编码代理放进一套可编排的工作流里。
夜雨聆风