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 | 心跳 |
agent | Agent 状态变更 |
presence | 用户在线状态 |
chat | 新消息 |
shutdown | 网关关闭 |
总结
本章介绍了 OpenClaw 的整体架构:
| 组件 | 职责 |
|---|---|
| Gateway | 消息中枢,管理平台连接、路由、认证 |
| Agent Runtime | 执行引擎,处理 LLM 调用和工具执行 |
| Channels | 消息入口/出口,连接各种平台 |
| Tools | 能力扩展,让 Agent 能"做事" |
🦞 下一章预告:我们将深入 Agent 运行时的实现细节,了解上下文组装、工具执行循环和记忆管理的具体机制。
作者:SoRound
链接:juejin.cn/post/761958…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。