Repository navigation
Releases
v0.6.4 — 计价审计:压缩成本补算 + Search API 按次计费建模
一句话
新模型(DeepSeek-V4.1-Flash-1017 / DSH 0.2.1-rc.2)上把插件所有计价路径重新算了一遍:算术是对的(独立重算与插件输出逐位一致),发现并修掉 2 个漏算/未建模项,另有 1 项无法在会话内证实——如实写在最后。
🔍 怎么复核的
不是看代码猜,而是三路对齐:
- 独立重算:自己写脚本从原始
session.v4.jsonl.zstd重算今日成本,与插件路由对比 →0.61913696vs0.61913696,逐位一致 - 对官方页:解析后的费率(
pricingSource: synced)与 DeepSeek 定价页 完全一致:Flash 命中 0.02/0.04、未命中 1/2、输出 4/8 - 对语义:
totalTokens = inputTokens + outputTokens + cacheReadTokens在今日 925/925 条 usage 事件上成立;峰谷/节假日/时区规则 5 个夹具用例回归通过
🐛 修了什么
1. 上下文压缩的成本此前完全漏算
compaction/summary 事件带 usage 却被解析器忽略。这是一次真实的模型调用:典型一次约 14 万 cache-read 输入 + 3.5k 输出 ≈ ¥0.017。最近 30 天 37 次,约占对话成本的 0.64%。
现已计入当天 / 工作区 / 全工作区成本;因为它没有 turn 字段,不会被算进「最近一次提问」(lastTurnCost 显式跳过)。
2. Search API 的按次计费此前未建模
官方定价页新增了一段:Search / Fetch 按成功请求计费 ¥5 / 1,000 次,且明确"在 DeepSeek Harness / Claude Code / Codex 中使用 DeepSeek API 时已通过服务端工具调用访问,目前未计费,2026 年 11 月 1 日 00:00 起按次收费"。
web_search 的每个查询是一次 Messages 调用(服务端 web_search_20250305 工具,最多 max_uses 次搜索),所以:
- 2026-11-01 00:00(北京时间)之前:只算 token(原行为)
- 之后:每次搜索额外 + ¥0.005
- 日志只记录请求、不记录实际发起了几次服务端搜索 → 按「每次查询 1 次」估算(偏下限),已在 README 写明
web_fetch走本地 HTTP 抓取(dsh-web-fetch-http),不涉及官方 Fetch API,不计费
🧪 验证
新增 11 项夹具断言(每个自带独立假 $HOME,走真实路由 + 真实 zstd 帧 + 真实定价表),全部通过:
PASS 压缩计入 today-cost(¥2.01) PASS 搜索 10-31 只有 token(¥0.014)
PASS 压缩排除在 last-prompt 外(¥2.00) PASS 搜索 11-02 含 ¥0.005(¥0.033)
PASS 压缩计入 today-this-session PASS 11-01 00:00 边界准确(¥0.019)
PASS 仅有压缩的会话 last-prompt = 0 PASS 国庆工作日仍为谷时(¥1.00)
ℹ️ 已知且有意不建模 / 待办
- 2027 年节假日表尚未发布:国务院通常在上一年 11 月公布,2027-01-01 起插件会退回"仅排除周末",元旦那天会被算成峰时。表一发布补上即可
- 会话标题生成(
session/title-llm-request)日志里没有 usage,未计入:约 200 tokens/次、30 天 36 次,量级 <0.01% - Pro 费率不随官方页自动同步(只解析左列 Flash);当前与官方一致
⚠️ 没能证实的一项(如实写)
想用「余额差值」做端到端标定,但发现余额接口只到分、且要几分钟才结算完:静默 12 分钟观察到 47.17 → 47.17(确认没有后台消耗),可一旦跨着未结算的扣费,短窗口的"实际/估算"比值从 0.5 到 2.7 都出现过 —— 不可信。
要真正确认绝对精度,得用「结算完成 → 跑一批固定工作 → 等结算完成」的对照(半天量级),本次会话内做不到。顺带说:2026-09-22 那次"低估约 1.8 倍"的结论用的是同一种受结算延迟干扰的测法,数字可能被高估了,值得哪天重测。
📦 升级
dsh plugin --profile web add dsh-balance-widget # Web
# 桌面版:侧边栏「插件」面板安装,或写进 ~/.dsh/profiles/desktop/package.json升级后需重启 dsh web 或桌面版生效。
📄 文档
v0.6.3 — 中国法定节假日全天按空闲时段计价(修一个 2× 计价 bug)
一句话
修一个会让你以为花的钱是实际两倍的计价 bug:中国法定节假日落在工作日时,此前被按高峰时段(2×)计价。今天正好是国庆假期——从这一版起,10/1–10/7 全天按空闲时段计。
官方规则(定价页注释(2)):北京时间周一至周五(不含中国法定节假日) 9:00–12:00、14:00–18:00 为高峰时段;其余时段,包括周末及中国法定节假日全天均为空闲时段。
🐛 修了什么
这个插件的峰/谷判断只排除了周六周日,没有排除法定节假日,于是落在工作日的法定假日被按 2× 计价 —— 卡片上的"今日花费"最多翻倍,峰/谷状态标签也会显示错。
依据 国办发明电〔2025〕7号(2026 年部分节假日安排),全年 33 天节假日中 19 天落在工作日,全部受影响:
| 节日 | 落在工作日的假日 |
|---|---|
| 元旦 | 1/1(四)、1/2(五) |
| 春节 | 2/16–2/20(一–五)、2/23(一) |
| 清明 | 4/6(一) |
| 劳动节 | 5/1(五)、5/4(一)、5/5(二) |
| 端午 | 6/19(五) |
| 中秋 | 9/25(五) |
| 国庆 | 10/1、10/2、10/5、10/6、10/7 |
调休上班的周六/周日本来就是对的(周末规则已覆盖,官方同样按空闲时段计费),这次一并写进测试用例防回归。
✨ 怎么修的
- 内置 2026 年法定节假日表(33 个 Beijing 日历日)+ 按北京时间日历日匹配;
isPeak()现在依次排除:周末 → 法定节假日 → 再判断 09:00–12:00 / 14:00–18:00 - 峰值状态本来只在宿主端计算,客户端没有第二套逻辑(已确认),所以一处修复即全部生效
- 峰/谷 tooltip 中英双语改准:"不含法定节假日 / 含调休上班日"
⚠️ 这张表需要每年更新(国务院办公厅通常在上一年 11 月发布下一年安排);未覆盖的年份会退回"只排除周末"的旧行为,不会报错
🧪 验证(差分,不是推断)
新建 14 个夹具会话,每个自带独立假 $HOME,走真实路由 + 真实 zstd 帧 + 真实定价表:
PASS 国庆 10-01(四) 10:00 ¥1.00 PASS 调休 10-10(六) 10:00 ¥1.00
PASS 国庆 10-05(一) 15:00 ¥1.00 PASS 调休 09-20(日) 15:00 ¥1.00
PASS 国庆 10-07(三) 10:00 ¥1.00 PASS 普通工作日峰窗 ¥2.00 ×4
PASS 春节 02-18(三) 10:00 ¥1.00 PASS 节后首日 10-08(四) ¥2.00
PASS 端午 06-19(五) 15:00 ¥1.00 PASS 午休 13:00 / 晚间 19:00 ¥1.00
PASS 中秋 09-25(五) 10:00 ¥1.00 14/14 通过
用修复前的代码跑同一组用例:6 个节假日用例全部失败(期望 ¥1.00,实得 ¥2.00)—— 这就是本次修复的量化证据(1,000,000 缓存未命中输入 token,空闲 ¥1.00 / 高峰 ¥2.00)。
📌 关于这个插件的当前阶段
按上一版(0.6.2)的说明,本插件已进入告别期:后续只跟随 DSH 版本做必要的兼容性与正确性维护,不扩展新功能。这一版属于「正确性维护」——计价算错就该修,跟是否会有官方替代无关。
📦 安装 / 升级
# Web(默认 profile)
dsh plugin --profile web add dsh-balance-widget
# 桌面版(DeepSeek Harness.app)——侧边栏「插件」面板安装,
# 或把包加进 ~/.dsh/profiles/desktop/package.json 的依赖与 dsh.profile.bundles升级后需重启 dsh web 或桌面版生效。
📄 文档
v0.6.2 — 余额改读官方账号服务(与设置页同源)· 进入告别期
一句话
桌面版 0.2.0 已经能在**登录后的「设置 → 账号与余额」**里看到余额了,但要多点几下才看得到,日常仍然不如侧边栏常驻一眼可读——所以这一版还是做了适配:余额改读官方账号服务,与设置页逐分一致,并且不再需要 API Key。同时也坦白说:官方已经把这个痛点接过去了,我们准备进入告别期。
✨ 这次改了什么
1. 兼容 DSH 0.2.0 的插件闸门(0.6.1,未单独发布,并入本版)
DSH 0.2.0 新增了插件兼容性闸门(dsh-app-boot 的 evaluatePluginCompatibility):它把 peerDependencies 里每个 @deepseek-ai/dsh / @deepseek-ai/dsh-* 范围与运行时版本比对,且预发布版本参与范围匹配(semver.satisfies(..., { includePrerelease: true }));不匹配且未被豁免的 bundle 会在启动时被静默跳过(loadProfileDirectory 收进 skippedBundles,不报错、也不改 manifest)。
旧声明 >=0.1.2-rc.1 <0.2.0 恰好覆盖 0.2.0-rc.1(所以在 0.2.0-rc.1 桌面上一切正常),但不覆盖 0.2.0 正式版——桌面版一升级,侧边栏卡片就会直接消失,插件管理器还会要求 dsh plugin allow-version 手动豁免。现放宽为 <0.3.0。
这不是推测:直接 import 装在本机的那份 0.2.0-rc.1 里的真函数,喂本插件的真实 manifest:
BEFORE (>=0.1.2-rc.1 <0.2.0) AFTER (>=0.1.2-rc.1 <0.3.0)
dsh 0.2.0-rc.1 OK dsh 0.2.0-rc.1 OK
dsh 0.2.0 INCOMPATIBLE dsh 0.2.0 OK
dsh 0.2.1 INCOMPATIBLE dsh 0.2.1 OK
dsh 0.3.0 INCOMPATIBLE(边界如预期)
2. 余额改读官方账号服务,与设置页同源(0.6.2)
官方账号提供方 @deepseek-ai/dsh-deepseek-account-platform 在宿主里注册的服务名是 deepseekAccount(凭据 key 的拼写 deepseek-account-platform 是另一回事,别混)。它就是「设置 → 账号与余额」页的数据来源:
- 已登录(DSH ≥ 0.2.0):余额读
deepseekAccount→ 卡片与设置页同一个数字,金额按官方规则正金额截断至分,充值余额取value[]、赠金取bonusWallets[],总额为两者之和,多币种各自成组 - 未登录 / 旧宿主(0.1.x)/ 账号读取失败:一律回退到原来的
GET /user/balance+DEEPSEEK_API_KEY,行为与 0.6.1 完全相同 - 🔑 登录态下余额不读任何密钥,纯账号模式(不配 API Key)也能显示余额
- 🔎 余额响应新增
balanceSource字段(deepseekAccount或回退路径),随时能确认这一次的数字从哪来
🧪 验证
真机实测(2026-09-29,桌面版 0.2.0-rc.1,重启后):
| 来源 | 数值 |
|---|---|
官方 account/getBalance |
¥55.0685054200000000 |
插件卡片/接口(balanceSource: deepseekAccount) |
¥55.06 |
逐分一致;真实 GUI 里卡片、弹层五档、峰时标签、去充值全部正常,控制台 0 异常。
另有 13 项路由级断言(假 cordis ctx 驱动真实路由):账号映射、多币种与赠金求和、截断到分、未登录回退、服务缺失回退、账号抛错回退并告警、账号优先于 API Key、agent 计费工具同源,以及"凭据 key 的拼写不能被误当成服务名"这条防回归。
💬 关于告别期
桌面版 0.2.0 把余额页放进了设置里,说明官方已经承认"用户需要随时知道余额"这个痛点。只是它要多点几下,日常用起来仍然不如侧边栏常驻、一眼可读——这也是这一版存在的理由。
但我们不装作看不见:官方既然已经把这个需求接过去了,这个插件被替代只是时间问题。有点不舍,不过工具的价值本来就应该由平台自己长出来。接下来进入告别期:后续只跟随 DSH 版本做必要的兼容性维护,不再扩展新功能。
谢谢一路用它看住余额的每一天。
📦 安装 / 升级
# Web(默认 profile)
dsh plugin --profile web add dsh-balance-widget
# 桌面版(DeepSeek Harness.app)——桌面版侧边栏「插件」面板安装,
# 或把包加进 ~/.dsh/profiles/desktop/package.json 的依赖与 dsh.profile.bundles升级后需重启 dsh web 或桌面版生效。
📄 文档
v0.6.0 — 适配 DSH 桌面版,界面与桌面端视觉对齐
桌面版来了,插件也跟着适配了
DSH 出桌面版(0.1.7 / DeepSeek Harness.app)之后,这个插件在桌面端基本不可用:成本相关的档位全部报错,卡片还可能在你点开弹层的瞬间整条消失。这次把 web 版和桌面版拉到同一条线上,并按桌面端的视觉语言把界面重做了一遍。
一、桌面端为什么跑不起来(三个都是"沉默失败")
- 找不到
zstd:插件此前 spawnzstd -d -c解压会话日志。桌面版由 GUI 启动,进程 PATH 只有/usr/bin:/bin:/usr/sbin:/sbin,Homebrew 装的 zstd 不在其中 —— 「今日花费 / 最近一次提问」在桌面端直接报错。现改用 Node 内置 zstd(node:zlib),不再依赖任何外部命令。 - v4 会话日志是多帧拼接:日志 append-only,每次 flush 追加一个独立的 zstd 帧(实测一份 726 KB 的 v4 日志里有 97 帧)。Node 的一次性解压只返回第一帧(258 B)—— 不报错,静默丢掉 99% 以上的数据,这比报错更危险。现在按帧魔数逐帧解码,v0 / v3 / v4 三种日志与
zstd -dc输出字节级一致。 - 图标改名导致整卡崩溃:0.1.7 把产品图标改为尺寸中性权重(
IconRefreshOutlineRegular+size属性),旧名IconRefreshOutline14已不存在。把它当组件渲染会抛 React #130,而侧边栏槽位对崩溃条目的处理是整条摘掉 —— 这正是「卡片闪一下、一点开就消失」的原因。现在按可用名解析,并带本地 SVG 兜底。 - 顺手清掉了
dsh.client.inject里那个从来不存在的包名(@deepseek-ai/dsh-client-runtime)。
二、界面按桌面端视觉重做
- 去掉卡片的状态边框(谷时绿框看着像「被选中」),峰/谷改为金额前的 6px 状态圆点
- 填充色、12px 圆角、14px 金额字号全部对齐桌面端会话行在用的设计 token
- 卡片占满侧边栏列(此前被 flex 压缩到 131px 宽并横向溢出 8px)
- 新增侧边栏收起态:在 56px 图标轨里渲染 36×36 图标按钮(与轨道其它按钮同规格),状态圆点变为角标
- 弹层改挂
document.body:侧边栏列是overflow:hidden,收起态下弹层会被裁到只剩左边一小条;现在面板宽度跟随卡片(打开时实测,240px 起),并用ResizeObserver在拖动侧边栏 / 缩放窗口时实时跟随 - 阴影与焦点环改用桌面端 token(
--dsw-shadow-lv3、--dsw-focus-ring-*)
三、仍然是同一个包、同一条分支
Web 版与桌面版共用同一份代码、同一个 npm 包。宿主差异(会话日志代数、zstd 来源、图标命名、侧边栏展开/收起)全部在运行时自适应,不需要分叉维护。
完整改动:v0.5.5...v0.6.0
安装(web):dsh plugin --profile web add dsh-balance-widget
安装(桌面版):装进 desktop profile(~/.dsh/profiles/desktop),装完重启桌面版
v0.5.5 — 修复 README 在 npm 包页面上的显示
修什么
README 里的两张截图和语言切换用的是仓库相对路径(docs/screenshot-corner.png、README.en.md)。npm 包页面只渲染 README 正文,不解析仓库内相对路径,所以在 npm 上两张截图和语言链接都是坏的。
改成什么
- 截图 →
https://raw.githubusercontent.com/LL-cmyk-so/dsh-balance-widget/main/docs/screenshot-corner.png(popover 同理,两个 URL 均已验证 200) - 语言切换 → GitHub blob 链接
- 顺带核查全文:无内嵌 HTML、无页内锚点、无其他相对链接
范围
仅文档,代码无变化。
v0.5.4 — 计入搜索调用(此前全部漏算)
怎么发现的
两条线索连着来:
- 先是周末峰谷误判(v0.5.3):周六白天插件显示「峰时」,而官方规则是周一至周五 09:00–12:00、14:00–18:00 才算高峰(其余含周末全天为空闲时段)。顺着定价页脚注确认后修掉。
- 修完价格口径去对账,发现插件显示的「今日花费」和账户余额差值对不上:2026-09-22 实测余额差约为插件数字的 1.8 倍。差得不像四舍五入,于是去翻会话日志。
怎么定位的
- 扫描
~/.dsh/sessions当天全部会话日志,按顶层事件类型统计:web/前缀只有一种事件 ——web/deepseek-search-llm-request。 - 这是
@deepseek-ai/dsh-web-search-deepseek在派发前写的 log-only 事件,内容只有 endpoint / apiVersion / 请求体(约 280 字符:查询词 +web_search工具定义),没有 usage 字段。该包官方文档也写明:它只发出派发前事件,不产生可关联的权威 dispatch 事件。 - 所以每次
web_search的每个查询都是一次独立的辅助 Messages 调用(默认deepseek-v4-flash),而它的 token 用量在本地任何文件里都不存在。任何「读会话日志计价」的实现都必然漏算 —— 这不是本插件独有的 bug,是这个数据源的固有缺口。 - 量级:2026-09-22 单日 1073 次搜索请求,全部没进账。
怎么标定的
既然拿不到权威 token 数,就用余额差值(唯一真相)反解单次成本:
- 同一窗口内记余额 B0 = ¥48.34、B1 = ¥48.06(差 ¥0.28),并统计窗口内搜索次数 = 14;
- 从会话日志算出「可精算的对话部分」= ¥0.094;
- 搜索实付 = 0.28 − 0.094 = ¥0.186 → ¥0.0133 / 次(谷时);
- 换算成 token:约 6k 缓存未命中输入 + 2k 输出,套用同一张峰谷价表 → 谷时 ¥0.014 / 峰时 ¥0.028,与实测相差 5%。
怎么改的
parseSessionUsages()新增解析web/deepseek-search-llm-request,按turn/start把它归到当轮,模型读body.model(配置成 Pro 就按 Pro 计价);- 新增
priceSearchTurn()/sampleCost()/sampleTokens(),四处成本聚合(最近提问 / 今日·本会话 / 今日·本工作区 / 今日·所有工作区)统一走这套; - 搜索结果进入全部层级:属于哪个会话、哪个工作区、哪一轮,归因是精确的;只有单次金额是估算。
验证
- 从改后的文件里抽取真实函数执行:谷时
¥0.01400/ 峰时¥0.02800/ 周六 10:00¥0.01400(v0.5.3 的周末修复仍成立);合成 JSONL 测得搜索事件正确归到 turn 2。 node --check通过。
已知局限
- 搜索部分是估算值(±30% 量级);余额到账约 2 分钟时延,标定窗口据此对齐。
- 会话正文部分仍是按日志精算。
- 余额差值是唯一权威口径,插件数字用于归因与趋势;对账时请以余额差为准。
v0.5.3 — 修复周末被误判为峰时
修什么
峰/谷判断只看小时、不看星期,导致周末 09:00–12:00、14:00–18:00 被误判为峰时并按 2× 计价,「今日花费」最多翻倍。
依据
官方定价页脚注原文:高峰时段为北京时间周一至周五 9:00-12:00、14:00-18:00(其余为空闲时段)—— 周末全天都是谷时。
怎么改的
isPeak() 先用北京时间的 getUTCDay() 排除周六/周日,再判小时;中英 README 与峰谷 tooltip 补上「周一至周五」限定。
验证
| 时刻(北京) | 结果 |
|---|---|
| 周六 10:00 / 周日 15:00 | 谷时 ✅ |
| 周一 10:00 / 周五 17:00 | 峰时 ✅ |
| 周一 12:00 / 周一 18:00(边界) | 谷时 ✅ |
v0.5.1 — 冷启动提速与代码清理
🚀 性能
- 今日成本冷启动从 ~5.4s 降至 ~0.01s:只解压当天活跃会话(mtime 过滤)+ 结果按 (path, mtime) 长期缓存 + 并行解析
🔧 修复
- 峰/谷判断显式按北京时间(UTC+8),不再依赖宿主机时区
- 峰价从官方页显式解析(不再硬编码“谷价 ×2”);缓存命中价解析失败时整表回退内置价目表
- README 轮询文案与代码统一(常驻卡片 60s 自动刷新)
- 卡片底部“今日”改为“今日·全部”,明确为所有工作区口径
🧹 清理
- 移除客户端从未调用的死计价代码,计价统一走宿主
🎨 外观刷新
- 💰 换 SVG 钱包图标;卡片按压/弹框弹入微动画;弹框次级数值层级弱化
v0.5.0 — 五层级成本与峰谷状态
五层级成本明细
- 余额 / 最近一次提问(标注会话名)/ 今日·本会话 / 今日·本工作区 / 今日·所有工作区
- 切换会话后,最近提问与今日·本会话跟随当前会话(active-cost 支持 ?session=)
峰谷状态可视化
- 卡片与弹框边框按时段着色(峰时橙 / 谷时绿),弹框标题旁显示「峰时/谷时」标签,悬停查看价格档位
其他
- 移除余额剩余比例条,改为余额数字按阈值变色
- 移除「本会话成本」(会话全程累计)行
- 更新截图与 README
v0.4.5 — 更新截图与描述
🖼️ 更新
- 截图刷新:替换为侧边栏卡片(左下角常驻)与四层级成本弹框的实际效果图。
- README 描述更新:改为侧边栏 UI 的描述(不再提及已移除的右上角)。
📦 安装
dsh plugin --profile web add dsh-balance-widget