Skip to content
dsh.fish
Bundle

dsh-v-token-insight

V Token Insight · Token 洞察 —— DSH Web 会话 token 统计插件:第三页签(KPI/图表/每轮明细)+ 回复尾部轻量消耗显示 + 跨会话 Token统计总览(侧栏座位入口,全会话 KPI/工作区/会话/时间/模型维度 + 本地逐步账本)+ 按可维护价目表的费用折算

Source
victor10035445
License
MIT
Updated
Updated 5 days ago

Readme

# dsh-v-token-insight · V TOKEN INSIGHT(Token 洞察)

**简体中文**  | [English](README.en.md)

DeepSeek Harness Web 客户端的 **Token 统计与费用洞察插件**——把会话与工作区的 token 消耗、缓存命中与折算费用变成随时可见的数据面板。

纯客户端、零内核改动:不替换、不禁用任何官方插件,数据全部来自宿主既有投影与会话窗口。

## 功能一览

| 入口 | 能力 |
|---|---|
| **侧栏座位 → Token统计总览**(整页) | 全会话 KPI(计费 Token / 计费输入 / 输出 / 缓存命中率 / 会话计数 / 费用)+ 五个维度页签:总览图表(消耗趋势 / 模型分布 / 项目占比 / 费用趋势)、按工作区、按会话(明细表 + 搜索/排序/列宽拖拽/右键跳转)、按时间(双口径)、按模型、价格表 |
| **会话页第三页签「会话Token统计」** | 单会话 KPI(计费四卡 + 首字延迟 / 生成速度)、上下文占用压力条、每轮明细表(四桶 / 命中率 / 折算费用,行点击跳回对话对应轮,行首展开逐步调用明细) |
| **回复尾部轻量显示** | 官方功能行内追加 `⏱耗时 · ≈费用 · token 总量 (↑输入 ↓输出)`,悬停显示完整计价依据 |
| **本地逐步账本** | 逐 (会话, 轮, 步) 沉淀消耗记录,支持按会话深度补全、一键重建、JSON 备份/恢复、压缩老化与孤儿清理——归档会话的消耗也能回溯 |
| **价目表与费用折算** | 可维护价目表(四桶单价 / 分档 / 时段折扣 / 币种守卫),逐步计费即时重算,绝不「总量 × 单价」近似;无匹配条目不显示费用(不猜价) |

图表全部手写 SVG/HTML(零图表库依赖),颜色全走官方主题令牌随明暗主题联动,尊重 `prefers-reduced-motion`;每个图表都配表格替代(无障碍)。

## 安装

**方式一 · GitHub 地址直装(推荐)**——构建产物 `lib/client.js` 随源码入库,安装无需本地构建:

```
dsh plugin --profile web add "github:victor10035445/dsh-v-token-insight"
```

如需锁定版本(后续推送不会悄悄改变实际运行的代码):

```
dsh plugin --profile web add "github:victor10035445/dsh-v-token-insight#<commit-sha>"
```

装完**重启 `dsh web`**,刷新页面生效。

**方式二 · 本地 clone + link 直连**(免打包,改动后重启 `dsh web` 生效,适合开发调试):

```
git clone https://github.com/victor10035445/dsh-v-token-insight.git
dsh plugin --profile web add "link:<克隆路径>"
```

**方式三 · tgz 打包安装**:

```
pnpm install && pnpm build   # 产出 lib/client.js
npm pack                     # 产出 dsh-v-token-insight-0.3.0.tgz
dsh plugin --profile web add "<tgz 的绝对路径>"
```

> **注**:与零构建的 `dsh-v-theme` 不同,本插件源码(`src/`)经 esbuild 打包为客户端 bundle。直装/直连使用仓库内已构建的 `lib/client.js` 即可;若你修改了 `src/`,需先 `pnpm install && pnpm build` 再重启生效。

## 使用

- 侧栏底部「**Token统计**」座位 → 打开跨会话总览整页(归档会话同样可见可查);
- 任意会话页顶部第三页签「**会话Token统计**」→ 查看当前会话的轮级明细与逐步调用;
- 回复尾部查看每轮轻量消耗;明细表内右键可跳转会话或复制会话 ID;
- 总览页「**价格表**」页签维护价目表(编辑器内可对齐官方模型目录),费用随价目即时重算;
- 账本沉淀在浏览器 `localStorage`(`dsh-v-token-insight.ledger.v1`),价目表(`dsh-v-token-insight.prices.v1`)与列宽偏好(`dsh-v-token-insight.colwidths.v2`)同样本地持久化——清空浏览器数据后可在总览页一键重建账本。

## 技术原理

| 机制 | 说明 |
|---|---|
| 插件形态 | 纯客户端插件:`cordis.patch.yml` 把插件挂进 cordis loader,`dsh.client.inject` 声明引导基线(runtime / locale / ui-layout / ui-conversation / ui-sidebar),client-modules 自动把 `lib/client.js` 编入 `/plugins` 启动图 |
| 双层数据口径 | Tier 0 = 宿主列表行投影(`tokenUsage` / `sessionStats` 等,O(1) 有界状态、全会话权威总量);Tier 1 = 本地逐步账本(键 `(sessionId, turn, step)`,支持离线深度补全) |
| 每轮明细 | 读会话窗口节点 `usage / timing`,并从轨迹视图 `requests[]` 按 `(turn, step)` join 补全每步模型与调用参数 |
| 计费 | L1 四桶单价 → L2 双维度分档(上下文规模 / 会话累计)→ L3 时段窗口 × 条目折扣,逐步计算即时呈现不落库,币种不符的步按「未定价」处理 |
| 图表 | 手写 SVG 布局原语(堆叠条 / 横条 / 折线 + `niceScale` 整刻度),零依赖、颜色全走 `--dsw-alias-*` / `--dsw-static-*` 令牌 |
| 构建 | esbuild → factory 形式 `lib/client.js`(react / `@deepseek-ai/*` 全部 external);`pricing / stats-fold / charts` 等纯函数模块可在 node 下直接单测 |

宿主端 `lib/index.js` 是无逻辑的空插件,仅让 cordis loader 能解析本包。

## 开发

```
pnpm install
pnpm build   # esbuild → lib/client.js
pnpm check   # node --check 两个产物
pnpm test    # node --test 纯函数单测(94 例)
```

## 文件

```
package.json          插件清单(dsh.bundle.patch + dsh.client 声明)
cordis.patch.yml      loader 插入条目
build.mjs             esbuild 构建脚本(src/ → lib/client.js)
lib/index.js          宿主端入口(空插件)
lib/client.js         客户端 bundle(factory 形式,随源码入库)
src/                  客户端源码(client.jsx + pricing/ledger/stats 等纯函数模块)
test/                 纯函数单测(node --test)
docs/                 开发者向内部实现档案(zh / en)
```

更多实现细节(注册点速查、页面锚点与样式钩子、联调风险清单)见 [内部实现档案](docs/zh/internals.md)([English](docs/en/internals.md))。

## License

[MIT](LICENSE)

Install

dsh plugin --profile web add github:victor10035445/dsh-v-token-insight

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source