← 返回学习中心 · Agent 工程OiOi Academy
AGENT 理论 · 21

多智能体架构选型:同步 vs 异步

@servasyy_ai 源码级对比 Hermes 与 OpenClaw,@idoubicc 用 500+ 用户托管实战复盘 OpenClaw 到 FastClaw。

来源 @servasyy_ai / @idoubicc 形式 X 长文 × 2 发布 2026-04-11 / 2026-06-22
🤔

开篇:一个"?"引发的惨案

想象你在用多 Agent 系统跑一个长任务,3 个子 agent 正在并行干活。你想问一句"进度怎么样了",随手发了个"?"。

在 Hermes 里,这个"?"会被当成中断信号——所有子 agent 被暴力 interrupt,之前的工作全白费。

在 OpenClaw 里,系统先判断你的意图:只是查进度?那就返回状态,子 agent 继续跑;想调整方向?用 Steer 给运行中的子 agent 发一条引导消息。

记住:这就是"同步阻塞" vs "异步编排"最直观的区别:前者父 agent 发出任务就原地等待,后者派出去就各干各的、随时还能遥控。

本课用两篇硬核长文讲透这个选题:

  • @servasyy_ai(2026-04-11):Hermes 的 delegate_task vs 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 并行处理。
原文配图:Hermes 与 OpenClaw 架构对比题图
原文配图:Hermes 与 OpenClaw 架构对比题图

子 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 块中自动释放。

原文配图:Hermes 通信模式示意
原文配图:Hermes 通信模式示意
🎼

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 适合长流程、多阶段的复杂任务。

原文配图:OpenClaw 异步编排示意
原文配图: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 树。
记住:原文还给了一个混合架构:OpenClaw 做编排层 + 局部用 Hermes delegate。main agent 经 sessions_spawn 起 research agent(ACP 调 Claude Code)、analysis agent(embedded)、writer agent;其中 analysis agent 内部用 Hermes 的 delegate_task 并行处理 3 个互不相关的数据分析任务(利用其上下文零膨胀的优势),research 和 writer 之间则经 announce / steer 协作。

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-User header 透传终端身份;
  • 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 无状态)、坏了一户不影响整栋(插件子进程隔离)。
原文配图:FastClaw 架构图
原文配图:FastClaw 架构图
✅

多 Agent 框架设计经验:5 条检查清单

原文"七、多 Agent 框架设计经验总结"一节给出 5 条经验(以下逐条引用原文)。点下面单步走一遍:

OpenClaw 一开始就做单租户,后来想加多租户发现要改的东西太多,几乎等于重写。FastClaw 从第一行代码就设计了 (user_id, agent_id) 的隔离模型,即使一开始只有一个人用,后续扩展也不需要改架构。

记住:多租户不是功能,是架构决策。越早做越省事。

原文收束金句:好的架构不是设计出来的,是迭代出来的。在迭代之前想清楚存算分离、多租户隔离、Fallback 容错这三件事,你会省下很多时间。

词

术语翻卡:点卡片看解释

delegate_task
delegate_task
Hermes 的子 agent 委派原语:同步阻塞调用,子任务完成后才返回。
有损压缩器
lossy compressor
原文对 Hermes 子 agent 的比喻:大量中间推理被压缩成一个 summary 字符串,细节丢失。
MAX_DEPTH
MAX_DEPTH
Hermes 的嵌套深度上限 = 2,子 agent 不能再 spawn 孙子。
Steer
steer
OpenClaw 向运行中子 agent 发送引导消息的机制(2 秒 1 次/4000 字符)。
announce
announce
OpenClaw 子 agent 完成后经 runSubagentAnnounceFlow() 把结果推送回父 agent 的机制。
存算分离
compute-storage separation
FastClaw 核心决策:Gateway 无状态水平扩展,DB + S3 是唯一真相源。
Fallback Chain
fallback chain
每个工具类别的主备 Provider 链,主挂了自动切备用,用户无感知。
测

自测一下:点问题展开参考答案

父 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 倍流量。