OpenClaw 架构演进问答

Agent|字数 6,495|阅读时长 ≈ 17 分钟

版本:2026-07-04

定位:这是一篇基于 openclaw-architecture-learning-guide.md 改写的问答式学习文档。它用“遇到问题 -> 做出设计 -> 又遇到新问题 -> 继续迭代”的方式,帮助你理解 OpenClaw 为什么会长成现在这个样子。

说明:本文是架构学习推演,不是 OpenClaw 官方真实历史时间线。它更像一次架构复盘剧本:把现在的组件倒推成一连串自然的问题和回答。

0. 先给一个结论

问:OpenClaw 到底是什么?

答:OpenClaw 是一个自托管个人 AI 助手平台。它不是“给模型套个聊天框”,而是把消息渠道、Gateway、Agent Runtime、Context、Memory、Tools、Plugins、Nodes、安全策略和多 Agent 路由拼成一套能长期运行的系统。

如果用一句更工程味的话说:

OpenClaw 解决的是:一个 AI 助手如何长期在线、安全接入真实渠道、调用真实工具,并且别在第二天早上忘了昨天晚上说过什么。

1. 最开始的问题:我只是想随时找 AI 助手

问:为什么要做 OpenClaw?直接打开一个网页聊天不就行了吗?

答:网页聊天适合“我现在主动去问它”。但个人助手更像“我在哪里,它就在哪里”。你可能在 Telegram、Slack、WhatsApp、iMessage、WebChat、CLI 里发消息,希望同一个助手能接住。

于是第一个问题出现了:

用户入口太多,模型入口只有一个,中间缺一个能长期在线的中枢。

问:所以最早的版本会是什么样?

答:最自然的第一版就是:

Code
Channel -> LLM -> Reply

某个聊天渠道收到消息,调用模型,回一段文本。看起来很美,跑起来也快,演示时掌声不错。

问:这版有什么问题?

答:问题来得非常快:

  • 每接一个渠道,都要重新写一套消息处理。
  • 渠道字段不一样,Telegram 有 bot token,WhatsApp 有 QR pairing,Slack 有 workspace/thread。
  • 模型响应可能很长,但渠道有长度限制。
  • 用户连续发三句话,系统可能触发三次模型调用。
  • 重连或重投可能导致同一条消息被处理两遍。

一句话:第一版不是坏,而是“每个渠道都在认真表达自己的个性”。系统一多,个性就变成维护成本。

2. 第一次迭代:引入 Gateway

问:怎么解决多渠道混乱?

答:需要一个 Gateway。它专门负责接入真实世界:

  • 连接不同消息渠道。
  • 统一 inbound message。
  • 处理认证、状态、健康检查。
  • 暴露 WebSocket / HTTP 控制面。
  • 把消息路由到正确 session 和 Agent。

架构变成:

Code
Channels -> Gateway -> Agent Runtime -> Gateway -> Channels

问:Gateway 为什么这么重要?

答:因为它是控制平面。控制平面负责回答几个硬问题:

  • 谁能连接?
  • 消息从哪里来?
  • 该发给哪个 Agent?
  • 这个 session 正在运行吗?
  • 工具和插件是否可用?
  • 系统是否健康?

没有 Gateway,每个渠道都要自己理解这些问题。那就不是架构,是复制粘贴比赛。

问:新发现是什么?

答:AI 助手不是只有“模型调用”。只要它接入真实用户,第一核心问题就变成:

输入从哪里来,状态归谁管,输出怎么安全回去。

这也是 OpenClaw 选择 Gateway-first 的原因。

3. 第二个问题:一条消息不是一条字符串

问:有了 Gateway,是不是就稳了?

答:还早。真实消息不是一句干净的字符串,而是一团带着渠道脾气的数据。

它可能包含:

  • channel id。
  • account id。
  • sender。
  • group / thread。
  • reply 引用。
  • 附件。
  • message id。
  • 平台状态。
  • 是否是重发。

问:怎么处理?

答:Channel Adapter 负责归一化。它把不同渠道的输入转换成 OpenClaw 内部能理解的消息,再把输出转换回渠道格式。

Code
Telegram messageSlack eventWhatsApp inboundWebChat frame      |      vNormalized OpenClaw message

问:这一步有什么价值?

答:Runtime 不需要知道 Telegram 和 Slack 的细节。它只处理统一后的消息、上下文、工具和输出。

这叫边界清楚。边界不清楚时,最容易出现“改一个 Slack thread,顺手弄坏 WhatsApp 回复”的小型惊喜。

4. 第三个问题:消息要归到哪里?

问:消息统一了以后,下一步是什么?

答:要知道它属于哪个 session。

同一个用户可能在多个渠道说话。同一个渠道可能有 DM、group、thread。同一个 Gateway 可能托管多个 Agent。如果没有 session key,系统就会把上下文搅在一起。

问:怎么解决?

答:Gateway 通过 channel、account、peer、group、thread、binding 等信息生成或查找 session key。

Code
Inbound message  -> routing  -> session key  -> session transcript  -> agent run

问:为什么 session store 很关键?

答:模型本身是无状态的。让它像“记得刚才聊过什么”,靠的是 session transcript、context assembly 和 memory。

换句话说:

不是模型记性好,是系统帮它把该看的东西拿回来了。

5. 第四个问题:用户不是按回车节拍器发消息的

问:用户连续发三条消息怎么办?

答:如果每条都立刻触发一次 agent run,会出现几个问题:

  • 成本上升。
  • 回复可能乱序。
  • 第二条消息还没被看到,第一轮模型已经开始回答。
  • 用户其实只是把一句话分成三段发。

问:OpenClaw 怎么处理?

答:引入 dedupe、debounce 和 active-run queue。

机制解决什么
dedupe防止同一条消息因重连或重投被处理两次
debounce把短时间连续消息合并成一个 turn
active-run queuesession 正在运行时,后续消息可以排队、追加、转向或打断
chunking模型长输出按渠道限制分块发送

问:这算并发问题吗?

答:算,而且是非常现实的并发问题。不是那种只出现在论文图里的并发,而是用户真的会在你还没答完时补一句“等等,我刚才说错了”。

系统需要决定:

  • 新消息是 follow-up 还是 interrupt?
  • 当前 run 要继续还是转向?
  • 多个输出如何避免交错?
  • 同一 session 能否同时跑多个 agent run?

问:架构上的收获是什么?

答:聊天系统的并发不是简单的线程数问题,而是“用户意图流”的一致性问题。

OpenClaw 把这个问题放在 Gateway 和 session 层处理,而不是丢给模型现场发挥。模型已经够忙了,不必让它兼职交通调度。

6. 第五个问题:调用模型和跑 Agent 不是一回事

问:Gateway 收到消息后,直接调用模型不行吗?

答:可以,但很快不够用。

因为一次 Agent run 不只是:

Code
prompt -> model -> text

而是:

Code
intake  -> context assembly  -> model inference  -> tool execution  -> streaming replies  -> persistence

问:所以需要 Agent Runtime?

答:对。Runtime 负责组织一次完整的 Agent loop:

  • 选模型。
  • 组装 system prompt。
  • 注入 workspace 文件。
  • 裁剪或压缩历史。
  • 暴露可用工具。
  • 处理 tool call。
  • 接收 provider stream。
  • 写回 transcript。
  • 把事件交还 Gateway。

问:Provider 和 Runtime 有什么区别?

答:Provider 负责“怎么调用某个模型服务”。Runtime 负责“怎么完成一次 Agent 任务”。

组件关注点
ProviderAPI、认证、流式协议、模型能力
Runtimeprompt、context、tools、session、重试、compaction、事件

把这俩混在一起,系统会变成“换个模型像动手术”。分开以后,模型供应商可以换,Agent 执行逻辑还能稳定。

7. 第六个问题:模型到底该看到什么?

问:直接把全部聊天记录塞给模型,不好吗?

答:一开始很好,直到上下文窗口不够、成本上升、速度下降,然后你发现“全部塞进去”是架构界的临时甜点。

问:OpenClaw 怎么处理上下文?

答:引入 Context Engine。它负责四件事:

阶段做什么
Ingest新消息进入时存储或索引
Assemble模型运行前组装合适上下文
Compact过长时把旧历史总结成 compact entry
After turn运行结束后持久化或维护索引

问:Compaction 是删除历史吗?

答:不是。历史仍然保存在 session transcript。Compaction 改变的是“下一次模型能看到什么”。

可以理解为:

Code
完整历史保存在磁盘模型上下文里放摘要 + 最近消息 + 必要工具结果

问:这里有什么性能收益?

答:三个方向:

  • 减少 token 输入,降低成本。
  • 缩短模型处理上下文的时间。
  • 避免 provider context overflow。

但也有代价:摘要可能丢细节。所以 OpenClaw 要尽量保留最近消息,工具调用和 tool result 也尽量成对保留。

问:新发现是什么?

答:长期对话不是“无限上下文”,而是“可恢复的叙事”。系统要知道哪些细节该保留原文,哪些可以变成摘要。

8. 第七个问题:长期记忆怎么做才不像玄学?

问:Agent 说它记得我,是真的记得吗?

答:在 OpenClaw 里,记忆不是神秘状态,而是写在磁盘上的 Markdown 文件和相关索引。

主要有三层:

文件适合内容
长期 curated memoryMEMORY.md稳定事实、偏好、长期决策
每日工作记忆memory/YYYY-MM-DD.md当天细节、session summary
Dreaming reviewDREAMS.md后台整理、复盘、人类复核

问:为什么不用一个巨大的 memory 文件?

答:因为记忆不是仓库清仓。长期记忆要短、准、可维护;当天细节可以多一点;复盘材料可以等人类确认后再进入长期记忆。

问:Memory Search 解决什么?

答:解决“历史太多,不能每次全塞进 prompt”的问题。它用关键词、embedding 或混合检索,把相关记忆片段召回到上下文。

问:Memory 能当安全机制吗?

答:不能。Memory 可以提醒“用户偏好 TypeScript”,但不能当权限系统。

硬约束必须放在:

  • Tool policy。
  • Sandbox。
  • Exec approvals。
  • Channel allowlist。
  • Gateway auth。
  • 独立 host / OS user。

记忆是便签,不是门锁。

9. 第八个问题:助手不能只会说,还要能做

问:只聊天有什么不够?

答:真实助手要能查文件、发消息、跑命令、搜资料、操作设备、调用 API。于是需要 Tools。

问:Tool 是什么?

答:Tool 是模型可调用的结构化动作。它有名称、描述、输入 schema 和返回结果。

好工具应该让模型一看就知道:

  • 它能做什么。
  • 需要哪些参数。
  • 返回什么信息。
  • 失败时怎么解释。

问:工具越多越好吗?

答:不。工具越多,选择难度越大,风险也越大。

OpenClaw 要根据 active profile、allow/deny policy、provider 限制、sandbox、channel 权限、plugin 加载状态来决定哪些工具对模型可见。

问:这里的稳定性问题是什么?

答:工具调用会失败,会超时,会返回奇怪数据,也可能带来副作用。

所以工具层要关注:

  • schema 清晰。
  • 错误可恢复。
  • 结果内容和诊断 metadata 分离。
  • 高风险动作需要审批。
  • 写操作和读操作分开。

这不是形式主义。工具结果一乱,模型就会一本正经地沿着错误方向继续努力,努力得让人有点心疼。

10. 第九个问题:能力不能都写进核心

问:如果每个工具、渠道、模型 provider 都写进核心,会怎样?

答:核心会越来越胖,最后没人敢动。新增一个渠道可能影响启动,新增一个工具可能影响安全面,新增一个 provider 可能影响 runtime。

问:怎么解决?

答:引入 Plugin 架构。

插件系统分四层:

职责
Manifest + discovery发现插件,读取声明
Enablement + validation判断启用、禁用、阻止、配置是否有效
Runtime loading加载运行时代码,注册工具、hook、provider、channel
Capability registry让核心通过 typed contracts 使用能力

问:为什么 manifest 重要?

答:因为它让系统在执行插件代码前,先知道插件声称自己提供什么能力、需要什么配置。

这一步很像“先看身份证,再请进屋”。虽然不能保证对方一定完美,但至少不是闭眼开门。

问:插件带来的新风险是什么?

答:原生插件通常和 Gateway 同进程运行,不是沙箱代码。

所以:

  • 插件 bug 可能拖垮 Gateway。
  • 恶意插件等价于执行任意代码。
  • plugins.allow 信任的是插件 id,不是魔法护盾。
  • workspace 插件适合开发,不适合生产随便开。

问:新发现是什么?

答:扩展性和供应链风险总是一起出现。系统越容易长能力,越要认真管理能力边界。

11. 第十个问题:外部生态怎么接?

问:有 Plugin 了,为什么还要 MCP?

答:Plugin 是 OpenClaw 内部扩展机制。MCP 是更通用的 AI 工具/资源/提示协议。

可以简单区分:

概念本质
PluginOpenClaw 的安装式扩展
MCP Server外部系统按 MCP 协议暴露 tools/resources/prompts

问:怎么理解 MCP?

答:可以把 MCP 看成外部能力的标准接口。OpenClaw 可以消费 MCP server,把外部工具纳入 Agent 能力系统。

问:有什么架构启发?

答:能力接入要标准化,但执行边界要分清。能连上,不等于应该无条件信任。

12. 第十一个问题:动作到底在哪台机器执行?

问:如果用户说“帮我跑个命令”,命令跑在哪里?

答:这就是 Node 要解决的问题。

Gateway 主机可以负责消息、路由和模型运行;Node 可以是另一台设备或主机,提供执行能力或设备能力。

问:Node 让系统多了什么问题?

答:位置问题和权限问题。

  • 命令在哪台机器执行?
  • 审批文件在哪个 host 生效?
  • Node 如何 pairing?
  • 远程 Gateway 是通过 SSH tunnel、Tailscale 还是别的网络方式连接?
  • 移动设备的 foreground-only 能力是否可用?

问:这有什么发现?

答:一旦系统能跨设备执行动作,“在哪里执行”就和“执行什么”一样重要。

远程执行不是把工具搬远一点,而是把信任边界也搬了出去。

13. 第十二个问题:我想要多个助手

问:一个 Gateway 能不能托管多个 Agent?

答:可以。OpenClaw 支持 multi-agent routing。

一个 Agent 不只是一个 prompt,而是一整个 per-persona scope:

  • Workspace。
  • AGENTS.mdSOUL.mdUSER.md
  • agentDir
  • auth profiles。
  • model registry。
  • session store。
  • skill allowlist。
  • channel bindings。

问:为什么不只用一个 Agent,然后 prompt 里写“你现在是 coding 助手”?

答:因为 prompt 不是隔离边界。

不同 Agent 可能需要不同工具、不同凭据、不同记忆、不同渠道绑定和不同权限。如果只换一句 prompt,状态和权限仍然混在一起。

问:多 Agent 带来什么新问题?

答:隔离问题。

  • 不要复用 agentDir
  • 不要共享高权限凭据。
  • 每个 Agent 要有独立 session store。
  • tool policy 要按 Agent 配。
  • binding 顺序要可审计。

问:Delegate 又是什么?

答:Delegate 是有独立身份、权限和审计轨迹的代理人。它不是假装成人类账号,而是在限定范围内代表某人或组织行动。

能力可以分层:

层级能力风险
Tier 1Read-only + Draft读数据并起草,人类发送
Tier 2Send on behalf用 delegate 身份发送和创建事件
Tier 3Proactive按 standing orders 自主执行

从 Tier 1 开始,比直接奔向 Tier 3 更像工程,少一点冒险文学。

14. 第十三个问题:安全不是写一句“请你安全”就完事

问:OpenClaw 的安全模型核心是什么?

答:一个 Gateway 对应一个受信任操作边界。OpenClaw 不是让多个互不信任用户共享同一个 tool-enabled Agent 的强隔离多租户系统。

问:为什么要这么强调?

答:因为只要多个不可信用户能给同一个 Agent 发消息,他们就在共享这个 Agent 的工具授权风险。

如果 Agent 能读文件、跑命令、发消息,那用户输入就不是普通聊天,而是可能影响真实系统的指令源。

问:主要安全控制点有哪些?

答:

控制点作用
Gateway auth控制谁能连接 Gateway
Channel allowlist / pairing控制谁能通过渠道触发 Agent
Tool policy控制模型能看到和调用哪些工具
Sandbox控制执行环境和文件/网络边界
Exec approvals控制 host/node 命令执行
SecretRefs减少明文凭据暴露
Audit/logs追踪 channel、tool、session、cron、安全事件
Separate hosts/users真正拆分不可信边界

问:禁止写文件工具就安全了吗?

答:不一定。如果 exec 仍然可用,shell 命令也能写文件。

所以“只读”不是一句 deny write 就完成,而要同时考虑:

  • runtime tools。
  • filesystem tools。
  • sandbox filesystem policy。
  • host boundary。
  • exec approvals。

安全配置最怕“看起来关了门,其实窗户开着,还贴了欢迎光临”。

15. 第十四个问题:并发、稳定、性能怎么逐步解决?

问:OpenClaw 可能遇到哪些并发问题?

答:

  • 同一 session 同时来了多条消息。
  • 同一消息被渠道重投。
  • Agent run 还没结束,用户要求改方向。
  • 模型 stream 和 channel chunking 交错。
  • 多 Agent 共用 Gateway 时路由必须稳定。
  • cron、channel event、manual command 同时触发。

问:对应的解决方式是什么?

答:

问题迭代设计
重复消息inbound dedupe
连续短消息debounce
session 正在运行active-run queue / steer / follow-up / interrupt
长输出streaming + chunking
渠道差异Channel Adapter
多 Agentbinding + per-agent session/workspace
状态恢复session transcript + persistence

问:稳定性问题怎么处理?

答:稳定性主要靠边界、持久化和可观测性:

  • Gateway 负责健康检查和事件。
  • Runtime 把一次 run 拆成清晰阶段。
  • Session transcript 保存完整历史。
  • Context compaction 处理上下文溢出。
  • Tool policy 限制能力暴露。
  • Plugin manifest 先声明能力再加载行为。
  • doctorstatussecurity audit 帮助发现配置问题。

问:性能问题主要在哪里?

答:

  • 上下文太长,token 成本高。
  • 检索或 memory search 太慢。
  • 模型 stream 延迟。
  • 渠道发送限制导致输出分块。
  • 插件或工具调用拖慢 run。
  • 多 Agent、多渠道增加路由和状态维护成本。

问:怎么改进?

答:

性能压力改进方向
上下文太长compaction、context pruning、只召回相关 memory
模型调用慢streaming、合理模型选择、减少无用上下文
工具慢超时、错误可恢复、减少不必要工具暴露
渠道输出慢chunking、格式化、按渠道限制发送
状态复杂session key、binding、agentDir 分离

问:这里最大的发现是什么?

答:Agent 系统的性能优化不只是“让模型快一点”。很多时候,更有效的是少发无用上下文、少暴露无用工具、少制造不必要的 agent run。

也就是说,先别急着换发动机,看看是不是后备箱里装了三吨历史聊天记录。

16. 第十五个问题:为什么要有 Workspace?

问:Workspace 解决什么?

答:Workspace 是 Agent 的家目录,也是上下文文件的来源。

常见文件包括:

  • AGENTS.md:操作说明和长期规则。
  • SOUL.md:人格、语气、边界。
  • USER.md:用户信息和偏好。
  • TOOLS.md:本地工具说明。
  • MEMORY.md:长期记忆。
  • memory/YYYY-MM-DD.md:每日工作记忆。

问:Workspace 是沙箱吗?

答:不是。Workspace 是默认 cwd,不是硬隔离。除非启用 sandbox,否则绝对路径仍可能访问宿主机其它位置。

问:为什么这点重要?

答:因为很多人会误以为“把 Agent 放进某个目录”就等于隔离。实际上目录只是房间号,门锁要靠 sandbox、权限和 host 边界。

17. 第十六个问题:可观测性从哪里来?

问:一个 Agent 做错了,怎么查?

答:需要能追踪一条消息完整路径:

Code
Inbound message  -> channel normalization  -> routing / binding  -> session key  -> debounce / queue  -> context assembly  -> model stream  -> tool calls  -> reply chunking  -> channel delivery  -> transcript persistence

问:为什么 transcript 很重要?

答:因为它保存了系统实际发生过什么,而不是我们事后希望它发生过什么。

出现问题时,要看:

  • 输入是什么。
  • 路由到哪个 Agent。
  • 模型看到了什么上下文。
  • 哪些工具可见。
  • 调用了哪些工具。
  • 工具返回了什么。
  • 最终发给用户什么。

问:有什么学习建议?

答:不要一上来泛读全部源码。先用一条消息做断点地图。沿着 inbound 到 outbound 追一遍,比硬啃目录树有效得多。

18. 第十七个问题:最终架构为什么是这样?

问:能不能把演进过程压缩成一张表?

答:可以。

阶段遇到的问题设计回应
只接一个渠道能聊,但入口单一Channel 接入
多渠道混乱字段、认证、回复限制不同Gateway + Channel Adapter
上下文混乱不知道消息属于谁Session key + Session Store
连续消息和重投重复 run、乱序、成本高dedupe + debounce + queue
不是单次问答需要工具、流式、持久化Agent Runtime
上下文过长token 成本、overflowContext Engine + Compaction
想长期记住模型无状态Workspace + Memory files + search
想真实行动只会说不会做Tools
能力越来越多核心膨胀Plugin + capability registry
外部生态接入每个系统都自定义MCP
跨设备执行不知道命令在哪跑Nodes
多人格/多职责prompt 不够隔离Multi-agent routing
真实风险prompt 不能当安全边界auth + allowlist + policy + sandbox + approvals + audit

问:OpenClaw 的本质发现是什么?

答:一个长期运行的 AI 助手,不是“模型聪明一点”就够了。它需要的是一整套运行系统:

  • 接得住真实消息。
  • 分得清身份和会话。
  • 控得住工具和权限。
  • 管得住上下文和记忆。
  • 扛得住并发和失败。
  • 查得出为什么出错。
  • 能逐步扩展能力。

模型是大脑,但 Gateway、Runtime、Context、Memory、Tools 和安全策略是身体、神经和刹车。只有大脑没有刹车,工程师睡觉会不踏实。

19. 复述模板

问:如果面试或学习分享里要快速讲 OpenClaw,怎么说?

答:可以这样说:

Code
OpenClaw 是一个自托管 AI 助手平台。它最核心的设计是 Gateway-first:Gateway 负责接入 Telegram、Slack、WhatsApp、WebChat 等渠道,做认证、归一化、去重、路由、session 管理和健康检查;消息进入某个 Agent 后,Agent Runtime 负责组装 system prompt、workspace 文件、session history、memory 和工具定义,调用模型并处理 tool calls;Context Engine 和 compaction 负责控制上下文长度;Memory 用 Markdown 文件和索引保存长期信息;Tools、Plugins、MCP 和 Nodes 负责扩展能力;安全上依赖 Gateway auth、channel allowlist、tool policy、sandbox、exec approvals、audit 和独立 host/user,而不是依赖 prompt 自觉。

20. 最后一个问题:学习 OpenClaw 应该抓哪条线?

问:这么多组件,先学哪个?

答:抓一条消息的旅程:

Code
用户发消息  -> Channel  -> Gateway  -> Routing  -> Session  -> Context  -> Runtime  -> Model  -> Tool  -> Stream  -> Channel reply  -> Transcript / Memory

每个组件都问三个问题:

  1. 它解决了什么问题?
  2. 如果没有它,系统会怎样失败?
  3. 它引入了什么新风险?

能这样问,OpenClaw 的架构就不是一堆名词,而是一条被问题推动出来的路径。

这也是架构学习最有趣的地方:好系统不是一开始就完整,它是在一次次“这个也会坏?”之后,慢慢长出边界、状态、策略和一点点成熟气质。

0