Agent 工程对照
← 返回框架对照

工具 · 第 5 章

Skills 与渐进披露

能力多到放不进上下文时,怎么按需暴露?

四家都只把技能名和描述放进上下文、正文按需读取;分歧在目录放在哪、有没有上限。

场景建议

编辑判断

按你的需求,倾向哪种做法

借鉴的是那一家的设计,不等于选用那个框架。

场景

技能很多,上下文放不下

只有它给技能目录设了预算(默认上下文窗口的 2%),超了先截描述、再删条目,并告诉用户少了几个。

场景

不想让技能增减打破前缀缓存

它把目录作为会话消息发布,摘要没变就不重发,系统提示前缀保持稳定。

场景

最快落地

系统提示里列名字、描述、位置,正文交给已有的读文件工具,不需要新工具。

容易踩的坑

  • 目录写进系统提示意味着每次技能增减都会让前缀缓存失效——技能会动态变化时要考虑这个代价。

四家怎么做

差异与源码

openJiuwen

系统提示只列名字、描述、目录,正文靠 read_file 自取

渐进披露只有两层:系统提示里逐条列出技能的名字、描述和目录,并要求模型动手前先用 read_file 读对应的 SKILL.md;正文不进提示词。没有专用的加载工具,复用的是通用文件读取能力。SkillManager 注册时要求 SKILL.md 的 YAML 头里必须有 description,缺了直接抛 KeyError;另有 RemoteSkillUtil 支持从 GitHub 目录树拉取技能。列表没有长度预算,技能多了就原样增长。

适合
技能数量不多、已有通用读文件工具的 Agent。
代价
列表没有长度预算,技能一多就原样挤占上下文。

此后的变化

  • 2026-W39 →

    对外部 CLI 成员(Claude Code、Codex、dsh),技能不再走系统提示列目录加 read_file 自取,而是整包复制进目标 CLI 的项目扫描目录,由目标 CLI 自己加载;冲突策略有 skip、replace、append 三种。

Codex

技能目录有预算:默认占上下文窗口的 2%,超了先截描述再删

Codex 给技能元数据单独算预算:知道上下文窗口时取窗口的 2%(token),显式配置时取配置值但封顶 1 万 token,都不知道时退回 8000 字符。超预算分两步降级:先把描述截短(平均截掉超过 100 字符时提示用户),仍放不下就删掉部分技能的描述,并明确告诉用户「有 N 个技能没进模型可见的列表」,建议停用不用的技能或插件。排序按作用域:系统、管理员、仓库、用户。

适合
装了很多技能与插件、上下文预算吃紧的产品。
代价
预算与降级逻辑(截描述、删条目、告警)需要专门维护。
DeepSeek Harness

专用 skill 加载工具,目录作为会话消息发布、变了才重发

DeepSeek 的披露有一个专用的 skill 工具:模型用确切的技能名调用它,拿回完整说明和资源目录。技能目录不写进系统提示,而是作为一条持久的会话消息发布,每条描述截到 500 字符(可配置);每步开始前对目录算摘要,和上次发布的相同就不重发,变了才追加一条「目录更新」——这样系统提示前缀保持稳定,不会因为技能增减失效。还有一个细节:只有当前 Agent 真能看到这个 skill 工具时才发布目录,工具被限制或被同名遮蔽时,schema 和调用指引一起消失。

适合
重视前缀缓存命中率、技能集合会在会话中途变化的系统。
代价
要多一个专用 loader 工具,并维护目录的摘要与更新消息。
Pi

系统提示里一段 XML 列表,读文件即加载

和 openJiuwen 同一路线,但写得更克制:系统提示里用 available_skills 的 XML 块列出名字、描述、位置,要求任务匹配时去读完整的技能文件,并交代相对路径要按技能目录解析。frontmatter 里标了 disable-model-invocation 的技能不进列表——模型看不到,但用户仍可通过 formatSkillInvocation 主动把整份技能塞进提示。加载器(同目录 skills.ts)限制名字 64 字符、描述 1024 字符:超长只记一条警告、照常加载,缺描述的技能则跳过。

适合
想要最简单的实现,同时保留「用户可以手动调用隐藏技能」的能力。
代价
同样没有预算;描述超长只告警、不截断,技能多了照样挤占系统提示。

此后的变化

  • 2026-W42 →

    原格只描述技能列表的披露方式。durable 包新增 deferred 工具:加载前不提供给模型,由 tool_search 扩展(BM25 排序名称、描述与参数)按需加载,加载只追加在已有工具之后以保住缓存前缀;code mode 段落同样不列出未加载的工具。

  • 2026-W40 →

    按需暴露从技能扩展到工具:codemode 描述只列 MCP 服务器名,工具由脚本用 searchTools() 和 describeNamespace() 查询;deferred 级别的工具不进入声明。

  • 2026-W37 →

    本格此前只记到单文件 harness/skills.ts。本周变更显示 Pi 的按需暴露实际落在 packages/ai 的线路兼容层:延迟工具加载(defer_loading 定义 + tool_reference 加载点)新增 Fireworks Messages 通道,与 Anthropic、OpenAI 并列,且三条线路的原生表示方式各不相同。

横向读这一行

四家都只把技能的名字和描述放进上下文、正文按需读取,分歧在两处:一是目录放在哪——openJiuwen 和 Pi 写进系统提示,DeepSeek 作为会话消息发布、变了才追加更新,从而不打破前缀缓存;二是目录有没有上限——只有 Codex 给了预算(默认上下文窗口的 2%),超了先截描述、再删条目,并如实告诉用户少了几个。加载方式上,DeepSeek 有专用的 skill 工具,其余三家复用通用的读文件能力。

这个问题为什么存在

第 5 章

工具调用:MCP 与 Skills

把世界暴露给模型:协议、技能与渐进式披露