这一节只讲相对 S06 新增的内容:
技能不是一次性全塞进上下文,而是先放目录,真正需要时再加载完整内容。
SKILLS_DIR:技能目录。_parse_frontmatter():解析 SKILL.md 顶部元数据。SKILL_REGISTRY:技能注册表。_scan_skills():启动时扫描所有技能。list_skills():列出技能名称和一句话描述。build_system():把技能目录放进 System Prompt。load_skill(name):按需读取完整 SKILL.md。每个技能目录大概长这样:
skills/
code-review/
SKILL.md
pdf/
SKILL.md
SKILL.md 里通常有 frontmatter:
---
name: code-review
description: 代码审查技能
---
这里是完整技能说明……
SKILL_REGISTRYSKILL_REGISTRY 是一个字典:
SKILL_REGISTRY: dict[str, dict]
结构大概是:
{
"code-review": {
"name": "code-review",
"description": "代码审查技能",
"content": "完整 SKILL.md 内容"
}
}
第一级:System Prompt 里只放技能目录。
可用技能:
- code-review: 代码审查技能
- pdf: PDF 处理技能
这样很省上下文。
第二级:模型需要某个技能时,调用:
load_skill("code-review")
程序再把完整 SKILL.md 内容作为 tool_result 返回给模型。
load_skill(name)源码逻辑:
skill = SKILL_REGISTRY.get(name)
if not skill:
return f"未找到技能:{name}"
return skill["content"]
它没有直接拼路径读取文件,而是从注册表里查。
这样可以避免模型传入奇怪路径,比如:
../../secret.txt
Skill Loading 解决的是上下文成本问题。
不要把所有知识都塞进 System Prompt。
更好的结构是:
System Prompt 放目录
真正需要时再 load_skill
这就是“按需知识注入”。