@kikkimo/claude-launcher 3.1.0 → 3.2.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.
@@ -0,0 +1,292 @@
1
+ # Provider 模型升级设计 — v3.2.0
2
+
3
+ - **日期**:2026-06-14
4
+ - **状态**:已批准(待实施);经 Codex(GPT-5.5 / xhigh)评审 3 轮通过(round1/round2 修订 → round3 pass)
5
+ - **影响文件**:`lib/presets/providers.js`、`lib/api-manager.js`(迁移逻辑)、`lib/launcher.js`(仅消费,无改动)、`lib/utils/model-upgrade-checker.js`(无逻辑改动)、`test/providers.test.js`、`test/env-vars-providers.test.js`、`test/api-manager.test.js`(新增迁移用例)、`package.json`、`CHANGELOG.md`
6
+
7
+ ## 背景
8
+
9
+ claude-launcher 预置 9 个 Anthropic 兼容 API provider,模型定义集中在 `lib/presets/providers.js`。截至 2026-06-14,经核对各家官方 Claude Code 集成口径,以下 provider 的模型定义滞后:
10
+
11
+ - **anthropic**:缺 `claude-opus-4-8`(当前最新停在 `claude-opus-4-7`)
12
+ - **moonshot**:当前主模型 `kimi-k2.6` 已被官方主推的 `kimi-k2.7-code` 取代
13
+ - **minimax(cn/global)**:缺 `MiniMax-M3`(2026-06-01 发布的 M 系列最新主模型)
14
+ - **deepseek**:Haiku 档应为 `deepseek-v4-flash`(项目当前用 `deepseek-v4-flash[1m]`)
15
+ - **zhipu / zai**:缺 `glm-5.2` / `glm-5.2[1m]`(当前最新停在 `glm-5.1`)
16
+
17
+ 此外,API 的 tier 默认值(`ANTHROPIC_DEFAULT_OPUS_MODEL` 等)在创建/编辑时由 provider template 计算并**持久化**,启动时直接消费(`launcher.js:getProviderEnvVars`)。provider template 升级后,已保存的旧配置不会自动刷新——本次必须一并设计迁移机制。
18
+
19
+ ## 目标
20
+
21
+ 1. 对齐 5 个 provider(anthropic、moonshot、minimax、deepseek、zhipu/zai)的模型定义到各家官方最新口径
22
+ 2. `versionAliases` 单跳收敛到当前旗舰,让升级检测对每个旧模型都生效
23
+ 3. 为 GLM 设计明确的 opus/sonnet/haiku 三档 tier 映射
24
+ 4. **新增**:provider template 升级后,已保存的 API 配置能自动刷新 tier 默认(保留用户手动覆盖)
25
+ 5. 同步更新测试断言与 CHANGELOG,保持既有不变量
26
+
27
+ ## 非目标
28
+
29
+ - **仅维护 Claude 4 Opus/Sonnet/Haiku tier**:本次把 opus 系列升级到 `claude-opus-4-8`,**不把 Fable / Mythos 纳入** claude-launcher 的 provider 列表或 upgrade alias
30
+ - 不增删 provider 列表本身
31
+ - 不改动 `model-upgrade-checker` 的检测算法(继续沿用单跳 `versionAliases`)
32
+ - `kimi_for_coding`(稳定别名 `kimi-for-coding`)与 `custom` 模板不变
33
+
34
+ ## 设计原则(由代码契约推导)
35
+
36
+ | 原则 | 依据 | 对设计的要求 |
37
+ |---|---|---|
38
+ | **单跳收敛** | `getLatestModel(model, provider) === providers[provider].versionAliases[model] \|\| null`,无图遍历 | 每个旧模型必须**直接**指向最新旗舰,禁止链式中间跳(如 `4.5→4.7→5.1` 会被截断到 `4.7`) |
39
+ | **旗舰豁免** | `test/providers.test.js` 不变量:`models[0]` 不得出现在 `versionAliases` 的 key 中 | 最新旗舰自身永不"可升级" |
40
+ | **分档不升级** | haiku/快速档是有效产品线,非"过时" | `glm-5-turbo`、`deepseek-v4-flash`、`MiniMax-M2.x-highspeed` 等 haiku 档模型不设升级路径 |
41
+ | **同档旧版升级** | 与 anthropic 既有模式一致(`opus-4-6→4-7`) | 旗舰/opus 系旧版引导升级到该档最新 |
42
+ | **有 tier 角色的可选模型不升级** | GLM 的 `glm-5`、`glm-5.1` 是用户主动保留的可选项 | 不设升级路径;仅已下线的 `glm-4.5/4.6/4.7` 设 alias |
43
+
44
+ ## 升级收敛图
45
+
46
+ 每条均为单跳,最左目标为 `models[0]`(本设计定义的 provider target model),不出现在任何 alias key 中。
47
+
48
+ ```
49
+ anthropic: opus-4 / 4-1 / 4-5 / 4-6 / 4-7 ──► claude-opus-4-8
50
+ sonnet-4 / 4-5 / 3-7-sonnet ──► claude-sonnet-4-6
51
+
52
+ zhipu/zai: glm-4.5 / 4.6 / 4.7 ──► glm-5.2[1m]
53
+ (glm-5 / glm-5.1 / glm-5-turbo 不升级:有 tier 角色)
54
+
55
+ moonshot: kimi-k2.6 / k2.5 / k2-thinking / k2-thinking-turbo
56
+ + kimi-k2-0711/0905/turbo-preview ──► kimi-k2.7-code
57
+
58
+ minimax: MiniMax-M2 / M2.1 / M2.5 / M2.7 ──► MiniMax-M3
59
+ (-highspeed 变体不升级:担任 haiku 档)
60
+
61
+ deepseek: deepseek-chat ──► deepseek-v4-flash
62
+ deepseek-reasoner ──► deepseek-v4-pro[1m]
63
+ deepseek-v4-flash[1m] ──► deepseek-v4-flash (兼容旧配置)
64
+ ```
65
+
66
+ ## tier 映射总表
67
+
68
+ | Provider | Opus 档(最强) | Sonnet 档(默认/平衡) | Haiku 档(快速/subagent) | template 实现 |
69
+ |---|---|---|---|---|
70
+ | **anthropic** | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5-20251001` | 现有 `find('opus'\|'sonnet'\|'haiku')`,不变 |
71
+ | **zhipu / zai** | `glm-5.2[1m]` | `glm-5.2[1m]` | `glm-5-turbo` | **新增固定 tier template** |
72
+ | **moonshot** | `kimi-k2.7-code` | `kimi-k2.7-code` | `kimi-k2.7-code` | `makeSingleTemplate()` |
73
+ | **minimax** | `MiniMax-M3` | `MiniMax-M3` | 选 M3→M3;选 M2.x→M2.x-highspeed | 现有 `makeFastMapTemplate`,不变(M3 自动 fallback 自身) |
74
+ | **deepseek** | `deepseek-v4-pro[1m]` | `deepseek-v4-pro[1m]` | `deepseek-v4-flash` | `makeFastMapTemplate({ 'deepseek-v4-pro[1m]': 'deepseek-v4-flash' })` |
75
+
76
+ **GLM 新 template**(取代当前 `makeFastMapTemplate`):Opus 与 Sonnet 同档(均用旗舰 `glm-5.2[1m]`),Haiku 固定为 `glm-5-turbo`。无论用户在 `/model` 选哪个模型作为 `CUSTOM_MODEL_OPTION`,三档标准固定,符合 Claude Code「tier 标准固定、CUSTOM 为当前选择」的语义。
77
+
78
+ ## 持久化迁移(template 漂移检测)
79
+
80
+ **问题**:API 的 tier 默认值在创建/编辑时由 provider template 计算并持久化到 `modelEnvVars` / `_autoModelEnvVars` / `smallFastModel`,启动时由 `launcher.js:getProviderEnvVars` 直接消费。当前 `_normalizeApiFields`(`api-manager.js:131`)只在 `_autoModelEnvVars` **缺失**时重建,已有配置仅补缺失 key;只有编辑 model 时(`api-manager.js:521`)才按新 template 刷新。因此 provider template 升级后,已保存的 API(如 `glm-5.1`、`deepseek-v4-pro[1m]`、`claude-sonnet-4-6`)会继续使用旧 tier 默认——**provider 单测通过 ≠ 真实启动环境已升级**。
81
+
82
+ **方案**:在 `_normalizeApiFields` 增加 template 漂移检测。加载时计算 `currentTemplate = provider.modelEnvTemplate.getValues(effectiveModel)`,与持久化的 `api._autoModelEnvVars` 比较:
83
+
84
+ - **一致**(template 未变):无操作,保持现状
85
+ - **不一致**(template 升级,即本次升级后首次加载旧配置):
86
+ - 对每个 `PREDEFINED_MODEL_ENV_KEYS`:若 `api.modelEnvVars[k] === api._autoModelEnvVars[k]`(仍等于旧 auto 快照、用户未手动覆盖)→ 刷新为 `currentTemplate[k]`
87
+ - `smallFastModel` 同理:若 `api.smallFastModel === api._autoModelEnvVars.smallFastModel` → 刷新为 `currentTemplate.smallFastModel`
88
+ - 更新 `api._autoModelEnvVars = { ...currentTemplate }`
89
+
90
+ **不在此处调用 `saveConfig()`**——`_normalizeApiFields` 保持纯变更函数。漂移改写会改变 `modelEnvVars` / `_autoModelEnvVars` / `smallFastModel`,而 `_migrateApiEntry`(`api-manager.js:88`)的 before/after 比较已覆盖这三个字段,自动返回 `migrated=true`;构造函数(`api-manager.js:43-47`)据此统一 `saveConfig()` 持久化。该「保留用户手动覆盖」逻辑复用 `updateApiField(model)` 已验证模式(`api-manager.js:533-551`),仅把触发条件从「用户编辑 model」扩展为「template 漂移」。
91
+
92
+ ## 各 provider 目标态
93
+
94
+ ### anthropic
95
+
96
+ ```js
97
+ const anthropicModels = [
98
+ 'claude-opus-4-8', // 新增 — models[0]
99
+ 'claude-opus-4-7',
100
+ 'claude-sonnet-4-6',
101
+ 'claude-haiku-4-5-20251001',
102
+ 'claude-sonnet-4-5',
103
+ 'claude-opus-4-6',
104
+ 'claude-opus-4-5',
105
+ ];
106
+ // versionAliases
107
+ {
108
+ 'claude-opus-4': 'claude-opus-4-8',
109
+ 'claude-opus-4-1': 'claude-opus-4-8',
110
+ 'claude-opus-4-5': 'claude-opus-4-8',
111
+ 'claude-opus-4-6': 'claude-opus-4-8',
112
+ 'claude-opus-4-7': 'claude-opus-4-8', // 新增
113
+ 'claude-sonnet-4': 'claude-sonnet-4-6',
114
+ 'claude-sonnet-4-5': 'claude-sonnet-4-6',
115
+ 'claude-3-7-sonnet': 'claude-sonnet-4-6',
116
+ }
117
+ // name: 'Anthropic (Official)' 不变
118
+ // modelEnvTemplate: 现有 find 逻辑不变(数组顺序保证 find('opus')→4-8, find('sonnet')→4-6)
119
+ ```
120
+
121
+ > 数组顺序约束:`claude-opus-4-8` 必须在所有含 `opus` 的模型之前;`claude-sonnet-4-6` 必须在 `claude-sonnet-4-5` 之前,以保证 `find()` 命中最新。
122
+
123
+ ### zhipu / zai(二者镜像一致)
124
+
125
+ ```js
126
+ // 新增 template factory
127
+ function makeGlmTierTemplate() {
128
+ return {
129
+ getValues(model) {
130
+ return {
131
+ ANTHROPIC_CUSTOM_MODEL_OPTION: model,
132
+ ANTHROPIC_CUSTOM_MODEL_OPTION_NAME: model,
133
+ ANTHROPIC_DEFAULT_OPUS_MODEL: 'glm-5.2[1m]',
134
+ ANTHROPIC_DEFAULT_SONNET_MODEL: 'glm-5.2[1m]',
135
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: 'glm-5-turbo',
136
+ CLAUDE_CODE_SUBAGENT_MODEL: 'glm-5-turbo',
137
+ smallFastModel: 'glm-5-turbo',
138
+ };
139
+ },
140
+ };
141
+ }
142
+
143
+ // provider 定义(zhipu 与 zai 除 baseUrl/name 外完全一致)
144
+ name: 'ZhiPu AI (GLM-5.2/5-Turbo) - 智谱清言', // zai: 'Z.ai (GLM-5.2/5-Turbo) - ZhiPu Global'
145
+ models: ['glm-5.2[1m]', 'glm-5.1', 'glm-5-turbo', 'glm-5'], // opus→sonnet 备选→haiku→历史
146
+ versionAliases: {
147
+ 'glm-4.5': 'glm-5.2[1m]',
148
+ 'glm-4.6': 'glm-5.2[1m]',
149
+ 'glm-4.7': 'glm-5.2[1m]',
150
+ // glm-5 / glm-5.1 / glm-5-turbo 均不设 alias(有 tier 角色或为 haiku 档)
151
+ },
152
+ envVars: {
153
+ // ...原有项保留...
154
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: '1000000', // 新增 — 配合 1M 上下文
155
+ },
156
+ modelEnvTemplate: makeGlmTierTemplate(),
157
+ ```
158
+
159
+ > **来源说明(glm-5.2)**:`glm-5.2` / `glm-5.2[1m]` 依据项目维护者 2026-06-14 提供的官方 FAQ 口径(GLM Coding Plan 当前支持 GLM-5.2、GLM-5-Turbo、GLM-4.7、GLM-4.5-Air)。`[1m]` 为 1M 上下文标记,配套 `CLAUDE_CODE_AUTO_COMPACT_WINDOW=1000000`。`glm-5.1` 保留为可选模型(用户主动保留,不设升级路径)。当前代码中 `'glm-5-turbo': 'glm-5.1'` 这一将快速档误升级为旗舰的矛盾项一并移除。
160
+
161
+ ### moonshot
162
+
163
+ ```js
164
+ name: 'Moonshot AI (Kimi-K2.7-Code)',
165
+ baseUrl: 'https://api.moonshot.cn/anthropic', // 不变
166
+ models: ['kimi-k2.7-code'],
167
+ versionAliases: {
168
+ 'kimi-k2.6': 'kimi-k2.7-code',
169
+ 'kimi-k2.5': 'kimi-k2.7-code',
170
+ 'kimi-k2-thinking': 'kimi-k2.7-code',
171
+ 'kimi-k2-thinking-turbo': 'kimi-k2.7-code',
172
+ 'kimi-k2-0711-preview': 'kimi-k2.7-code',
173
+ 'kimi-k2-0905-preview': 'kimi-k2.7-code',
174
+ 'kimi-k2-turbo-preview': 'kimi-k2.7-code',
175
+ },
176
+ modelEnvTemplate: makeSingleTemplate(), // thinking 不可关,单一旗舰,所有 tier 同模型
177
+ envVars: {
178
+ // ...原有项保留(API_TIMEOUT_MS、CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC 等)...
179
+ ENABLE_TOOL_SEARCH: 'false', // 新增 — Kimi 官方 Claude Code 集成要求
180
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: '262144', // 新增 — 配合 K2.7 的 256K 上下文
181
+ },
182
+ ```
183
+
184
+ > **来源说明(moonshot env vars)**:`ENABLE_TOOL_SEARCH=false` 与 `CLAUDE_CODE_AUTO_COMPACT_WINDOW=262144` 依据 Kimi 官方 Claude Code 集成文档(CN: platform.kimi.com / Global: platform.kimi.ai)。K2.7 thinking 不可关闭、256K 上下文。这两个为 **provider-only 默认**——它们不在 `PREDEFINED_RUNTIME_KEYS` 白名单(`validators.js:138`),Runtime UI 不暴露,用户若需覆盖走 **Custom Vars**(`launcher.js:260-265` 已支持非预定义 key 覆盖 provider 默认)。**本次不扩展 Runtime UI 白名单**(避免牵动 validators / api-editor / i18n / 多个 runtime 测试,超出模型升级范围)。
185
+
186
+ ### minimax_cn / minimax_global(二者镜像一致)
187
+
188
+ ```js
189
+ name: 'MiniMax CN (国内版)', // global: 'MiniMax Global (国际版)'
190
+ models: [
191
+ 'MiniMax-M3', // 新增 — models[0],所有 tier 均映射 M3
192
+ 'MiniMax-M2.7',
193
+ 'MiniMax-M2.7-highspeed',
194
+ 'MiniMax-M2.5',
195
+ 'MiniMax-M2.5-highspeed',
196
+ 'MiniMax-M2.1',
197
+ 'MiniMax-M2.1-highspeed',
198
+ 'MiniMax-M2',
199
+ ],
200
+ versionAliases: {
201
+ 'MiniMax-M2': 'MiniMax-M3',
202
+ 'MiniMax-M2.1': 'MiniMax-M3',
203
+ 'MiniMax-M2.5': 'MiniMax-M3',
204
+ 'MiniMax-M2.7': 'MiniMax-M3', // 新增
205
+ // -highspeed 变体不设 alias(担任 haiku 档)
206
+ },
207
+ // modelEnvTemplate 不变:makeFastMapTemplate({ M2.x → M2.x-highspeed })
208
+ // M3 不在 fastMap 中 → fastMap[model] || model 回退到 M3 自身 = 所有 tier 映射 M3
209
+ ```
210
+
211
+ ### deepseek
212
+
213
+ ```js
214
+ name: 'DeepSeek (V4-Pro/V4-Flash)', // 不变
215
+ models: [
216
+ 'deepseek-v4-pro[1m]', // 主力(Opus/Sonnet)
217
+ 'deepseek-v4-flash', // 快速/Haiku/subagent(去掉 [1m],对齐官方 Haiku 口径)
218
+ 'deepseek-chat', // 兼容别名,2026-07-24 停用
219
+ 'deepseek-reasoner', // 兼容别名,2026-07-24 停用
220
+ ],
221
+ versionAliases: {
222
+ 'deepseek-chat': 'deepseek-v4-flash',
223
+ 'deepseek-reasoner': 'deepseek-v4-pro[1m]',
224
+ 'deepseek-v4-flash[1m]': 'deepseek-v4-flash', // 兼容旧配置
225
+ },
226
+ modelEnvTemplate: makeFastMapTemplate({ 'deepseek-v4-pro[1m]': 'deepseek-v4-flash' }),
227
+ // envVars 不变
228
+ ```
229
+
230
+ > **来源说明(deepseek `[1m]`)**:`deepseek-v4-pro[1m]` 为 Claude Code 官方集成示例的主模型写法(`[1m]`=1M 上下文变体,非笔误);Haiku 档用 `deepseek-v4-flash`(无 `[1m]`)对齐官方示例。旧别名 `deepseek-chat` / `deepseek-reasoner` 将于 2026-07-24 停用,保留为兼容 alias。
231
+
232
+ ### kimi_for_coding / custom — 不改动
233
+
234
+ `kimi-for-coding` 是后端自动映射最新的稳定别名,保持原样。
235
+
236
+ ## 测试影响
237
+
238
+ ### `test/providers.test.js`
239
+
240
+ - `zhipu: models list is correct` → `['glm-5.2[1m]', 'glm-5.1', 'glm-5-turbo', 'glm-5']`
241
+ - `zhipu: name includes all current model families` → 含 `GLM-5.2`、`5-Turbo`
242
+ - 删除 `zhipu: glm-5-turbo aliases to glm-5.1`(turbo 不再升级)
243
+ - `zhipu: glm-4.7 aliases to ...` → 目标改为 `glm-5.2[1m]`;新增 `glm-5.2[1m] has no alias`、`glm-5.1 has no alias`
244
+ - `moonshot: models list ...` → `['kimi-k2.7-code']`,`length === 1`
245
+ - 所有 moonshot alias 目标 → `kimi-k2.7-code`;新增 `kimi-k2.7-code has no alias`
246
+ - `minimax_cn: models list ...` → 含 `MiniMax-M3`,`length === 8`
247
+ - `minimax_cn: MiniMax-M2.7 aliases to ...` → `MiniMax-M3`;新增 `MiniMax-M3 has no alias`
248
+ - `anthropic: models include ...` → 含 `claude-opus-4-8`,`length === 7`
249
+ - `anthropic: versionAliases map opus series to opus-4-7` → 改为 `opus-4-8`,并覆盖 `opus-4-7 → opus-4-8`
250
+ - `deepseek: models include ...` → 含 `deepseek-v4-flash`(去 `[1m]`)
251
+ - 新增 `moonshot: envVars includes ENABLE_TOOL_SEARCH / AUTO_COMPACT_WINDOW` 断言
252
+ - 不变量测试 `models[0] ∉ versionAliases`:自动覆盖新旗舰,无需改
253
+
254
+ ### `test/env-vars-providers.test.js`
255
+
256
+ - `anthropic model list trimmed` → `length === 7`,含 `claude-opus-4-8`
257
+ - `anthropic versionAlias opus-4-6 → opus-4-7` → `opus-4-8`
258
+ - `anthropic template: tier-based assignment` → 选 `claude-sonnet-4-6` 时 `OPUS = claude-opus-4-8`
259
+ - `deepseek alias chat → v4-flash` → `deepseek-v4-flash`(去 `[1m]`)
260
+ - `deepseek template: pro model → flash` → `HAIKU/SUBAGENT/smallFast = deepseek-v4-flash`
261
+ - 新增 GLM tier template 测试:`getValues('glm-5.2[1m]')` → `OPUS = SONNET = glm-5.2[1m]`、`HAIKU = glm-5-turbo`;`getValues('glm-5')` → tier 标准仍为 `glm-5.2[1m]`/`glm-5-turbo`,`CUSTOM = glm-5`
262
+ - 新增 moonshot provider-default vs Custom Vars 覆盖优先级测试:`getProviderEnvVars()` 默认输出 `ENABLE_TOOL_SEARCH=false`;当 `customEnvVars.ENABLE_TOOL_SEARCH='true'` 时输出 `'true'`(验证 `launcher.js:260-265` 合并优先级)
263
+
264
+ ### `test/api-manager.test.js`(新增迁移用例)
265
+
266
+ 覆盖**真实加载路径**(`_migrateApiEntry` / `loadConfig`),而非仅直调 `_normalizeApiFields`:
267
+
268
+ - 构造旧配置(`provider=zhipu, model=glm-5.1, _autoModelEnvVars=<旧 glm-5.1 template 快照>`),经 `_migrateApiEntry` 后:
269
+ - `api.modelEnvVars.ANTHROPIC_DEFAULT_OPUS_MODEL === 'glm-5.2[1m]'`(漂移刷新)
270
+ - `api.modelEnvVars.ANTHROPIC_DEFAULT_HAIKU_MODEL === 'glm-5-turbo'`
271
+ - `api._autoModelEnvVars` 已更新为新 template 快照
272
+ - `_migrateApiEntry` 返回 `true`(migrated),证明会触发构造函数 `saveConfig()`
273
+ - 用户手动覆盖保留:旧配置中 `modelEnvVars.ANTHROPIC_DEFAULT_HAIKU_MODEL` 被手动设为 `'glm-5.1'`(≠ 旧 auto)→ 漂移刷新后**保持** `'glm-5.1'` 不变
274
+ - 集成断言:上述旧配置经 `getProviderEnvVars()` 输出含 `ANTHROPIC_DEFAULT_OPUS_MODEL=glm-5.2[1m]`
275
+ - 无漂移场景:`_autoModelEnvVars` 已等于当前 template → `_migrateApiEntry` 返回 `false`,不改写任何字段
276
+
277
+ ## 版本与 CHANGELOG
278
+
279
+ - `package.json` → `3.2.0`
280
+ - CHANGELOG `[3.2.0]` 段:
281
+ - **Added**:`claude-opus-4-8`(anthropic)、`kimi-k2.7-code`(moonshot)、`MiniMax-M3`(minimax)、`glm-5.2[1m]`(zhipu/zai)
282
+ - **Added**:provider template 漂移检测——升级后首次加载旧配置自动刷新 tier 默认(保留用户手动覆盖)
283
+ - **Changed**:GLM 改用固定 tier template(Opus=Sonnet=`glm-5.2[1m]`、Haiku=`glm-5-turbo`);DeepSeek Haiku 档对齐为 `deepseek-v4-flash`;moonshot 收敛为单一旗舰 `kimi-k2.7-code`,旧模型转为升级别名,新增 `ENABLE_TOOL_SEARCH`/`CLAUDE_CODE_AUTO_COMPACT_WINDOW`;zhipu/zai 新增 `CLAUDE_CODE_AUTO_COMPACT_WINDOW=1000000`
284
+ - **Removed**:moonshot 主列表移除 `kimi-k2.5/k2-thinking/k2-thinking-turbo`(保留为升级别名)
285
+
286
+ ## 验收标准
287
+
288
+ 1. `npm test` 全部通过
289
+ 2. 对每个 provider,`getLatestModel(<每个旧模型>, provider)` 返回该 provider 的本设计定义 target model(或对 haiku/有角色模型返回 `null`)
290
+ 3. 对每个 provider,`getLatestModel(models[0], provider) === null`(旗舰豁免)
291
+ 4. `model-upgrade-checker.checkAllApiUpgrades()` 对一个配置了旧模型(如 `glm-4.7`、`kimi-k2.6`、`MiniMax-M2.7`、`claude-opus-4-7`)的 API 能正确检出升级建议
292
+ 5. **迁移**:加载一个升级前保存的旧配置(如 `provider=zhipu, model=glm-5.1`),`getProviderEnvVars()` 输出新的 tier 默认值(`OPUS=glm-5.2[1m]`、`HAIKU=glm-5-turbo`);用户手动覆盖的字段保持不变
@@ -168,6 +168,32 @@ class ApiManager {
168
168
  api.smallFastModel = template.smallFastModel;
169
169
  }
170
170
 
171
+ // template 漂移检测:provider template 升级后首次加载旧配置时,_autoModelEnvVars
172
+ // 仍是旧快照。检测到漂移则刷新仍等于旧快照的 tier 字段(保留用户手动覆盖),
173
+ // 复用 updateApiField() 的保留覆盖模式。_migrateApiEntry 的 before/after 比较
174
+ // 已覆盖 modelEnvVars/_autoModelEnvVars/smallFastModel,会据此返回 migrated=true
175
+ // 并由构造函数统一 saveConfig()。
176
+ if (hadAutoModelEnvVars) {
177
+ let drifted = false;
178
+ for (const k of PREDEFINED_MODEL_ENV_KEYS) {
179
+ if (api._autoModelEnvVars[k] !== template[k]) { drifted = true; break; }
180
+ }
181
+ if (!drifted && api._autoModelEnvVars.smallFastModel !== template.smallFastModel) {
182
+ drifted = true;
183
+ }
184
+ if (drifted) {
185
+ for (const k of PREDEFINED_MODEL_ENV_KEYS) {
186
+ if (api.modelEnvVars[k] === api._autoModelEnvVars[k]) {
187
+ api.modelEnvVars[k] = template[k] || '';
188
+ }
189
+ }
190
+ if (api.smallFastModel === api._autoModelEnvVars.smallFastModel) {
191
+ api.smallFastModel = template.smallFastModel;
192
+ }
193
+ api._autoModelEnvVars = { ...template };
194
+ }
195
+ }
196
+
171
197
  // runtimeEnvVars — fill "" not provider values
172
198
  if (!api.runtimeEnvVars) {
173
199
  api.runtimeEnvVars = {};
@@ -39,8 +39,28 @@ function makeSingleTemplate() {
39
39
  };
40
40
  }
41
41
 
42
+ // Template factory: GLM — fixed tier standards (Opus=Sonnet=flagship, Haiku=turbo),
43
+ // regardless of which model the user picked as CUSTOM. Matches Claude Code's
44
+ // "tier standards are fixed, CUSTOM is the current selection" semantics.
45
+ function makeGlmTierTemplate() {
46
+ return {
47
+ getValues(model) {
48
+ return {
49
+ ANTHROPIC_CUSTOM_MODEL_OPTION: model,
50
+ ANTHROPIC_CUSTOM_MODEL_OPTION_NAME: model,
51
+ ANTHROPIC_DEFAULT_OPUS_MODEL: 'glm-5.2[1m]',
52
+ ANTHROPIC_DEFAULT_SONNET_MODEL: 'glm-5.2[1m]',
53
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: 'glm-5-turbo',
54
+ CLAUDE_CODE_SUBAGENT_MODEL: 'glm-5-turbo',
55
+ smallFastModel: 'glm-5-turbo',
56
+ };
57
+ },
58
+ };
59
+ }
60
+
42
61
  // Anthropic models — defined as const so the template factory can reference them
43
62
  const anthropicModels = [
63
+ 'claude-opus-4-8',
44
64
  'claude-opus-4-7',
45
65
  'claude-sonnet-4-6',
46
66
  'claude-haiku-4-5-20251001',
@@ -55,10 +75,11 @@ const providers = {
55
75
  baseUrl: 'https://api.anthropic.com',
56
76
  models: anthropicModels,
57
77
  versionAliases: {
58
- 'claude-opus-4': 'claude-opus-4-7',
59
- 'claude-opus-4-1': 'claude-opus-4-7',
60
- 'claude-opus-4-5': 'claude-opus-4-7',
61
- 'claude-opus-4-6': 'claude-opus-4-7',
78
+ 'claude-opus-4': 'claude-opus-4-8',
79
+ 'claude-opus-4-1': 'claude-opus-4-8',
80
+ 'claude-opus-4-5': 'claude-opus-4-8',
81
+ 'claude-opus-4-6': 'claude-opus-4-8',
82
+ 'claude-opus-4-7': 'claude-opus-4-8',
62
83
  'claude-sonnet-4': 'claude-sonnet-4-6',
63
84
  'claude-sonnet-4-5': 'claude-sonnet-4-6',
64
85
  'claude-3-7-sonnet': 'claude-sonnet-4-6',
@@ -89,21 +110,19 @@ const providers = {
89
110
  },
90
111
  },
91
112
  moonshot: {
92
- name: 'Moonshot AI (Kimi-K2.6/K2.5/K2-Thinking)',
113
+ name: 'Moonshot AI (Kimi-K2.7-Code)',
93
114
  baseUrl: 'https://api.moonshot.cn/anthropic',
94
115
  models: [
95
- 'kimi-k2.6',
96
- 'kimi-k2.5',
97
- 'kimi-k2-thinking',
98
- 'kimi-k2-thinking-turbo',
116
+ 'kimi-k2.7-code',
99
117
  ],
100
118
  versionAliases: {
101
- 'kimi-k2-0711-preview': 'kimi-k2.6',
102
- 'kimi-k2-0905-preview': 'kimi-k2.6',
103
- 'kimi-k2-turbo-preview': 'kimi-k2.6',
104
- 'kimi-k2-thinking': 'kimi-k2.6',
105
- 'kimi-k2-thinking-turbo': 'kimi-k2.6',
106
- 'kimi-k2.5': 'kimi-k2.6',
119
+ 'kimi-k2.6': 'kimi-k2.7-code',
120
+ 'kimi-k2.5': 'kimi-k2.7-code',
121
+ 'kimi-k2-thinking': 'kimi-k2.7-code',
122
+ 'kimi-k2-thinking-turbo': 'kimi-k2.7-code',
123
+ 'kimi-k2-0711-preview': 'kimi-k2.7-code',
124
+ 'kimi-k2-0905-preview': 'kimi-k2.7-code',
125
+ 'kimi-k2-turbo-preview': 'kimi-k2.7-code',
107
126
  },
108
127
  authTokenFormat: 'sk-...',
109
128
  description: 'Moonshot AI - Provides Anthropic-compatible API',
@@ -114,9 +133,11 @@ const providers = {
114
133
  CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
115
134
  CLAUDE_CODE_ATTRIBUTION_HEADER: '0',
116
135
  CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS: '1',
117
- CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1'
136
+ CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1',
137
+ ENABLE_TOOL_SEARCH: 'false',
138
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: '262144',
118
139
  },
119
- modelEnvTemplate: makeFastMapTemplate({"kimi-k2.6":"kimi-k2-thinking-turbo","kimi-k2-thinking":"kimi-k2-thinking-turbo"}),
140
+ modelEnvTemplate: makeSingleTemplate(),
120
141
  note: 'Requires extended timeout for large responses'
121
142
  },
122
143
  kimi_for_coding: {
@@ -143,6 +164,7 @@ const providers = {
143
164
  name: 'MiniMax CN (国内版)',
144
165
  baseUrl: 'https://api.minimaxi.com/anthropic',
145
166
  models: [
167
+ 'MiniMax-M3',
146
168
  'MiniMax-M2.7',
147
169
  'MiniMax-M2.7-highspeed',
148
170
  'MiniMax-M2.5',
@@ -152,8 +174,10 @@ const providers = {
152
174
  'MiniMax-M2',
153
175
  ],
154
176
  versionAliases: {
155
- 'MiniMax-M2.1': 'MiniMax-M2.7',
156
- 'MiniMax-M2.5': 'MiniMax-M2.7'
177
+ 'MiniMax-M2': 'MiniMax-M3',
178
+ 'MiniMax-M2.1': 'MiniMax-M3',
179
+ 'MiniMax-M2.5': 'MiniMax-M3',
180
+ 'MiniMax-M2.7': 'MiniMax-M3'
157
181
  },
158
182
  authTokenFormat: 'sk-...',
159
183
  description: 'MiniMax AI - Anthropic-compatible API for China users',
@@ -173,6 +197,7 @@ const providers = {
173
197
  name: 'MiniMax Global (国际版)',
174
198
  baseUrl: 'https://api.minimax.io/anthropic',
175
199
  models: [
200
+ 'MiniMax-M3',
176
201
  'MiniMax-M2.7',
177
202
  'MiniMax-M2.7-highspeed',
178
203
  'MiniMax-M2.5',
@@ -182,8 +207,10 @@ const providers = {
182
207
  'MiniMax-M2',
183
208
  ],
184
209
  versionAliases: {
185
- 'MiniMax-M2.1': 'MiniMax-M2.7',
186
- 'MiniMax-M2.5': 'MiniMax-M2.7'
210
+ 'MiniMax-M2': 'MiniMax-M3',
211
+ 'MiniMax-M2.1': 'MiniMax-M3',
212
+ 'MiniMax-M2.5': 'MiniMax-M3',
213
+ 'MiniMax-M2.7': 'MiniMax-M3'
187
214
  },
188
215
  authTokenFormat: 'sk-...',
189
216
  description: 'MiniMax AI - Anthropic-compatible API for international users',
@@ -204,13 +231,14 @@ const providers = {
204
231
  baseUrl: 'https://api.deepseek.com/anthropic',
205
232
  models: [
206
233
  'deepseek-v4-pro[1m]',
207
- 'deepseek-v4-flash[1m]',
234
+ 'deepseek-v4-flash',
208
235
  'deepseek-chat',
209
236
  'deepseek-reasoner',
210
237
  ],
211
238
  versionAliases: {
212
- 'deepseek-chat': 'deepseek-v4-flash[1m]',
239
+ 'deepseek-chat': 'deepseek-v4-flash',
213
240
  'deepseek-reasoner': 'deepseek-v4-pro[1m]',
241
+ 'deepseek-v4-flash[1m]': 'deepseek-v4-flash',
214
242
  },
215
243
  authTokenFormat: 'sk-...',
216
244
  description: 'DeepSeek AI - Anthropic-compatible endpoint',
@@ -224,24 +252,22 @@ const providers = {
224
252
  CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1',
225
253
  CLAUDE_CODE_EFFORT_LEVEL: 'max',
226
254
  },
227
- modelEnvTemplate: makeFastMapTemplate({"deepseek-v4-pro[1m]":"deepseek-v4-flash[1m]"}),
255
+ modelEnvTemplate: makeFastMapTemplate({"deepseek-v4-pro[1m]":"deepseek-v4-flash"}),
228
256
  note: 'Requires extended timeout for complex reasoning tasks',
229
257
  },
230
258
  zhipu: {
231
- name: 'ZhiPu AI (GLM-5.1/5-Turbo/5/4.7) - 智谱清言',
259
+ name: 'ZhiPu AI (GLM-5.2/5-Turbo) - 智谱清言',
232
260
  baseUrl: 'https://open.bigmodel.cn/api/anthropic',
233
261
  models: [
262
+ 'glm-5.2[1m]',
234
263
  'glm-5.1',
235
264
  'glm-5-turbo',
236
- 'glm-5',
237
- 'glm-4.7'
265
+ 'glm-5'
238
266
  ],
239
267
  versionAliases: {
240
- 'glm-4.5': 'glm-5.1',
241
- 'glm-4.6': 'glm-5.1',
242
- 'glm-4.7': 'glm-5.1',
243
- 'glm-5': 'glm-5.1',
244
- 'glm-5-turbo': 'glm-5.1'
268
+ 'glm-4.5': 'glm-5.2[1m]',
269
+ 'glm-4.6': 'glm-5.2[1m]',
270
+ 'glm-4.7': 'glm-5.2[1m]',
245
271
  },
246
272
  authTokenFormat: 'sk-...',
247
273
  description: 'ZhiPu AI (智谱清言) - Anthropic-compatible API for mainland China',
@@ -252,26 +278,25 @@ const providers = {
252
278
  CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
253
279
  CLAUDE_CODE_ATTRIBUTION_HEADER: '0',
254
280
  CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS: '1',
255
- CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1'
281
+ CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1',
282
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: '1000000',
256
283
  },
257
- modelEnvTemplate: makeFastMapTemplate({"glm-5.1":"glm-5-turbo"}),
284
+ modelEnvTemplate: makeGlmTierTemplate(),
258
285
  note: 'Requires extended timeout for large responses'
259
286
  },
260
287
  zai: {
261
- name: 'Z.ai (GLM-5.1/5-Turbo/5/4.7) - ZhiPu Global',
288
+ name: 'Z.ai (GLM-5.2/5-Turbo) - ZhiPu Global',
262
289
  baseUrl: 'https://api.z.ai/api/anthropic',
263
290
  models: [
291
+ 'glm-5.2[1m]',
264
292
  'glm-5.1',
265
293
  'glm-5-turbo',
266
- 'glm-5',
267
- 'glm-4.7'
294
+ 'glm-5'
268
295
  ],
269
296
  versionAliases: {
270
- 'glm-4.5': 'glm-5.1',
271
- 'glm-4.6': 'glm-5.1',
272
- 'glm-4.7': 'glm-5.1',
273
- 'glm-5': 'glm-5.1',
274
- 'glm-5-turbo': 'glm-5.1'
297
+ 'glm-4.5': 'glm-5.2[1m]',
298
+ 'glm-4.6': 'glm-5.2[1m]',
299
+ 'glm-4.7': 'glm-5.2[1m]',
275
300
  },
276
301
  authTokenFormat: 'sk-...',
277
302
  description: 'Z.ai (ZhiPu AI Global) - Anthropic-compatible API for international users',
@@ -282,9 +307,10 @@ const providers = {
282
307
  CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
283
308
  CLAUDE_CODE_ATTRIBUTION_HEADER: '0',
284
309
  CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS: '1',
285
- CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1'
310
+ CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK: '1',
311
+ CLAUDE_CODE_AUTO_COMPACT_WINDOW: '1000000',
286
312
  },
287
- modelEnvTemplate: makeFastMapTemplate({"glm-5.1":"glm-5-turbo"}),
313
+ modelEnvTemplate: makeGlmTierTemplate(),
288
314
  note: 'Requires extended timeout for large responses'
289
315
  },
290
316
  custom: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kikkimo/claude-launcher",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "description": "Interactive launcher for Claude Code with beautiful Claude-style interface",
5
5
  "main": "claude-launcher",
6
6
  "bin": {