@eddyskywalker/dsh-chatgpt-subscription 0.53.0 → 0.54.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +14 -8
  3. package/lib/client.js +72 -19
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +20564 -19183
  6. package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
  7. package/lib/types/client/progress-updates/locales.d.ts +8 -2
  8. package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
  9. package/lib/types/client/progress-updates/settings-binding.d.ts +3 -1
  10. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
  11. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
  12. package/lib/types/compat.d.ts +35 -16
  13. package/lib/types/compat.d.ts.map +1 -1
  14. package/lib/types/host/adapter.d.ts +1 -1
  15. package/lib/types/host/adapter.d.ts.map +1 -1
  16. package/lib/types/host/antigravity/adapter.d.ts.map +1 -1
  17. package/lib/types/host/antigravity/mapper.d.ts +4 -24
  18. package/lib/types/host/antigravity/mapper.d.ts.map +1 -1
  19. package/lib/types/host/antigravity/types.d.ts +7 -1
  20. package/lib/types/host/antigravity/types.d.ts.map +1 -1
  21. package/lib/types/host/claude/adapter.d.ts.map +1 -1
  22. package/lib/types/host/claude/client.d.ts +19 -3
  23. package/lib/types/host/claude/client.d.ts.map +1 -1
  24. package/lib/types/host/claude/mapper.d.ts +105 -8
  25. package/lib/types/host/claude/mapper.d.ts.map +1 -1
  26. package/lib/types/host/claude/model-catalog.d.ts +97 -9
  27. package/lib/types/host/claude/model-catalog.d.ts.map +1 -1
  28. package/lib/types/host/claude/types.d.ts +21 -2
  29. package/lib/types/host/claude/types.d.ts.map +1 -1
  30. package/lib/types/host/cline-pass/adapter.d.ts +9 -1
  31. package/lib/types/host/cline-pass/adapter.d.ts.map +1 -1
  32. package/lib/types/host/cline-pass/mapper.d.ts +18 -0
  33. package/lib/types/host/cline-pass/mapper.d.ts.map +1 -1
  34. package/lib/types/host/cline-pass/types.d.ts +8 -2
  35. package/lib/types/host/cline-pass/types.d.ts.map +1 -1
  36. package/lib/types/host/codex-catalog.d.ts +9 -0
  37. package/lib/types/host/codex-catalog.d.ts.map +1 -1
  38. package/lib/types/host/command-code/adapter.d.ts.map +1 -1
  39. package/lib/types/host/command-code/mapper.d.ts +44 -2
  40. package/lib/types/host/command-code/mapper.d.ts.map +1 -1
  41. package/lib/types/host/command-code/model-catalog.d.ts +53 -11
  42. package/lib/types/host/command-code/model-catalog.d.ts.map +1 -1
  43. package/lib/types/host/command-code/routes.d.ts +6 -0
  44. package/lib/types/host/command-code/routes.d.ts.map +1 -1
  45. package/lib/types/host/command-code/types.d.ts +24 -3
  46. package/lib/types/host/command-code/types.d.ts.map +1 -1
  47. package/lib/types/host/common/account-pool.d.ts +33 -3
  48. package/lib/types/host/common/account-pool.d.ts.map +1 -1
  49. package/lib/types/host/common/idle-watchdog.d.ts +27 -7
  50. package/lib/types/host/common/idle-watchdog.d.ts.map +1 -1
  51. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  52. package/lib/types/host/glm-coding-plan/adapter.d.ts.map +1 -1
  53. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts +111 -31
  54. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts.map +1 -1
  55. package/lib/types/host/glm-coding-plan/mapper-openai.d.ts.map +1 -1
  56. package/lib/types/host/glm-coding-plan/model-catalog.d.ts +12 -3
  57. package/lib/types/host/glm-coding-plan/model-catalog.d.ts.map +1 -1
  58. package/lib/types/host/glm-coding-plan/types.d.ts +88 -3
  59. package/lib/types/host/glm-coding-plan/types.d.ts.map +1 -1
  60. package/lib/types/host/kimi-code/account-pool.d.ts +2 -2
  61. package/lib/types/host/kimi-code/account-pool.d.ts.map +1 -1
  62. package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
  63. package/lib/types/host/kimi-code/cache-wait.d.ts +28 -6
  64. package/lib/types/host/kimi-code/cache-wait.d.ts.map +1 -1
  65. package/lib/types/host/kimi-code/oauth.d.ts +21 -1
  66. package/lib/types/host/kimi-code/oauth.d.ts.map +1 -1
  67. package/lib/types/host/kimi-code/types.d.ts +19 -1
  68. package/lib/types/host/kimi-code/types.d.ts.map +1 -1
  69. package/lib/types/host/minimax-code/adapter.d.ts.map +1 -1
  70. package/lib/types/host/minimax-code/types.d.ts +7 -1
  71. package/lib/types/host/minimax-code/types.d.ts.map +1 -1
  72. package/lib/types/host/model-catalog.d.ts +14 -0
  73. package/lib/types/host/model-catalog.d.ts.map +1 -1
  74. package/lib/types/host/ollama/adapter.d.ts.map +1 -1
  75. package/lib/types/host/ollama/types.d.ts +10 -0
  76. package/lib/types/host/ollama/types.d.ts.map +1 -1
  77. package/lib/types/host/opendesign/adapter.d.ts.map +1 -1
  78. package/lib/types/host/opendesign/mapper.d.ts +31 -0
  79. package/lib/types/host/opendesign/mapper.d.ts.map +1 -1
  80. package/lib/types/host/opendesign/types.d.ts +8 -2
  81. package/lib/types/host/opendesign/types.d.ts.map +1 -1
  82. package/lib/types/host/qoder/adapter.d.ts.map +1 -1
  83. package/lib/types/host/qoder/mapper.d.ts +9 -0
  84. package/lib/types/host/qoder/mapper.d.ts.map +1 -1
  85. package/lib/types/host/responses-client.d.ts +22 -2
  86. package/lib/types/host/responses-client.d.ts.map +1 -1
  87. package/lib/types/host/responses-mapper.d.ts +44 -4
  88. package/lib/types/host/responses-mapper.d.ts.map +1 -1
  89. package/lib/types/host/step-code/adapter.d.ts.map +1 -1
  90. package/lib/types/host/step-code/client.d.ts +8 -0
  91. package/lib/types/host/step-code/client.d.ts.map +1 -1
  92. package/lib/types/host/step-code/mapper.d.ts +9 -5
  93. package/lib/types/host/step-code/mapper.d.ts.map +1 -1
  94. package/lib/types/host/step-code/model-catalog.d.ts +17 -0
  95. package/lib/types/host/step-code/model-catalog.d.ts.map +1 -1
  96. package/lib/types/host/wire-auth.d.ts +31 -0
  97. package/lib/types/host/wire-auth.d.ts.map +1 -1
  98. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
  99. package/lib/types/host/workbuddy/types.d.ts +7 -1
  100. package/lib/types/host/workbuddy/types.d.ts.map +1 -1
  101. package/lib/types/index.d.ts +8 -0
  102. package/lib/types/index.d.ts.map +1 -1
  103. package/lib/types/shared/model-catalog.d.ts +58 -12
  104. package/lib/types/shared/model-catalog.d.ts.map +1 -1
  105. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.54.0 - 2026-11-02
6
+
7
+ - **[provider parity] 对照官方 Agent / 客户端修复其余线路的能力与性能差异**:
8
+ - Claude:未知模型按当前代能力处理,支持原生 mid-conversation system 消息,模型发现禁重定向并使用 3 秒超时,单图与整请求图片预算分离;
9
+ - GLM:Anthropic 面改用 `output_config.effort`、按模型关闭思考、增加缓存断点并补齐业务码分类;
10
+ - Command Code:完整刷新官方 106 模型注册表,取消无依据的输出上限,Anthropic system 增加缓存断点;
11
+ - Cline / OpenDesign:按各自官方规则选择输出预算字段,Cline 增加有界空回复重试,两者扩大上下文溢出恢复并保留旧词面;
12
+ - Step / Qoder:Step 无真实 cap 时省略 `max_tokens`,Qoder 会话亲和按账号隔离并纳入并发闸门;
13
+ - Claude / Antigravity / Qoder / Step / WorkBuddy:图片预算按实际上线 payload 计量,避免误丢缩放后可用的图片。
14
+ - **[docs] 新增 `docs/provider-agent-parity-audit.md`,记录各线路官方基线、修复范围及仍需 live 验证的边界。
15
+ - **[all routes] 静默流两分钟判死,不必再等满五分钟**:每条线路的空闲看门狗阈值原本都是 300_000,与 undici 判死静默 HTTP/2 流的 300 s **完全同值**——两个计时器同时到点、传输层先抛,应用层的 `TIMEOUT` 判定从来没拿到话语权。线上为此付的代价是:5 分钟零输出 → 重试在 300 s 之后才起 → 又被手动中止,一轮白等约 9 分钟。现在共享默认降到 120 s(antigravity / claude / cline-pass / command-code / glm-coding-plan / kimi-code / minimax-code / opendesign / workbuddy 各自常量同步,qoder / step-code 直接吃共享默认),并且**每条线路都在收到响应头时 pulse 一次**,把「连接 + 预填充到首字节」与「流内静默」拆成两个 120 s 窗口:慢启动不会被误杀,开了口却不再出声的流两分钟判死并立即进入既有重试策略(3 次、1.5 s 起退避)。ollama 是唯一例外,保留 300 s 并在自己的 `types.ts` 写明理由——本地推理受算力限制,长上下文可能要几分钟才出第一个字节。120 s 是量出来的:该会话 104 次请求里相邻 chunk 最长静默 6.4 s(6,539 个间隔)、从 step 开始到首字节最长 65 s(21 万 token 的 prompt);日志里 135.6 s / 89 s / 197 s 那些「间隔」是推理块 `dt` 累加的总时长,不是静默,不能当作阈值依据。新增 `test/stream-idle-budgets.test.ts` 钉住共享阈值严格小于 300 s、各线路必须等于它、ollama 必须更大;`test/kimi-code-stream-idle.test.ts` 新增「首字节慢、响应头正常」用例(去掉响应头那一次 pulse 即变红)。
16
+ - **验证**:`npm run typecheck` 0 错误;全量 Vitest 355 文件通过、6529 项测试通过(另有 2 文件 / 9 项跳过);`lib/` 清空后重建、`npm pack --dry-run` 与 `git diff --check` 通过。
17
+
5
18
  ## 0.53.0 - 2026-11-01
6
19
 
7
20
  - **[dispatch] Mandate v2 头部协议:样板自洽、可直接复制的骨架、会自纠的拒绝文案**
package/README.md CHANGED
@@ -44,7 +44,7 @@
44
44
  | `claude-subscription` | Claude Pro / Max | Anthropic Messages | 手动粘贴 / loopback 回调 | 实时 `/v1/models` + 本地兜底 |
45
45
  | `minimax-code` | MiniMax Code 编程订阅 | Anthropic Messages | **复用桌面端登录态** 或设备码 | **硬编码**(见下) |
46
46
  | `antigravity` | Google Antigravity | Gemini | Google OAuth | 内置表 |
47
- | `glm-coding-plan` | GLM Coding Plan(ZCode 账号,国区 BigModel / 国际区 Z.ai) | Anthropic Messages + OpenAI Chat Completions(按模型声明) | ZCode 账号 OAuth(浏览器中转轮询)+ 可选导入本机 ZCode 登录态 | 随包目录(源自官方 `zcode-builtin.json`) |
47
+ | `glm-coding-plan` | GLM Coding Plan(ZCode 账号,国区 BigModel / 国际区 Z.ai) | Anthropic Messages(当前 Coding Plan 目录的全部模型) | ZCode 账号 OAuth(浏览器中转轮询)+ 可选导入本机 ZCode 登录态 | 随包目录(源自官方 `zcode-builtin.json`) |
48
48
  | `step-code` | StepFun Step Plan 订阅(国区 api.stepfun.com / 国际区 api.stepfun.ai)或开放平台 API Key | OpenAI Chat Completions | **云端轮询**浏览器授权(不开本地回调端口)/ 手工粘贴 Platform API Key / 只读导入本机 `~/.stepcode/auth.json` | **实时运行时发现**(随包表刻意为空) |
49
49
  | `cline-pass` | Cline Pass | OpenAI Chat Completions | **浏览器设备码 OAuth**(WorkOS,账号入池、自动续期);API Key 仅作兼容回退 | 随包表兜底 + 官方 `recommended-models` / models.dev / 上游网关目录补全 |
50
50
  | `qoder` | Qoder 订阅(全球区 qoder.com / 中国站 qoder.com.cn) | Qoder 自有(COSY 签名 + 信封 SSE) | **浏览器设备流**(仅全球区)/ 手工粘贴 PAT(两区)/ 只读导入本机 `~/.qoder/.auth/user` | **实时运行时发现**(COSY 签名 GET)+ 随包能力兜底表 |
@@ -116,6 +116,8 @@
116
116
  - 模型目录取自公开的 `/provider/v1/models`,每个模型的 `context_length` 作为默认上下文窗口,可逐模型覆盖;
117
117
  - **模型能力逐模型查表**(`src/host/command-code/model-catalog.ts`,转录自官方 CLI 的模型注册表):是否接受图片输入、支持哪些思考档位由该表决定,未知模型回落纯文本;
118
118
  - 图片能力**不能靠厂商/模型名前缀推断**——同厂商内部就会自相矛盾:`deepseek/deepseek-v4.1-flash` 与 `deepseek/deepseek-v4-flash-vision-exp` 支持图片,而 `deepseek/deepseek-v4-flash`、`deepseek/deepseek-v4-pro` 不支持;`z-ai/glm-5.3-flash` 支持而 `zai-org/GLM-5.3` 不支持;
119
+ - 随包能力表完整转录官方 `command-code@1.88.2` 注册表的 106 条记录,并以脱敏 fixture 逐字段对拍;实时目录仍决定账号实际可用模型;
120
+ - **输出预算不猜**:OpenAI / Responses 面在调用方与官方注册表都未给 cap 时省略字段;Anthropic Messages 必须带 `max_tokens`,无声明时使用官方 CLI 的 64000。Anthropic system 按官方 `toWireSystem` 使用块数组与 ephemeral 缓存断点;
119
121
  - 额度与用量来自账户 API 的账单/用量线路,任一条失败不影响其余;
120
122
  - **瞬时失败按 DSH retry policy 有界重试**:`command-code` 路由显式声明 `normal` 策略(最多 3 次,1.5s 起指数退避、15s 上限、0.2 抖动),覆盖 `RATE_LIMIT`、`SERVER`、`TIMEOUT`、`TRANSPORT`;
121
123
  - 上游模型供应商临时不可用(502/503/504/500,典型响应体是 `"{\"error\":{\"type\":\"server_error\"}}"`)被归类为 `SERVER` 并自动重试;
@@ -242,7 +244,8 @@
242
244
  - **两条登录路径,模式在流程开始时确定且不可中途切换**:默认是**手动粘贴**(授权页把码显示在屏幕上,粘贴 `<code>#<state>`;也容错接受整条重定向 URL)。可选 loopback 回调,绑定 `127.0.0.1` 并顺序探测可用端口(Windows 的保留端口段会让固定端口绑定失败)。端口探测失败**降级为手动**而不是报错。切换模式等于作废当前流程并重新发起——授权码与签发它的那次请求的 `redirect_uri` 绑定,这是该流程最常见的失败;
243
245
  - **一次授权只兑换一次**:浏览器回调与手动粘贴可能同时到达,用 compare-and-set 保证只有一方发起兑换(另一方得到「正在处理中」,已结算的流程得到 410 且**不做任何兑换**)。错误的 `state` **只拒绝那一个请求**,不会终止正在进行的合法登录。回调服务器只绑 loopback、只应答 `/callback`、只接受本机来源;
244
246
  - **刷新是单飞的**:并发请求共享同一次刷新。否则到期瞬间的一批请求会各自轮换刷新令牌,除第一个之外全部作废(上游会给出终局判定)。刷新令牌轮换后**先读回校验再落盘**;
245
- - **模型能力逐模型查表**(`src/host/claude/model-catalog.ts`),**不从模型名推断**。该表转录自本机随 harness 安装的参照目录,**只证明抄录忠实,不证明服务端提供这些模型**——服务端自己的 `GET /v1/models` 才是权威,且它**只覆盖上下文窗口**,能力字段不被改写;
247
+ - **模型能力逐模型查表**(`src/host/claude/model-catalog.ts`),**不从模型名推断**。已知 id 使用随包能力表;表外 id 按官方 Claude Code 的「未识别模型按当前模型处理」规则继承当前代 adaptive thinking、effort 与图片能力,不再静默降为无思考/无图。服务端 `GET /v1/models` 仍是账号可调用模型的权威,实时目录只覆盖上下文窗口;发现请求使用官方同款 3 秒超时、拒绝重定向并只接收 Claude / Anthropic id;
248
+ - **支持会话中的原生 system 消息**:官方支持名单及未知当前模型仅在官方允许的位置保留历史 `role:'system'`——它必须紧跟 user,且是末条或后接 assistant;DSH 的首条系统提示及其它违规位置仍折回顶层 `system`,不支持的旧模型也保留折叠兜底。单图 base64 防线与整请求图片预算分别执行,超限优先缩小,无法满足时以可见文本说明;
246
249
  - **思考形态有四类,顺序决定成败**(`thinkingMode`):
247
250
  - `mid-convo` → `{type:'adaptive', block_binding:{prefix_mismatch_behavior:'drop_block'}}` 外加 `output_config.effort`;
248
251
  - `adaptive` → `{type:'adaptive'}`;
@@ -913,15 +916,17 @@ access token / refresh token / 授权码 / PKCE verifier**;诊断里提到某
913
916
 
914
917
  两区共用同一个 OAuth 控制面(`zcode.z.ai/api/v1/oauth/cli/*`),分开的只有上面这几行。**业务 JWT 的自动重取只服务国际区**——国区没有这一层。授权参数里**没有 PKCE**(两个 provider 的授权参数只有 redirect / appId / state),本插件照抄上游形状,不自带 `code_challenge`。本仓库历史里那句「国区没有浏览器登录」是错的,本线路删除了它:国区**有**浏览器登录,只是入口与参数名都不同。
915
918
 
916
- **模型目录**:随包目录 4 个模型(`GLM-5.3` / `GLM-5.3-Flash` / `GLM-5.2` / `GLM-5-Turbo`),逐模型事实转录自官方开源版内置配置 `zai-org/ZCode` 的 `config/provider/zcode-builtin.json`(revision 31)。能力**逐模型查表,不从模型名推断**,其中三处是被官方配置纠正过的历史值:
919
+ **模型目录**:随包目录 4 个模型(`GLM-5.3` / `GLM-5.3-Flash` / `GLM-5.2` / `GLM-5-Turbo`),逐模型事实转录自官方开源版内置配置 `zai-org/ZCode` 的 `config/provider/zcode-builtin.json`(revision 43)。能力**逐模型查表,不从模型名推断**,其中三处是被官方配置纠正过的历史值:
917
920
 
918
921
  - **输出上限**:GLM-5.3 家族与 GLM-5.2 是 **128000**、GLM-5-Turbo 是 **64000**。历史转录引用的 docs.z.ai 通用参数表给的是 131072,按本仓库「取小值」的规则取 128000(高报会被网关拒,低报只是提前压缩);128000 也正是**官方客户端自己在 Coding Plan 面上发的那个数**。同一代模型上限差一倍,正是「不得按家族名推」的又一处证据;
919
922
  - **图片输入**:四个模型的 `supportsImages` 全为 `true`——**不是因为模型多模态**,而是官方配置里两条 `modelMatch: ".*"` 的站点规则把 `api.z.ai/api/anthropic` 与 `open.bigmodel.cn/api/anthropic` 这两个 Coding Plan 基址的 `supportsImage` 打开成 true(基础规则对 `GLM-5.3` / `GLM-5.2` / `GLM-5-Turbo` 写的都是 false)。所以这条能力读作「**经本线路这两个端点时**收不收图」;
920
923
  - **套餐归属**:这四个**全部**是 Coding Plan 模型;反倒是 **Start Plan 缺 `GLM-5.3`**。这一条曾被写反过,写反的代价是把两个确实在套餐里的模型判成未订阅、用户连试都不能试。留着它是为了让复审记住:**套餐归属是账号的属性,不是模型的属性**,同一个 id 在不同 provider 规则下启用的集合是不同的。
921
924
 
922
- 思考档位同样逐模型声明:`GLM-5.3` / `GLM-5.3-Flash` 三档且**不可关闭思考**(上游把 `thinking.type: "disabled"` 当错误拒绝),`GLM-5.2` 两档(模型页面写的是更宽的词汇,但它同时写明套餐如何映射,真正能上线缆的只有这两级)且可关闭,`GLM-5-Turbo` **不收档位**(梯子为空,请求里根本不发思考控制字段)。DSH 词汇表更宽的 `minimal` / `medium` / `xhigh` 先收敛到模型真实的梯子再发出去,平手时向上取。
925
+ 思考档位同样逐模型声明:`GLM-5.3` / `GLM-5.3-Flash` 三档且**不可关闭思考**(上游把 `thinking.type: "disabled"` 当错误拒绝),`GLM-5.2` 两档(模型页面写的是更宽的词汇,但它同时写明套餐如何映射,真正能上线缆的只有这两级)且可关闭,`GLM-5-Turbo` **不收档位**,但显式选择关闭时会发 `thinking:{type:'disabled'}`。DSH 词汇表更宽的 `minimal` / `medium` / `xhigh` 先收敛到模型真实的梯子再发出去,平手时向上取。
923
926
 
924
- **瞬时失败按错误类别重试**:`glm-coding-plan` 路由显式声明 `normal` 策略(最多 3 次,1.5s 起指数退避、15s 上限、0.2 抖动),覆盖 `RATE_LIMIT` / `SERVER` / `TIMEOUT` / `TRANSPORT`。分类**不能停在状态行**——冻结的错误码表里七条 429 中**只有两条可重试**(1302 频率限制、1305 瞬时过载),其余五条全是额度类,所以**正文没给业务码的裸 429 一律判不可重试**(`Retry-After` 仍然读取并下发,它不改变判定)。同一张表在两个协议面上是**同一份取值**,Anthropic 面与 OpenAI 面各有一份判读函数,改一处必须同时改另一处。
927
+ Anthropic 面的思考深度按官方 ZCode 规则走 `output_config.effort`,不再发顶层 `reasoning_effort`。system 使用 text block 数组,并在 system 末块与最新非 system 消息的可缓存末块放置 `cache_control:{type:'ephemeral'}`;业务码 1303 / 1312 按官方客户端分类为可重试,额度与终局业务码仍不重试。上述请求形状均有 mock 回归,真实缓存命中与上游接受度仍需账号实测。
928
+
929
+ **瞬时失败按错误类别重试**:`glm-coding-plan` 路由显式声明 `normal` 策略(最多 3 次,1.5s 起指数退避、15s 上限、0.2 抖动),覆盖 `RATE_LIMIT` / `SERVER` / `TIMEOUT` / `TRANSPORT`。分类**不能停在状态行**——这一族里只有官方判为瞬时限流/过载的 1302、1303、1305、1312 可重试,其余已识别的额度类或终局限流类不重试;**正文没给业务码的裸 429 一律判不可重试**(`Retry-After` 仍然读取并下发,它不改变判定)。同一张表在两个协议面上是**同一份取值**,Anthropic 面与 OpenAI 面各有一份判读函数,改一处必须同时改另一处。
925
930
 
926
931
  ### 插件路由(GLM Coding Plan)
927
932
  所有路由都以 `/glm-coding-plan/api` 为前缀:
@@ -995,7 +1000,7 @@ access token / refresh token / 授权码 / PKCE verifier**;诊断里提到某
995
1000
  - 因此这一节不是免责套话:**列出的分档就是上线时的实际置信度**,读的人可以据此判断哪一块需要自己再试一次;
996
1001
  - **额度读的是非公开的开发者中心接口**(见开头的风险提示)。两代套餐同时在用(老式 5 小时 / 周窗口,与 Credit 月池),判定**按载荷形状**(老式窗口字段 vs `credit_buckets`)而不是只信 `plan_family`;两端都认不出来时只显示「认不出」,**一个进度条都不画**;
997
1002
  - **没有 refresh_token 交换链**。access token 过期只能重新走登录;账号行上的「重新登录」在 host 侧只解除鉴权失败标记与冷却,真正重登要由卡片再开一次流程;
998
- - **上下文窗口的输出上限是推导值**。端点不报输出上限,所以默认等于上下文窗口——这是一个诚实的兜底,不是一份上游声明;
1003
+ - **没有真实输出 cap 时不在 wire 上发明一个**。目录或调用方明确给出上限时才发送 `max_tokens`;端点没报就省略字段,由上游采用自己的默认值。上下文窗口仍只用于 host 的上下文/压缩判断,不再经 `defaultMaxTokens` 间接变成输出上限;
999
1004
  - **品牌标记取自官方站点资产**,不是本地画的占位图形:形状逐字转录 `platform.stepfun.com/favicon.svg`,底砖色用该文件里的 `#1d1d1d`。抓取日期与字节数记在 `brand-icons.tsx` 的注释里,便于日后核对;
1000
1005
 
1001
1006
  ### 插件路由(Step Code)
@@ -1082,7 +1087,8 @@ access token / refresh token / 授权码 / PKCE verifier**;诊断里提到某
1082
1087
 
1083
1088
  **能力**
1084
1089
 
1085
- - OpenAI Chat Completions 协议,流式输出;透传工具 schema、工具调用/结果,图片按 `image_url` 内联,`reasoning_effort` 原样下发;支持 `temperature`、`stop` 与 `max_tokens`;
1090
+ - OpenAI Chat Completions 协议,流式输出;透传工具 schema、工具调用/结果,图片按 `image_url` 内联,`reasoning_effort` 原样下发;支持 `temperature`、`stop`,输出预算按官方模型规则选择 `max_tokens` / `max_completion_tokens`;
1091
+ - 对真正零内容、零工具且正常 stop 的空轮次按官方 Cline 策略做最多 3 次总尝试(250ms、可取消);内容证明前缓冲,重试不泄漏空块,usage 聚合;
1086
1092
  - 模型目录:随包 16 个 Cline Pass 模型是**兜底**(含 `deepseek-v4.1-flash-1017` 快照 id——网关对别名与快照的钉选行为不同)。点「刷新模型目录」会读官方 `/ai/cline/recommended-models`、models.dev 与上游网关目录,只增不减,并把每个模型的能力(上下文窗口、输出上限、图片、推理档位)一起补上;新发布、本版本不认识的模型按保守值录取,不会被隐藏;**设置页与模型选择器只列内置 + 官方订阅 + 手动添加的模型**,完整网关目录仅作为搜索索引(旧的 exposeCatalog 配置不再展开),其他模型可在卡片里按 id 搜索并添加,添加后自动启用;
1087
1093
  - **上游渠道可观测、可钉住**:同一模型可能由 OpenRouter(direct 管线)或 Vercel AI Gateway(planner 管线)转发。卡片可以对单个模型「探测」渠道、逐个「校验」、按顺序钉住或排除,并在**首个 token 之前**失败切换到下一个渠道;`strict` 只发允许列表,`preferred` 按顺序尝试。钉住字段默认**两种写法都写**(`provider.only/order/sort` 与 `providerOptions.gateway.*`),因为网关可以在两次请求之间换管线,只写一种会让钉住悄悄失效;
1088
1094
  - **钉住是否被采纳以响应为准**:网关对未知/不可用的 `only` 不报错,直接从别的渠道服务。因此探测、校验与真实请求都会回读响应里的实际服务渠道(流式帧的路由块在 `delta.provider_metadata` 的收尾帧上,本线路也会读);「请求 baseten、实际 deepseek」会被明确标成未被采纳,而不是当成成功;
@@ -1140,7 +1146,7 @@ OAuth 是默认入口;「使用 API Key」按钮保留为兼容回退,部署
1140
1146
 
1141
1147
  号池支持多账号轮换;部署也可以用 `OPENDESIGN_API_KEY` 提供第一把 Key(号池为空时投射为首要账号,不写入凭据库)。
1142
1148
 
1143
- **能力**:OpenAI Chat Completions 流式对话(官方给 DeepSeek Harness 推荐的正是这个协议形态),工具调用、图片输入、推理档位透传。网关是 `https://amr-link.open-design.ai/v1`,Bearer 鉴权。
1149
+ **能力**:OpenAI Chat Completions 流式对话(官方给 DeepSeek Harness 推荐的正是这个协议形态),工具调用、图片输入、推理档位透传。输出预算按 OpenDesign 官方规则选择 `max_tokens` / `max_completion_tokens`;仅对官方定义的字段拒收 400 做一次降级重试。网关是 `https://amr-link.open-design.ai/v1`,Bearer 鉴权。
1144
1150
 
1145
1151
  **模型目录**:随包内置 37 个聊天模型,每个都带 id、显示名、美元单价,以及**上下文窗口、最大输出、输入模态(是否收图)与推理档位**——价目来自官方公开价目接口,能力字段转录自本仓库已核对过的同族模型表(command-code 官方注册表、cline-pass、Claude 与 Antigravity 目录;两处冲突以 cline-pass 为准)。登录成功或添加 Key 后自动同步实时目录:**浏览器授权账号(带控制 Key)还会读 AMR 控制面目录**,那里有上游真实的 `metadata.contextWindowTokens`,会覆盖随包表;网关自己的 `/v1/models` 提供该 Key 实际可见的模型清单。同步条目持久化在设置文档里,重启无需网络即可恢复。**`minimax-m3.1-flash` 与 `muse-wonder` 没有任何同族表可核对**,按 128k / 默认三档处理并在文档里列名,不猜数字;任何模型都能在卡片的「上下文窗口」里按模型修正,覆盖值优先于以上全部来源。
1146
1152
 
package/lib/client.js CHANGED
@@ -710,8 +710,6 @@ window.__ModuleLoader__.load({
710
710
  //#region src/shared/model-catalog.ts
711
711
  const GPT_56_MAX_CONTEXT_WINDOW = 1e6;
712
712
  const GPT_6_MAX_CONTEXT_WINDOW = 872e3;
713
- /** Effective context the GPT-6 family starts at, before any user override. */
714
- const GPT_6_DEFAULT_CONTEXT_WINDOW = 384e3;
715
713
  /** Output cap of the GPT-6 family; the vendor declares 128K for all three. */
716
714
  const GPT_6_MAX_TOKENS = 128e3;
717
715
  const CODEX_MODEL_CATALOG = [
@@ -720,72 +718,78 @@ window.__ModuleLoader__.load({
720
718
  name: "5.6 Sol",
721
719
  contextWindow: 272e3,
722
720
  inputModalities: ["text", "image"],
723
- defaultReasoningEffort: "medium",
721
+ defaultReasoningEffort: "low",
724
722
  reasoningProfile: "gpt-5.6",
725
723
  supportsReasoningSummary: true,
726
724
  fallbackModelId: "gpt-5.6-terra",
727
725
  supportsOutputVerbosity: true,
728
- defaultOutputVerbosity: "low"
726
+ defaultOutputVerbosity: "low",
727
+ useResponsesLite: true
729
728
  },
730
729
  {
731
730
  id: "gpt-6-astra",
732
731
  name: "6 Astra",
733
- contextWindow: GPT_6_DEFAULT_CONTEXT_WINDOW,
732
+ contextWindow: 272e3,
734
733
  inputModalities: ["text", "image"],
735
- defaultReasoningEffort: "medium",
734
+ defaultReasoningEffort: "low",
736
735
  reasoningProfile: "gpt-6",
737
736
  supportsReasoningSummary: true,
738
737
  maxTokens: GPT_6_MAX_TOKENS,
739
738
  supportsOutputVerbosity: true,
740
- defaultOutputVerbosity: "low"
739
+ defaultOutputVerbosity: "low",
740
+ useResponsesLite: true
741
741
  },
742
742
  {
743
743
  id: "gpt-6.1-sol",
744
744
  name: "6.1 Sol",
745
- contextWindow: GPT_6_DEFAULT_CONTEXT_WINDOW,
745
+ contextWindow: 272e3,
746
746
  inputModalities: ["text", "image"],
747
- defaultReasoningEffort: "medium",
747
+ defaultReasoningEffort: "low",
748
748
  reasoningProfile: "gpt-6",
749
749
  supportsReasoningSummary: true,
750
750
  maxTokens: GPT_6_MAX_TOKENS,
751
751
  supportsOutputVerbosity: true,
752
- defaultOutputVerbosity: "low"
752
+ defaultOutputVerbosity: "low",
753
+ useResponsesLite: true
753
754
  },
754
755
  {
755
756
  id: "gpt-6.1-terra",
756
757
  name: "6.1 Terra",
757
- contextWindow: GPT_6_DEFAULT_CONTEXT_WINDOW,
758
+ contextWindow: 5e5,
758
759
  inputModalities: ["text", "image"],
759
- defaultReasoningEffort: "medium",
760
+ defaultReasoningEffort: "low",
760
761
  reasoningProfile: "gpt-6",
761
762
  supportsReasoningSummary: true,
762
763
  maxTokens: GPT_6_MAX_TOKENS,
763
764
  supportsOutputVerbosity: true,
764
- defaultOutputVerbosity: "low"
765
+ defaultOutputVerbosity: "low",
766
+ useResponsesLite: true
765
767
  },
766
768
  {
767
769
  id: "gpt-6-sol",
768
770
  name: "6 Sol",
769
- contextWindow: GPT_6_DEFAULT_CONTEXT_WINDOW,
771
+ contextWindow: 272e3,
770
772
  inputModalities: ["text", "image"],
771
773
  defaultReasoningEffort: "medium",
772
774
  reasoningProfile: "gpt-6",
773
775
  supportsReasoningSummary: true,
774
776
  maxTokens: GPT_6_MAX_TOKENS,
775
777
  supportsOutputVerbosity: true,
776
- defaultOutputVerbosity: "low"
778
+ defaultOutputVerbosity: "low",
779
+ useResponsesLite: true
777
780
  },
778
781
  {
779
782
  id: "gpt-6-luna",
780
783
  name: "6 Luna",
781
- contextWindow: GPT_6_DEFAULT_CONTEXT_WINDOW,
784
+ contextWindow: 272e3,
782
785
  inputModalities: ["text", "image"],
783
786
  defaultReasoningEffort: "medium",
784
787
  reasoningProfile: "gpt-6",
785
788
  supportsReasoningSummary: true,
786
789
  maxTokens: GPT_6_MAX_TOKENS,
787
790
  supportsOutputVerbosity: true,
788
- defaultOutputVerbosity: "low"
791
+ defaultOutputVerbosity: "low",
792
+ useResponsesLite: true
789
793
  },
790
794
  {
791
795
  id: "gpt-5.6-terra",
@@ -797,7 +801,8 @@ window.__ModuleLoader__.load({
797
801
  supportsReasoningSummary: true,
798
802
  fallbackModelId: "gpt-5.5",
799
803
  supportsOutputVerbosity: true,
800
- defaultOutputVerbosity: "low"
804
+ defaultOutputVerbosity: "low",
805
+ useResponsesLite: true
801
806
  },
802
807
  {
803
808
  id: "gpt-5.6-luna",
@@ -809,7 +814,8 @@ window.__ModuleLoader__.load({
809
814
  supportsReasoningSummary: true,
810
815
  fallbackModelId: "gpt-5.5",
811
816
  supportsOutputVerbosity: true,
812
- defaultOutputVerbosity: "low"
817
+ defaultOutputVerbosity: "low",
818
+ useResponsesLite: true
813
819
  },
814
820
  {
815
821
  id: "gpt-5.5",
@@ -21358,6 +21364,8 @@ window.__ModuleLoader__.load({
21358
21364
  settingsCacheWarmupNote: "Kimi Code 专用:投影大型日志结果,原文可通过 ref 按需补读;非 Kimi 线路开关无影响",
21359
21365
  settingsRetrievalName: "检索结果投影",
21360
21366
  settingsRetrievalNote: "Kimi Code 专用:导航任务中投影文件、网页与搜索,编辑审查保留原文;非 Kimi 线路开关无影响",
21367
+ settingsCacheWaitWarmupName: "等待缓存续热",
21368
+ settingsCacheWaitWarmupNote: "Kimi Code 专用:等待子代理期间每满 20 分钟自动触发一次轻量续热,只要子代理未完成就持续保活;非 Kimi 线路开关无影响",
21361
21369
  settingsPlanModePipelineName: "计划模式管线",
21362
21370
  settingsPlanModePipelineNote: "澄清访谈收敛后自动进入计划模式出计划,再交审批(仅调度模式生效);关闭后该模式会请用户手动输入 /plan",
21363
21371
  settingsDispatchExecutionGuardName: "调度执行守卫",
@@ -21402,6 +21410,8 @@ window.__ModuleLoader__.load({
21402
21410
  settingsCacheWarmupNote: "Kimi Code only: project large log results and read the original on demand through a ref; no effect on other lines",
21403
21411
  settingsRetrievalName: "Retrieval projection",
21404
21412
  settingsRetrievalNote: "Kimi Code only: project files, pages, and searches for navigation; keep source verbatim for editing and review; no effect on other lines",
21413
+ settingsCacheWaitWarmupName: "Wait-time cache keepalive",
21414
+ settingsCacheWaitWarmupNote: "Kimi Code only: trigger a lightweight warmup every 20 minutes while waiting for subagents so the prefix cache stays warm until they finish; no effect on other lines",
21405
21415
  settingsPlanModePipelineName: "Plan-mode pipeline",
21406
21416
  settingsPlanModePipelineNote: "After the clarification interview converges, enter plan mode, write the plan and send it for approval (dispatch mode only); turning it off makes that mode ask the user to type /plan",
21407
21417
  settingsDispatchExecutionGuardName: "Dispatch execution guard",
@@ -22770,6 +22780,8 @@ window.__ModuleLoader__.load({
22770
22780
  settingsCacheWarmupNote: "Только Kimi Code: проецировать большие журналы и читать оригинал по ref при необходимости; на других линиях переключатель ничего не меняет",
22771
22781
  settingsRetrievalName: "Проекция результатов поиска",
22772
22782
  settingsRetrievalNote: "Только Kimi Code: проецировать файлы, страницы и поиск при навигации; сохранять код при правке и ревью; на других линиях переключатель ничего не меняет",
22783
+ settingsCacheWaitWarmupName: "Поддержание кеша при ожидании",
22784
+ settingsCacheWaitWarmupNote: "Только Kimi Code: каждые 20 минут ожидания субагентов отправлять лёгкий прогрев, пока субагенты работают, чтобы префиксный кеш не остывал; на других линиях переключатель ничего не меняет",
22773
22785
  settingsPlanModePipelineName: "Конвейер режима плана",
22774
22786
  settingsPlanModePipelineNote: "После схождения уточняющего интервью автоматически войти в режим плана, подготовить план и отправить его на утверждение (только в режиме диспетчера); если выключено, этот режим попросит пользователя ввести /plan вручную",
22775
22787
  settingsDispatchExecutionGuardName: "Защита выполнения диспетчера",
@@ -55088,6 +55100,25 @@ window.__ModuleLoader__.load({
55088
55100
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m12 12 4 4M4 3h5M3 16h5" })]
55089
55101
  });
55090
55102
  }
55103
+ /** 等待缓存续热那一行的标记:带循环刷新弧线的时钟(周期续热保活)。 */
55104
+ function CacheWaitWarmupMark() {
55105
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
55106
+ viewBox: "0 0 20 20",
55107
+ width: "20",
55108
+ height: "20",
55109
+ fill: "none",
55110
+ stroke: "currentColor",
55111
+ strokeWidth: "1.6",
55112
+ strokeLinecap: "round",
55113
+ strokeLinejoin: "round",
55114
+ "aria-hidden": "true",
55115
+ children: [
55116
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M16.5 10a6.5 6.5 0 1 1-1.9-4.6" }),
55117
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M16.5 3.8v2.8h-2.8" }),
55118
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10 6.8V10l2.2 1.4" })
55119
+ ]
55120
+ });
55121
+ }
55091
55122
  /** 计划模式管线那一行的标记:一份带勾的计划(计划先出、再交审批)。 */
55092
55123
  function PlanModeMark() {
55093
55124
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
@@ -55199,6 +55230,7 @@ window.__ModuleLoader__.load({
55199
55230
  const enabled = value.progressUpdates !== false;
55200
55231
  const cacheWarmup = value.cacheWarmup !== false;
55201
55232
  const retrieval = value.cacheWarmupRetrieval !== false;
55233
+ const cacheWaitWarmup = value.cacheWaitWarmup !== false;
55202
55234
  const planModePipeline = value.planModePipeline !== false;
55203
55235
  const dispatchExecutionGuard = value.dispatchExecutionGuard !== false;
55204
55236
  const threshold = typeof value.progressUpdatesNudgeThreshold === "number" ? value.progressUpdatesNudgeThreshold : 8;
@@ -55338,6 +55370,27 @@ window.__ModuleLoader__.load({
55338
55370
  }
55339
55371
  })
55340
55372
  }),
55373
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardRow, {
55374
+ part: "settings-row-cache-wait-warmup",
55375
+ brand: "#d97724",
55376
+ mark: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CacheWaitWarmupMark, {}),
55377
+ name: translate("settingsCacheWaitWarmupName"),
55378
+ note: failure?.row === "cacheWaitWarmup" ? failure.text : translate("settingsCacheWaitWarmupNote"),
55379
+ danger: failure?.row === "cacheWaitWarmup",
55380
+ enabled: cacheWaitWarmup,
55381
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
55382
+ type: "button",
55383
+ role: "switch",
55384
+ "aria-checked": cacheWaitWarmup,
55385
+ "aria-label": translate("settingsCacheWaitWarmupName"),
55386
+ className: "dsh-progress-switch",
55387
+ "data-dsh-part": "settings-cache-wait-warmup-switch",
55388
+ disabled: !writable,
55389
+ onClick: () => {
55390
+ write("cacheWaitWarmup", "cacheWaitWarmup", !cacheWaitWarmup);
55391
+ }
55392
+ })
55393
+ }),
55341
55394
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardRow, {
55342
55395
  part: "settings-row-plan-mode-pipeline",
55343
55396
  brand: "#566179",