版本: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 里发消息,希望同一个助手能接住。
于是第一个问题出现了:
用户入口太多,模型入口只有一个,中间缺一个能长期在线的中枢。
问:所以最早的版本会是什么样?
答:最自然的第一版就是:
Channel -> LLM -> Reply某个聊天渠道收到消息,调用模型,回一段文本。看起来很美,跑起来也快,演示时掌声不错。
问:这版有什么问题?
答:问题来得非常快:
- 每接一个渠道,都要重新写一套消息处理。
- 渠道字段不一样,Telegram 有 bot token,WhatsApp 有 QR pairing,Slack 有 workspace/thread。
- 模型响应可能很长,但渠道有长度限制。
- 用户连续发三句话,系统可能触发三次模型调用。
- 重连或重投可能导致同一条消息被处理两遍。
一句话:第一版不是坏,而是“每个渠道都在认真表达自己的个性”。系统一多,个性就变成维护成本。
2. 第一次迭代:引入 Gateway
问:怎么解决多渠道混乱?
答:需要一个 Gateway。它专门负责接入真实世界:
- 连接不同消息渠道。
- 统一 inbound message。
- 处理认证、状态、健康检查。
- 暴露 WebSocket / HTTP 控制面。
- 把消息路由到正确 session 和 Agent。
架构变成:
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 内部能理解的消息,再把输出转换回渠道格式。
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。
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 queue | session 正在运行时,后续消息可以排队、追加、转向或打断 |
| chunking | 模型长输出按渠道限制分块发送 |
问:这算并发问题吗?
答:算,而且是非常现实的并发问题。不是那种只出现在论文图里的并发,而是用户真的会在你还没答完时补一句“等等,我刚才说错了”。
系统需要决定:
- 新消息是 follow-up 还是 interrupt?
- 当前 run 要继续还是转向?
- 多个输出如何避免交错?
- 同一 session 能否同时跑多个 agent run?
问:架构上的收获是什么?
答:聊天系统的并发不是简单的线程数问题,而是“用户意图流”的一致性问题。
OpenClaw 把这个问题放在 Gateway 和 session 层处理,而不是丢给模型现场发挥。模型已经够忙了,不必让它兼职交通调度。
6. 第五个问题:调用模型和跑 Agent 不是一回事
问:Gateway 收到消息后,直接调用模型不行吗?
答:可以,但很快不够用。
因为一次 Agent run 不只是:
prompt -> model -> text而是:
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 任务”。
| 组件 | 关注点 |
|---|---|
| Provider | API、认证、流式协议、模型能力 |
| Runtime | prompt、context、tools、session、重试、compaction、事件 |
把这俩混在一起,系统会变成“换个模型像动手术”。分开以后,模型供应商可以换,Agent 执行逻辑还能稳定。
7. 第六个问题:模型到底该看到什么?
问:直接把全部聊天记录塞给模型,不好吗?
答:一开始很好,直到上下文窗口不够、成本上升、速度下降,然后你发现“全部塞进去”是架构界的临时甜点。
问:OpenClaw 怎么处理上下文?
答:引入 Context Engine。它负责四件事:
| 阶段 | 做什么 |
|---|---|
| Ingest | 新消息进入时存储或索引 |
| Assemble | 模型运行前组装合适上下文 |
| Compact | 过长时把旧历史总结成 compact entry |
| After turn | 运行结束后持久化或维护索引 |
问:Compaction 是删除历史吗?
答:不是。历史仍然保存在 session transcript。Compaction 改变的是“下一次模型能看到什么”。
可以理解为:
完整历史保存在磁盘模型上下文里放摘要 + 最近消息 + 必要工具结果问:这里有什么性能收益?
答:三个方向:
- 减少 token 输入,降低成本。
- 缩短模型处理上下文的时间。
- 避免 provider context overflow。
但也有代价:摘要可能丢细节。所以 OpenClaw 要尽量保留最近消息,工具调用和 tool result 也尽量成对保留。
问:新发现是什么?
答:长期对话不是“无限上下文”,而是“可恢复的叙事”。系统要知道哪些细节该保留原文,哪些可以变成摘要。
8. 第七个问题:长期记忆怎么做才不像玄学?
问:Agent 说它记得我,是真的记得吗?
答:在 OpenClaw 里,记忆不是神秘状态,而是写在磁盘上的 Markdown 文件和相关索引。
主要有三层:
| 层 | 文件 | 适合内容 |
|---|---|---|
| 长期 curated memory | MEMORY.md | 稳定事实、偏好、长期决策 |
| 每日工作记忆 | memory/YYYY-MM-DD.md | 当天细节、session summary |
| Dreaming review | DREAMS.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 工具/资源/提示协议。
可以简单区分:
| 概念 | 本质 |
|---|---|
| Plugin | OpenClaw 的安装式扩展 |
| 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.md、SOUL.md、USER.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 1 | Read-only + Draft | 读数据并起草,人类发送 |
| Tier 2 | Send on behalf | 用 delegate 身份发送和创建事件 |
| Tier 3 | Proactive | 按 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 |
| 多 Agent | binding + per-agent session/workspace |
| 状态恢复 | session transcript + persistence |
问:稳定性问题怎么处理?
答:稳定性主要靠边界、持久化和可观测性:
- Gateway 负责健康检查和事件。
- Runtime 把一次 run 拆成清晰阶段。
- Session transcript 保存完整历史。
- Context compaction 处理上下文溢出。
- Tool policy 限制能力暴露。
- Plugin manifest 先声明能力再加载行为。
doctor、status、security 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 做错了,怎么查?
答:需要能追踪一条消息完整路径:
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 成本、overflow | Context 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,怎么说?
答:可以这样说:
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 应该抓哪条线?
问:这么多组件,先学哪个?
答:抓一条消息的旅程:
用户发消息 -> Channel -> Gateway -> Routing -> Session -> Context -> Runtime -> Model -> Tool -> Stream -> Channel reply -> Transcript / Memory每个组件都问三个问题:
- 它解决了什么问题?
- 如果没有它,系统会怎样失败?
- 它引入了什么新风险?
能这样问,OpenClaw 的架构就不是一堆名词,而是一条被问题推动出来的路径。
这也是架构学习最有趣的地方:好系统不是一开始就完整,它是在一次次“这个也会坏?”之后,慢慢长出边界、状态、策略和一点点成熟气质。