dsh-skill-switch:按会话控制 Skill 加载,降低未使用 Skill 的 Token 开销

前言

在 DeepSeek Harness(DSH)里,Skill 的 SKILL.md 正文是懒加载的:模型只有调用 skill 工具时才会读到正文。但 Skill 目录不是懒加载的。官方 tool-skill 在每一步之前都会把每个可被模型调用的 Skill 注入为 <available_skills> 块,因此某个会话里从未用到的 Skill,仍会在每一步产生目录描述行的开销。若希望某次对话就是纯聊天、一开始就不提供任何 Skill,原先也没有统一的入口。

dsh-skill-switch 由维护者 EdisonYang1982 发布,在 SkillHub 社区目录中归类为 工作流。它提供按会话查看与开关 Skill、三种会话姿态预设,以及将整组相互依赖的 Skill 家族移入或移出宿主 Skill Hub 的能力,目标是在「按会话」和「按家族」两个维度上减少未使用 Skill 带来的 Token 成本。

这是什么

一句话:Per-session skill switch for DeepSeek Harness——在输入框上方展示当前会话加载了哪些 Skill,可逐项关闭,也可一键保持无 Skill 的纯聊天会话;同时支持整族 Skill 挂载或停放(park)到 Hub 外。

插件以 npm 包名 dsh-skill-switch 分发,当前资料中的版本为 0.1.0,许可证 MIT。GitHub 仓库:EdisonYang1982/dsh-skill-switch;社区目录页:skillhub.cn 条目。

它针对的三层成本

README 将设计目标拆成三层,实际收益最大的是第二层:

层级 机制 节省什么
1 从目录中移除 Skill 一行描述
2 模型看不到,因而不会加载 整份 SKILL.md 正文
3 全部关闭后 skill 工具本身卸载 连 JSON Schema 也不再注入

第一层主要是为第二层服务:隐藏目录行后,模型不再知道该 Skill 存在,从而不会触发正文加载。第三层在已全部关闭时几乎无额外成本。

README 在真实 ~/.agents/skills Hub 上做过字符数对比(非 Token,便于复现):Hub 内 7 个 Skill 全开时目录约 749 字符;某一组 27 个相互依赖的 Skill 家族 停放(parked) 时目录成本为 0;同一家族 挂载(mounted) 时为 5,559 字符(平均每行约 205 字符)。要点是:仅做目录内「隐藏」仍要先发现 Skill 再渲染行;把目录移出 Hub 则注册表根本看不到,停放时成本为 0。

核心功能

会话条(Strip)

每个会话在 Composer 上方有一条可折叠的条带,展示当前会话会加载哪些 Skill,每个 Skill 有独立开关,并提供三种 姿态(posture)预设(配置中的 defaultMode 与 workSkills 与之相关,见下文)。

按会话开关

设计理由是会话意图不同:头脑风暴不必为编码工具集付目录行;「本会话不要任何 Skill」应一键可达,而不是反复和模型说明。

Skill 组(skillGroups)

部分 Skill 家族体积大且 成员间用相对路径互相引用(例如 lark-doc → ../lark-shared),无法按单个 Skill 拆分开关:只开一个会破坏引用,全部列出则每一步都付全部目录行。

Skill 组把整族 Skill 停放 在 Hub 外的 parkDir,需要时再 整组移入 hubDir:

状态 目录成本 成员所在位置
Parked 0 parkDir
Mounted 每个成员一行 hubDir

条带上以虚线/实线芯片展示组状态(例如停放时 ⬡ Feishu CLI 27),点击整组挂载或停放。

同步脚本(syncScript)

宿主从 Hub 目录 扫描 Skill,而不是从作者存放 Skill 的任意路径。若 Skill 仓库在别处(网络盘、同步目录),可配置 syncScript 指向绝对路径的同步脚本;条带会出现 Sync skills 按钮,点击后执行脚本、使目录缓存失效并刷新所有打开的条带。Hub → 条带的展示由文件监听与 SSE 自动更新;仓库 → Hub 的拷贝 ** deliberately 手动**,避免网络挂载上每次扫描的隐性成本。

替换官方 skill 工具

安装前需知:插件通过 cordis.patch.yml 禁用 @deepseek-ai/dsh-tool-skill,并注册自己的 skill 工具与会话目录实现;实现是对官方逻辑的移植并加入按会话过滤,不是在外层包一层官方插件。若你依赖官方 tool-skill 的精确行为,安装前应阅读仓库 README 中 Why it takes over tool-skill 一节。

安装与启用

资料给出两种路径:本地 link 构建,以及发布后的 profile 安装。

本地构建并 link 到 profile:

# 1. Build (inside the plugin directory)
npm install && npm run build

# 2. Link it into a profile: add to <profile>/package.json
#    dependencies: { "dsh-skill-switch": "link:/path/to/dsh-skill-switch" }
#    dsh.profile.bundles: [..., "dsh-skill-switch"]

# 3. Let the plugin resolve @deepseek-ai/* from the profile
ln -s ~/.dsh/profiles/node_modules <plugin>/node_modules

发布后(README 示例):

dsh plugin --profile web add dsh-skill-switch

安装后需 重启 DSH。插件在 DSH 进程权限下运行;安装前应自行审阅源码与 MIT 许可证,确认可接受替换官方 skill 工具的行为。

配置

默认值在插件自带的 cordis.patch.yml;与环境相关的项写在 你的 profile patch(<profile>/cordis.patch.yml),对应行 id 为 skill-switch:

- id: skill-switch
  name: dsh-skill-switch
  config:
    defaultMode: all          # posture a new session starts in: all | none | work
    workSkills: []            # skills the `work` posture enables
    syncScript: ''            # absolute path of a sync script; empty hides the control
    hubDir: ''                # absolute path of the hub the host scans (needed for skillGroups)
    skillGroups: []           # all-or-nothing bundles, see below
  • defaultMode: all 接近 stock 行为,需要时再关;设为 none 则新会话默认不提供 Skill,按需打开。
  • 使用 skillGroups 时需填写 hubDir 与每组 parkDir 等字段。

Skill 组示例(来自 README):

hubDir: '/home/you/.agents/skills'
skillGroups:
  - id: lark
    label: 'Feishu CLI'
    description: '27 Feishu skills, mounted and parked as one unit'
    parkDir: '/home/you/.agents-parked/lark'
    discover: true          # read members from parkDir; no hand-maintained list

典型用法

  1. 安装并重启 DSH 后,打开任意会话,在 Composer 上方展开 Skill 条,查看当前会话目录中有哪些 Skill。
  2. 关闭本会话不需要的 Skill,或切换到 none / work 等姿态(由 profile 中 defaultMode 与 workSkills 定义「工作」集)。
  3. 若配置了 skillGroups,在条带上点击对应芯片,整组在 Hub 与 parkDir 之间移动;长期不用的大家族建议保持 parked,避免每一步的目录行成本。
  4. 若 Skill 源不在 Hub 路径,配置 syncScript,在需要更新 Hub 内容时点击 Sync skills;成功约 2 秒后按钮恢复,失败会保留错误输出便于排查。

适用场景与注意

适合: 本地或 profile 中挂载了大量 Skill、且不同会话用途差异明显的 DSH 用户;拥有数十个相互引用、只能整族启用的 Skill 家族,希望在不使用时从 Hub 物理移出以省目录成本。

注意:

  • 插件 替换 官方 @deepseek-ai/dsh-tool-skill,升级 DSH 或 Cordis 时需关注 peer 依赖是否仍匹配(package.json 中列出了 @deepseek-ai/cordis、dsh-agent、dsh-skill 等范围)。
  • 社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标等元数据以目录页为准(当前资料中 GitHub 星标为 0)。
  • 所有安装与配置命令、字段名以上述 README 与 cordis.patch.yml 为准,勿凭插件名臆造 dsh plugin add github:... 形式。

结尾

dsh-skill-switch 把 Skill 的 Token 成本拆成「目录行」「正文加载」「工具 Schema」三层,用会话级开关和整族 park/mount 两种手段,让纯聊天和未使用的 Skill 家族不必在每一步付费。需要细节、行为差异说明与中文 README 时,可查阅 GitHub 仓库 与 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

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

小夜