OpenClaw 架构
~/.openclaw/ 是 OpenClaw 的“神经中枢”,里面存放着所有配置和状态。
~/.openclaw/
├── openclaw.json # 全局配置文件
├── gateway/ # Gateway 相关
│ ├── config.json # Gateway 配置
│ ├── logs/ # 日志目录
│ └── pid # 进程 ID 文件
├── plugins/ # 插件目录
│ ├── @openclaw/ # 官方插件
│ └── @wecom/ # 第三方插件
├── workspaces/ # Agent 工作区
│ ├── default/ # 默认 Agent
│ └── paigit/ # 自定义 Agent
├── skills/ # 技能包
├── cache/ # 缓存目录
└── .env # 环境变量
Gateway
-
接收消息
飞书把消息推送到Gateway。Gatwway收到后,解析消息内容,识别是哪个agent、哪个会话。
-
分发任务
Gateway 把消息路由给对应的 Agent 处理。如果你配置了多个 Agent(比如一个负责代码审核,一个负责会员审批),Gateway 会根据消息来源判断该交给谁。
-
返回结果
Agent 处理完任务后,把结果交给 Gateway,Gateway 再通过 IM 通道发回飞书。
Gateway 负责 IM 通信,Agent 负责任务执行。这样可以一个 Gateway 挂多个 Agent,每个 Agent 用不同的模型、跑不同的任务,互不干扰。
插件
核心只提供最基础的能力——消息收发、任务调度、工具调用。其他功能全部通过插件扩展。
OpenClaw 实操
成员加入Github仓库,开通访问权限。
以前的流程:会员申请加入 -> 我收到通知 -> 手动打开 gitcode 后台 -> 搜索用户昵称 -> 添加到对应的项目组 -> 发消息通知会员审核通过
把任务交给OpenClaw
-
创建一个专属 Agent
openclaw agents add PaiGit --workspace ~/openclaw-workspaces/paigit -
配置 BOOT.md 告诉 Agent 它的职责
# PaiGit 职责 你是技术派的 gitcode 账号审核助手。 当收到飞书消息包含用户昵称时: 1. 登录 gitcode 后台 2. 搜索用户 3. 添加到技术派-会员组 4. 回复审核结果 -
绑定飞书通道
在飞书群,直接发消息,让OpenClaw开始流程。
配置Webhook实现飞书群消息同步
每个飞书群都有一个 Webhook 地址,可以在群设置里找到。
把这些 Webhook 地址告诉 OpenClaw
发送同步指令
OpenClaw 支持用自然语言创建定时任务。
定时任务的底层实现是 cron。OpenClaw 会把自然语言转成 cron 表达式,然后在后台调度执行。
OpenClaw 优化
Token优化
- prompt 压缩:去除冗余信息,只传必要上下文
- 上下文裁剪:只保留最近 N 轮对话
- 结果缓存:相同问题直接返回缓存结果
响应慢
- 流式输出:边生成边返回,减少用户等待
- 异步处理:复杂任务后台执行,先返回 ACK
- 模型选择:简单任务用 Lite 模型,复杂任务用 Pro 模型
费用控制
- 配额管理:每天/每月设置 token 上限
- 成本追踪:记录每个任务的 token 消耗
- 自动降级:额度用完时切换到便宜模型
踩坑
排查Gateway启动收不到消息
第一步:检查日志
cat ~/.openclaw/gateway/logs/error.log
看有没有报错信息。常见错误有:飞书 App ID 填错、权限没开通、事件订阅没配置。
第二步:检查通道状态
openclaw channels status
看飞书/企微通道是不是正常连接。
第三步:检查飞书配置
去飞书开放平台,确认:
- 事件订阅已开启
im.message.receive_v1事件已添加- 长链接模式已启用
多Agent路由机制
真正决定多 Agent 路由的,就是 dmPolicy 和 bindings 这两个点。
dmPolicy
dmPolicy 全称 Direct Message Policy,控制机器人如何处理私信。有三种策略可选:
{
"dmPolicy": {
"app1": "allow", // 允许所有私信
"app2": "deny", // 拒绝所有私信
"app3": "pairing" // 只允许配对过的用户私信
}
}
bindings
bindings 是 OpenClaw 多 Agent 路由的核心机制。它定义了消息应该如何分配给不同的 Agent。
{
"bindings": [
{
"agentId": "CodeReview",
"match": {
"channel": "feishu",
"accountId": "cli_xxx1",
"peer": {
"type": "group",
"id": "oc_xxx"
}
}
},
{
"agentId": "DevOps",
"match": {
"channel": "feishu",
"accountId": "cli_xxx2"
}
}
]
}
channel是消息来源,比如 feishu、wecom;accountId是飞书应用的 App ID;peer是发送者信息,type可以是 user 或 group,id是对应的 ID。
groupPolicy
{
"groupPolicy": {
"requireMention": true, // 群组中是否需要@机器人
"allowAnonymous": false // 是否允许匿名消息
}
}
Gateway 网关架构
链路
飞书消息 → Gateway → Agent → 大模型 → Agent → Gateway → 飞书回复
Gateway 和飞书之间如何通信
WebSocket 长连接。飞书开放平台提供了事件订阅机制,Gateway 启动时会向飞书注册一个 WebSocket 连接。之后飞书有消息就会主动推过来。
认证方式用的是 Token 机制。在openclaw.json里配置的verificationToken和encryptKey,就是用来验证消息来源和解密消息内容的。
{
"gateway": {
"port": 18789,
"auth": "token",
"host": "0.0.0.0"
}
}
高可用架构
Gateway 集群+负载均衡
部署多个 Gateway 实例,前面挂一个负载均衡器(如 Nginx)。飞书的 WebSocket 连接可以分发到不同实例。
会话状态下沉
把会话状态从本地磁盘迁移到 Redis,这样 Gateway 实例就变成无状态的了。任何一个实例挂掉,其他实例可以接管会话。
任务队列化
对于耗时任务,用消息队列(如 RabbitMQ)做缓冲,避免 Gateway 被阻塞。
会话管理与压缩
会话数据默认存在~/.openclaw/workspaces/<agent>/memory/目录下。每次对话会序列化保存,用 session_id 标识。Gateway 重启后可以恢复会话状态。
会话数据会越积越多,尤其是长对话场景。OpenClaw 提供了压缩机制:
{
"memory": {
"compression": true,
"maxHistory": 20, // 保留最近20轮对话
"summarizeThreshold": 10 // 超过10轮后自动摘要
}
}
上下文窗口
分层记忆设计
把记忆分成三层:
- 短期记忆:最近 5 轮对话,完整保留
- 中期记忆:6-20 轮对话,压缩存储
- 长期记忆:超过 20 轮,只保留关键摘要
关键信息提取
在 BOOT.md 里告诉 Agent,哪些信息必须记住,哪些可以丢弃。
定期清理机制
设置定时任务,自动清理过期的会话数据。
OpenClaw 组件
**LLM:**这是 Agent 的大脑,负责理解指令、规划任务、生成回复。OpenClaw 支持多种模型,Claude、GPT、GLM 都可以接。
任务规划:把用户的自然语言需求,拆解成可执行的任务步骤。比如“帮我查天气”,会拆解成:调用天气 API → 解析返回数据 → 生成回复。
工具执行器:负责调用外部工具,比如搜索、文件操作、数据库查询等。每个工具都有明确的输入输出定义。
记忆管理器:管理 Agent 的短期记忆(Session)和长期记忆(Memory)。这是 Agent 能持续对话的关键。
技能加载器:动态加载 Skills,扩展 Agent 的能力。Skills 本质上是封装好的 Prompt 和工具组合。
组件之间通信
每个组件都是独立的,通过消息总线交换数据。
消息总线本质上是一个事件队列。
当组件 A 需要调用组件 B 时,不是直接调用,而是发送一个消息到总线。
Agent是常驻进程吗?
不是,Agent 是 per-session 的瞬态实例。
每个对话都是一次完整的加载-执行-销毁循环。
Session如何加载
Session 的加载是懒加载机制。当消息到达,路由到 SessionKey 之后,OpenClaw 会查找 sessions.json 获取当前 SessionId,然后把 SessionId 对应的.jsonl 文件加载到 Agent 中。
Memory
短期记忆(Session):当前对话的上下文,存储在内存中。包括用户输入、Agent 回复、工具调用结果等。
长期记忆(Memory):跨对话的持久化记忆,存储在磁盘上。包括用户偏好、历史事实、重要结论等。