OpenClaw 的五层架构设计与解析

我见过最优雅的 AI Agent 架构,就五层

改一个功能,另外三个地方莫名其妙出了 bug。

做过复杂项目的人,对这句话一定不陌生。

模块之间的依赖像一碗搅乱的意大利面,你拽起一根,整碗都跟着动。改记忆系统,消息路由崩了。改工具调用,上下文管理出了问题。每次动代码都像在拆炸弹------不知道哪根线是致命的那根。

AI Agent 系统把这个问题放大了好几倍。

你同时要面对:多平台接入、长期记忆存储、工具调用执行、LLM 流式响应、多 Agent 协作调度...这些模块如果没有清晰的边界,系统三个月后就是一场噩梦。

最近正在研究 OpenClaw 的 AI Agent 框架,它的架构设计给了我很大的启发。

不是那种"哦原来还可以这么做"的惊喜,而是"这个问题我也踩过,但我没想到可以这样解"的共鸣。

它的答案,是一个五层蛋糕。

第一层:门面,但有严格的边界

用户看到的是三种入口------macOS 原生应用、命令行工具、Web UI。

产品经理用 GUI,工程师用 CLI,远程访问用 Web。这不是功能堆砌,是对不同用户心理模型的尊重。

但真正有意思的,是这层做了什么限制

控制面只负责两件事:展示指令下发。不承担任何业务逻辑。

无论你用哪个入口,发出去的消息都会被标准化成同一种格式,再往下传。

听起来很普通对吧?但它的价值在于:未来你想新增一个 iPad 客户端、一个 Raycast 插件,你只需要实现一个新的"展示层",核心逻辑一行不用动。

变化被锁在了边界里。

这层还管着系统的生命周期。10 步初始化序列,按依赖关系严格排序------先加载配置,再建数据库连接,再加载安全策略,再启动网关监听...任何一步失败,系统优雅回滚,不带病运行。

很多系统在启动错误处理上是事后诸葛亮,OpenClaw 把它放进了架构里。

第二层:交通枢纽,但不只是转发

Gateway 网关,系统所有数据流的必经之地。

用 WebSocket 而不是 HTTP,原因很实际:Agent 系统充满双向实时通信------用户发消息、Agent 流式回复、工具结果返回、状态推送。长连接的效率远优于轮询,这不是技术偏好,是场景驱动的选择。

安全上,它用了"挑战-响应"握手机制。

每次连接都生成一个动态随机数,客户端用私钥签名返回,网关验证通过才建立信任。就算攻击者截获了历史通信数据,也无法伪造------因为上一次的随机数已经作废了。

更有意思的是它的消息路由

7 层优先级匹配规则,从"精确用户绑定"到"默认兜底",依次降级。你可以把特定用户的消息路由给专属 Agent,把某个群组交给群组专属处理器,让功能型 Agent 按名称接单。

路由逻辑集中在一处,不会散落在各个 Agent 里,不会"各自为战"。

第三层:适配器,把异构世界统一成一种语言

WhatsApp 用 Baileys 库,Telegram 走 MTProto 协议,Discord 是 Bot API,Signal 有端对端加密...

如果为每个平台写一套处理逻辑,核心代码会被平台细节污染得面目全非。

OpenClaw 的做法是适配器模式:每个平台对应一个 ChannelAdapter,把平台特有的格式转换成统一的 UnifiedMessage 对象。

核心引擎拿到的永远是这个标准格式。

它根本不知道------也不需要知道------这条消息是从 Telegram 还是 WhatsApp 来的。

所以,如果你想新增 Slack 支持,只需要写一个 SlackChannelAdapter。其他层,一行代码不用改。

这就是低耦合。不是说说的那种,是架构上强制保证的那种。

第四层:真正的大脑,但它被切成了三片

核心引擎层是整个系统最复杂的地方,也是最值得细看的地方。

Agent Loop 的执行被切成三层嵌套:

外层 run.ts:管全局生命周期,处理重试、队列、会话串行化。出了错,它决定是重试还是放弃。

中层 attempt.ts:管单次 LLM 交互,构建 Prompt,注册工具,提供 6 个插件 Hook 点。

内层 subscribe.ts:消费流式 token,执行工具调用,同步实时状态。

分这三层的意义在哪?

想修改重试策略,只动 run.ts。想优化 Prompt 构建,只动 attempt.ts。想改流式处理,只动 subscribe.ts。

修改不跨层扩散,这是架构设计里最难得的品质之一。

除此之外,核心引擎层还有三个子系统协同工作:Memory System 负责向量记忆,Routing Engine 处理多 Agent 协作,Context Manager 用自适应算法压缩上下文,避免 token 爆炸。

这里还有一个值得单独说的设计------Ralph Loop 范式

它包含三个原则:

  1. 每轮迭代重新构建上下文,避免历史信息污染
  2. 引入外部工具客观验证 LLM 输出,而非盲目信任
  3. 通过 Stop Hook 强制在必要时停止,避免无限循环

这三个原则组合起来,解决的是早期 Agent 系统最常见的死亡模式。

一个名字:幻觉循环

Agent 不停地自我强化一个错误的判断,越跑越偏,停不下来。Ralph Loop 的三原则,从源头截断了这条路。

第五层:开放,但核心不膨胀

24 个生命周期 Hook 点,38+ 官方插件,52+ 内置技能。

这层的哲学只有一句话:核心不膨胀,能力靠生长。

第三方开发者可以在任意 Hook 点注入逻辑,不需要 fork 项目修改核心代码。Skills 甚至支持声明式的 SKILL.md 文件------零代码扩展能力。

你开放的不是代码,而是接入点。这是生态设计的智慧。

两个技术选型,藏着一套价值观

为什么用 Node.js 不用 Python?

Agent 系统的核心是大量并发 I/O------等 LLM 响应、等工具执行、等平台回复。这是 Node.js 事件循环的主场,不是 CPU 密集型计算的战场。不是技术偏好,是场景驱动。

为什么用 SQLite 不用云端数据库?

这背后是一个明确的立场:Local-First

数据存在用户本地,数据主权归用户所有。复制一个文件,记忆随身带走。没有云账号,没有订阅费,没有数据泄露的担忧。

这个选择当然有代价------多设备实时同步很麻烦,高并发写入会遇到瓶颈。

但这是有意为之的权衡,不是技术局限。设计者清楚自己在为谁服务,并为此付出了相应的代价。

这种清醒,在很多系统里是缺席的。

最后说一句

OpenClaw 的五层架构给我最大的启发,不是某个具体技术点,而是一种优先级排序

先想清楚每一层的职责边界,再想层与层之间的接口,最后才是具体实现。

边界划清了,耦合自然就低了。职责集中了,内聚自然就高了。

很多项目走的是相反的路------先写功能,再发现模块纠缠,再痛苦地重构。

下次设计一个新系统时,我会先问自己三个问题:

这个改动,会影响几层?

这个新功能,应该放在哪一层?

如果要替换这个模块,需要改多少其他地方?

如果答案都是"一层"、"明确"、"几乎不用改"------ 那架构大概是对的。

如果你也在做 AI Agent 相关的开发,欢迎留言交流。

参考资料:mp.weixin.qq.com/s/eWc5MD3yS...

相关推荐
JavaGuide1 小时前
Claude Code 新功能Agent View 发布:终于不用在一堆终端窗口里找 Agent 了!
前端·后端·agent
不简说1 小时前
前端可视化打印设计器sv-print,一口气更新了30版
前端·源码·产品
颖火虫盟主1 小时前
Claude Code Hook 系统详解与 Hello World 实操
前端·网络·数据库
_大学牲1 小时前
从零实现自己的agent第五期:子代理实现
github·agent·ai编程
JavaGuide1 小时前
Claude Code + BrowserAct,夯爆了!一句话让 AI 帮你操控浏览器。
前端·后端·ai编程
七十二時_阿川1 小时前
Electron WebContents 完全指南:页面渲染、导航控制与安全实战
前端·electron
用户11481867894841 小时前
Vue 开发者快速上手 Flutter(五) -状态管理路径
前端
该昵称用户已存在2 小时前
拒绝封闭技术栈绑架:MyEMS 开源能源管理平台的架构中立性与兼容性设计
架构·开源
七十二時_阿川2 小时前
Electron 主进程和渲染进程如何通信?这篇讲清楚了
前端·electron