OpenClaw 实现原理详解(二):Gateway 网关架构与消息流转

7 阅读4分钟

2.1 架构全景图:Gateway、Agent、Channels、Tools

OpenClaw 的整体架构可以概括为"一个中心,多层协作":

┌──────────────────────────────────────────────────────────────────┐
│                         用户界面层                                │
│    WhatsApp │ Telegram │ Discord │ 微信 │ Slack │ WebChat       │
└──────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│                      Gateway 网关(守护进程)                      │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐               │
│  │ 消息路由    │  │ 会话管理    │  │ 认证授权    │               │
│  └─────────────┘  └─────────────┘  └─────────────┘               │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐               │
│  │ 协议转换    │  │ 事件推送    │  │ 节点管理    │               │
│  └─────────────┘  └─────────────┘  └─────────────┘               │
└──────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│                        Agent 运行时                               │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐               │
│  │ 上下文组装  │  │ LLM 调用    │  │ 工具执行    │               │
│  └─────────────┘  └─────────────┘  └─────────────┘               │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐               │
│  │ 流式输出    │  │ 会话持久化  │  │ 记忆管理    │               │
│  └─────────────┘  └─────────────┘  └─────────────┘               │
└──────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│                          工具层                                   │
│  文件操作 │ 命令执行 │ 网络请求 │ 浏览器控制 │ 消息发送           │
└──────────────────────────────────────────────────────────────────┘

2.2 组件职责与交互关系

Gateway 网关(守护进程)

Gateway 是 OpenClaw 的核心枢纽,作为长期运行的守护进程存在:

主要职责:

  • 维护平台连接:管理 WhatsApp、Telegram、Discord 等消息平台的长连接
  • 消息路由:将收到的消息路由到正确的 Agent
  • 会话管理:维护多渠道、多用户的会话状态
  • 认证授权:验证客户端和节点的身份
  • 事件推送:向客户端推送消息、状态变更等事件

关键设计:

  • 每台主机只有一个 Gateway 实例
  • 通过 WebSocket 暴露 API
  • 支持 Token 认证和设备配对

Agent 运行时

Agent 运行时是"大脑"的执行引擎:

主要职责:

  • 上下文组装:收集系统提示、历史消息、Skills 等构建 LLM 输入
  • LLM 调用:与各种 LLM API 交互,支持流式输出
  • 工具执行:解析 LLM 的工具调用请求并执行
  • 记忆管理:管理短期和长期记忆

Channels 渠道层

渠道是消息的"入口"和"出口":

interface Channel {
  // 渠道标识
  id: string;
  provider: 'whatsapp' | 'telegram' | 'discord' | 'slack' | ...;
  
  // 发送消息
  send(to: string, message: Message): Promise<void>;
  
  // 接收消息(通过 Gateway 推送)
  onMessage(callback: (msg: InboundMessage) => void): void;
}

2.3 数据流向:消息如何从用户到 AI 再返回

完整的消息流程

用户在 WhatsApp 发送消息
        │
        ▼
┌───────────────────┐
│ WhatsApp 服务器   │
└───────────────────┘
        │ Baileys (WhatsApp Web 协议)
        ▼
┌───────────────────┐
│   Gateway 网关    │ ← 接收原始消息
└───────────────────┘
        │ 解析、转换、路由
        ▼
┌───────────────────┐
│  会话管理器       │ ← 查找/创建会话
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  Agent 运行时     │ ← 组装上下文
└───────────────────┘
        │
        ▼
┌───────────────────┐
│     LLM API       │ ← 模型推理
└───────────────────┘
        │ 可能调用工具
        ▼
┌───────────────────┐
│    工具执行器     │ ← 执行工具
└───────────────────┘
        │
        ▼
┌───────────────────┐
│  Agent 运行时     │ ← 处理结果,生成回复
└───────────────────┘
        │
        ▼
┌───────────────────┐
│   Gateway 网关    │ ← 发送回复
└───────────────────┘
        │
        ▼
┌───────────────────┐
│ WhatsApp 服务器   │
└───────────────────┘
        │
        ▼
用户收到回复

2.4 进程模型:Gateway 守护进程、客户端、节点

单进程 vs 多进程

OpenClaw 采用混合进程模型

组件进程类型说明
Gateway守护进程长期运行,管理所有平台连接
Agent Runtime线程/协程在 Gateway 进程内或独立进程
客户端独立进程macOS 应用、CLI、Web 界面
节点独立进程iOS/Android 应用、无头设备

客户端连接生命周期

Client                    Gateway
  |                          |
  |──── req:connect ────────>|  首帧必须是 connect
  |<───── res (ok) ──────────|  或 res error + close
  |                          |
  |<───── event:presence ────|  状态同步
  |<───── event:tick ────────|  心跳
  |                          |
  |────── req:agent ────────>|  发起 AI 请求
  |<───── res:agent ─────────|  确认接受
  |<───── event:agent ───────|  流式输出
  |<───── res:agent ─────────|  完成
  |                          |

2.5 部署模式:本地、远程、多主机

本地部署(最简单)

# 安装
npm install -g openclaw

# 启动
openclaw gateway start

# 连接 WhatsApp(扫码)
openclaw whatsapp connect

适用于个人使用,所有组件在同一台机器上。

远程部署(服务器)

┌─────────────────┐         ┌─────────────────┐
│   用户设备      │         │   云服务器      │
│  (macOS/iOS)    │         │  (Gateway)      │
│                 │  Tailscale              │
│  客户端 ────────┼─────────┼─► Gateway      │
│                 │         │                 │
│                 │         │  WhatsApp 连接  │
└─────────────────┘         └─────────────────┘

安全考虑:

  • 使用 Tailscale 或 VPN 加密传输
  • 配置 OPENCLAW_GATEWAY_TOKEN 认证
  • 启用设备配对机制

多主机部署

┌─────────────────────────────────────────────────────┐
│                      主控节点                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │
│  │   Gateway   │  │    Agent    │  │   Canvas    │  │
│  └─────────────┘  └─────────────┘  └─────────────┘  │
└─────────────────────────────────────────────────────┘
         │                    │
         ▼                    ▼
┌─────────────────┐  ┌─────────────────┐
│  节点 A (手机)   │  │  节点 B (平板)  │
│  - 相机         │  │  - 屏幕共享     │
│  - 定位         │  │  - 通知         │
└─────────────────┘  └─────────────────┘

2.6 WebSocket 协议详解

协议格式

所有通信使用 JSON 格式的 WebSocket 帧:

// 请求
interface Request {
  type: "req";
  id: string;        // 唯一标识,用于匹配响应
  method: string;    // 方法名
  params: object;    // 参数
}

// 响应
interface Response {
  type: "res";
  id: string;        // 对应请求的 id
  ok: boolean;       // 是否成功
  payload?: object;  // 成功时的数据
  error?: string;    // 失败时的错误信息
}

// 事件
interface Event {
  type: "event";
  event: string;     // 事件名
  payload: object;   // 事件数据
  seq?: number;      // 序列号(可选)
}

常用方法

方法说明
health健康检查
status获取状态
send发送消息
agent调用 Agent
system-presence设置在线状态

常用事件

事件说明
tick心跳
agentAgent 状态变更
presence用户在线状态
chat新消息
shutdown网关关闭

总结

本章介绍了 OpenClaw 的整体架构:

组件职责
Gateway消息中枢,管理平台连接、路由、认证
Agent Runtime执行引擎,处理 LLM 调用和工具执行
Channels消息入口/出口,连接各种平台
Tools能力扩展,让 Agent 能"做事"

🦞 下一章预告:我们将深入 Agent 运行时的实现细节,了解上下文组装、工具执行循环和记忆管理的具体机制。