首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenClaw 底层架构:1 个 Gateway 如何管理 30+ 消息平台

OpenClaw 底层架构:1 个 Gateway 如何管理 30+ 消息平台

作者头像
运维有术
发布2026-04-01 19:54:46
发布2026-04-01 19:54:46
1930
举报
文章被收录于专栏:运维有术运维有术

🚩 2026 年「术哥无界」系列实战文档 X 篇原创计划 第 58 篇,OpenClaw 最佳实战「2026」系列第 28 篇 大家好,欢迎来到 术哥无界 | ShugeX | 运维有术。 我是术哥,一名专注于 AI 编程、AI 智能体、Agent Skills、MCP、云原生、AIOps、Milvus 向量数据库的技术实践者与开源布道者Talk is cheap, let's explore。无界探索,有术而行。

OpenClaw 架构概览
OpenClaw 架构概览

OpenClaw 是 2026 年最火爆的现象级 AI 开源项目。这个 2025 年 11 月才发布的开源项目,GitHub Star 数已经突破 31 万:超过了 React、Vue 等明星项目多年的积累。

NVIDIA CEO 黄仁勋的评价更直接:「OpenClaw 是个人 AI 的操作系统」。

但大多数介绍文章只停留在「它能做什么」的层面。如果你和我一样,更关心「它是怎么做到的」,这篇文章会带你深入 OpenClaw 的底层架构:看看 pi-mono 运行时Gateway 控制平面Context EngineSession Management 是怎么协同工作的。

1. 整体架构:一个 Gateway 统管全局

OpenClaw 整体架构图
OpenClaw 整体架构图

先看一张简化版的架构图:

代码语言:javascript
复制
消息平台 (WhatsApp/Telegram/Slack/Discord/...)
                    │
                    ▼
          ┌─────────────────┐
          │    Gateway      │
          │  (控制平面)      │
          │ 127.0.0.1:18789 │
          └────────┬────────┘
                   │
    ┌──────────────┼──────────────┐
    │              │              │
    ▼              ▼              ▼
macOS App      CLI/WebUI      iOS/Android
 (Client)       (Client)       (Node)

OpenClaw 的核心设计思想是:一个长生命周期的 Gateway 进程,统一管理所有消息渠道

这种设计有几个直接的好处:

第一,避免重复连接。 如果你同时用 WhatsApp 和 Telegram 跟 Agent 聊天,不需要分别启动两个进程。Gateway 内部维护了两套连接,但对外只暴露一个 WebSocket 接口。

第二,状态一致性。 所有会话状态都由 Gateway 持有。无论你从手机还是电脑发起对话,看到的都是同一个上下文。

第三,简化部署。 只需要在服务器上跑一个 Gateway,客户端(macOS app、WebChat、CLI)通过 WebSocket 连接即可。

官方文档里有一句话很关键:

One Gateway per host; it is the only place that opens a WhatsApp session.

这意味着 Gateway 是「单一事实来源」。所有 UI 客户端必须向 Gateway 查询会话列表和消息数量,而不是自己解析本地的 JSONL 文件。

2. Agent Runtime:pi-mono 的嵌入式运行时

Gateway 负责消息路由,但真正「思考」的是 Agent Runtime。OpenClaw 使用的是 pi-mono,一个嵌入式 Agent Runtime。

2.1 pi-mono 是什么?

根据官方文档的描述:

OpenClaw runs a single embedded agent runtime derived from pi-mono.

注意这里用的是「derived from」(派生自),不是「based on」。这意味着 OpenClaw 重用了 pi-mono 代码库的部分组件(比如 models/tools),但会话管理、发现机制和工具绑定是 OpenClaw 自有的

具体来说:

  • OpenClaw 不使用 pi-coding agent runtime
  • OpenClaw 不读取~/.pi/agent<workspace>/.pi 配置
  • 会话存储路径是 OpenClaw 自己定义的:~/.openclaw/agents/<agentId>/sessions/

2.2 Agent Loop 的执行流程

Agent Loop 执行流程
Agent Loop 执行流程

Agent Loop 是一个完整的「思考-行动」周期。官方文档定义了 6 个阶段:

代码语言:javascript
复制
intake → context assembly → model inference → tool execution → streaming replies → persistence

Intake(消息摄入)

Gateway 接收到用户消息,验证参数,解析会话 ID,立即返回 { runId, acceptedAt }。这一步是异步的——用户不需要等 Agent 思考完就能收到确认。

Context Assembly(上下文组装)

这是最复杂的一步。Context Engine 会:

  1. 从 JSONL 文件加载历史消息
  2. 注入 6 个上下文文件(AGENTS.md、SOUL.md、TOOLS.md 等)
  3. 加载 Skills 快照
  4. 根据模型上下文窗口大小截断或压缩历史

Model Inference(模型推理)

调用 LLM API(Claude、GPT 或本地模型),传入组装好的上下文。

Tool Execution(工具执行)

如果模型决定调用工具(比如浏览网页、读取文件),这一步会执行工具并将结果返回给模型。

Streaming Replies(流式回复)

模型的输出会实时流式返回给客户端,而不是等全部生成完才发送。

Persistence(持久化)

完整的对话轮次被写入 JSONL 文件。

2.3 队列与并发控制

Agent Loop 是按会话序列化执行的。这意味着:

  • 同一个会话中,后发的消息会排队等待前一条处理完
  • 不同会话可以并行执行

官方文档用了「per-session lane」(会话车道)的比喻:

Runs are serialized per session key (session lane) and optionally through a global lane.

这种设计防止了「工具竞态」——如果同一个会话中同时执行两个修改文件的工具,可能会产生冲突。

2.4 Hook 系统:在哪里可以拦截?

OpenClaw 提供了两套 Hook 系统,让你可以在特定时机注入自定义逻辑:

内部 Hooks(Gateway Hooks)

  • agent:bootstrap:在构建引导文件时运行,可以添加/删除引导上下文
  • 命令 Hooks:/new/reset/stop 等命令的触发点

插件 Hooks(Plugin Hooks)

更细粒度的生命周期钩子:

Hook

触发时机

before_model_resolve

模型解析前,可以覆盖 provider/model

before_prompt_build

提示词构建前,可以注入上下文

before_tool_call / after_tool_call

工具调用前后

session_start / session_end

会话生命周期边界

这套 Hook 系统让 OpenClaw 具备了很强的可扩展性——你可以通过插件实现自定义的上下文管理、工具拦截、安全审计等功能。

3. Context Engine:上下文的四个生命周期

Context Engine 生命周期
Context Engine 生命周期

Context Engine 是 OpenClaw 中负责「管理模型能看到什么」的组件。它有四个生命周期点:

3.1 Ingest(摄入)

每条新消息被添加到会话时触发。Context Engine 可以在这里存储或索引消息。

3.2 Assemble(组装)

每次模型运行前触发。Context Engine 返回一组有序的消息(以及可选的 systemPromptAddition),这些消息会被放入模型的上下文窗口。

3.3 Compact(压缩)

当上下文窗口满了,或者用户执行 /compact 命令时触发。Context Engine 负责压缩历史——通常是把旧消息总结成摘要。

3.4 After Turn(轮次后)

一次完整的对话轮次结束后触发。Context Engine 可以在这里持久化状态、触发后台压缩、更新索引。

3.5 默认引擎 vs 插件引擎

OpenClaw 默认使用 legacy 引擎:

  • Ingest:无操作(Session Manager 直接处理消息持久化)
  • Assemble:透传(使用运行时的 sanitize → validate → limit 管道)
  • Compact:委托给内置的摘要压缩
  • After Turn:无操作

你也可以通过插件注册自定义的 Context Engine。比如一个基于向量检索的引擎,可以在 Assemble 阶段用 RAG 方式召回相关历史,而不是简单地截断。

配置方式:

代码语言:javascript
复制
{
  plugins: {
    slots: {
      contextEngine: "my-custom-engine",
    },
    entries: {
      "my-custom-engine": {
        enabled: true,
      },
    },
  },
}

4. Session Management:会话隔离与持久化

4.1 会话存储结构

OpenClaw 的会话数据存储在两个地方:

会话列表(sessions.json)

代码语言:javascript
复制
~/.openclaw/agents/<agentId>/sessions/sessions.json

这是一个 sessionKey -> { sessionId, updatedAt, ... } 的映射表。

会话记录(JSONL 文件)

代码语言:javascript
复制
~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl

每行是一个完整的对话轮次,包含用户消息、模型回复、工具调用等。

4.2 会话键(Session Key)的映射规则

Session Key 决定了哪些消息会被归到同一个会话中。映射规则取决于聊天类型:

直接消息(Direct Message)

session.dmScope 配置控制:

  • main(默认):所有直接消息共享主会话,跨设备/跨渠道连续
  • per-peer:按发送者 ID 隔离
  • per-channel-peer:按渠道 + 发送者隔离(推荐用于多人共享收件箱)
  • per-account-channel-peer:按账户 + 渠道 + 发送者隔离

官方有一个重要的安全警告:

If your agent can receive DMs from multiple people, you should strongly consider enabling secure DM mode. Without it, all users share the same conversation context, which can leak private information between users.

群组消息

格式为 agent:<agentId>:<channel>:group:<id>,每个群组有独立的会话。

4.3 会话维护(Maintenance)

OpenClaw 会自动清理过期会话,默认配置:

代码语言:javascript
复制
{
  session: {
    maintenance: {
      mode: "warn",        // "warn" 只报告,"enforce" 执行清理
      pruneAfter: "30d",   // 超过 30 天的会话会被清理
      maxEntries: 500,     // 最多保留 500 个会话
      rotateBytes: "10mb", // sessions.json 超过 10MB 时轮转
    },
  },
}

维护操作的执行顺序:

  1. 清理超过 pruneAfter 天数的旧会话
  2. 限制会话数量不超过 maxEntries
  3. 归档不再引用的 JSONL 文件
  4. 轮转过大的 sessions.json

4.4 注入文件:6 个上下文增强点

OpenClaw 会在构建系统提示词时自动注入工作区中的 6 个文件:

文件

作用

AGENTS.md

操作指令 + 「记忆」

SOUL.md

人设、边界、语调

TOOLS.md

用户维护的工具说明

BOOTSTRAP.md

一次性首次运行仪式(完成后删除)

IDENTITY.md

智能体名称/风格/表情符号

USER.md

用户配置 + 首选地址

这些文件让你可以高度定制 Agent 的行为,而不需要修改代码。

5. 与 LangChain/CrewAI/AutoGen 的本质差异

OpenClaw 的官方文档有一句很直接的声明:

Unlike LangChain, CrewAI, AutoGen, and Semantic Kernel, OpenClaw prioritizes modularity.

但「modularity」(模块化)这个词太空洞了。更本质的差异是定位不同

维度

OpenClaw

LangChain/CrewAI/AutoGen

核心定位

个人 AI 助手

LLM 应用开发框架

目标用户

终端用户

开发者

运行方式

本地长期运行

按需调用

渠道支持

30+ 平台开箱即用

需自行集成

Gateway

统一控制平面

状态管理

内置持久化

需自行实现

OpenClaw 解决的问题是:让普通用户能在自己熟悉的聊天软件(WhatsApp、Telegram、Discord...)中使用一个「有眼睛有手」的 AI 助手——它能浏览网页、读写文件、执行命令。

LangChain/CrewAI/AutoGen 解决的问题是:让开发者能更方便地构建 LLM 应用——它们提供的是「积木」,而不是「成品」。

这不是竞争关系,而是不同层面的工具。

你在项目中用过类似的 Agent 架构吗?评论区聊聊你的设计选择。

6. 技术选型建议

如果你在考虑是否使用 OpenClaw,可以参考以下判断:

适合 OpenClaw 的场景

  • 需要 24/7 在线的个人 AI 助手
  • 希望在多个聊天平台统一使用同一个助手
  • 注重数据隐私,希望本地运行
  • 需要完整的配套生态(macOS/iOS/Android 应用)

不太适合的场景

  • 企业级多租户部署(安全模型仍在演进中)
  • 需要高度定制 Agent 逻辑(LangChain 可能更灵活)
  • 对第三方插件生态有顾虑(快速增长中有风险)

官方和社区的安全建议:

  1. 在沙箱 VM 或容器中运行
  2. 使用最小权限、短期令牌
  3. 限制技能/扩展注册表,验证来源
  4. 定期审查代理记忆/状态和行为
  5. 运行实时反恶意软件解决方案

总结

OpenClaw 的底层架构可以用一句话概括:一个 Gateway 统管全局,pi-mono 负责思考,Context Engine 管上下文,Session Manager 保持久化

这套架构的核心创新点是统一控制平面:用一个长生命周期的 Gateway 进程管理所有消息渠道,避免了传统方案中「每个平台一个进程」的复杂性。

如果你对 AI Agent 的架构设计感兴趣,OpenClaw 的源码和文档都是很好的学习材料。它的模块化设计、Hook 系统、Context Engine 抽象,都值得深入研究。

好啦,谢谢你观看我的文章,如果喜欢可以点赞转发给需要的朋友,我们下一期再见!敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维有术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 整体架构:一个 Gateway 统管全局
  • 2. Agent Runtime:pi-mono 的嵌入式运行时
    • 2.1 pi-mono 是什么?
    • 2.2 Agent Loop 的执行流程
    • 2.3 队列与并发控制
    • 2.4 Hook 系统:在哪里可以拦截?
  • 3. Context Engine:上下文的四个生命周期
    • 3.1 Ingest(摄入)
    • 3.2 Assemble(组装)
    • 3.3 Compact(压缩)
    • 3.4 After Turn(轮次后)
    • 3.5 默认引擎 vs 插件引擎
  • 4. Session Management:会话隔离与持久化
    • 4.1 会话存储结构
    • 4.2 会话键(Session Key)的映射规则
    • 4.3 会话维护(Maintenance)
    • 4.4 注入文件:6 个上下文增强点
  • 5. 与 LangChain/CrewAI/AutoGen 的本质差异
  • 6. 技术选型建议
    • 适合 OpenClaw 的场景
    • 不太适合的场景
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档