首页
首页/s07
s0785 行代码

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 正文。这是最简单同时兼具人类可读和机器可解析的格式。

备选方案: JSON 或纯 YAML 对机器更友好,但人类编写和维护更困难。带前置元数据的 Markdown 平衡了两种需求。

三级优先级加载

技能按优先级加载:项目技能优先,然后是个人技能,最后是内置技能。同名的高优先级技能会覆盖低优先级技能,允许在不修改基础技能的情况下进行定制。

备选方案: 扁平的技能目录更简单,但无法定制。优先级链允许用户覆盖任何技能而无需 fork。

Learn OpenCode — Built with Next.js