OpenClaw 代码深度剖析 第二篇:Skills、Memory 与 Tools
在第一篇中我们介绍了 OpenClaw 以 gateway 为中心的架构,并发现核心 agent 循环被委托给了外部库。现在来看 OpenClaw 在此基础上构建了什么:skills、memory、tools 和 plugin 系统。
- 第一篇:架构
- 第二篇(本文): Skills、Memory 与 Tools
- 第三篇:安全、质量与最终评价
Skills:是 Prompt,不是代码
位置: src/agents/skills/(16 个文件)+ skills/(52 个内置技能)
OpenClaw 的技能系统是其最独特的设计决策。Skills 是 Markdown 文件,不是可执行代码。每个技能是一个包含 SKILL.md(带 YAML frontmatter)的目录。
注入机制
系统 prompt 只包含技能名称和描述 — 不包含完整内容:
## Skills (mandatory)
Before replying: scan <available_skills> <description> entries.
- If exactly one skill clearly applies: read its SKILL.md, then follow it.
- If multiple could apply: choose the most specific one.
- If none clearly apply: do not read any SKILL.md.Agent 随后使用 read 工具按需加载完整技能内容。这是上下文窗口的懒加载 — 只有被选中的技能才消耗 token。
5 级来源优先级
Skills 从五个位置加载,后者覆盖前者:
| 优先级 | 来源 | 路径 |
|---|---|---|
| 1(最低) | 内置 | OpenClaw 发行版中的 skills/ |
| 2 | 托管 | ~/.config/openclaw/skills/ |
| 3 | 个人 agents | ~/.agents/skills/ |
| 4 | 项目 agents | {workspace}/.agents/skills/ |
| 5(最高) | 工作区 | {workspace}/skills/ |
每个来源有大小限制以防止滥用。Frontmatter 元数据包括安装规范(brew、node、go、uv、download)和调用策略。
52 个内置技能
涵盖:1Password、Apple Notes/Reminders、Bear Notes、浏览器截图、Canvas、coding agent、Discord、GitHub/Issues、图像生成(OpenAI)、Notion、Obsidian、Slack、Spotify、Trello、语音通话、天气等。
每个技能本质上是通过自然语言指令教 agent 如何使用特定工具或服务 — 而非 API 绑定。
Memory:混合向量 + 全文搜索
位置: src/memory/(78 个文件)
架构
Memory 系统结合向量嵌入和全文搜索(FTS),底层使用 SQLite + sqlite-vec。
interface MemorySearchManager {
search(query, opts?): Promise<MemorySearchResult[]>;
readFile(params): Promise<{text, path}>;
status(): MemoryProviderStatus;
sync?(params?): Promise<void>;
}嵌入提供商链
四个嵌入提供商,自动回退:
| 提供商 | 模型 | 成本 |
|---|---|---|
| 本地(默认) | GemmaEmbed 300M via node-llama-cpp |
免费、隐私保护 |
| OpenAI | 可配置 | 远程 API |
| Gemini | 可配置 | 远程 API |
| Voyage | 可配置 | 远程 API |
自动模式下:先尝试本地,然后 OpenAI、Gemini、Voyage。如果全部失败,降级为纯 FTS。系统不会因嵌入失败而崩溃。
混合合并算法
1. 按 ID 合并向量和关键词结果(并集合并)
2. 计算加权分数:vectorWeight * vectorScore + textWeight * textScore
3. 应用时间衰减(最近修改文件的新鲜度加成)
4. 应用 MMR 重排序(最大边际相关性,确保结果多样性)BM25 分数通过 1 / (1 + rank) 归一化到 0-1。FTS 查询使用 Unicode 感知的分词,以 AND 连接。
Memory 作为 Plugin 插槽
Memory 是一个特殊的 plugin 插槽 — 同一时间只有一个实现运行。内置的 memory-core 注册 memory_search 和 memory_get 工具。替代方案 memory-lancedb 扩展提供 LanceDB 后端的向量存储。
Tool 系统:70 个文件
位置: src/agents/tools/
可用工具
| 类别 | 工具 |
|---|---|
| 文件系统 | read、write、edit、apply_patch、grep、find、ls |
| 执行 | exec(shell)、process(后台进程) |
| Web | web_search(Brave API)、web_fetch(含 SSRF 防护) |
| 浏览器 | CDP 自动化 via Playwright-core |
| Canvas | 可视化工作区控制 |
| Memory | memory_search、memory_get |
| 消息 | 跨 channel 消息发送 |
| Session | 列表、历史、发送、创建子 agent |
| 调度 | Cron 任务和提醒 |
| 媒体 | 图像分析、TTS |
| 设备 | 摄像头、屏幕(通过伴侣应用) |
| 平台专属 | Discord、Slack、Telegram、WhatsApp 特定操作 |
工具策略配置
四个配置档控制访问权限:
| 配置档 | 权限范围 |
|---|---|
minimal |
仅 session_status |
coding |
文件系统、运行时、session、memory、图像 |
messaging |
消息和 session 管理 |
full |
无限制 |
所有者专属工具(如 whatsapp_login)无论配置档如何都限制为设备所有者使用。工具组可展开别名:“filesystem” 映射到 read、write、edit、apply_patch。
Plugin Hook 系统:20+ 个生命周期 Hook
位置: src/plugins/hooks.ts
这是 OpenClaw 可扩展性真正闪光的地方。Hook 系统提供 20+ 个生命周期切入点,有三种执行模型:
Hook 分类
| 阶段 | Hook | 执行方式 |
|---|---|---|
| 模型 | before_model_resolve |
顺序 |
| Prompt | before_prompt_build |
顺序 |
| Agent | before_agent_start、agent_end |
顺序 / 并行 |
| LLM | llm_input、llm_output |
并行(仅观察) |
| 压缩 | before_compaction、after_compaction |
顺序 |
| 消息 | message_received、message_sending、message_sent |
混合 |
| 持久化 | before_message_write、tool_result_persist |
同步 |
| 工具 | before_tool_call、after_tool_call |
顺序 / 并行 |
| Session | session_start、session_end |
并行 |
| Gateway | gateway_start、gateway_stop |
并行 |
执行模型
- 并行 — 所有 hook 同时运行。用于观察和分析。
- 顺序 — 按优先级处理(高优先级先执行),结果合并。用于修改操作。
- 同步 — 在热路径上运行(对话记录写入)。不允许异步。
37 个 Extension
| 类别 | 数量 | 示例 |
|---|---|---|
| 消息 | 20 | WhatsApp、Telegram、Discord、Slack、Signal、iMessage、Matrix、Teams、IRC、Nostr |
| 认证 | 4 | Google Antigravity、Gemini CLI、MiniMax、Qwen |
| Memory | 2 | memory-core、memory-lancedb |
| Agent/LLM | 3 | copilot-proxy、llm-task、lobster |
| 设备 | 2 | device-pair、phone-control |
| 语音 | 2 | talk-voice、voice-call |
| 其他 | 4 | diagnostics-otel、open-prose、shared、thread-ownership |
消息覆盖范围确实令人印象深刻 — 20 个 channel 适配器涵盖了每一个主流平台,加上 Nostr、Tlon、Zalo 等小众平台。
下一篇:第三篇 — 安全、质量与最终评价 涵盖 Docker 沙箱、安全审计系统、代码质量评估、生态风险以及我们的最终判断。
分析基于 OpenClaw v2026.2.18。源码:github.com/openclaw/openclaw。