如果你把 OpenClaw 当成“会回消息的机器人”,很快就会看不懂它的很多设计。把它当成一个常驻运行的 Agent 系统,架构就顺了。
01 三层架构:Gateway、Node、Channel
OpenClaw 使用的是 Gateway -> Node -> Channel 三层结构。
| 层级 | 作用 | 关键点 |
|---|---|---|
| Gateway | 中央控制平面 | 维护 WebSocket、Session、调度 Agent |
| Node | 设备执行层 | 负责本地命令、摄像头、录屏、系统操作 |
| Channel | 消息接入层 | 负责 Telegram、飞书、钉钉、Discord 等渠道 |
消息是怎么流动的
一次完整交互,大致是下面这条链路:
用户发消息 -> Channel 接收 -> Gateway 路由 -> Agent 思考 -> Node 执行 -> 再回到用户
为什么默认只监听本地
OpenClaw 的默认设计是 Loopback-First,也就是 Gateway 默认只绑定 127.0.0.1。
这样做有三个好处:
- 默认不暴露公网端口,更安全。
- 本机 Node 直接走本地 WebSocket,延迟低。
- 需要远程访问时,再通过 Tailscale 或隧道显式暴露。
一个实用原则是:每台主机尽量只跑一个 Gateway 实例。尤其是像 WhatsApp Web 这类需要独占会话的渠道,多实例容易相互冲突。
02 记忆系统:OpenClaw 为什么“记得住”
记忆系统是 OpenClaw 区别于普通聊天机器人最核心的部分之一。通常可以把它分成四层。
| 层级 | 存储位置 | 作用 |
|---|---|---|
| SOUL | SOUL.md | 不可变人格、价值观、核心身份 |
| TOOLS | Skills / Extensions | 当前可用的工具与扩展能力 |
| USER | MEMORY.md + 向量库 | 用户偏好、长期事实、决策记录 |
| Session | 内存 + sessions.json | 当前会话的即时上下文 |
Daily Logs
每天的交互会以追加方式写入 memory/YYYY-MM-DD.md。新 Session 启动时,Agent 会优先读取今天和昨天的日志,形成短期连续性。
Pre-Compaction
当上下文接近 Token 上限时,OpenClaw 会静默执行一个压缩流程:
- 检测 Token 使用接近阈值。
- 把重要信息写入
MEMORY.md和 Daily Log。 - 压缩旧上下文,释放窗口。
用户通常看不到这个过程,但正是它让 OpenClaw 不会像普通聊天窗口那样“聊久了就失忆”。
语义搜索
系统默认支持记忆搜索,结合两类方式:
Embedding 向量搜索:适合模糊召回。BM25 关键词搜索:适合精确匹配。
常见工具包括:
memory_search:找相关记忆片段memory_get:读取完整记忆文件
03 Agent 工作区:一切皆文件
OpenClaw 的很多“高级能力”,本质上都来自它把系统状态落到了文件里。
workspace/
├── AGENTS.md
├── SOUL.md
├── USER.md
├── MEMORY.md
├── HEARTBEAT.md
├── memory/
│ └── YYYY-MM-DD.md
├── skills/
└── sessions.json这些文件分别管什么
| 文件 | 作用 |
|---|---|
AGENTS.md | Agent 身份、边界、回复风格 |
SOUL.md | 更底层、更稳定的人格内核 |
USER.md | 用户资料和偏好 |
MEMORY.md | 长期记忆 |
HEARTBEAT.md | 定时任务与主动行为 |
skills/ | 当前工作区私有 Skills |
sessions.json | 会话元数据 |
这套设计非常符合 OpenClaw 的工程哲学:用最普通的文本文件,表达最复杂的 Agent 状态。
04 Session 与认证
OpenClaw 在“谁能和我说话、不同上下文怎么隔离”这件事上设计得很严格。
DM Pairing
默认情况下,陌生人第一次给 Agent 发私聊,不会直接进入对话,而是会收到一个一次性配对码。只有你批准之后,对方才能继续使用。
这一步的意义非常大:
- 防止陌生人滥用你的 Agent
- 防止别人直接消耗你的 API 额度
- 防止私聊入口变成未授权公网接口
allowFrom 白名单
如果你希望某些账号直接跳过配对,可以在 AGENTS.md 里预授权:
allowFrom:
- telegram:123456789
- whatsapp:+8613800138000
- discord:user#1234requireMention 群聊策略
群聊里默认只响应 @Agent 的消息,而不是扫描整个群。
这能明显减少两件事:
- 群聊噪音
- 无意义 Token 消耗
Session 隔离
| 场景 | 行为 | 是否加载长期记忆 |
|---|---|---|
| 私聊 | 进入共享的 main session | 是 |
| 群聊 | 每个群独立 Session | 否 |
| 跨渠道私聊 | 同一用户可共享主 Session | 是 |
所以 OpenClaw 的设计意图很明确:私聊是你的长期空间,群聊是公开场合。
05 设计哲学:为什么它看起来这么“工程师”
OpenClaw 背后有一套很鲜明的设计思想。
Unix 风格
项目明显继承了 Unix 的思路:
- 小工具
- 可组合
- 文本流
它不试图把所有能力都做成平台内专有协议,而是尽量让 Agent 通过命令行和文件系统直接触达真实环境。
极简工具集
OpenClaw 的核心工具非常少,重点是:
ReadWriteEditBash
少工具的好处是 system prompt 更短、Token 更省、模型决策更聚焦。
不迷信 MCP
OpenClaw 并没有把 MCP 当成唯一正道,而是倾向于直接调用 CLI,必要时再通过 mcporter 这类桥接方案兼容。
这背后的思路是:如果 Agent 自己会写工具、会调用命令,那它的上限更高。
支持自我扩展
OpenClaw 很强调一件事:Agent 不只是“用工具”,还可以“自己补工具”。
常见流程就是:
- 发现现有能力不够。
- 写一个 Skill 或脚本补上。
- 测试、重载、继续执行原任务。
这也是为什么它在很多场景下看起来更像一个真的“会做事的系统”,而不是单轮对话机器人。
06 规模与性能
从现有规模来看,OpenClaw 并不算轻量级。
| 指标 | 数值 |
|---|---|
| 代码规模 | 约 43 万行 TypeScript |
| 运行内存 | 约 1 GB |
| 启动时间 | 3 到 5 秒 |
| 官方扩展 | 40+ |
| 内置 Skills | 55 |
这说明两件事:
- 它已经不是玩具项目,而是一个完整平台。
- 你部署它时,应该用“长期运行服务”的心态去规划,而不是只把它当一个临时脚本。