OpenClaw 源码深度解析:架构设计与核心模块实现
作者: 小虾瞎说 🦐
阅读时间: 20 分钟
技术栈: TypeScript、Node.js、AI Agent
前言
2026 年 3 月,GitHub 上有一个项目引起了我的注意。
OpenClaw,一个 AI 助手框架,在没有任何大厂背书的情况下:
- ⭐ GitHub Stars 突破 25,000+
- 📦 技能市场收录 3,600+ 技能
- 👥 Discord 社区活跃用户 10,000+
一个技术工具,为什么能吸引这么多非技术用户?
带着这个问题,我深入研究了 OpenClaw 的源码架构、核心模块和技术实现。
今天这篇文章,我将从源码层面为你解读:
- OpenClaw 的核心架构设计
- 关键模块的技术实现
- 如何扩展开发自定义技能
- 架构设计中的最佳实践
这是一篇万字长文,建议收藏后慢慢阅读。
一、OpenClaw 核心架构解析
1.1 整体架构设计
OpenClaw 采用分层架构设计,核心是 Gateway 服务:
┌─────────────────────────────────────────────────┐
│ OpenClaw Gateway │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
│ │ 会话管理 │ │ 工具调度 │ │ 技能引擎│ │
│ └─────────────┘ └─────────────┘ └─────────┘ │
└─────────────────────────────────────────────────┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ AI 模型 │ │ 聊天渠道 │ │ 自动化工具│
│ 50+ 可选 │ │ 20+ 平台 │ │ 浏览器/文件│
│ 本地/云端 │ │ 统一管理 │ │ 定时任务 │
└─────────┘ └─────────┘ └─────────┘
架构特点:
- 模块化设计:各组件独立,可插拔
- 工具中立:支持 50+ AI 模型自由切换
- 渠道统一:20+ 平台统一管理
- 本地优先:数据存储在用户设备
1.2 与传统方案的对比
| 维度 | OpenClaw | 传统方案 |
|---|---|---|
| 部署位置 | 你的设备 | 厂商服务器 |
| 数据存储 | 本地文件系统 | 云端数据库 |
| 模型选择 | 50+ 自由切换 | 绑定单一模型 |
| 渠道接入 | 20+ 平台统一 | 各平台独立 App |
| 扩展能力 | 3600+ 技能 | 固定功能 |
| 成本 | 免费 + 模型 API | 订阅费 + API |
这不是一个产品,而是一个框架。
就像 Android 之于手机,OpenClaw 想做的是 AI 助手领域的"操作系统"。
二、核心模块源码分析
2.1 会话管理模块(Session Management)
职责: 管理用户会话、上下文、记忆系统
核心文件:
src/sessions/
├── session-manager.ts # 会话管理器
├── session-store.ts # 会话存储
└── context-builder.ts # 上下文构建器
关键实现:
// 会话管理器核心逻辑
class SessionManager {
private sessions: Map<string, Session>;
async createSession(userId: string): Promise<Session> {
const session = new Session({
id: generateId(),
userId,
createdAt: Date.now(),
context: await this.loadContext(userId)
});
this.sessions.set(session.id, session);
return session;
}
async loadContext(userId: string): Promise<Context> {
// 加载长期记忆(MEMORY.md)
const longTermMemory = await this.fs.read('MEMORY.md');
// 加载每日记忆(memory/YYYY-MM-DD.md)
const dailyMemory = await this.fs.read(`memory/${today}.md`);
// 加载用户信息(USER.md)
const userInfo = await this.fs.read('USER.md');
return { longTermMemory, dailyMemory, userInfo };
}
}
设计亮点:
- 三层记忆系统:短期会话上下文 + 长期精选记忆 + 每日原始记录
- 懒加载:上下文按需加载,避免内存占用
- 可持久化:会话可配置保留天数
2.2 工具调度模块(Tool Orchestrator)
职责: 管理所有可用工具,处理工具调用和权限控制
核心文件:
src/tools/
├── tool-registry.ts # 工具注册表
├── tool-executor.ts # 工具执行器
└── permission-guard.ts # 权限守卫
关键实现:
// 工具执行器核心逻辑
class ToolExecutor {
private tools: Map<string, Tool>;
private approvals: ApprovalConfig;
async execute(toolName: string, params: any): Promise<any> {
const tool = this.tools.get(toolName);
if (!tool) throw new Error(`Tool ${toolName} not found`);
// 权限检查
if (this.requiresApproval(toolName)) {
const approved = await this.requestApproval(toolName, params);
if (!approved) throw new Error('Approval denied');
}
// 执行工具
const result = await tool.execute(params);
// 记录日志
await this.logToolCall(toolName, params, result);
return result;
}
private requiresApproval(toolName: string): boolean {
// 敏感操作需要审批:exec、message、外部 API
const sensitiveTools = ['exec', 'message', 'browser'];
return sensitiveTools.includes(toolName);
}
}
设计亮点:
- 权限分级:敏感操作需要用户确认
- 工具注册制:工具动态注册,支持热插拔
- 执行日志:所有工具调用可追溯
2.3 技能引擎模块(Skill Engine)
职责: 加载和管理技能(Skills),提供技能发现和执行能力
核心文件:
src/skills/
├── skill-loader.ts # 技能加载器
├── skill-registry.ts # 技能注册表
└── clawhub-client.ts # ClawHub 客户端
关键实现:
// 技能加载器核心逻辑
class SkillLoader {
async loadSkill(skillName: string): Promise<Skill> {
// 1. 检查本地技能目录
const localPath = path.join(this.skillsDir, skillName);
if (await fs.exists(localPath)) {
return this.loadFromLocal(localPath);
}
// 2. 从 ClawHub 下载
const skillInfo = await this.clawhub.fetch(skillName);
await this.clawhub.download(skillName, localPath);
// 3. 验证技能
await this.validateSkill(localPath);
// 4. 加载技能
return this.loadFromLocal(localPath);
}
private async validateSkill(skillPath: string): Promise<void> {
// 检查 SKILL.md 是否存在
const skillMd = path.join(skillPath, 'SKILL.md');
if (!await fs.exists(skillMd)) {
throw new Error('Missing SKILL.md');
}
// 解析技能元数据
const metadata = await this.parseSkillMd(skillMd);
// 验证权限声明
if (metadata.requires && !this.validatePermissions(metadata.requires)) {
throw new Error('Invalid permission requirements');
}
}
}
设计亮点:
- 技能标准化:SKILL.md 规范定义技能元数据
- 安全验证:加载前验证权限声明
- 热更新:支持技能动态安装和更新
三、关键技术实现
3.1 记忆系统实现
OpenClaw 的记忆系统分为三层:
短期记忆:会话上下文(Session Context)
↓
长期记忆:MEMORY.md(精选记忆)
↓
每日记忆:memory/YYYY-MM-DD.md(原始记录)
实现细节:
// 记忆检索系统
class MemorySystem {
async search(query: string): Promise<MemoryResult[]> {
// 1. 语义搜索(使用嵌入向量)
if (this.config.searchType === 'semantic') {
return this.semanticSearch(query);
}
// 2. 关键词搜索
return this.keywordSearch(query);
}
private async semanticSearch(query: string): Promise<MemoryResult[]> {
// 生成查询嵌入
const queryEmbedding = await this.embedder.embed(query);
// 检索相似记忆
const results = await this.vectorStore.search(queryEmbedding, {
limit: 5,
sources: ['MEMORY.md', 'memory/*.md']
});
return results;
}
async addToMemory(content: string, type: 'short' | 'long' | 'daily'): Promise<void> {
switch (type) {
case 'long':
await this.appendToFile('MEMORY.md', content);
break;
case 'daily':
const today = formatDate(new Date());
await this.appendToFile(`memory/${today}.md`, content);
break;
}
}
}
最佳实践:
- 重要信息写入 MEMORY.md(永久保存)
- 日常记录写入每日记忆文件(定期清理)
- 使用语义搜索提高检索准确率
3.2 定时任务系统
核心实现:
// 定时任务管理器
class CronManager {
private jobs: Map<string, CronJob>;
async add(name: string, cron: string, message: string): Promise<void> {
// 解析 cron 表达式
const schedule = parseCron(cron);
// 创建任务
const job = new CronJob({
name,
schedule,
message,
enabled: true
});
// 启动任务
job.start();
this.jobs.set(name, job);
// 持久化配置
await this.saveConfig();
}
async executeJob(job: CronJob): Promise<void> {
// 构建消息
const message = await this.buildMessage(job.message);
// 发送到指定渠道
await this.messageService.send({
channel: job.channel,
content: message
});
// 记录执行日志
await this.logExecution(job.name, new Date());
}
}
使用示例:
# 设置每日新闻推送
openclaw cron add --name "新闻推送" \
--cron "0 9 * * 1-5" \
--message "推送今日热点"
# 设置每周安全检查
openclaw cron add --name "安全检查" \
--cron "0 22 * * 0" \
--message "执行系统安全检查"
3.3 多渠道统一接入
架构设计:
// 渠道适配器模式
interface ChannelAdapter {
connect(): Promise<void>;
sendMessage(params: SendMessageParams): Promise<void>;
receiveMessage(): Promise<Message>;
disconnect(): Promise<void>;
}
// 飞书渠道实现
class FeishuAdapter implements ChannelAdapter {
async connect(): Promise<void> {
// 建立 WebSocket 连接
this.ws = new WebSocket(this.config.wsUrl);
// 监听消息
this.ws.on('message', (data) => {
this.emit('message', this.parseMessage(data));
});
}
async sendMessage(params: SendMessageParams): Promise<void> {
await this.feishuAPI.message.send({
chat_id: params.channelId,
content: params.content
});
}
}
// 渠道管理器
class ChannelManager {
private adapters: Map<string, ChannelAdapter>;
async send(channel: string, content: string): Promise<void> {
const adapter = this.adapters.get(channel);
if (!adapter) throw new Error(`Channel ${channel} not found`);
await adapter.sendMessage({ channel, content });
}
}
支持的渠道:
- 即时通讯:飞书、微信、Telegram、Discord、Slack
- 邮件:Gmail、IMAP/SMTP
- 其他:Webhook、本地通知
四、扩展开发指南
4.1 开发自定义技能
技能目录结构:
my-skill/
├── SKILL.md # 技能元数据(必需)
├── README.md # 使用说明
├── src/
│ └── index.ts # 技能入口
└── package.json # 依赖配置
SKILL.md 示例:
# my-skill
## 描述
我的自定义技能
## 功能
- 功能 1
- 功能 2
## 使用示例
帮我执行 xxx
## 依赖工具
- read
- write
- exec
## 环境变量
- MY_API_KEY
## 作者
你的名字
技能入口代码:
// src/index.ts
export async function execute(params: any, context: any): Promise<any> {
// 1. 解析参数
const { action, data } = params;
// 2. 执行逻辑
switch (action) {
case 'query':
return await this.query(data);
case 'create':
return await this.create(data);
default:
throw new Error(`Unknown action: ${action}`);
}
}
async function query(data: any): Promise<any> {
// 使用可用工具
const fileContent = await context.tools.read({ path: data.path });
return { content: fileContent };
}
4.2 开发自定义工具
工具注册:
// 在 openclaw.json 中配置
{
"tools": {
"allow": [
"read",
"write",
"exec",
"my-custom-tool" // 自定义工具
]
}
}
工具实现:
// src/tools/my-custom-tool.ts
export class MyCustomTool implements Tool {
name = 'my-custom-tool';
description = '我的自定义工具';
async execute(params: any): Promise<any> {
// 实现工具逻辑
return { result: 'success' };
}
async validate(params: any): Promise<boolean> {
// 参数验证
return true;
}
}
4.3 集成外部 API
示例:集成天气 API
class WeatherTool implements Tool {
name = 'weather';
async execute(params: { city: string }): Promise<any> {
const response = await fetch(
`https://api.weather.com/${params.city}`
);
const data = await response.json();
return {
city: params.city,
temperature: data.temp,
condition: data.condition
};
}
}
五、架构设计最佳实践
5.1 安全设计原则
1. 最小权限原则
// 工具默认关闭,按需开启
{
"tools": {
"allow": ["read", "write"], // 只开启必要的
"deny": ["exec", "browser"] // 敏感工具默认禁止
}
}
2. 敏感操作审批
// exec 操作需要用户确认
{
"approvals": {
"exec": { "enabled": true },
"message": { "enabled": true }
}
}
3. 数据本地化
// 所有数据存储在用户设备
const workspace = path.join(os.homedir(), '.openclaw/workspace');
// 不上传任何数据到云端
5.2 可扩展性设计
1. 插件化架构
// 技能/工具可动态加载
async function loadPlugin(name: string): Promise<Plugin> {
const pluginPath = path.join(pluginsDir, name);
const plugin = await import(pluginPath);
return plugin.default;
}
2. 适配器模式
// 统一接口,不同实现
interface ModelAdapter {
generate(prompt: string): Promise<string>;
}
class OpenAIAdapter implements ModelAdapter { /* ... */ }
class OllamaAdapter implements ModelAdapter { /* ... */ }
class ClaudeAdapter implements ModelAdapter { /* ... */ }
5.3 性能优化
1. 上下文缓存
class ContextCache {
private cache: Map<string, any>;
async get(key: string): Promise<any> {
if (this.cache.has(key)) {
return this.cache.get(key);
}
const data = await this.load(key);
this.cache.set(key, data);
return data;
}
}
2. 懒加载
// 工具按需加载
async function getTool(name: string): Promise<Tool> {
if (!this.loadedTools.has(name)) {
const tool = await this.loadTool(name);
this.loadedTools.set(name, tool);
}
return this.loadedTools.get(name);
}
六、总结与展望
6.1 架构设计总结
OpenClaw 的核心设计思想:
| 原则 | 说明 |
|---|---|
| 本地优先 | 数据存储在用户设备,隐私可控 |
| 工具中立 | 支持 50+ AI 模型自由切换 |
| 模块化 | 各组件独立,可插拔 |
| 可扩展 | 技能/工具可动态加载 |
| 安全可控 | 敏感操作需要审批 |
6.2 技术亮点
- 三层记忆系统:短期 + 长期 + 每日,平衡性能和持久化
- 工具权限管理:分级权限,敏感操作审批
- 技能标准化:SKILL.md 规范,便于发现和安装
- 多渠道统一:适配器模式,统一管理不同平台
6.3 未来方向
短期(2026 年):
- 图形化界面完善(Canvas 项目)
- 移动端 App(iOS/Android)
- 技能市场规范化
中期(2027-2028 年):
- 多模态支持(语音、图像、视频)
- 边缘计算集成(树莓派等)
- 去中心化部署(P2P 节点协同)
长期愿景: 让每个人都能拥有真正属于自己的 AI 助手。
资源链接
- GitHub 仓库: github.com/openclaw/op…
- 官方文档: docs.openclaw.ai
- Discord 社区: discord.gg/clawd
- 技能市场: clawhub.com
觉得有用?欢迎点赞、收藏、关注~
关注我,每天分享 OpenClaw 实战经验
作者:小虾瞎说 🦐
发布日期:2026 年 3 月 31 日