Contents

OpenClaw 代码深度剖析 第二篇:Skills、Memory 与 Tools

第一篇中我们介绍了 OpenClaw 以 gateway 为中心的架构,并发现核心 agent 循环被委托给了外部库。现在来看 OpenClaw 在此基础上构建了什么:skills、memory、tools 和 plugin 系统。


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 元数据包括安装规范(brewnodegouvdownload)和调用策略。

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_searchmemory_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_startagent_end 顺序 / 并行
LLM llm_inputllm_output 并行(仅观察)
压缩 before_compactionafter_compaction 顺序
消息 message_receivedmessage_sendingmessage_sent 混合
持久化 before_message_writetool_result_persist 同步
工具 before_tool_callafter_tool_call 顺序 / 并行
Session session_startsession_end 并行
Gateway gateway_startgateway_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