dsh-connect-modelscope-token-plan 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,36 @@
26
26
  > **发版时**:顶部开 `## [X.Y.Z] — YYYY-MM-DD`,完整流程见
27
27
  > [RELEASING.md](RELEASING.md) §3(本文开头这段是**写作者规范**,那是**发布操作流程**)。
28
28
 
29
+ ## [0.5.0] — 2026-10-17
30
+
31
+ **面板「模型」tab:清单按厂商分组**
32
+
33
+ - 三十几个模型平铺时,`deepseek-ai/…` 这类前缀每一行都要说一遍(目录只回 id,行名就等于 id)。现在按厂商分组:组头一行(可折叠,带数量与已选数),组内只显示模型名、完整 id 留在悬停里;顶部加了搜索框;推荐的三家(深度求索 / 智谱 / 通义千问)置顶。
34
+ - 「推荐」以前挂在每一行上,同名厂商的十几行各一枚;现在每组建一枚、挂在组头——它同时解释了这一组凭什么是置顶的。
35
+ - 卡片顶部原先把「已接入」「已注册」分两行说,加上区块标题一共说了三遍;现在并成一行「已接入 · 已注册(模型可在选择器里选用) · 面板」。失败仍单独一行,且此时不再重复一句状态。
36
+ - 出图卡:能力改正向双徽章(文生图 / 图生图各一枚),层级重排为「状态 → 选择 → 操作 → 说明」,说明沉底;「自动选择」成为单选组里的第一项。
37
+
38
+ **面板「额度」tab:趋势图与读数**
39
+
40
+ - 趋势图改为**竖向柱状图**,柱顶标当天次数(0 次不标),轴约 7 个日期刻度且不带年份。
41
+ - 新增**「显示天数」**选择器(默认 / 7 / 14 / 30 / 90),并与决定「能回看多久」的**保留窗口**(90 天)拆成两件事——显示窗口恒被夹在保留窗口内,不会出现「把已剪掉的日子画成 0」这种与「那天真的没调用」无法区分的形状。选择保存在 `usage-prefs.json`。
42
+ - 单模型排行的读数补上单位:`2 · 21,695t` → `2 次 · 21,695 token`(裸 `t` 既不是量级后缀,也不是任何语言的单位词)。
43
+
44
+ **读数与标签不再自相矛盾**
45
+
46
+ - 窗口徽标此前一律按 ÷1024 换算,把上游自己写的十进制数印成了另一个样子:`256000`(上游叫 256K)显示 250K、`1000000`(GLM-5.2 的 1M)显示 977K、`200000` 显示 195K。现在按**上游写出来的进制**渲染:2 的幂仍按 1024(`131072` → 128K),十进制仍按 1000(`128000` → 128K)。代价是两个进制都整除的 `128000` 与 `131072` 同读 128K(相差 2.4%)。
47
+ - **本地计数是「本客户端」的口径**:桌面端与 Web 端是两个 profile,各记各的账、互不可见。此前面板图例与 README 把它写成「覆盖全部 DSH 魔搭调用」,实测不成立。想并排看各 profile 的账用 `npm run doctor`。
48
+ - 成本更诚实的两处:策展表(内置窗口真值)距上次核对超过 180 天时,面板会给一条「该复核了」的提示,静态表不再悄悄腐烂;魔搭目录读不到时不再被当成「0 个模型」,保存也不再因此报出假失败。
49
+
50
+ **对上游更省、更不打断**
51
+
52
+ - 模型详情标签此前与目录、余额共用 60 秒缓存,于是每轮轮询都对目录里**每个**模型打一次网站接口(约 38 个请求/分钟、5 万/天,只为判一个几乎不变的布尔值)。标签改走自己的 6 小时缓存。
53
+ - 面板里改模型展示名不再触发重新注册(此前那会打断在途的对话请求);出图等待在关闭/卸载时立即中断,不再让用户等满那个 15 秒间隔;「忘掉已保存的令牌」不再可能因删除失败而静默复活环境变量里的旧令牌。
54
+
55
+ > **实施过程(病灶、取证、判据)在
56
+ > [docs/archive/2026-10-17-0.5.0-process.md](docs/archive/2026-10-17-0.5.0-process.md)**——这一轮
57
+ > 里有多处是「推翻自己此前的明文裁定」,理由与代价都写在里面。
58
+
29
59
  ## [0.4.0] — 2026-10-17
30
60
 
31
61
  **面板保存不再被瞬时网络故障打断**
package/README.md CHANGED
@@ -10,11 +10,13 @@
10
10
 
11
11
  三个 tab:**额度 / 模型 / 接入**。
12
12
 
13
- **「额度」tab**——头条是官方魔粒余额(真实值),下面接本地调用分布:
13
+ **「额度」tab**——头条是官方魔粒余额(真实值),下面接本地调用分布与趋势图:
14
14
 
15
15
  ![「额度」tab:魔粒余额与本地调用](assets/tab-account-and-usage.png)
16
16
 
17
- **「模型」tab**——一行一个魔搭模型,可勾选启用;开关打开即把魔搭注册为 DSH provider:
17
+ 趋势图是**竖向柱状图**(每根柱顶标出当天次数、0 次不标;轴约 7 个日期刻度且不带年份),区块内可切**显示天数**(默认 / 7 / 14 / 30 / 90)。这个选择器只决定「画多少天」,与决定「能回看多久」的**保留窗口**(`retentionDays`,默认 90 天)是两件事——显示窗口恒被夹在保留窗口之内,所以不会出现「把已剪掉的日子画成 0」那种与「那天真的没调用」无法区分的形状。选择保存在 `usage-prefs.json`(按 profile 分段)。
18
+
19
+ **「模型」tab**——模型按**厂商分组**(组头可折叠、带数量与已选数,「推荐」徽标挂在组头、推荐的三家置顶),组内一行一个魔搭模型、勾选即启用,顶部可搜索;开关打开即把魔搭注册为 DSH provider:
18
20
 
19
21
  ![「模型」tab:接入为DSH 模型与模型清单](assets/tab-model-list.png)
20
22
 
@@ -29,15 +31,19 @@ tools registry 没有 unregister)。实测协议(异步两段式、必需头
29
31
  继续查询**(只查询、不重复出图)。上游排队实测 1–15 分钟,此前一次调用会一直
30
32
  await 到出图为止,整轮对话都得陪着等。
31
33
 
32
- 同一 tab 下方另有**「上下文窗口」**选择器(默认/128K/256K/512K/1M):魔搭目录
33
- `/v1/models` 不返回窗口字段,Host 侧按三级真值链给每个模型定窗口——目录真声明了
34
- 就用目录值(不受任何下层影响);用户在这里选一个档位即对**目录没声明窗口的模型**
35
- 全局生效,保存即重注册;**用户没设覆盖时**,插件查内置策展表(`context-catalog.ts`,
36
- 来自 models.dev 各厂 host 交叉比对的同 id 主流窗口,2026-10-16 核对,含 DeepSeek-V4
37
- 全系 1M、Qwen3.5/Qwen3.8-27B/Step 3.x 256K、GLM-5.2 1M 等 19 个当前目录 id);
38
- 表里也没有的模型才落 128K 兜底。档位落盘在 `provider.json` 的 `contextWindow` 键
39
- (v1 形状的新增可选键,旧构建宽容读),roster 每行会标出该模型当前生效的窗口——
40
- 策展表来的值带 `*` 号与悬停说明(平台未亲口声明),与目录声明/用户覆盖区分。
34
+ ![「模型」tab:出图工具卡(能力徽标、自动选择、重启提示)](assets/tab-model-draw.png)
35
+
36
+ **卡片最底**另有**「上下文窗口覆盖」**选择器(不覆盖 / 128K / 256K / 512K / 1M):
37
+ 魔搭目录 `/v1/models` 不返回窗口字段,Host 侧按四级真值链给每个模型定窗口——
38
+ ① 目录真声明了就用目录值(不受任何下层影响);② 用户在下面选一个档位(保存即
39
+ 重注册);③ 没设覆盖才查内置策展表(`context-catalog.ts`,来自 models.dev 各厂 host
40
+ 交叉比对的同 id 主流窗口,2026-10-16 核对,含 DeepSeek-V4 全系 1M、
41
+ Qwen3.5/Qwen3.8-27B/Step 3.x 256K、GLM-5.2 1M 等 19 个当前目录 id);④ 都没有才落
42
+ 128K 兜底。**覆盖压过策展表**——插件自带的那份是第三方交叉真值,用户要改就改得动。
43
+ 档位落盘在 `provider.json` 的 `contextWindow` 键(v1 形状的新增可选键,旧构建宽容读),
44
+ roster 每行标出该模型当前生效的窗口,数字按**上游写出来的进制**显示(目录写 `128000`
45
+ 就是 `128K`、档位写 `131072` 也是 `128K`,不做进制换算;策展表来的值带 `*` 号与悬停
46
+ 说明——平台未亲口声明)。
41
47
 
42
48
  ## 对话框胶囊(v0.2 起)
43
49
 
@@ -86,7 +92,7 @@ await 到出图为止,整轮对话都得陪着等。
86
92
 
87
93
  ## 诚实声明
88
94
 
89
- - 面板头条是**官方魔粒余额**(真实值);本地计数只统计**经本插件的调用**——它回答的是分布/趋势/429 事件流,不是余额,直连魔搭的其它客户端不计入。注册 provider 之后,DSH 的全部魔搭调用都经本插件,所以本地计数**覆盖全部 DSH 魔搭调用**。次数口径的「推算剩余」已从面板移除(官方改魔粒计费后两单位并排是误导),相应地`quota.daily` 只剩 `usedLocal` 一个数——没有 `limit`,也没有推算出的「剩余」。这个数还有第三种答案:**本地计数文件读不到时它是 `null`,面板渲染「—」**——「今日 0 次」是可信的日常值,把「我不知道」画成它会让人以为今天没调用过(`usage.json` 损坏、形状不对、或被更新的构建写过都是这种情形,原因会在面板上方的漂移提示里说明)。
95
+ - 面板头条是**官方魔粒余额**(真实值);本地计数只统计**经本插件的调用**——它回答的是分布/趋势/429 事件流,不是余额。**它是「本客户端」的口径**:注册 provider 之后该客户端的全部魔搭调用都经本插件,但**不跨客户端**——桌面端与 Web 端是两个 profile,各有各的状态目录(`$DSH_HOME/state/<profile>/<插件名>/usage.json`),各记各的账、互不可见;直连魔搭的其它客户端同样不计入。`npm run doctor` 会把每个 profile 的用量并排列出来,这是「另一个客户端的数字去哪了」的答案。次数口径的「推算剩余」已从面板移除(官方改魔粒计费后两个单位并排是误导),相应地`quota.daily` 只剩 `usedLocal` 一个数——没有 `limit`,也没有推算出的「剩余」。这个数还有第三种答案:**本地计数文件读不到时它是 `null`,面板渲染「—」**——「今日 0 次」是可信的日常值,把「我不知道」画成它会让人以为今天没调用过(`usage.json` 损坏、形状不对、或被更新的构建写过都是这种情形,原因会在面板上方的漂移提示里说明)。
90
96
  - **本地计数的口径与 harness 全局账本不同,且刻意不合并**。DSH 自己有 `@linxin666/dsh-usage`,按 `days→provider→model` 记成功调用的 token;它只订阅 session 的 `assistant/message`,**失败调用一次都不记**。所以本插件只做两件全局账本答不了的事:①「经本插件的调用分布与趋势」;②**429/错误事件流**——这是本插件的独家数据(官方只给总额度余额,不给「哪个模型刚才在限频」)。成功的 token 总量不在此重复记账(详见 `src/host/usage-observer.ts` 文件头)。
91
97
  - 429/错误事件的分类读的是 **`llm-error-fix` 重分类之后**的 code:被误判成 QUOTA 的 rpm 限频在事件流里记作 `rate_limit`,与退避策略说同一件事。观察层套在重分类层**之外**,顺序不可反。
92
98
  - **计数口径**:每次流结束记一次 call,**含失败、含用户中断**(魔搭按次数计费,限频掉的请求同样是一次调用);token 数上游没给时是 `null` 而非 0。偏差方向是**按流计次**:重试不在流内部发生,而是在流消费完后由 `agent/request-error` 瀑布决定重发,因而**每次重试各记一次**——按「魔搭按次数计费」的口径这反而是对的(每次重发都真打了一次上游)。
Binary file
Binary file
Binary file