OpenClaw 实现原理详解(一):什么是 AI Agent?从 LLM 到智能体 + (二):Gateway 网关架构与消息流转

3 阅读7分钟

1.1 LLM 的局限性:为什么需要 Agent

大型语言模型(LLM)等具有强大的语言理解和生成能力,但它们存在几个关键局限:

1. 无状态性

LLM 本身不"记住"之前的对话。每次调用都是独立的,需要你把所有上下文重新传入。这在长对话中会变得昂贵且低效。

2. 无法主动行动

LLM 只能输出文本,无法:

  • 读取或写入文件
  • 执行代码或命令
  • 调用 API
  • 操作浏览器
  • 发送消息

3. 时效性限制

LLM 的知识截止于训练数据的时间点,无法:

  • 搜索最新信息
  • 查询实时数据
  • 访问动态内容

4. 无持久记忆

每次对话结束后,LLM 不会"学会"任何东西。用户的偏好、之前的决策、重要事件都无法保留。

💡 理解要点:LLM 是一个"只读"的大脑——能思考,但不能行动,也不记事。


1.2 Agent 的核心能力:感知、决策、行动、记忆

AI Agent(智能体)是在 LLM 之上构建的系统,弥补了上述局限。它具备四大核心能力:

感知(Perception)

Agent 能够接收和理解来自多种渠道的信息:

  • 用户通过 WhatsApp、Telegram、Discord 等发送的消息
  • 邮件、日历事件、系统通知
  • 文件内容、网页信息
  • 传感器数据、日志流

决策(Decision)

Agent 的"大脑"——基于 LLM:

  • 理解用户意图
  • 规划执行步骤
  • 决定调用哪些工具
  • 处理工具返回的结果
  • 生成最终回复
用户消息 → LLM 思考 → 决定使用工具A → 执行 → 获取结果 → LLM 继续思考 → 生成回复

行动(Action)

通过"工具"系统,Agent 能够:

  • 文件操作:读取、编辑、创建文件
  • 命令执行:运行 Shell 命令
  • 网络访问:搜索网页、调用 API
  • 消息发送:回复用户、发送邮件、发布内容
  • 浏览器控制:打开网页、截图、自动化操作

记忆(Memory)

Agent 能够跨会话保持信息:

  • 短期记忆:当前对话的上下文
  • 长期记忆:用户偏好、重要事件、历史决策
  • 工作记忆:当前任务的状态和中间结果

1.3 Agent 的典型架构模式

现代 AI Agent 通常采用以下架构:

┌─────────────────────────────────────────────────────────┐
│                      用户界面层                          │
│   WhatsApp │ Telegram │ Discord │ WebChat │ CLI        │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                     Gateway 网关层                       │
│   消息路由 │ 会话管理 │ 认证授权 │ 协议转换              │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                    Agent 运行时                          │
│   上下文组装 │ LLM 调用 │ 工具执行 │ 流式输出            │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                      工具层                              │
│   文件操作 │ 命令执行 │ 网络请求 │ 浏览器控制 │ ...     │
└─────────────────────────────────────────────────────────┘

1.4 OpenClaw 在 Agent 生态中的定位

OpenClaw 是一个生产级 AI Agent 框架,专注于:

多渠道接入

开箱即用支持 20+ 消息平台:

  • 即时通讯:WhatsApp、Telegram、Discord、Signal、微信
  • 企业协作:Slack、飞书、钉钉、企业微信
  • 其他:Email、IRC、Matrix、Nostr

企业级特性

  • 安全控制:沙箱隔离、权限管理、审计日志
  • 高可用:守护进程模式、自动重启、健康检查
  • 可扩展:插件系统、Skills 机制、Webhook 集成
  • 多租户:多 Agent、多账户、会话隔离

开发者友好

  • 配置即代码:JSON5 配置,环境变量支持
  • 丰富的文档:中英文文档,详细的 API 说明
  • 活跃社区:GitHub 开源,Discord 社区支持

总结

概念描述
LLM只能思考的大脑,无状态、无行动能力
Agent = LLM + 感知 + 行动 + 记忆能听、能想、能做、能记的完整系统
OpenClaw生产级 Agent 框架,专注多渠道接入和企业特性

🦞 下一章预告:我们将深入 OpenClaw 的整体架构,了解 Gateway、Agent Runtime、Channels 等组件如何协同工作。

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

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

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

markdown
 体验AI代码助手
 代码解读
复制代码
┌──────────────────────────────────────────────────────────────────┐
│                         用户界面层                                │
│    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 渠道层

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

typescript
 体验AI代码助手
 代码解读
复制代码
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 再返回

完整的消息流程

markdown
 体验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 应用、无头设备

客户端连接生命周期

arduino
 体验AI代码助手
 代码解读
复制代码
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 部署模式:本地、远程、多主机

本地部署(最简单)

bash
 体验AI代码助手
 代码解读
复制代码
# 安装
npm install -g openclaw

# 启动
openclaw gateway start

# 连接 WhatsApp(扫码)
openclaw whatsapp connect

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

远程部署(服务器)

scss
 体验AI代码助手
 代码解读
复制代码
┌─────────────────┐         ┌─────────────────┐
│   用户设备      │         │   云服务器      │
│  (macOS/iOS)    │         │  (Gateway)      │
│                 │  Tailscale              │
│  客户端 ────────┼─────────┼─► Gateway      │
│                 │         │                 │
│                 │         │  WhatsApp 连接  │
└─────────────────┘         └─────────────────┘

安全考虑:

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

多主机部署

css
 体验AI代码助手
 代码解读
复制代码
┌─────────────────────────────────────────────────────┐
│                      主控节点                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │
│  │   Gateway   │  │    Agent    │  │   Canvas    │  │
│  └─────────────┘  └─────────────┘  └─────────────┘  │
└─────────────────────────────────────────────────────┘
         │                    │
         ▼                    ▼
┌─────────────────┐  ┌─────────────────┐
│  节点 A (手机)   │  │  节点 B (平板)  │
│  - 相机         │  │  - 屏幕共享     │
│  - 定位         │  │  - 通知         │
└─────────────────┘  └─────────────────┘

2.6 WebSocket 协议详解

协议格式

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

typescript
 体验AI代码助手
 代码解读
复制代码
// 请求
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 运行时的实现细节,了解上下文组装、工具执行循环和记忆管理的具体机制。

作者:SoRound
链接:juejin.cn/post/761958…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。