Skip to content

Releases

v0.6.4 — 计价审计:压缩成本补算 + Search API 按次计费建模

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 20 Oct 15:03

一句话

新模型(DeepSeek-V4.1-Flash-1017 / DSH 0.2.1-rc.2)上把插件所有计价路径重新算了一遍:算术是对的(独立重算与插件输出逐位一致),发现并修掉 2 个漏算/未建模项,另有 1 项无法在会话内证实——如实写在最后。

🔍 怎么复核的

不是看代码猜,而是三路对齐:

  1. 独立重算:自己写脚本从原始 session.v4.jsonl.zstd 重算今日成本,与插件路由对比 → 0.61913696 vs 0.61913696,逐位一致
  2. 对官方页:解析后的费率(pricingSource: synced)与 DeepSeek 定价页 完全一致:Flash 命中 0.02/0.04、未命中 1/2、输出 4/8
  3. 对语义: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)

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 03 Oct 03:26

一句话

修一个会让你以为花的钱是实际两倍的计价 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 — 余额改读官方账号服务(与设置页同源)· 进入告别期

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 29 Sep 01:50

一句话

桌面版 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 桌面版,界面与桌面端视觉对齐

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 25 Sep 06:21

桌面版来了,插件也跟着适配了

DSH 出桌面版(0.1.7 / DeepSeek Harness.app)之后,这个插件在桌面端基本不可用:成本相关的档位全部报错,卡片还可能在你点开弹层的瞬间整条消失。这次把 web 版和桌面版拉到同一条线上,并按桌面端的视觉语言把界面重做了一遍。

一、桌面端为什么跑不起来(三个都是"沉默失败")

  1. 找不到 zstd:插件此前 spawn zstd -d -c 解压会话日志。桌面版由 GUI 启动,进程 PATH 只有 /usr/bin:/bin:/usr/sbin:/sbin,Homebrew 装的 zstd 不在其中 —— 「今日花费 / 最近一次提问」在桌面端直接报错。现改用 Node 内置 zstd(node:zlib),不再依赖任何外部命令。
  2. v4 会话日志是多帧拼接:日志 append-only,每次 flush 追加一个独立的 zstd 帧(实测一份 726 KB 的 v4 日志里有 97 帧)。Node 的一次性解压只返回第一帧(258 B)—— 不报错,静默丢掉 99% 以上的数据,这比报错更危险。现在按帧魔数逐帧解码,v0 / v3 / v4 三种日志与 zstd -dc 输出字节级一致。
  3. 图标改名导致整卡崩溃:0.1.7 把产品图标改为尺寸中性权重(IconRefreshOutlineRegular + size 属性),旧名 IconRefreshOutline14 已不存在。把它当组件渲染会抛 React #130,而侧边栏槽位对崩溃条目的处理是整条摘掉 —— 这正是「卡片闪一下、一点开就消失」的原因。现在按可用名解析,并带本地 SVG 兜底。
  4. 顺手清掉了 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 包页面上的显示

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 22 Sep 04:23

修什么

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 — 计入搜索调用(此前全部漏算)

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 22 Sep 04:23

怎么发现的

两条线索连着来:

  1. 先是周末峰谷误判(v0.5.3):周六白天插件显示「峰时」,而官方规则是周一至周五 09:00–12:00、14:00–18:00 才算高峰(其余含周末全天为空闲时段)。顺着定价页脚注确认后修掉。
  2. 修完价格口径去对账,发现插件显示的「今日花费」和账户余额差值对不上: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 数,就用余额差值(唯一真相)反解单次成本:

  1. 同一窗口内记余额 B0 = ¥48.34、B1 = ¥48.06(差 ¥0.28),并统计窗口内搜索次数 = 14;
  2. 从会话日志算出「可精算的对话部分」= ¥0.094;
  3. 搜索实付 = 0.28 − 0.094 = ¥0.186 → ¥0.0133 / 次(谷时);
  4. 换算成 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 — 修复周末被误判为峰时

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 22 Sep 04:23

修什么

峰/谷判断只看小时、不看星期,导致周末 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 — 冷启动提速与代码清理

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 05 Sep 11:38

🚀 性能

  • 今日成本冷启动从 ~5.4s 降至 ~0.01s:只解压当天活跃会话(mtime 过滤)+ 结果按 (path, mtime) 长期缓存 + 并行解析

🔧 修复

  • 峰/谷判断显式按北京时间(UTC+8),不再依赖宿主机时区
  • 峰价从官方页显式解析(不再硬编码“谷价 ×2”);缓存命中价解析失败时整表回退内置价目表
  • README 轮询文案与代码统一(常驻卡片 60s 自动刷新)
  • 卡片底部“今日”改为“今日·全部”,明确为所有工作区口径

🧹 清理

  • 移除客户端从未调用的死计价代码,计价统一走宿主

🎨 外观刷新

  • 💰 换 SVG 钱包图标;卡片按压/弹框弹入微动画;弹框次级数值层级弱化

v0.5.0 — 五层级成本与峰谷状态

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 30 Aug 06:17

五层级成本明细

  • 余额 / 最近一次提问(标注会话名)/ 今日·本会话 / 今日·本工作区 / 今日·所有工作区
  • 切换会话后,最近提问与今日·本会话跟随当前会话(active-cost 支持 ?session=)

峰谷状态可视化

  • 卡片与弹框边框按时段着色(峰时橙 / 谷时绿),弹框标题旁显示「峰时/谷时」标签,悬停查看价格档位

其他

  • 移除余额剩余比例条,改为余额数字按阈值变色
  • 移除「本会话成本」(会话全程累计)行
  • 更新截图与 README

v0.4.5 — 更新截图与描述

Choose a tag to compare

@LL-cmyk-so LL-cmyk-so released this 18 Aug 14:38

🖼️ 更新

  • 截图刷新:替换为侧边栏卡片(左下角常驻)与四层级成本弹框的实际效果图。
  • README 描述更新:改为侧边栏 UI 的描述(不再提及已移除的右上角)。

📦 安装

dsh plugin --profile web add dsh-balance-widget