§07 Skills 技能系统
DeerFlow 把「怎么做好某类事」外置成一个个 Skill 目录。这是它和很多框架最不一样的地方——能力不是写死在代码里的,是目录里读出来的。
一个 Skill 长什么样
每个 Skill 是自包含目录,典型结构:
skills/public/image-generation/
SKILL.md # frontmatter: name + description + 给代理的使用说明
scripts/
generate.py # 纯 requests 调用外部 API 的 CLI(argparse)
templates/ # 可选模板
SKILL.md 的 frontmatter 有 name 和 description,后面是给 Agent 看的操作说明。运行时,公共技能挂在 /mnt/skills/public/<name>/,产物写到 /mnt/user-data/...。
public 与 custom,靠组合键区分
Skill 分两类:public(仓库自带)和 custom(你自己装)。早期有个坑:同名 public 和 custom 技能会互相串门。2.0 的解法是组合键 {category}:{name}。
配置里这么写:
{
"skills": {
"public:my-skill": { "enabled": true },
"custom:my-skill": { "enabled": false }
}
}
旧格式(只用 name)依然兼容——系统会自动识别。加载时还会在同一类别内查重,撞名直接抛 ValueError,把错误说在前面。
通过 API 管理技能
Gateway 暴露了技能管理端点:
| 端点 | 作用 |
|---|---|
GET /api/skills |
列出技能 |
GET /api/skills/{skill_name} |
查详情,可带 ?category=public |
PUT /api/skills/{skill_name} |
改启用状态,可带 ?category= |
POST /api/skills/install |
从 .skill 归档安装 |
同名时,API 会要求你补 category 参数,否则返回 400,把「到底改哪个」抛回给你。
用 skill-creator 造新技能
仓库里自带一个 skill-creator 公共技能,提供 scripts/init_skill.py 脚手架。想加自己的能力,先用它生成骨架,再填 SKILL.md 和 scripts/。
标叔的结论:Skill 目录化,是 DeerFlow 能「越用越聪明」的根本。你别急着改核心代码,先想「这事能不能做成一个 Skill」。能,就外置;外置了,就能热插拔、能隔离、能审计。
记忆是代理的「长期脑子」。下一章讲它怎么不丢历史。