多智能体架构选型:同步 vs 异步
@servasyy_ai 源码级对比 Hermes 与 OpenClaw,@idoubicc 用 500+ 用户托管实战复盘 OpenClaw 到 FastClaw。
开篇:一个"?"引发的惨案
想象你在用多 Agent 系统跑一个长任务,3 个子 agent 正在并行干活。你想问一句"进度怎么样了",随手发了个"?"。
在 Hermes 里,这个"?"会被当成中断信号——所有子 agent 被暴力 interrupt,之前的工作全白费。
在 OpenClaw 里,系统先判断你的意图:只是查进度?那就返回状态,子 agent 继续跑;想调整方向?用 Steer 给运行中的子 agent 发一条引导消息。
本课用两篇硬核长文讲透这个选题:
- @servasyy_ai(2026-04-11):Hermes 的
delegate_taskvs OpenClaw 的 subagent 系统,源码级深度对比; - @idoubicc(2026-06-22):基于一年 Agent 基础设施实战(500+ 用户托管),复盘 OpenClaw 做对了什么、错在哪,以及 FastClaw 的云原生重构。
Hermes delegate_task:同步阻塞的"总承包商"
以下来自 @servasyy_ai 对 Hermes 源码的剖析。Hermes 的实现集中在 978 行的 delegate_tool.py 中,支持两种工作模式:
- 单任务模式:给一个
goal参数,启动单个子 agent 同步执行; - 批量模式:接受最多 3 个任务的数组,通过
ThreadPoolExecutor并行处理。
子 Agent 的构造与隔离
每次委派都会创建全新的 AIAgent 实例:独立的对话历史、独立的 Terminal session(每个 task_id 对应独立的工作目录和状态),以及专门构建的 System Prompt。配置遵循严格的继承规则:
- 模型可以继承父 agent,也可用
delegation.model单独配置; - 工具集通过交集计算——子不能获得父没有的工具;
- 凭证可以共享父的 credential pool,也可以独立配置;
- System Prompt 特别强调工作空间规则:"Never assume a repository lives at /workspace/",避免路径假设导致的错误。
工具剥夺:天然沙箱
为防止失控,Hermes 对子 agent 进行了严格的工具剥夺:
- 禁用
delegate_task本身——防止递归委派; - 移除
clarify——子 agent 无法与用户交互; - 剥夺
memory工具——保护共享记忆不被污染; - 禁用
execute_code——避免子 agent 编写复杂脚本; - 移除
send_message——防止跨平台消息发送。
注意:子 agent 被剥夺了所有"向外逃逸"的工具。这既是限制,也是安全设计——后面会讲到这让 Hermes 天然适合安全敏感场景。
生命周期与深度控制
- MAX_DEPTH = 2:父 agent(深度 0)可以 spawn 子 agent(深度 1),但子 agent 不能再 spawn 孙子(深度 2 会被拒绝);
- 每个子 agent 默认 50 轮迭代上限(
DEFAULT_MAX_ITERATIONS,可通过 config.yaml 配置);
致命短板:没有时间维度的超时控制。
future.result() 调用不带 timeout 参数,子 agent 理论上可以无限期运行直到耗尽迭代次数。如果每轮都调用慢速 LLM,50 轮可能跑数小时。通信模式:纯单向的"有损压缩器"
Hermes 采用纯粹的单向返回(Request-Response)通信模式:父 agent 构造 goal 和 context 后调用 delegate_task(),然后阻塞等待。子 agent 之间完全无通信,所有中间 tool 调用和推理链都不进入父的上下文窗口。
就像总承包商派分包商去干活:分包商干完才回来交一份总结报告,中间怎么干的、试错了多少次,总承包商一概不知道——信息被"有损压缩"成了一个 summary 字符串。
唯一的"进度通知"只是 UI 层面的 callback(CLI 的 spinner 上方打印工具调用,或 Gateway 批量中继工具名称)——这是进度显示,不是语义通信。
凭证三级优先级
子 agent 的凭证解析遵循三级优先级:delegation.base_url → delegation.provider → 继承父 agent 的全部凭证。当子 agent 与父 agent 使用同一 provider 时,共享同一个 credential pool(cooldown 状态同步);每个子 agent 获取凭证 lease 后,在 finally 块中自动释放。
OpenClaw:异步编排的"交响乐团"
同样来自 @servasyy_ai 的对比。OpenClaw 走的是完全另一条路:
三角色与并发
- main / orchestrator(可再 spawn)/ leaf(不可再 spawn)三角色;
- 默认全局 8 路并发、每 agent 最多 5 个活跃子 agent、嵌套深度可配。
异步事件驱动
spawn 后立即返回,父 agent 不用原地等待。子 agent 完成后,经 runSubagentAnnounceFlow() 以 user message 的形式把结果推送回父 agent。文档明示:不要轮询 sessions_list。
Steer:运行中遥控
父 agent 可以向运行中的子 agent 发送引导消息,触发其重新调整方向。限流保护:每 2 秒最多 1 次,消息最大 4000 字符。这正是 Hermes 最缺失的能力。
就像交响乐团的指挥:乐手们各奏各的声部,指挥不用等某个人拉完才继续,而是在演奏中途用手势随时调整——这就是 Steer。
完整的生命周期管理
runTimeoutSeconds参数(默认 300 秒)提供时间维度的控制;runs.json持久化运行记录,支持 orphan recovery(孤儿恢复);resumeSessionId允许恢复已有会话。
这些机制让 OpenClaw 适合长流程、多阶段的复杂任务。
灵活性的代价:多 12% token
announce 推送会把子 agent 的结果注入父 agent 的上下文,频繁的 steer 消息也会产生额外 token 开销。原文算了一笔账:同等 3 子任务场景,每次 announce 约 1K token,父 agent 上下文从 10K 增长到 13K,总消耗约 28K token——比 Hermes 多 12%。
深层逻辑:单体 vs 分布式
- Hermes 更像单体应用:简单、可预测;
- OpenClaw 更像分布式系统:灵活,但需要更复杂的状态管理。
从安全视角看:Hermes 的强隔离形成天然沙箱,适合安全敏感场景;OpenClaw 的子 agent 保留更多能力,但也意味着更大的攻击面。
机制差异对照表与选型建议
把两篇对比的核心差异收进一张表(以下均来自 @servasyy_ai 原文):
| 维度 | Hermes delegate_task | OpenClaw subagent |
|---|---|---|
| 通信模式 | 同步阻塞,Request-Response | 异步事件驱动,announce + steer |
| 并发 | 批量最多 3(ThreadPoolExecutor) | 全局 8 路,每 agent 最多 5 子 |
| 嵌套深度 | MAX_DEPTH = 2,不可再 spawn | 可配,orchestrator 可再 spawn |
| 超时控制 | 无(只有 50 轮迭代上限) | runTimeoutSeconds(默认 300 秒) |
| 中途干预 | 只能暴力 interrupt("?"惨案) | Steer 引导(2 秒 1 次/4000 字符) |
| 状态恢复 | 无 | runs.json + orphan recovery + resumeSessionId |
| token 开销 | 零膨胀(中间推理不进父上下文) | 多约 12% |
| 外部 Agent | 不支持 | ACP 接 Claude Code / Codex |
选型建议(原文结论)
- 选 Hermes:3 个互不相关并行任务、怕污染主上下文的场景;
- 选 OpenClaw:需要在子 agent 运行中调整方向、需要超时控制防止无限运行、需要调用外部编码 agent(如 Claude Code、Codex)做子 agent、构建多层嵌套 agent 树。
Hermes 的改进方向(原文列出)
- 加
timeout_seconds参数(最高优先级); - Gateway interrupt 逻辑改"进度查询";
- 引入 Steer 能力;
- 并发上限可配置;
- 支持持久化和恢复;
- ACP 支持外部 Agent。
OpenClaw → FastClaw:一年的实战复盘
以下来自 @idoubicc。基于一年 Agent 基础设施实战(500+ 用户托管),他复盘了 OpenClaw 做对的 6 点、8 大架构缺陷,以及重构出的 FastClaw。
- 多端接入:Telegram / Discord / Slack / 飞书等——"Agent 不应被困在一个 App 里";
- SOUL.md 人格机制:用户粘性暴涨,换模型不换人设;
- 两层记忆:MEMORY.md 长期摘要注入 prompt + memory/ 每日明细按需检索,不占 token;
- Cron + 心跳主动通知:从被动响应到主动服务;
- 对话式安装 Skill:"帮我装个翻译技能",对话即操作;
- 多 Agent 协作:单 Gateway 进程内多 Agent 隔离运行,各有 workspace / agentDir / 会话历史,multi-agent routing 分发。
Node.js 单体架构:一个 ~/.openclaw/openclaw.json 文件管所有配置(LLM Provider、Channel Token、Plugin 配置、Skill 列表……);存储以文件系统为主(Session 存 JSON、Memory 存 Markdown、Skills 存目录);openclaw start 单进程挂载所有 Channel 和 Plugin。
- 缺平台级多租户:隔离围绕 Agent 而非用户,一人一 Agent 成本高;
- Gateway 单点故障:一个 Plugin 泄漏,全盘崩溃;
- 默认上下文偏重,token 失控(bootstrap 文件越堆越大);
- 资源占用大(idle 500MB+);
- 云原生不友好:配置状态落本地文件系统;
- 800MB+ node_modules,臃肿的依赖树;
- Web UI 体验差;
- 安全模型只为单机单操作者设计:exec 默认 full 免审批、prompt injection 未解决、密钥明文存储、无 per-user RBAC。
FastClaw:轻量、快速、云原生
- 云原生优先:一行命令安装、零配置环境变量启动、SQLite → Postgres 一行切换、S3 对象存储;
- 多租户与 RBAC:super_admin / user / app_user / channel_user 四角色;system → user → agent → (user,agent) 四层配置继承;
- 会话隔离:key 为 user_id / agent_id / channel_type / chat_id 四元组;
X-Fastclau-End-Userheader 透传终端身份; - Go 高并发无状态 Session:状态在 DB,任意 Pod 处理任意请求;
- 单二进制约 30MB分发;Go 编译为原生机器码,没有 GC 停顿——同样的硬件,能扛 10 倍流量;
- 插件 JSON-RPC 子进程隔离:插件崩溃不影响 Gateway,openclaw-plugin-bridge 兼容 TS 插件生态;
- 工具 Provider Fallback Chain:Web Search(Tavily → SerpAPI → 直接抓取)、Image Gen(Replicate → 本地 SD)、TTS(ElevenLabs → Fish Audio)、Sandbox(Docker → E2B → 无沙盒)。
核心架构决策
- 存算分离:计算层 Gateway 无状态水平扩展;存储层 DB + S3 是唯一真相源;
- 基于 Scope 的配置继承;
- LLM / Tool / Sandbox 三层 Fallback对上层透明。
四个定位
- Assistant:个人助理;
- Factory:在 cloud.fastclaw.ai 上创建、分享 Agent;
- Runtime:weclaw.im 一小时上线,把 FastClaw 当 Backend 用;
- Platform:企业私有化 Agent 协作平台。
OpenClaw 像单间公寓:一个人住很舒服,但想改成公寓楼出租(多租户)几乎要推倒重来。FastClaw 从第一行代码就按公寓楼设计:每户独立水电(会话隔离)、统一物业(Gateway 无状态)、坏了一户不影响整栋(插件子进程隔离)。
多 Agent 框架设计经验:5 条检查清单
原文"七、多 Agent 框架设计经验总结"一节给出 5 条经验(以下逐条引用原文)。点下面单步走一遍:
OpenClaw 一开始就做单租户,后来想加多租户发现要改的东西太多,几乎等于重写。FastClaw 从第一行代码就设计了 (user_id, agent_id) 的隔离模型,即使一开始只有一个人用,后续扩展也不需要改架构。
原文收束金句:好的架构不是设计出来的,是迭代出来的。在迭代之前想清楚存算分离、多租户隔离、Fallback 容错这三件事,你会省下很多时间。
术语翻卡:点卡片看解释
自测一下:点问题展开参考答案
父 agent 调用后原地阻塞等待子 agent 返回,子之间也零通信。致命短板是 future.result() 不带 timeout 参数——只有 50 轮迭代上限,没有时间维度超时,慢速 LLM 下 50 轮可能跑数小时。
用户发"?"查进度时,Hermes 会把所有子 agent 暴力 interrupt;OpenClaw 可以先判断意图,返回状态让子 agent 继续跑,或用 Steer(每 2 秒 1 次、最大 4000 字符)向运行中的子 agent 发引导消息调整方向。
多约 12%(父上下文 10K→13K,总约 28K)。因为 announce 推送把子 agent 结果注入父上下文,加上频繁的 steer 消息开销;Hermes 的中间推理不进父上下文,零膨胀。
存算分离 + 多租户:Go 实现的无状态 Gateway(状态全在 DB),单二进制约 30MB;四角色 RBAC 与四层配置继承;会话隔离 key 为四元组;插件子进程隔离;每类工具都有 Fallback Chain。同样的硬件能扛 10 倍流量。