Skill Loading
“Load Only When Needed”
Inject specialized knowledge only when the task actually needs it.
技能是带有 YAML 前置元数据的 SKILL.md 文件。加载顺序遵循严格的优先级层级:项目级技能最优先,其次为个人技能,最后是内置默认技能。高优先级的同名技能会覆盖低层级的技能。Skill 工具仅在 agent 请求时才将内容按需加载到上下文中。
架构流程图
问题:如何在不过载上下文的情况下注入专业知识
通用编程 agent 不可能预先了解每个框架、库或项目约定的细节。预加载所有知识会迅速耗尽上下文窗口。解决方案是按需技能系统:技能是带有结构化元数据的 markdown 文件,按优先级顺序存储在目录树中。Skill 工具仅在 agent 明确请求或任务描述与技能的声明用途匹配时才加载其内容。这种方法在保持上下文精简的同时,确保专业知识在需要时精准可用。
基于优先级的加载:可预测的覆盖
三层优先级系统(项目级、个人级、内置级)使加载行为完全确定。项目级技能始终优先,因此不会对 'react-testing' 这类技能的哪个版本生效产生歧义。这种设计允许组织通过仓库分发标准技能,允许个人开发者按自身偏好覆盖技能,同时使 opencode 自身能够提供合理的默认值。load_skill() 函数按优先级顺序遍历目录,返回第一个匹配项,成功后即短路退出。
设计决策
技能描述承担双重职责:agent 在运行时利用它们发现相关技能。遇到不熟悉的任务时,agent 扫描可用描述并请求匹配的技能。这是一种即时知识检索形式。
技能是纯 markdown,不含可执行代码。这保证了从未知仓库加载的安全性。技能文件无法执行任意代码,也无法在提供文本上下文之外修改 agent 的行为。
对比 Claude Code
两者都支持基于 SKILL.md 的技能加载。OpenCode 的三层优先级链(项目级、用户级、内置级)比 Claude Code 的隐式发现机制更明确。优先级系统意味着项目技能覆盖个人技能,个人技能覆盖内置默认值。这对团队环境至关重要,项目级标准必须具有优先权。
深入设计决策
SKILL.md 作为知识单元
每个技能是一个 SKILL.md 文件,包含 YAML 前置元数据和 markdown 正文。这是最简单同时兼具人类可读和机器可解析的格式。
三级优先级加载
技能按优先级加载:项目技能优先,然后是个人技能,最后是内置技能。同名的高优先级技能会覆盖低优先级技能,允许在不修改基础技能的情况下进行定制。