dsh-xixi-cost
给 DeepSeek Harness(DSH)Web UI 加两处人民币花费估算:
- 每轮回复底部:紧贴「用量 X tok」右边显示本轮花费,例如
≈¥0.042。 - 输入框下方统计行:紧跟「用量 X tok · 缓存命中」显示整个会话的花费,例如
≈¥0.42。
两处都可以点一下弹出和官方「用量」胶囊同样式的小面板,点外面或按 Esc 关闭。
这是非官方插件,所有金额都是按公开价目表 + token 用量估算出来的参考值, 实际扣费以 DeepSeek 官方账单为准。
效果
DeepSeek 回复……
[复制] [反馈] [分支] 用量 443.7k tok ≈¥0.042 10:34
┌ 输入框 ──────────────────────────────────┐
│ … │
└──────────────────────────────────────────┘
12 轮 · 45 步 · 18.2 tok/s 443.7k tok · 缓存命中 91% ≈¥0.42 ◔82%
弹层内容(会话那颗按每轮实际结束时刻的价目逐轮累计,进行中的本轮按当前时段补差):
整个会话花费 ¥0.42
──────────────────────────────────────────────────
模型 deepseek-flash / deepseek-v4-pro
时段 高峰 ¥0.30 + 空闲 ¥0.10
缓存命中输入 9,812,005 tok = ¥0.3925
未命中输入 62,881 tok = ¥0.1258
输出(含思考) 37,073 tok = ¥0.2966
其中进行中本轮 ¥0.0032
合计 ¥0.42
按每轮结束时刻的价目逐轮累计;进行中的本轮按当前时段估算……
安装
需要较新的 DSH 桌面版(Web GUI)。插件是纯前端 bundle,没有第三方依赖、不需要构建。
# 从 GitHub 安装(仓库根目录就是包根目录,可以直接装)
dsh plugin --profile desktop add github:xixi0v0/dsh-xixi-cost
# 建议锁定 commit,避免上游变动:
dsh plugin --profile desktop add github:xixi0v0/dsh-xixi-cost#<完整 commit 哈希>
# 本地开发:直接链到源码目录
dsh plugin --profile desktop add D:\Project\dsh-xixi-cost
也可以直接把仓库地址发给别人:https://github.com/xixi0v0/dsh-xixi-cost, 对方执行
dsh plugin --profile desktop add github:xixi0v0/dsh-xixi-cost即可。 前提:能访问 GitHub,并且本机装了 Git(pnpm 会用git ls-remote解析仓库; 没有 Git 会报ERR_PNPM_GIT_RESOLVE_FAILED)。把desktop换成对方实际使用的 profile 名即可。
装完 / 改完代码后,必须重启一次桌面版 DSH 才会生效(DSH 启动时读一次组合清单)。
如果你之前装过旧名字
dsh-turn-cost,请先移除再装,否则两个插件会同时渲染、出现两份标签:dsh plugin --profile desktop remove dsh-turn-cost
卸载 / 升级
# 卸载
dsh plugin --profile desktop remove dsh-xixi-cost
# 升级:重新 add 一次(或换成新的 commit 哈希/分支)后重启 DSH
dsh plugin --profile desktop add github:xixi0v0/dsh-xixi-cost
本包在 package.json 里标了 "private": true,只从 GitHub 分发、不发布到 npm;
如果以后要发 npm,删掉这个字段即可。
价目表
取自 DeepSeek 官方页 https://api-docs.deepseek.com/zh-cn/quick_start/pricing (2026-11-03 读取),单位:人民币 / 百万 tokens。
| 模型 | 缓存命中输入 | 缓存未命中输入 | 输出 |
|---|---|---|---|
deepseek-flash(高峰) |
0.04 | 2.00 | 8.00 |
deepseek-flash(空闲) |
0.02 | 1.00 | 4.00 |
deepseek-v4-pro(高峰) |
0.30 | 9.00 | 27.00 |
deepseek-v4-pro(空闲) |
0.15 | 4.50 | 13.50 |
- 高峰时段 = 北京时间周一至周五 09:00–12:00、14:00–18:00(不含法定节假日); 其余时间、周末为空闲时段,价格恰为高峰的一半。
- 思考(reasoning)token 计入输出,按输出价计费。
- 单轮如果有多个模型尝试(重试),按第一个能识别出价目的路由计价。
价目变了就改 lib/client.js 里的 PRICES_CNY_PER_M(模型别名在 MODEL_ALIASES),
然后跑一遍自检再提 PR。
实现方式
- 两个客户端插槽:
conversation.chat.assistant-actions(每轮结束那条操作按钮行)→ 本轮花费;conversation.composer.dock(输入框下方统计行,官方activity/usage两颗就在这) → 会话花费,注册order: 2,所以紧跟在usage(order 1)右边。
- 每轮的数据用聊天快照里这一轮已经算好的
turn-tail.tokenUsage分桶,按本轮结束时刻的 价目与路由计价; 会话花费也是逐轮累计:遍历快照里的所有turn-tail,每轮用它自己的用量、结束时刻和 路由算一遍再求和,所以会话跨高峰/空闲、中途换过模型都按实际分布算;然后把 Host 的tokenUsage投影(整份会话日志的 token 总量)比已完成轮次多出来的 token 当作「进行中的 本轮」,按当前模型、当前时段补一笔。两者都不额外扫日志、不改会话事件、不影响模型请求。 逐轮花费按turn-tail对象缓存(一轮关闭后用量不再变化),长会话也不会重复算。 - 每轮标签的位置:那一行原本是
[复制][反馈][分支][用量][时间],「用量」和时间戳装在一个span里。插件用两条结构性 CSS 规则(以[data-turn-tail]/[data-clock="end"]定位), 当「用量 + 时间」两段都在时把那个span摊平,并给时间戳order:2, 于是顺序变成[用量][本轮花费][时间]。结构一变规则就匹配不上,标签退回行末,不会弄坏界面。 - 明细面板用
react-domportal 挂到document.body,避免被滚动容器裁掉。 - 颜色、圆角、阴影全部走
--dsw-*主题变量,浅色 / 深色主题与字号设置都自动跟随。
已知限制
- 法定节假日没有单独区分:本机判断节假日不可靠,工作日一律按高峰规则算, 节假日当天的高峰时段会略高估(最多高估一倍)。
- 每轮跨高峰/空闲边界时,以本轮结束时刻的计价;属于近似。
- 会话合计 = 已完成轮次的逐轮花费之和 + 进行中本轮的估算,因此和输入框上方官方 token 总量不完全同步(进行中部分仍会随使用量实时增长)。
- 认不出价目(非 DeepSeek 路由 / 未知模型)的轮次不计入会话金额;它们的 token 仍计入 分桶展示,只是不折算成钱。
- 非 DeepSeek 路由或认不出价目的模型,标签直接不显示,避免给出错误数字。
- 官方单独计费的 Search / Fetch 请求费(5 元 / 1000 次)不计入。
- 每轮只覆盖「完成一轮」之后:本轮进行中还没有最终用量;会话胶囊则随 token 实时增长。
- 简洁(compact)模式下官方不显示 token 用量,本插件仍会显示;需要的话可以改成跟随隐藏。
- 依赖 DSH 客户端插槽与聊天快照的内部结构;DSH 大版本升级后如果界面结构变了, 最坏情况是标签不显示,不会让聊天界面报错。
目录结构
dsh-xixi-cost/
├─ package.json # 包身份 + dsh.bundle / dsh.client 声明
├─ cordis.patch.yml # 往 profile 里插入 xixi-cost 这一行
├─ lib/
│ ├─ index.js # 宿主半侧:只占位
│ └─ client.js # 浏览器半侧:价目折算 + 插槽注册 + 弹层
├─ locale/
│ ├─ zh.json # 插件管理器显示名/说明(中文)
│ └─ en.json # 同上(英文)
├─ test/verify.cjs # 无依赖离线自检
├─ icon.svg # 插件图标
├─ CHANGELOG.md
├─ LICENSE # MIT
└─ .github/workflows/ci.yml # 跑 test/verify.cjs
命名约定(改包名必读)
这个插件里有 5 个名字,规则不同;其中 3 处是硬绑定,改包名时千万别漏:
| 名字 | 位置 | 规则 |
|---|---|---|
| ① 包名 | package.json 的 name |
守 npm 命名规则(全小写、URL 安全字符、≤214 字符)。同时是浏览器模块身份 |
| ② 插件标识 | cordis.patch.yml 的 id + lib/index.js 的 @module |
无格式要求,但必须唯一(patch 按 id 定位,撞了会覆盖别人的行) |
| ③ 本地化命名空间 | lib/client.js 的 NS + 槽位注册的 locale |
必须等于包名,否则插件管理器里的翻译对不上 |
| ④ 样式 / 属性前缀 | lib/client.js 的 xixicost_* 类名与 data-xixi-cost* |
带前缀防撞,可以自由改,但要和自检脚本一起改 |
| ⑤ 显示名 | locale/*.json 的 meta.title / description |
随喜好,中文/空格/符号都行 |
三条硬绑定:
lib/client.js第一段window.__ModuleLoader__.load({ id: ... })必须逐字等于package.json的name。不一致浏览器就找不到这个插件。cordis.patch.yml里的name:必须等于包名;id:要唯一。lib/client.js的NS(本地化命名空间)必须等于包名,槽位注册的locale: NS才会生效。
test/verify.cjs 会静态检查这三条,改完名字跑一遍就能发现问题。
开发与自检
没有构建步骤,也没有第三方依赖。自检脚本会在 Node 里用最小 React/ReactDOM 桩
加载真实的 lib/client.js,校验:
- 包名 / 插件 id / 模块 id / locale 命名空间的静态一致性,以及旧名字残留;
- 逐轮价目折算(高峰、空闲、模型别名、重试路由、非 DeepSeek 路由);
- 会话花费的逐轮累计(跨高峰/空闲、跨模型)、进行中补差、投影滞后与未知模型边界;
- 会话明细行与逐轮明细行;
- 按
messageId找turn-tail、最近路由兜底; apply注册的两个插槽(slot 名、id、order、locale);- 两个组件渲染出的按钮文案与
aria-*/data-*属性。
node test/verify.cjs
# 或者
npm test
GitHub Actions 会在 push / PR 时用 Node 20 与 22 各跑一遍。
改名历史
- 2026-11-03:开源时从内部名
dsh-turn-cost改为dsh-xixi-cost。 同步更新了包名、插件标识(xixi-cost)、浏览器模块 id、locale 命名空间、 CSS 类前缀(xixicost_)与 data 属性(data-xixi-cost)。 旧安装与新包同时存在会出现两份标签,迁移时先移除旧的。
许可证
MIT © 2026 xixi0v0
这是一个个人开源项目,与 DeepSeek 官方无关。金额仅为估算,请以官方账单为准; 价目表若变动,欢迎提 issue / PR。
No comments yet. Be the first to write one.