Repository navigation
技能目录的触发规则存在结构性缺陷:常驻型技能永远不会被加载,whenToUse 字段对模型完全不可见 #9375
Replies: 5 comments
|
Thanks for the thorough report — I verified both halves against
One thing worth adding: both gaps are already reachable from a plugin today, without core changes — so the capability can ship before the core feature lands.
I'm building that as a plugin (catalog |
|
感谢你独立核实了两部分——我逐条验证了你列出的钩子,你的判断是对的: 但有两点需要补充。 一、这个临时插件恰恰证明问题存在,而不是解决了问题 你说的技术在今天确实都可用。但这正是原始报告——以及另一份关于桌面客户端的报告(#9369)——所担心的事:一项基础能力的缺口,最终由社区插件补上,而不是由项目本身补上。这件事有四个具体影响:
二、临时插件替代不了核心修法 插件可以追加一条指引消息、可以预加载正文。但它做不到:
所以插件只是缩小了症状,设计缺口依然敞着。有用,但不等于解决。 我的请求:
说明一点:以上不是对你工作的批评。核实报告并做一个临时修复,这件事本身很有价值,有总比没有好。我反对的是这个模式,不是你。 |
|
再补充一点,这条可能比前两条更能说明问题的普遍程度。 DSH 几乎从不主动调用技能。 我观察到的情况是:技能目录虽然每轮都会注入,但模型基本不会自己去调用
这两个例子合起来说明:问题不只是「常驻型技能没有触发路径」(我上一条报告的那个),而是整个自动调用机制在实践中基本不工作。 我认为原因是叠加的:
结果是:技能目录变成了一个「需要用户记住有哪些技能、再手动点名」的功能,而不是一个自动生效的扩展机制。对技能作者来说,等于他们精心写的触发条件基本不起作用。 我不确定这是否有意为之(例如出于 token 成本的考虑)。如果是有意的,希望文档能明确写清「技能默认不会被自动调用,请依赖用户显式点名」;如果不是,那这就是技能系统当前最该修的地方——优先级应排在 |
|
Following the seam analysis above: both halves of this report are now available as a published plugin, so a deployment can close them today without patching a core package.
npm install @argszero/dsh-skill-residency- insert:
- id: skill-residency
name: '@argszero/dsh-skill-residency'What it does, at
Both messages are durable, so a resident skill survives compaction: the plugin re-publishes when the plan changes and after the message leaves the model-visible surface ( It is deliberately inert: a deployment whose skills declare no Two notes for whoever picks up the core side, since this is a workaround and not the fix:
Verified against |
|
感谢你真的把它做出来了,而且我注意到你在最后两段里用的判断和我的报告是一致的—— 我也核对了你的发布:npm 上 但正因为如此,我想把一件事说得更明确一些,因为它是这个帖子真正的重点。 你这个插件的存在本身,恰好演示了 #9369 里批评的那个模式。 这不是针对你。你在上一条里已经明确说了「这只是权宜之计,不是修复方案」,还主动写了两条给核心侧的说明——你的立场和我的报告是一致的。但客观结果是:一个今天创建、零星标、单人维护的包,现在成了这个缺口的「可用解决方案」。而缺口本身在核心侧依然敞着。 这正是问题所在。我在 #9369 里列过四条理由,放在这里同样成立:
所以我请求的是:不要让这个插件成为核心侧不作为的理由。 具体来说:
对看到这条的维护者:这个帖子的结局是社区成员自己写插件补上了缺口。如果这就是项目对基础能力的态度,希望明确说出来;如果不是,希望给出排期。目前 #9375 和 #9369 两条帖子都还没有官方回应。 最后,再说一次:以上不是对你工作的批评。你核实了报告、承认了问题性质、还把权宜之计和修复方案分得很清楚——这比很多官方回应都更负责。我反对的是这个模式,不是你。 |
Uh oh!
There was an error while loading. Please reload this page.
摘要
DSH 的 skill(技能)系统存在两个相互关联的缺陷。第一,目录注入给模型的触发规则只覆盖「任务匹配」这一种情形,导致输出风格类、常驻类技能永远不会被加载——哪怕技能作者在描述里明确写了「每次会话开始时加载」。第二,
whenToUse字段被解析、被校验、被传给界面,但从不进入模型可见的任何输出,官方文档也承认了这一点。第一个缺陷是设计缺口,第二个是已记录但未修复的功能空转。两者叠加的后果是:技能作者写在元数据里的意图,对模型而言等于不存在。
一、常驻型技能永远不会被加载
事实
会话开始时注入的目录消息,结尾指令原文如下(
@deepseek-ai/dsh-tool-skill的renderCatalogMessage):这条规则只有两个触发条件:用户点名,或任务明确匹配技能描述。
问题
这两个条件都预设了「技能绑定某个具体任务」。但有一类技能不绑定任何任务——它们约束的是输出形式本身。这类技能永远不「匹配」任何一次具体任务,因此永远不触发。
具体实例:本机安装的
i-have-adhd技能,其描述含以下文字:这段话是技能作者写给模型的直接指令。但它在实际使用中从未生效,必须由用户每轮手动点名。
已排除的其他原因
为免被归因于配置问题,以下均已核查:
catalogDescriptionMaxLength默认值 500invocation默认modelInvocable: true、userInvocable: truename、description齐备,YAML 合法真正的原因就是触发规则本身:没有「无条件加载」这一触发路径。
缺少机制
全库搜索,不存在任何常驻加载字段:
@deepseek-ai/dsh-skill-filesystem解析的 frontmatter 字段为:name、description、whenToUse、metadata、disable-model-invocation、user-invocable。其中没有任何一个能让技能常驻加载。后果
目前唯一能让指令常驻生效的路径,是把内容写进
AGENTS.md(由@deepseek-ai/dsh-agent-instructions注入)。这意味着:技能系统无法表达「常驻」这一语义,用户被迫绕过技能系统,改用另一套机制。对技能生态而言,这是能力缺口。任何希望提供「全局输出规范」「统一回复风格」「团队编码约定」的插件作者,都无法通过技能系统实现,只能引导用户手工编辑
AGENTS.md。而技能系统正是官方主推的扩展机制。二、whenToUse 字段对模型完全不可见
事实
whenToUse是一个被官方支持的 frontmatter 字段,语义是「何时使用本技能」。它被完整地解析、校验、并随技能摘要传递给界面层。但面向模型的两处渲染,都没有使用它:
1. 目录条目只含两个字段(
catalogSourceEntries):渲染时也只输出这两项(
renderCatalogEntries):2. skill 工具返回给模型的内容不含 whenToUse:
3. 渲染给模型的
<skill_content>包装层只含 name 与 content(renderSkillContent)。计数佐证:
whenToUse在@deepseek-ai/dsh-skill中出现 14 次(校验与传递),在@deepseek-ai/dsh-tool-skill中出现 0 次——即负责面向模型渲染的那个包,从不读取该字段。官方已承认
@deepseek-ai/dsh-tool-skill的 README 在「已知限制与延期工作」中原文写道:也就是说,这不是未知问题,是已记录但未修复。
后果
这构成一个功能性矛盾:官方提供了一个字段让作者声明使用场景,又把它从模型的全部视野中删除。
whenToUse,得到零收益——模型永远看不到它。description。而description同时承担「给人看的简介」和「给模型看的路由依据」两种职责,当作者按常规写法把它写成简介时,路由准确率必然下降。whenToUse(dsh-api-session-controller传递该字段),但客户端 UI 也未使用(dsh-client-ui-skill中 0 处引用)。该字段目前处于全链路空转状态:解析它、校验它、传递它,却没有任何消费者。三、这两件事叠加起来是什么
单独看,第一条是缺一个字段,第二条是少一行渲染。叠加之后,问题的性质变了:
技能系统无法表达「无条件生效」,而唯一能表达「何时生效」的字段又不可见。
结果是技能作者与模型之间不存在可靠的意图传递通道:
AGENTS.md;whenToUse写了也白写,模型看不见。对使用者而言,表现为技能时灵时不灵、需要人工点名;对生态而言,表现为技能作者无法可靠控制技能的生效时机。
四、请求
为技能增加常驻加载能力。建议在 frontmatter 中增加字段(例如
always-load: true),使标记的技能在每次会话的首次请求前即注入正文,而非仅出现在目录中。这对输出风格类、全局规范类技能是必需的。让
whenToUse真正到达模型。既然字段被官方支持并已通过校验,就应至少渲染进目录条目(例如以- \name`: description | when to use: ...的形式),或进入<skill_content>` 包装层。若判定该字段确无用途,请在文档中明确说明并考虑移除,而不是维持「可填写但永不生效」的状态。修正目录注入的指令措辞。当前措辞只描述「用户点名」与「任务匹配」两种触发路径,未提及任何其他情形。建议明确说明:对于要求全程生效的技能,模型应如何处理——或明确说明当前不支持此类技能,以免作者产生错误预期。
在文档中明确技能的生效语义。当前文档描述了目录与加载工具的行为,但未明确回答「技能能否常驻」这一作者最关心的问题。请补充说明。
五、复现方式
环境:DeepSeek Harness
0.2.0-rc.2(desktop profile),Windows 11。~/.agents/skills/下放置一个技能,其description中写明「每次会话开始时加载本技能」(示例:i-have-adhd)。skill工具加载该技能。~/.dsh/AGENTS.md中写入同样的要求,则每轮自动生效——证明缺的是技能系统的常驻机制,而非提示内容本身。说明:以上结论均基于对
app.asar中@deepseek-ai/dsh-skill、@deepseek-ai/dsh-skill-filesystem、@deepseek-ai/dsh-tool-skill、@deepseek-ai/dsh-client-ui-skill及@earendil-works/pi-ai的源码核查,以及官方 README 的原文引用。未修改任何 DSH 安装文件。All reactions