🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Token 用量统计 KILLEDx/dsh-token-stats

DeepSeek Harness
KILLEDx25 天前有提交已提供中文文档扫描:含敏感能力

在设置页与悬浮窗查看跨会话 token 用量与热力图

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add KILLEDx/dsh-token-stats
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/11/04·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 25 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 43 处,展示前 40 条)
  • 读取本地文件
    lib/index.js:169
    readFile(cfgFilePath(), "utf8")
  • 写入本地文件
    lib/index.js:200
    fsSync.writeFileSync(tmp, JSON.stringify(parsed, null, 2), "utf8");
  • 写入本地文件
    lib/index.js:201
    rename(tmp, file)
  • 写入剪贴板
    lib/client.js:1333
    return navigator.clipboard.writeText(text);
  • 发起网络请求
    lib/client.js:3407
    var res = await fetch("/token-stats/summary" + (needHours(cfgLive) ? "?hours=1" : ""));
  • 发起网络请求
    lib/client.js:5127
    fetch("/token-stats/summary")
  • 发起网络请求
    lib/client.js:6604
    fetch("/token-stats/cfg")
  • 发起网络请求
    lib/client.js:6614
    fetch("/token-stats/cfg", {
  • 发起网络请求
    lib/client.js:6643
    fetch("/token-stats/cfg", {
  • 发起网络请求
    lib/client.js:6660
    fetch("/token-stats/summary?from=" + encodeURIComponent(from) + "&to=" + encodeURIComponent(to))
  • 读取本地文件
    lib/host/collect.js:47
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    lib/host/collect.js:57
    const st = statSync(p);
  • 读取本地文件
    lib/host/collect.js:155
    const buf = readFileSync(it.path);
  • 读取本地文件
    lib/host/collect.js:178
    const buf = readFileSync(it.path);
  • 读取本地文件
    lib/host/parse.js:471
    feedLines(st, decompressFrames(readFileSync(filePath)).toString("utf8"));
  • 读取本地文件
    lib/host/cache.js:89
    obj = JSON.parse(gunzipSync(readFileSync(file)).toString("utf8"));
  • 删除本地文件
    lib/host/cache.js:108
    rmSync(file, { force: true });
  • 写入本地文件
    lib/host/cache.js:120
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/host/cache.js:131
    writeFileSync(tmp, gzipSync(Buffer.from(JSON.stringify(obj), "utf8"), { level: 6 }));
  • 写入本地文件
    lib/host/cache.js:132
    renameSync(tmp, file);
  • 读取本地文件
    lib/host/cache.js:154
    obj = JSON.parse(gunzipSync(readFileSync(file)).toString("utf8"));
  • 读取本地文件
    lib/host/cache.js:170
    raw = readFileSync(src);
  • 写入本地文件
    lib/host/cache.js:176
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/host/cache.js:179
    writeFileSync(tmp, raw);
  • 写入本地文件
    lib/host/cache.js:180
    renameSync(tmp, dst);
  • 删除本地文件
    lib/host/cache.js:181
    rmSync(src, { force: true });
  • 读取本地文件
    lib/host/cache.js:200
    names = readdirSync(archiveDir());
  • 读取本地文件
    lib/host/cache.js:208
    const obj = JSON.parse(gunzipSync(readFileSync(path.join(archiveDir(), f))).toString("utf8"));
  • 读取本地文件
    lib/host/cache.js:233
    names = readdirSync(cacheDir());
  • 删除本地文件
    lib/host/cache.js:244
    rmSync(path.join(cacheDir(), f), { force: true });
  • 删除本地文件
    lib/host/cache.js:261
    rmSync(path.join(archiveDir(), f), { force: true });
  • 删除本地文件
    lib/host/cache.js:273
    rmSync(path.join(archiveDir(), f), { force: true });
  • 写入剪贴板
    lib/client.parts/06-tip.js:28
    return navigator.clipboard.writeText(text);
  • 发起网络请求
    lib/client.parts/10-modal.js:666
    var res = await fetch("/token-stats/summary" + (needHours(cfgLive) ? "?hours=1" : ""));
  • 发起网络请求
    lib/client.parts/10c-float.js:199
    fetch("/token-stats/summary")
  • 发起网络请求
    lib/client.parts/11-section.js:90
    fetch("/token-stats/cfg")
  • 发起网络请求
    lib/client.parts/11-section.js:100
    fetch("/token-stats/cfg", {
  • 发起网络请求
    lib/client.parts/11-section.js:129
    fetch("/token-stats/cfg", {
  • 发起网络请求
    lib/client.parts/11-section.js:146
    fetch("/token-stats/summary?from=" + encodeURIComponent(from) + "&to=" + encodeURIComponent(to))
  • 发起网络请求
    lib/client.parts/11-section.js:166
    fetch(url)
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 跨会话用量指标
  • 热力图展示
  • 常驻悬浮小窗

DSH设置页 Token 统计分区:跨会话用量指标、热力图与常驻悬浮小窗(读本地日志,零模型消耗)

README

由 DeepSeek 最新模型翻译生成
dsh-token-stats · Token 统计 一个 DSH Web 插件:在设置页新增「Token 统计」分区,展示跨会话的 token 用量;并在界面上常驻一个悬浮小窗。 全部数据由本地会话日志聚合得出,不发起任何模型调用,零 token 消耗。 效果预览 常驻悬浮小窗——可拖动、贴边吸附、双击展开,随时看一眼用量: 悬浮小窗演示 设置页分区——指标卡、热力图与模型分布;点击热力图方块可跳转对应日期,点击色块可设置模型颜色: 设置页分区 会话 Top——按主 / 子代理区分视图,父行显示合计并拆分主 / 子用量: 会话 Top 目录 - 常驻悬浮小窗 - 设置页分区 - 费用估算 - 套餐配额与预算告警 - 会话下钻 - 导出 - 配置文件 - 统计口径 - 数据来源与边界 - 安装 / 升级 / 卸载 常驻悬浮小窗 一个常驻在界面右下角的小窗,默认停靠,用来随时看一眼今日用量。
展开完整文档(README 剩余 1 节)
dsh-token-stats · Token 统计

一个 DSH Web 插件:在设置页新增「Token 统计」分区,展示跨会话的 token 用量;并在界面上常驻一个悬浮小窗。

全部数据由本地会话日志聚合得出,不发起任何模型调用,零 token 消耗。

效果预览

常驻悬浮小窗——可拖动、贴边吸附、双击展开,随时看一眼用量:

悬浮小窗演示

设置页分区——指标卡、热力图与模型分布;点击热力图方块可跳转对应日期,点击色块可设置模型颜色:

设置页分区

会话 Top——按主 / 子代理区分视图,父行显示合计并拆分主 / 子用量:

会话 Top

目录

- 常驻悬浮小窗
- 设置页分区
- 费用估算
- 套餐配额与预算告警
- 会话下钻
- 导出
- 配置文件
- 统计口径
- 数据来源与边界
- 安装 / 升级 / 卸载

常驻悬浮小窗

一个常驻在界面右下角的小窗,默认停靠,用来随时看一眼今日用量。

四种形态

小窗有四种形态,尺寸与内容各不相同:

| 形态 | 内容 | 尺寸 |
| 吸附态 | 贴边细条:运行状态点 + 竖排今日数字 | 24×74px,贴死屏幕边缘 |
| 折叠态 | 小横条:「Token 统计」+ 齿轮 + 状态点 + 今日数字 | 190×61px |
| 悬浮态 | 完整卡片:折叠态内容 + 热力图 + 图例 + 页脚 + 缩放把手 | 可拖拽调整 |
| 完整历史面板 | 独立浮层:全年热力图 + 汇总(合计 / 活跃天数 / 日均 / 最佳单日) | 820px 宽浮层 |

切换方式

| 想做什么 | 怎么做 |
| 从吸附态展开 | 悬停(临时预览)或双击(锁定为完整卡片) |
| 双击完整卡片 | 退回折叠态 |
| 单击 | 不改变形态 |
| 看全年历史 | 鼠标停在标题栏「Token 统计」上约 160ms |
| 拖动位置 | 按住卡片任意位置拖动 |
| 调整大小 | 拖右下角把手 |
| 折叠 / 展开 | 双击卡片 |

小窗功能

- 今日 token:大字显示当天总量。
- 热力图:9 周 × 7 天的贡献图,行 = 星期、列 = 周,左侧有「一~日」星期标。
色深分 5 档,按实际用量四分位自适应。
- 图例:卡片底部 5 个色块,说明每档大概代表多少用量。
- 点击方块看某天:点任意方块,主数字切换到该日用量,标签变为「9月30日 token」,并出现「回今天」按钮。选中日带蓝色外圈。
- 悬停方块:显示该日的输入 / 输出 / 缓存读明细。
- 完整历史面板:贴在上方展开,含月份标与汇总指标;面板内的方块同样可以点选日期。
拖动或缩放卡片时面板自动收起,松手后按新位置重现。
- 状态行:「近 9 周」+ 数据新鲜度(「刚刚更新」/「N 秒前」/「读取失败」)。
- 运行状态:有会话在跑时,卡片外框缓慢呼吸变蓝;最后一个会话结束即停止。
系统开启「减少动态效果」时降级为常亮蓝框。
- 设置直达:标题栏右侧的 ⚙ 按钮一步跳到本插件的设置页,完整配置表单就在那页上。

键盘操作

热力图支持键盘访问:Tab 进入网格(只有 1 个格子进入 Tab 序列),

| 按键 | 作用 |
| ← / → | 跨一周(±7 天) |
| ↑ / ↓ | 跨一天 |
| 回车 / 空格 | 选中该日 |
| Esc | 回到今天 |

自动停靠

当窗口未最大化时,小窗会自动最小化为贴边的细条,只保留一个状态点与竖排今日数字,尽量少遮挡内容。窗口最大化后自动恢复为完整卡片。

细条中的数字为紧凑格式(保留 4 位有效数字,如「3680万」); 悬停细条或读屏可获得精确值——一眼看大概、悬停看准确,两条路径都在。

位置与尺寸的记忆

小窗的位置、尺寸、折叠与停靠状态会记在浏览器 localStorage 中,刷新或重启后保持。

设置页分区

设置页中的「Token 统计」分区,提供完整的用量分析。

顶部指标卡

- 连续天数:当前连续使用天数 / 最长连续天数(全局口径,不随时间页签变化)。
- 累计 Token:默认随页签周期取值(每日 = 今日、每周 = 本周、每月 = 本月、累计 = 全部历史)。
点击热力图方块后,改为显示所选区块的值,并在括号中标注该区块(如「累计 Token(8月17日~8月23日)」)。
- 峰值 Token、最长单轮耗时:与累计卡同样随页签和区块联动。

Token 活动热力图

四个时间页签:每日 / 每周 / 每月 / 累计。

- 未用时段显示空心方块,有用量的按时段分档填色;
- 悬停任意方块弹出该时段明细气泡;
- 「累计」视图不重复渲染模型列表(模型明细统一由下方「模型用量分布」卡片承载)。

模型用量分布

热力图下方的常驻区块,展示模型行 + 环形饼图:

- 跟随页签周期(每日 = 今日、每周 = 本周、每月 = 本月、累计 = 全部历史);
- 点击热力图方块即覆盖为该时间区块的模型分布,标题随之更新;
- 每模型一行显示该区块的累计消耗:含缓存读写、调用次数、占比、缓存命中率,悬停另显示输入 / 输出明细;
- 右侧饼图展示各模型占比,饼心为该区块总消耗;配色按模型名稳定生成(同模型跨区块同色)。

缓存命中率口径与 OpenAI 一致:缓存读 /(输入 + 缓存读 + 缓存写),显示在卡片标题旁、各模型行副行与悬停气泡中。

性能时序

展示在「会话 Top」中,口径与 DSH 自带「会话统计」对齐:

| 指标 | 含义 |
| 用时 | 模型响应总耗时(Σ(message.time − step/start)) |
| 工具 | 工具调用次数与总耗时(按 callId 配对求和) |
| 首字 | 平均首 token 时间 TTFT(含 reasoning 时段) |
| 输出 | 输出速度(ΣoutputTokens / Σ耗时,加权平均,单位 T/s) |

行内只保留最主要的信息,工具 / 首字 / 输出等细节放在行悬停气泡中;无样本时自动省略对应项。

刷新机制

- 打开分区立即拉取数据,可见期间每 20 秒轮询一次,切走自动暂停;
- dsh web 启动后约 5 秒会后台预热一轮扫描,此后打开分区直接命中缓存(毫秒级);
- 首次安装(无缓存)打开需全量解析全部历史日志,约半分钟,之后不再需要。

删会话不丢数

DSH 删除会话会连日志一起删掉,本插件会把已解析的结果移入归档区($DSH_HOME/token-stats-cache/archive/),使历史用量仍然计入统计——删掉会话后总量不会变小。

- 归档条目只在该会话已无存活日志时参与统计,不会重复计数;
- 日志重新出现时,归档条目自动移回常规区;
- 归档区上限 2000 条,损坏条目自动跳过、不影响统计;
- 若会话尚未来得及落盘就被删除,这部分日志无法恢复。

费用估算

点分区顶部的「费用单价配置…」打开配置弹窗,为每个模型设置单价。

基本单价

每个模型可配置四项单价(单位:货币 / 每百万 token):

| 字段 | 说明 |
| 输入 | 输入 token 单价 |
| 输出 | 输出 token 单价 |
| 缓存读 | 缓存读取单价(免费可填 0) |
| 缓存写 | 缓存写入单价(免费可填 0) |

- 单价可指定币种(¥ 或 $),显示币种在弹窗内切换;
- 各币种分别合计、不做汇率折算;同时存在时显示为「¥X + $Y」;
- 未配置单价的模型不计入费用;
- 价格输入自动兼容全角数字与全角小数点。

时段单价(峰谷价)

每个模型在默认单价之外,可添加多个价格档:

- 一个价格档 = 一组四项单价 + 绑定的多个时间段;
- 每个时间段可指定生效星期(不选 = 全周),适合「周末全天谷价」这类场景;
- 支持跨零点的时间段(如 22:00~06:00);
- 时间输入自动补全:输入 9 失焦即变为 09:00,也支持输入 930;
- 费用按用量发生的本地小时 + 当天星期匹配,命中任一时间段即整档覆盖默认价;
- 都不命中时使用默认单价。

「累计」页签与每日费用为精确值;点击区块后的范围查询不含小时粒度,该卡片费用为默认单价的估算值。

历史价

定价行的「历史价(N)」按钮展开编辑块,按「生效起始日 + 当时四项单价」记录历代价格。

- 某日费用按「起始日 ≤ 该日」的最后一条计算;早于全部起始日的日期用该行默认价;
- 典型用法:把当前价填进默认单价,再补一条「改价那天 + 改价前的价」,历史账单即固定不再变动;
- 不填历史价时,所有日期都按当前价重算;
- 起始日格式为 YYYY-MM-DD,填错会在保存时报错拦下。

共享定价

一个定价条目可套用多个模型 key(适用于同一模型挂在多个 provider 下、价格完全一致的场景):

- 模型名旁的「模型 ×N」徽标,点击或悬浮弹出勾选面板(带搜索,勾选立即生效);
- 保存时校验 key 唯一;
- 首项为行主模型(置灰不可取消);
- 复制按钮可一键派生新行(含全部价格档,但共享模型不随复制)。

模型颜色

「模型用量分布」的图例色块与柱状条行首色块可点击或悬浮,弹出调色盘:

- 12 个预设色 + 原生自定义取色器 + 「恢复自动」;
- 未指定颜色的模型按 key 哈希自动配色;
- 指定色跨会话保留,饼图 / 柱状条 / 图例 / 跨时间区块全局一致。

套餐配额与预算告警

套餐配额

对应 OpenCode Go / Command Code 式订阅。一个套餐(名称 + 适用范围)内可并列多条限额:

- 适用范围:全部模型 / provider 前缀 / 指定模型;
- 每条限额独立设置计量单位(调用次数 / Token 量 / 费用)、统计周期(自然月 / 自然周(周一起)/ 滚动 7 天 / 滚动 5 小时)与限量。

按模型细分额度(共享总额度池):额度明细每行 = 模型 + 独立额度 + 当前已用%,同一行紧凑排布。

- 各模型使用率(其已用 ÷ 其额度)相加得出汇总行的「总使用率」;某模型用满自己的额度即计 100%,汇总可 >100% 表示超用;
- 支持从模型配置按 provider 整组导入;
- 总限量与明细可并存,也可只留其一(总限量留空 = 只用明细);
- 费用限额在配置时固定币种,已用只累计该币种的费用,不跨币种折算。

页面上的「套餐配额」卡片按套餐分组展示进度条:≥80% 黄色预警,≥100% 红色;汇总超限时进入顶部告警条并列出超限模型。

当前已用百分比(锚点式)

每条限额及每个模型额度明细可填写「当前已用%」,用法是:

照抄订阅站当前显示的已用百分比(这个数字已包含本机到填写时刻的消耗)。

保存时插件会记录当时的本机周期用量作为锚点,此后显示比例 = 填写值 − 锚点 + 本机实时用量 ÷ 限量,即「填写的值 + 填写之后本机的新增」,不会重复计算填写时已有的消耗。

在别处使用过之后,照抄新的数字重新填一次即可重新锚定。允许填 >100 表示超用。

预算告警

可设置日预算,支持费用与 token 双口径(任一超标即触发):

- 超标当天的热力图方块带红圈标注;
- 最新一天超标时,分区顶部展示告警条。

会话下钻

点击热力图方块后,「会话 Top」卡片展示该时间区块消耗最高的会话(Top 10)。

主 / 子代理视图

卡片头部提供四个视图按钮:

| 视图 | 内容 |
| 综合(默认) | 只列主会话;子代理会话递归折叠到对应父会话下,点父行展开 / 收起 |
| 全部 | 主 / 子平铺混合 |
| 主对话 | 只列主会话 |
| 子对话 | 只列子代理会话(含嵌套) |

- 综合视图中,父行显示合计(主自身 + 全部后代子代理),并拆分标识「合计 X(主 Y · 子 Z)」;
- 无父可挂的孤儿子代理独立成行,带醒目的「[子]」标识;
- 子代理行显示任务名称,悬停气泡包含「父会话」与「子代理任务」信息。

会话明细

- 会话名默认为 工作区编码名/uuid 前 8 位;若日志中有会话标题(含用户重命名),则优先显示标题;
- 悬停行展示完整会话目录名与输入 / 输出 / 缓存读写 / 命中率明细气泡;
- 截断的会话名可悬停查看完整名称;
- 行尾提供一键复制按钮(复制会话名称)与 ID 按钮(复制完整会话目录名)。

导出

分区顶部的两个按钮:

| 格式 | 内容 |
| 导出 CSV | 日序列逐日一行,配置单价时附费用列;带 UTF-8 BOM,Excel 直接打开不乱码 |
| 导出 JSON | totals + days(含双币种费用)+ models(含双币种费用)+ 币种 / 导出时间 |

配置文件

$DSH_HOME/token-stats.cfg.json 是全部费用配置的唯一权威存放位置(Windows 默认位于 %USERPROFILE%\.dsh\token-stats.cfg.json)。

包含:定价(pricesJson)、套餐(plansJson)、模型颜色(colorsJson)、预算、显示币种。

- 首次打开分区页时,会自动把浏览器中已有的旧配置播种进该文件;
- 此后在弹窗中点保存即实时写回文件;
- 直接编辑该文件后刷新页面即可生效,无需再在弹窗里逐项点;
- 换浏览器或清缓存都不会丢失配置。

浏览器 localStorage(键 dsh-token-stats.cfg.v1)仅作首帧即时缓存。

配置文件结构

pricesJson 每个条目的字段:

| 字段 | 说明 |
| key | 主模型 key |
| keys | 共享同一份定价的其他模型 key 数组 |
| currency | CNY 或 USD |
| input / output / cacheRead / cacheWrite | 默认单价(每百万 token) |
| tiers | 价格档:四项单价 + ranges: [{s, e, days}] |
| rates | 历史价:[{from: "YYYY-MM-DD", input, output, cacheRead, cacheWrite}],按生效起始日升序 |

某日费用取「from ≤ 该日」的最后一条历史价;早于全部 from 的日期使用默认价。

让 AI 帮你改价

把新价写进默认价四项,并在 rates 里补一条「改价生效日 + 改价前的价」,历史费用即固定不再漂移。

统计口径

合计 = 输入 + 输出 + 缓存读 + 缓存写,与 DSH 聊天统计条一致(各平台账单均把缓存读写计入消耗,仅单价不同)。所有总量展示处都带缓存读写标识。

模型归属:会话中途切换模型会产生多条模型记录,每个用量步骤归属到「序号不晚于它的最近一条模型记录」;无法归属的用量记为「未知模型」。

调用次数 = 去重后的用量步骤数(一个步骤 = 一次模型响应)。

会话标题:以日志中最新的标题事件为准,因此用户重命名后会自动跟随。

数据来源与边界

- 数据来自本地会话日志:$DSH_HOME/sessions/**/session.jsonl.zstd(旧格式)与同目录 session.v3.jsonl.zstd(新格式);两者并存时只读新格式(其为完整历史);
- 已结束的步骤按下标去重,跨文件复制产生的事件也会被识别并去重,不会重复计数;
- 零模型消耗:不注册工具、不注册提示词区块、不发起任何 LLM 调用;
- 实时性上限为秒级准实时——用量随步骤结束上报,日志按批落盘,因此有数秒延迟,不是逐 token 实时。

HTTP 接口

宿主半提供两条路由,仅回环地址(本机)可访问,供高级用法直接取数:

GET /token-stats/summary(可附加 ?hours=1 获取小时粒度明细)

{
"totals": { "grandTotal": 0, "grandCache": 0, "peakDay": 0, "peakDayCache": 0, "longestTurnMillis": 0, "currentStreak": 0, "maxStreak": 0 },
"firstDate": null,
"days": [{ "date": "YYYY-MM-DD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0, "total": 0, "maxTurn": 0 }],
"models": [{ "key": "provider/model", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0, "total": 0, "calls": 0 }],
"periodModels": { "today": [], "week": [], "month": [] }
}

days 自首个有用量日起逐日稠密(含零日);models 为全局按模型汇总(按 total 降序)。

GET /token-stats/summary?from=YYYY-MM-DD&to=YYYY-MM-DD 按任意日期范围聚合各模型用量(含端点日)。

GET/POST /token-stats/cfg 读写配置文件(原子写,请求体上限 512KB)。

安装 / 升级 / 卸载

环境要求

| 依赖 | 版本 |
| DSH | >=0.1.7-alpha.1 <0.2.0 |
| Node.js | >=22.15(读取会话日志依赖 Node 内置的 zstd 解压) |

插件没有独立的设置表单,全部配置都在设置页的「Token 统计」分区里完成。

方式一:桌面版面板(推荐)

DeepSeek Harness 桌面版自带插件管理界面,不需要命令行:

1. 打开左侧的 「插件」 页(副标题为「安装、启用和配置插件」)。
2. 点右上角的 「+ 添加插件」。
3. 在「包名或地址」输入框里填入下面任意一种写法(三种等价):

- github:KILLEDx/dsh-token-stats
- https://github.com/KILLEDx/dsh-token-stats
- git+https://github.com/KILLEDx/dsh-token-stats.git

4. 点 「安装」,等进度走完。
关于「安装源」下拉:它只影响按 npm 包名安装的情况(默认安装源 / npm 官方源 / 中国大陆镜像源 / 自定义地址)。填 GitHub 地址时不经过安装源,而是本机直连 GitHub——所以国内网络若连不上 GitHub,请改用方式二并自行配置代理。

卸载:在「插件」页点开 Token 统计 这一项进入详情页,点右上角的 「卸载」(垃圾桶图标)并确认。

方式二:命令行

适用于 web、tui 等由命令行管理的 profile(<你的 profile> 换成你的 profile 名,可用环境变量 DSH_PROFILE 查看):

从 GitHub 安装
dsh plugin --profile <你的 profile> add "github:KILLEDx/dsh-token-stats"

或从本地目录安装(必须是绝对路径)
dsh plugin --profile <你的 profile> add "<本插件目录的绝对路径>"

卸载
dsh plugin --profile <你的 profile> remove dsh-token-stats

⚠️ desktop profile 的额外要求:桌面版的 profile 由应用自身管理。用桌面版自带的 dsh 命令装它时,官方要求该 profile 已由桌面版初始化(即桌面版至少启动过一次),并建议先完全退出桌面版再执行;用独立安装的 dsh CLI 则会被直接拒绝,报 profile "desktop" is managed exclusively by the Electron application。桌面版用户直接用方式一最省事。

方式三:让你的 AI 助手代装

把下面整段发给你正在用的 AI 助手即可(DSH 里的助手,或其他 agent 都行):

请帮我安装 DSH 插件 dsh-token-stats,按下面步骤做:

1. 先确认环境:DSH 版本需满足 >=0.1.7-alpha.1 <0.2.0,Node.js 需 >=22.15,并确认当前 profile 名(环境变量 DSH_PROFILE)。
2. 如果 profile 是 desktop:不要用命令行,直接告诉我按这个路径手动装——打开「插件」页 →「+ 添加插件」→ 填 github:KILLEDx/dsh-token-stats →「安装」。
3. 其他 profile 执行:
dsh plugin --profile <profile> add "github:KILLEDx/dsh-token-stats"
4. 装完提醒我重启 DSH,并让我确认设置页出现了「Token 统计」分区、界面上出现了悬浮小窗。
5. 如果失败,把完整报错原文发给我,不要自行猜测原因、不要擅自改用其他安装源。

装完要重启

插件在 DSH 启动时加载,安装后需重启 DSH 才生效(面板会提示「更改将在下次启动生效」)。

升级

安装后暂不支持自动更新,升级请先卸载再装新版:

dsh plugin --profile <你的 profile> remove dsh-token-stats
dsh plugin --profile <你的 profile> add "github:KILLEDx/dsh-token-stats"

升级前建议先备份配置文件(见配置文件)。

许可

本项目以 MIT 许可证发布,详见 LICENSE。

开发过程中参考的第三方项目见 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓KILLEDx/dsh-token-stats
分享 · DeepSeek Harness Hub
KILLEDx/dsh-token-stats

在设置页与悬浮窗查看跨会话 token 用量与热力图

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部