架构与核心概念
整体系统架构
OpenClaw 采用分层架构设计,从上到下依次为表现层、路由层、处理层和数据层。各层各司其职,通过清晰的接口定义实现解耦。
┌─────────────────────────────────────────┐
│ 表现层 (Channels) │
│ Telegram Discord 微信 飞书 钉钉 Slack │
└────────────────┬────────────────────────┘
│ 统一消息抽象
┌────────────────▼────────────────────────┐
│ 路由层 (Router) │
│ 消息分发 | 平台适配 | 格式转换 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ 处理层 (Agent) │
│ LLM 调用 | 插件执行 | 工具调用 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ 数据层 (Storage) │
│ 会话管理 | 消息记录 | 持久化存储 │
└─────────────────────────────────────────┘
Agent 模型:消息处理流水线
Agent 是 OpenClaw 的核心处理单元,负责将用户输入转化为 AI 回复。消息的处理遵循一条清晰的流水线:
- 消息接收:通道层将各平台的原始消息转化为统一格式的
Message对象 - 预处理:经过消息过滤、内容审核、格式校验等预处理步骤
- 会话加载:从会话存储中加载当前对话的上下文历史
- 提示词组装:将系统提示词、会话历史和当前消息组装为完整的 Prompt
- LLM 调用:向大模型发送请求,获取生成的回复
- 后处理:对生成的回复进行过滤、格式化、敏感内容检测
- 消息路由:将最终回复通过目标通道发送给用户
// 消息处理流水线的核心简化实现
async function processMessage(input: Message): Promise<Message> {
// 1. 预处理
const sanitized = await sanitizer.sanitize(input);
// 2. 加载会话上下文
const session = await sessionManager.getSession(sanitized.sessionId);
const context = session.getContext();
// 3. 组装 Prompt
const prompt = promptBuilder.build({
systemPrompt: bot.systemPrompt,
context,
userMessage: sanitized,
});
// 4. 调用 LLM
const response = await llmProvider.generate(prompt);
// 5. 更新会话
session.addMessage(sanitized);
session.addMessage(response);
await sessionManager.saveSession(session);
return response;
}
会话管理机制
会话管理是维持多轮对话连贯性的关键。OpenClaw 的会话管理包含以下核心机制:
- 会话标识:每个会话由
sessionId唯一标识,通常为{platform}:{userId}的格式 - 上下文窗口:默认保留最近 20 轮对话(用户消息 + AI 回复),超过则自动丢弃最早的轮次
- 超时回收:会话在超过 TTL(默认 30 分钟)无活动后自动回收,释放内存资源
- 持久化策略:支持内存存储(开发环境)、Redis(生产环境)和数据库存储三种模式
创建和管理会话的示例:
// 会话配置示例
const sessionConfig = {
strategy: 'redis', // 使用 Redis 存储
ttl: 1800, // 30 分钟超时
maxContext: 20, // 保留 20 轮上下文
redis: {
host: 'localhost',
port: 6379,
keyPrefix: 'openclaw:sessions:',
},
};
消息路由引擎
消息路由引擎负责将经过 AI 处理后的回复精确地送达目标用户。路由流程如下:
- 从
Message对象中提取目标channel和recipient - 根据
channel类型选择对应的通道适配器 - 将统一格式的消息转化为目标平台的原生消息格式
- 通过对应的 API 发送消息
- 处理发送结果(重试、错误上报等)
插件系统架构
OpenClaw 的插件系统基于事件驱动模型。插件可以监听框架生命周期中的各种事件,在合适的时机插入自定义逻辑:
| 生命周期事件 | 触发时机 | 典型用途 |
|---|---|---|
| beforeMessage | 消息进入处理流水线前 | 消息过滤、日志记录 |
| afterMessage | 消息处理完成 | 数据统计、自动回复 |
| beforeLLM | LLM 调用前 | 修改 Prompt、注入上下文 |
| afterLLM | LLM 调用后 | 结果审核、格式修正 |
| sessionCreate | 新会话创建时 | 初始化欢迎语 |
| sessionExpire | 会话超时时 | 清理资源、保存摘要 |
插件开发示例:
import { Plugin, Message } from 'openclaw';
export class LoggingPlugin implements Plugin {
name = 'logging';
// 监听消息事件
async beforeMessage(msg: Message): Promise<Message> {
console.log(`[收到消息] 来自 ${msg.platform} 用户 ${msg.userId}`);
console.log(`[消息内容] ${msg.text}`);
return msg;
}
async afterMessage(response: Message): Promise<Message> {
console.log(`[发送回复] 耗时 ${response.latency}ms`);
return response;
}
}
核心概念对比
理解以下四个核心概念的区别是掌握 OpenClaw 的关键:
| 概念 | 英文 | 定义 | 实例 |
|---|---|---|---|
| Agent | Agent | AI 处理单元,负责调用 LLM 并执行逻辑 | 客服机器人、翻译助手 |
| Session | Session | 一次连续对话的上下文容器 | 用户 A 与机器人的 5 轮对话 |
| Message | Message | 单次交互的消息单元 | "你好"、"今天的天气怎么样" |
| Channel | Channel | 消息平台的接入适配器 | Telegram 通道、Discord 通道 |
Agent 是整个系统的核心,Session 维护对话的连续性,Message 是基本的数据单元,Channel 负责对接外部平台。这四个概念相互配合,构成了 OpenClaw 完整的工作闭环。