前言¶
在 DeepSeek Harness(DSH)里装了一堆 skill 之后,常见问题是:本机到底有哪些、当前这场对话里模型或用户真的触发了哪几个、各触发了几次,很难从聊天界面一眼看清。靠翻会话记录或自己记名字,成本高,也不利于调 prompt 和 skill 编排。
dsh-skill-meter 把「本机清单」和「本会话真实用量」做成 dsh-better-sidebar 的一个侧边栏页面:右侧栏 + 菜单选「Skill 用量」,页头显示点亮数与总数,逐条列出 skill 的命中次数与首末轮次。下面介绍它的定位、数据来源、安装方式与使用注意。
这是什么¶
- 插件名称:dsh-skill-meter(仓库 mengge237/dsh-skill-meter)
- 维护者:mengge237
- 分类:客户端(双面板包:Node 侧注册数据路由,浏览器侧挂到 better-sidebar)
- 版本(package.json):0.2.3,MIT,要求 Node >= 24
一句话:DSH 技能用量面板——本机装了哪些 skill、当前会话真的用过哪几个,命中次数与首末轮次一目了然。侧边栏按会话隔离,数字对应当前对话,不是全局累计。
核心功能¶
侧边栏「Skill 用量」页¶
装好并启用后,在 Web 客户端右侧栏 + 菜单里选择「Skill 用量」。页头为 点亮数 / 总数(例如 1 / 59 已点亮),并标注数据来源与会话轮次信息。
每条 skill 一行:
- 用过:点亮(绿点),并显示次数、首次/最近第几轮、触发方式(模型通过
tool/call加载 skill,或用户/名字直接触发)。 - 未用过:压暗显示。
- 可按「全部 (N)」等过滤查看。
页头来源标记有实际含义:官方 skills/list 表示清单来自宿主接口(含 whenToUse、modelInvocable 等,改 SKILL.md 不必重启);磁盘兜底 表示未拿到 Remote 时退回读 ~/.agents/skills/*/SKILL.md 的 frontmatter。
数据从哪儿来¶
0.2 起口径分为两条读口:
- 清单:宿主 Remote
skills命名空间,方法skills/list,请求{ sessionId },响应{ skills: [{ name, description, whenToUse?, modelInvocable }] }。客户端通过inject: ['betterSidebar', 'remote', 'remote.skills']与宿主dsh-client-ui-skill同类方式使用;清单变更可订阅skills/change,另有约 20s 刷新兜底。 - 本会话用量:无官方接口,插件只读会话存档(
~/.dsh/sessions),解析tool/call(skill 名)、skill-invocation消息与存档中的<skill_content name="...">。存档为追加式多帧 zstd,使用 Node 24 自带zlib.zstdDecompressSync按帧魔数逐帧解压。
HTTP 聚合接口:GET http://127.0.0.1:3080/dsh-skill-meter/data.json(可选 ?session=<id> 指定会话)。多开会话时可用查询参数对准某场对话。
分组与排序(视图层)¶
自 0.2.3 起,页头下拉分组仅影响展示顺序,不决定有哪些 skill;清单仍以 skills/list 为准。配置写在 ~/.dsh/skill-view.json,服务端每次请求现读,改完保存并刷新页面即可,无需重启 dsh web。
示例结构:
{
"version": 1,
"groups": [
{ "name": "运行时", "skills": ["dsh-local-runbook", "dsh-plugin-dev"] },
{ "name": "额度与成本", "skills": ["free-llm-pool"] }
]
}
未写入任何组的 skill 落在「(未归组)」,不会因未配置而从页面消失。可用 skill-center-map 脚本一键生成初始分组(与上游分类账之后各归各,不再自动同步):
python ~/.agents/skills/skill-center-map/scripts/catalog.py --seed-view
幽灵 skill 与边界提示¶
- 底部列出「存档里用过、本机清单里没有」的名字(改名或已删的 skill)。
- 「点亮但不在 catalog 快照里」会单独提示,便于发现磁盘上有但本会话未发给模型的情况。
设置页开关¶
通过 registerTab 接入宿主后,设置页「侧边卡片」分区会自动出现本页的开关,无需第三方再塞一张外来设置卡片(旧方案已移除)。
安装与启用¶
安装前建议先停掉正在运行的 dsh web。装进 web profile 后会写入 package.json 依赖、dsh.profile.bundles、node_modules 软链与 lock。
从 registry 安装(README 注明仓库尚未公开发布 npm,发布后才走 registry):
dsh plugin --profile web add dsh-skill-meter
从本地源码开发(link: 指向本地目录,改源码即时生效):
dsh plugin --profile web add <仓库根>/plugins/dsh-skill-meter
生效条件:
- 修改 服务端
lib/index.js(路由、存档解析等)后需 重启dsh web(会打断当前会话)。 - 修改 浏览器侧
lib/client.js一般 刷新页面(Ctrl+R) 即可。
卸载:
dsh plugin --profile web remove dsh-skill-meter
安装后自检¶
先验服务端(本机 loopback,curl 不受浏览器同源限制):
curl -s "http://127.0.0.1:3080/dsh-skill-meter/data.json" | head -c 200
期望看到 ok:true 及 skills[]、lit/total、skillsRoot 等字段。路由由插件自行校验来源(loopback、非跨站等),不满足返回 403,且不携带 Access-Control-Allow-Origin。
再开 GUI:右侧栏应有「Skill 用量」;设置页「侧边卡片」应有对应开关。若未出现,依次检查:dsh plugin --profile web list 是否包含本包、package.json 中 dsh.bundle.patch 与 dsh.client.platform、浏览器控制台是否有 cannot get module 或 betterSidebar 相关报错(未装侧边栏时插件仅 warn,不拖垮页面)。
不启动 dsh 时可在仓库内跑:
node test/selftest.mjs
node test/routes.mjs
node test/client-smoke.mjs
典型用法¶
- 安装插件并重启
dsh web(若刚改服务端)。 - 打开一场会话,在右侧栏
+→ Skill 用量,查看点亮数 / 总数与每条 skill 的命中与轮次。 - 需要自定义分组时编辑
~/.dsh/skill-view.json,保存后刷新侧边栏页。 - 多会话调试时用
curl带session查询参数核对指定会话存档解析结果。
会话 id 为带 session- 前缀的完整字符串(与侧边栏 scope.sessionId、会话目录名一致);只传 uuid 片段也可命中,找不到会话会明确报错,不会误落到其他会话。
适用场景与注意¶
适合:在本机 DSH Web 上长期开发、调试 skill 的开发者;需要对照「装了什么」和「这场对话实际用了什么」做复盘或减负 skill 列表时。
权限与只读边界:插件以当前 dsh 进程权限运行,安装前应阅读仓库源码与 MIT 许可证。全程只读 ~/.agents/skills、~/.dsh/sessions,不写 dsh 数据;缓存仅在内存,依存档 mtime+size 避免重复解压。
依赖:需要 dsh-better-sidebar 生态的侧边栏扩展点;清单依赖较新宿主的 remote.skills 与 skills/list,过旧宿主会走磁盘兜底。
发布状态:README 写明仓库当前为私有、未发 npm,定位为本机自用与后续上游 PR 素材;社区目录页见 SkillHub 插件条目(与 DeepSeek / 幻方无官方从属,属社区收录)。
结尾¶
dsh-skill-meter 把 skill 清单与会话存档里的真实触发记录接到 better-sidebar 一页里,清单走宿主 skills/list,用量走磁盘存档解析,分组用 skill-view.json 只做视图。需要核对数据时可用本机 curl 访问 data.json;日常在右侧栏「Skill 用量」即可查看。
- 目录页:https://www.skillhub.cn/plugins/mengge237/dsh-skill-meter
- GitHub:https://github.com/mengge237/dsh-skill-meter