dsh-usage-monitor:侧边栏里的 token 用量与 DeepSeek 余额面板

前言

做 DSH 插件时,常见一类需求:我想知道本机每个会话每天烧了多少 token,顺便看看 DeepSeek 账号还剩多少余额。这类数据散落在本地的会话日志里,通常得开终端翻文件、写脚本,才能拼出一张按天的汇总。

dsh-usage-monitor 就是针对这个痛点:它不替代任何统计命令,只把会话日志解析成按天的汇总,再叠加一个余额卡片。下面介绍它的功能、安装方式、数据流向和局限。

这是什么

  • 维护者:Alvin-Sun6612
  • 仓库:https://github.com/Alvin-Sun6612/dsh-usage-monitor
  • 目录页:https://www.skillhub.cn/plugins/Alvin-Sun6612/dsh-usage-monitor
  • 定位:DSH(DeepSeek Harness)客户端插件,在侧边栏开一个「用量与余额」面板

它解决两件事:

  1. 按天统计本机会话的 token 用量,分今日、近 7 天、近 30 天、累计四个窗口。
  2. 显示 DeepSeek 账号余额,但需要你自己在面板里粘贴 API Key。

核心功能

下面是 README 中已核实的能力,逐条列出。

  1. 用量窗口:今日 / 近 7 天 / 近 30 天 / 累计,每个窗口给 token 总量、调用次数、缓存命中率。
  2. 今日明细:未缓存输入、缓存命中、输出。
  3. 近 30 天柱状图,悬停可看当天数值。
  4. 余额卡片:需要 DeepSeek API Key,在面板里粘贴即可,Key 存在本机。
  5. 面板名与描述提供中英两份 locale。

关于余额,README 明确写了一点容易踩坑的约束:余额接口 /user/balance 只认 API Key(sk-...)。如果只在 DSH 里登录了 DeepSeek 账号、没有 Key,面板会显示「未配置 API Key」。用量统计本身不需要 Key。

安装与启用

README 给了三条安装路径,按场景选。安装命令照抄自 README,没有自行拼接。

方式一:本机目录(开发用)

powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1
# 或指定 profile:-Profile web

装完需要重启 DSH,侧边栏才会出现「用量与余额」。这条路径假设你已经把仓库拉到本地,适合改源码的阶段。

方式二:安装 Release 里的 tgz

这是 README 标注的推荐路径,不需要 git、也不需要 npm:

# 直接装 Release 附件(推荐)
dsh plugin --profile desktop add "https://github.com/Alvin-Sun6612/dsh-usage-monitor/releases/download/v0.1.0/dsh-usage-monitor-0.1.0.tgz"

# 手上有 tgz 文件时
dsh plugin --profile desktop add .\dsh-usage-monitor-0.1.0.tgz

# 仓库装了 git 时也可以用 GitHub 直装(pnpm 会走 git,需 allowBuilds 授权)
dsh plugin --profile desktop add github:Alvin-Sun6612/dsh-usage-monitor

装完同样要重启 DSH。卸载命令:

dsh plugin --profile desktop remove dsh-usage-monitor

注意这里的 profile 固定为 desktop。如果你装完看不到入口,README 让检查 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 是否包含 dsh-usage-monitor。

它读什么、发什么

这部分决定你愿意在多大范围内信任它。README 给了一张表,下面照录重点。

项目 说明
数据来源 ~/.dsh/sessions/<工作区>/<会话>/*.jsonl.zstd,只读
解析内容 assistant/message 事件的 usage(inputTokens / cacheReadTokens / cacheWriteTokens / outputTokens)与事件时间
本地服务 127.0.0.1:46850 起只读 HTTP 服务,CORS 只放行 localhost
联网 只有配置了 API Key 后,才请求 https://api.deepseek.com/user/balance;用量统计完全离线
Key 存放 ~/.dsh/dsh-usage-monitor.json(权限 0600),面板不回显、不记录
缓存 会话文件按 (mtime, size) 缓存解析结果;余额结果缓存 60 秒

端口被占用时,可以在面板底部改端口(浏览器端记住设置),也可以直接在 ~/.dsh/dsh-usage-monitor.json 里写:

{"port": 46851}

典型用法

不必起 DSH,直接验证 Host 半

README 提供一条独立自测路径。index.js 是 Host 半,负责解析 zstd 日志、代理余额、起本地 HTTP 服务;它不依赖 DSH 运行时,可以直接跑起来:

node index.js
# http://127.0.0.1:46850/health
# http://127.0.0.1:46850/summary?days=30
# http://127.0.0.1:46850/balance
  • /health:服务是否存活。
  • /summary?days=30:用量汇总。
  • /balance:余额,未配 Key 时返回未配置状态。

/summary 返回结构(README 节选):

{
  "sessions": 22, "scanned": 22, "parsed": 22, "scanMs": 465,
  "today":  { "requests": 525, "totalTokens": 43301332, "cacheHitRate": 0.982 },
  "last7":  { "...": "同上结构" },
  "last30": { "...": "同上结构" },
  "allTime":{ "...": "同上结构" },
  "series": [{ "date": "2026-11-05", "totalTokens": 43301332 }]
}

浏览器半契约测试

修改面板逻辑后,README 建议跑一遍 19 项契约测试,覆盖浏览器半的渲染与交互:

node test/smoke.mjs

版本与发布

package.json 里的 version 是 0.1.0,license 是 MIT。README 还给了几条发布路径,这里只提醒两点:npm publish 前要 npm login,且 package.json 里得有 repository;直接发 tgz 则用 pnpm pack,产出 dsh-usage-monitor-0.1.0.tgz。

目录结构

dsh-usage-monitor/
├─ package.json          # dsh.bundle + dsh.client 声明,exports 四项
├─ cordis.patch.yml      # 组合包补丁:insert id=usage-monitor
├─ index.js              # Host 半:解析 zstd 会话日志 + 余额代理 + 本地 HTTP 服务
├─ client.js             # 浏览器半:侧边栏面板(无构建,React.createElement)
├─ locale/{zh,en}.json   # 面板名与描述
├─ icon.svg / icon.png   # 图标
├─ install.ps1           # 一键安装(UTF-8 BOM)
└─ test/smoke.mjs        # 契约测试:node test/smoke.mjs

两部分是分离的:index.js 跑在本机进程里,client.js 跑在浏览器侧边栏,中间靠 127.0.0.1:46850 的本地只读 HTTP 服务连通。想改造功能时,client.js 是面板侧,index.js 是数据侧。

自定义与上架

如果你想改名或换成自己的功能,README 给了四步:改 package.json(保留 dsh.bundle.patch);cordis.patch.yml 的 id 与 name 与包名对齐;client.js 里的 NS、PANEL_ID、PORT_KEY 和 CSS 前缀 dsh-um-* 建议一起换,避免与别的插件冲突;locale/*.json 的 meta.title / meta.description 就是市场卡片文案。

上架 DSH 插件市场(dshmarket)时,README 结论很明确:不要给 dsh-market 仓库提 PR,也不要手改 README / plugins.json / index.json,它们由 CI 生成。唯一动作是往 https://github.com/awesome-dsh-plugin/awesome-dsh-plugin 提交一个新文件 data/plugins/Alvin-Sun6612__dsh-usage-monitor.yml,条目用 category: usage。本插件的市场条目已经准备好,位于仓库内的 data/plugins/Alvin-Sun6612__dsh-usage-monitor.yml。

前置条件之一是把目录内容推到你自己的 GitHub 仓库根目录,仓库创建满 1 天,加 dsh-plugin topic。合并后市场自动重建,通常一天内可搜到。

常见问题

下面几条是 README 已列的故障与处理,挑了最常见的四条。

现象 原因 / 处理
面板提示「读不到本地服务的数据」 插件没随 DSH 重启加载,或 Host 半端口被占。重启 DSH;必要时在面板底部改端口。
余额一直是「未配置 API Key」 用的是账号登录而非 API Key。去 platform.deepseek.com 建 Key 粘贴进面板。
余额显示 HTTP 401 Key 无效或已被删除;重新生成。
今日用量为 0,但确实在用 面板按本机时区分桶;刚产生的调用需要点「刷新」清缓存。

还有一条环境坑:PowerShell 5.1 读文件要加 -Encoding UTF8,.ps1 要存成 UTF-8 with BOM。

适用场景与注意

适合这些人和场景:

  • 想按天、按窗口看本机 token 趋势,而不是只有单次调用的瞬时数字。
  • 想顺手盯 DeepSeek 余额,不想开浏览器登控制台。
  • 要做 DSH 插件、需要一个 Host 半 + 浏览器半的最小参考结构。

需要留意的点:

  1. 插件以当前 DSH 进程权限运行。安装前应读一遍源码与 LICENSE(MIT),确认它访问 ~/.dsh/sessions/ 和 ~/.dsh/dsh-usage-monitor.json 的权限你能接受。
  2. 用量统计是本机范围,只覆盖 ~/.dsh/sessions/ 下的会话日志;多机、多工作区的全局视图它不提供。
  3. 余额是插件转发的 api.deepseek.com/user/balance 结果,Key 只存在本机、面板不回显。
  4. 本地服务默认端口固定为 46850,被占用时才需要改。

结尾

dsh-usage-monitor 的价值在于把「用量统计」和「余额」这两件运维级小事收进侧边栏,Host 半离线跑、浏览器半做展示,职责切得干净。目录页在 https://www.skillhub.cn/plugins/Alvin-Sun6612/dsh-usage-monitor ,源码在 https://github.com/Alvin-Sun6612/dsh-usage-monitor 。

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

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

小夜