dsh-skill-router-and-gate:为 DSH 增加三层 Skill 控制

前言

DeepSeek Harness(DSH)会把完整 Skill 目录注入每一轮对话,并默认由模型自行决定何时用 skill 工具加载哪一项。在长会话里,目录从第一条消息起就存在,却可能几千轮都不被真正加载——短名单可以提示,但提示不等于约束。

dsh-skill-router-and-gate(斜杠命令与环境变量短名 skill-gate)在目录之上叠三层:路由每轮给出候选,闸在工具执行前硬性拦截,可选策略层用项目自有的 JSON 绑定受管命令与证据。仓库由 yuanfeng637-cmyk 维护,许可证 MIT;社区目录页见 SkillHub,源码见 GitHub。

这是什么

一句话:在 DSH 的 Skill 生态里,用「每轮短名单 + 格式加载闸 + 可选合规策略」把「该用的 Skill 真的被加载、该绑定的命令真的按证据执行」从建议变成可执行的规则。

插件通过 Cordis 在 agent/pre-step 挂一行路由逻辑,在 tools/pre-execute 做闸;不注册新工具、不 patch 已有 Cordis 行,移除 bundle 即恢复 DSH 原行为。README 标注当前行为版本 v33(逐版变化见仓库 CHANGELOG.md);npm 包版本为 0.5.0。

核心功能

路由层(Router)

每一轮在进程内用一次 LLM 裁判读取当前会话的 Skill 目录快照,注入 ranked 短名单(系统 reminder:候选 Skill 名称、理由,并提示用 skill 工具按精确名称加载)。裁判超时、报错或输出无效时,由九路词法打分器兜底。候选来自 live catalog;不可由模型调用的 Skill、以及本会话已加载的 Skill 会被过滤(可通过 DSH_SKILL_GATE_INCLUDE_LOADED 改变后者)。

若 DSH 原生 <available_skills> 块缺失,插件可代为注入目录(DSH_SKILL_GATE_CATALOG_FALLBACK,默认开启)。

执行闸(Gate)

在 tools/pre-execute 上:若工具调用涉及受管格式(xlsx / docx / pptx / pdf / csv-tsv),且本会话从未加载对应 Skill,调用被拒绝(deny),并提示加载该 Skill 后重发同一命令。已加载状态与目录快照按 session(agent) 跟踪,不同会话互不影响。同一 Skill 连续拒绝达到 DSH_SKILL_GATE_SKILL_GATE_MAX_DENY(默认 3)次后,为防死锁会放行(格式加载闸保留该行为)。

加载成功会写入 skill-loaded,并同步路由账本的 loaded;这证明加载发生,不证明 Skill 全文被遵守。

合规策略层(Policy,可选)

未设置 DSH_SKILL_GATE_POLICY 时,插件不猜测项目标准。设置后须指向项目自有的策略 JSON 绝对路径:用 protect 命中受管命令,用 actions[].command 固定完整命令文本;绑定输入/脚本/引用 SHA256、用户裁定与来源 SHA256、先前验证命令及输出片段;同会话成功证据 30 分钟 TTL。策略是数据,trace 账本记录决策,不做自然语言解读。

README 还描述内置示例:加载 bioinformatics-toolkit 后,首次裸跑 mafft / iqtree 等前,需同会话内先有独立 --help / -h 的成功输出(独立版本查询放行但不计帮助证据)。达到 wall ≥300 秒、CPU ≥1800 秒、输出 ≥100 MiB、请求 ≥100 次等阈值时,须声明假设、至少一项已成功的便宜验证及中止条件——四项为显式估计,非插件对任意进程的资源配额。

审计默认追加到 ~/.dsh/skill-gate-compliance.ndjson,可用 DSH_SKILL_GATE_COMPLIANCE_TRACE 改路径。新增依从闸无「拒绝三次后放行」退路;策略错误或缺失会拒绝 shell 工具,可用 /skill-gate off 或 kill switch 恢复。

Answer gate(可选,默认关闭)

对 llm/stream 的数值溯源等检查仅在 DSH_ANSWER_GATE=warn|block 时启用;未设置时插件不注入、不包裹、不改写最终回答。

安装与启用

环境要求(来自 README 与 package.json):

  • Node:^22.19.0 || >=24.0.0
  • DSH:>=0.1.5-rc.1 <0.3.0-0(开发与验证目标 0.2.0-rc.2)
  • @deepseek-ai/dsh、@deepseek-ai/dsh-llm、@deepseek-ai/dsh-skill 为 optional peer,由 profile 提供

安装示例(安装后须重启 DSH,插件代码不热加载):

# 本地 checkout
dsh plugin --profile <profile> add "file:/abs/path/to/dsh-skill-router-and-gate"

# 从 GitHub(npm 解析 spec 并由包管理器 clone)
dsh plugin --profile <profile> add "github:yuanfeng637-cmyk/dsh-skill-router-and-gate"

# HTTPS 不可达 GitHub 时用 SSH
dsh plugin --profile <profile> add "git+ssh://git@github.com/yuanfeng637-cmyk/dsh-skill-router-and-gate.git"

主开关 DSH_SKILL_GATE 默认 true;格式硬闸 DSH_SKILL_GATE_SKILL_GATE 默认 true。短名单数量 DSH_SKILL_GATE_TOPK 默认 3;裁判 DSH_SKILL_GATE_JUDGE 默认 true,超时 DSH_SKILL_GATE_JUDGE_TIMEOUT_MS 默认 8000。完整环境变量表见仓库 README「Configuration」一节。

典型用法

会话中你会看到什么

  1. Shortlist:本轮系统 reminder 列出候选 Skill 及理由;不适用则忽略。
  2. Catalog fallback:原生目录块缺失时由插件补全并标注。
  3. Gate refusal:工具不执行,消息指明应加载的 Skill;加载后重发同一命令。

斜杠命令

命令 作用
/skill-gate status 闸状态、会话账本、各 Skill 拒绝计数、版本
/skill-gate on / /skill-gate off 运行时总开关
/skill-gate eval <fixtures.json> 进程内跑路由 fixture,不污染运行时

路由 fixture 评估

需要离线验证路由逻辑时,在 DSH 内执行:

/skill-gate eval <fixtures.json>

具体 fixture 格式以仓库文档为准。

开启项目合规策略

  1. 按仓库 docs/DESIGN.md 编写策略 JSON。
  2. 设置绝对路径,例如:
export DSH_SKILL_GATE_POLICY=/abs/path/to/your-policy.json
  1. 重启 DSH 后,受管命令须满足策略中的 hash 与证据链;审计写入 compliance trace 文件。

适用场景与注意

适合谁:长 horizon 的 DSH 智能体开发——依赖 xlsx/docx 等格式 Skill、又希望模型不能「跳过加载直接调工具」;或在生物信息、重计算流水线里需要「先 help、再跑命令」等可审计规则的团队。

权限与安全:插件与当前 DSH 进程同权限运行;策略 JSON 应由人工审阅与保管,README 明确不提供防止 agent 改写策略的隔离。安装前请自行阅读源码与 MIT 许可证。SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。

局限:没有回复发布闸,日志不能保证模型在最终回复里展示证据或不说「已完成」;后台、远端、复合 shell 等场景的退出码与科学语义仍需执行端或人工核验。

结尾

dsh-skill-router-and-gate 把 Skill 使用从「目录一直在、模型自己猜」改成「每轮短名单、格式调用必须先加载、可选策略绑定精确命令与证据」。若你在 DSH profile 里堆了大量 Skill,可先装默认两层路由+闸,再按需用 DSH_SKILL_GATE_POLICY 收紧项目命令。

  • 目录页:https://www.skillhub.cn/plugins/yuanfeng637-cmyk/dsh-skill-router-and-gate
  • GitHub:https://github.com/yuanfeng637-cmyk/dsh-skill-router-and-gate
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye