claude-code-model-router 1.2.3 → 1.3.1

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/dist/config.js CHANGED
@@ -16,100 +16,303 @@ const dotenv_1 = require("dotenv");
16
16
  // Load .env file
17
17
  (0, dotenv_1.config)();
18
18
  const DEFAULT_CONFIG = {
19
- default_model: 'deepseek',
20
- models: {
19
+ default_model: 'deepseek-v4-pro',
20
+ providers: {
21
21
  deepseek: {
22
- display_name: 'DeepSeek V3.2',
22
+ display_name: 'DeepSeek',
23
23
  provider: 'deepseek',
24
- model_id: 'deepseek-chat',
25
24
  base_url: 'https://api.deepseek.com/anthropic',
26
25
  api_key_env: 'DEEPSEEK_API_KEY',
27
26
  auth_header: 'x-api-key',
27
+ auth_type: 'api_key',
28
28
  supports_streaming: true,
29
29
  supports_tools: true,
30
- max_tokens: 128000,
31
- context_window: 128000,
30
+ default_variant: 'v4-pro',
31
+ variants: {
32
+ 'v4-pro': {
33
+ display_name: 'DeepSeek V4 Pro',
34
+ model_id: 'deepseek-v4-pro',
35
+ max_tokens: 393216,
36
+ context_window: 1048576,
37
+ },
38
+ 'v4-flash': {
39
+ display_name: 'DeepSeek V4 Flash',
40
+ model_id: 'deepseek-v4-flash',
41
+ max_tokens: 393216,
42
+ context_window: 1048576,
43
+ },
44
+ },
32
45
  },
33
46
  kimi: {
34
- display_name: 'Kimi K2.5',
47
+ display_name: 'Kimi',
35
48
  provider: 'moonshot',
36
- model_id: 'kimi-for-coding',
37
- base_url: 'https://api.kimi.com/coding/',
49
+ base_url: 'https://api.moonshot.ai/anthropic',
38
50
  api_key_env: 'KIMI_API_KEY',
39
- auth_header: 'x-api-key',
51
+ auth_header: 'Authorization',
52
+ auth_type: 'bearer',
40
53
  supports_streaming: true,
41
54
  supports_tools: true,
42
- max_tokens: 32768,
43
- context_window: 256000,
55
+ default_variant: 'k2.6',
56
+ variants: {
57
+ 'k2.6': {
58
+ display_name: 'Kimi K2.6',
59
+ model_id: 'kimi-k2.6',
60
+ max_tokens: 32768,
61
+ context_window: 262144,
62
+ },
63
+ },
44
64
  },
45
65
  minimax: {
46
- display_name: 'MiniMax M2.7',
47
- provider: 'minimax',
48
- model_id: 'MiniMax-M2.7',
66
+ display_name: 'MiniMax CN',
67
+ provider: 'minimax-cn',
49
68
  base_url: 'https://api.minimaxi.com/anthropic',
50
69
  api_key_env: 'MINIMAX_API_KEY',
51
- auth_header: 'x-api-key',
70
+ auth_header: 'Authorization',
71
+ auth_type: 'bearer',
72
+ supports_streaming: true,
73
+ supports_tools: true,
74
+ default_variant: 'm2.7',
75
+ variants: {
76
+ 'm2.7': {
77
+ display_name: 'MiniMax M2.7',
78
+ model_id: 'MiniMax-M2.7',
79
+ max_tokens: 196608,
80
+ context_window: 204800,
81
+ },
82
+ 'm2.7-highspeed': {
83
+ display_name: 'MiniMax M2.7 Highspeed',
84
+ model_id: 'MiniMax-M2.7-highspeed',
85
+ max_tokens: 196608,
86
+ context_window: 204800,
87
+ },
88
+ },
89
+ },
90
+ 'minimax-global': {
91
+ display_name: 'MiniMax Global',
92
+ provider: 'minimax-global',
93
+ base_url: 'https://api.minimax.io/anthropic',
94
+ api_key_env: 'MINIMAX_GLOBAL_API_KEY',
95
+ auth_header: 'Authorization',
96
+ auth_type: 'bearer',
52
97
  supports_streaming: true,
53
98
  supports_tools: true,
54
- max_tokens: 196608,
55
- context_window: 204800,
99
+ default_variant: 'm2.7',
100
+ variants: {
101
+ 'm2.7': {
102
+ display_name: 'MiniMax M2.7 (Global)',
103
+ model_id: 'MiniMax-M2.7',
104
+ max_tokens: 196608,
105
+ context_window: 204800,
106
+ },
107
+ 'm2.7-highspeed': {
108
+ display_name: 'MiniMax M2.7 Highspeed (Global)',
109
+ model_id: 'MiniMax-M2.7-highspeed',
110
+ max_tokens: 196608,
111
+ context_window: 204800,
112
+ },
113
+ },
56
114
  },
57
115
  qwen: {
58
- display_name: 'Qwen3.5 Plus',
116
+ display_name: 'Qwen',
59
117
  provider: 'alibaba',
60
- model_id: 'qwen3.5-plus',
61
118
  base_url: 'https://dashscope.aliyuncs.com/apps/anthropic',
62
119
  api_key_env: 'QWEN_API_KEY',
63
120
  auth_header: 'x-api-key',
121
+ auth_type: 'api_key',
64
122
  supports_streaming: true,
65
123
  supports_tools: true,
66
- max_tokens: 65536,
67
- context_window: 1000000,
124
+ default_variant: '3.5-plus',
125
+ variants: {
126
+ '3.5-plus': {
127
+ model_key: 'qwen3.5-plus',
128
+ display_name: 'Qwen3.5 Plus',
129
+ model_id: 'qwen3.5-plus',
130
+ max_tokens: 65536,
131
+ context_window: 1000000,
132
+ },
133
+ '3.5-flash': {
134
+ model_key: 'qwen3.5-flash',
135
+ display_name: 'Qwen3.5 Flash',
136
+ model_id: 'qwen3.5-flash',
137
+ max_tokens: 65536,
138
+ context_window: 1000000,
139
+ },
140
+ '3-max': {
141
+ model_key: 'qwen3-max',
142
+ display_name: 'Qwen3 Max',
143
+ model_id: 'qwen3-max',
144
+ max_tokens: 65536,
145
+ context_window: 1000000,
146
+ },
147
+ },
68
148
  },
69
149
  glm: {
70
- display_name: 'GLM-5',
150
+ display_name: 'GLM',
71
151
  provider: 'zhipu',
72
- model_id: 'glm-5',
73
152
  base_url: 'https://open.bigmodel.cn/api/anthropic',
74
153
  api_key_env: 'GLM_API_KEY',
75
154
  auth_header: 'x-api-key',
155
+ auth_type: 'api_key',
76
156
  supports_streaming: true,
77
157
  supports_tools: true,
78
- max_tokens: 128000,
79
- context_window: 200000,
158
+ default_variant: '5.1',
159
+ variants: {
160
+ '5.1': {
161
+ display_name: 'GLM-5.1',
162
+ model_id: 'glm-5.1',
163
+ max_tokens: 131072,
164
+ context_window: 204800,
165
+ },
166
+ },
80
167
  },
81
- kat: {
82
- display_name: 'KAT-Coder-Pro V2',
83
- provider: 'kuaishou',
84
- model_id: 'kat-coder-pro-v2',
85
- base_url: 'https://wanqing.streamlakeapi.com/api/gateway/coding/kat-coder-pro-v2/claude-code-proxy',
86
- api_key_env: 'KAT_API_KEY',
87
- auth_header: 'x-api-key',
168
+ mimo: {
169
+ display_name: 'MiMo Token Plan SGP',
170
+ provider: 'xiaomi-token-sgp',
171
+ base_url: 'https://token-plan-sgp.xiaomimimo.com/anthropic',
172
+ api_key_env: 'MIMO_API_KEY',
173
+ auth_header: 'api-key',
174
+ auth_type: 'api_key',
175
+ supports_streaming: true,
176
+ supports_tools: true,
177
+ default_variant: 'v2.5-pro',
178
+ variants: {
179
+ 'v2.5-pro': {
180
+ display_name: 'MiMo V2.5 Pro',
181
+ model_id: 'mimo-v2.5-pro',
182
+ max_tokens: 131072,
183
+ context_window: 1048576,
184
+ },
185
+ 'v2.5': {
186
+ display_name: 'MiMo V2.5',
187
+ model_id: 'mimo-v2.5',
188
+ max_tokens: 131072,
189
+ context_window: 1048576,
190
+ },
191
+ },
192
+ },
193
+ 'mimo-token-cn': {
194
+ display_name: 'MiMo Token Plan CN',
195
+ provider: 'xiaomi-token-cn',
196
+ base_url: 'https://token-plan-cn.xiaomimimo.com/anthropic',
197
+ api_key_env: 'MIMO_TOKEN_CN_API_KEY',
198
+ auth_header: 'api-key',
199
+ auth_type: 'api_key',
88
200
  supports_streaming: true,
89
201
  supports_tools: true,
90
- max_tokens: 81920,
91
- context_window: 262144,
202
+ default_variant: 'v2.5-pro',
203
+ variants: {
204
+ 'v2.5-pro': {
205
+ display_name: 'MiMo V2.5 Pro (CN)',
206
+ model_id: 'mimo-v2.5-pro',
207
+ max_tokens: 131072,
208
+ context_window: 1048576,
209
+ },
210
+ 'v2.5': {
211
+ display_name: 'MiMo V2.5 (CN)',
212
+ model_id: 'mimo-v2.5',
213
+ max_tokens: 131072,
214
+ context_window: 1048576,
215
+ },
216
+ },
217
+ },
218
+ 'mimo-token-ams': {
219
+ display_name: 'MiMo Token Plan AMS',
220
+ provider: 'xiaomi-token-ams',
221
+ base_url: 'https://token-plan-ams.xiaomimimo.com/anthropic',
222
+ api_key_env: 'MIMO_TOKEN_AMS_API_KEY',
223
+ auth_header: 'api-key',
224
+ auth_type: 'api_key',
225
+ supports_streaming: true,
226
+ supports_tools: true,
227
+ default_variant: 'v2.5-pro',
228
+ variants: {
229
+ 'v2.5-pro': {
230
+ display_name: 'MiMo V2.5 Pro (AMS)',
231
+ model_id: 'mimo-v2.5-pro',
232
+ max_tokens: 131072,
233
+ context_window: 1048576,
234
+ },
235
+ 'v2.5': {
236
+ display_name: 'MiMo V2.5 (AMS)',
237
+ model_id: 'mimo-v2.5',
238
+ max_tokens: 131072,
239
+ context_window: 1048576,
240
+ },
241
+ },
242
+ },
243
+ 'mimo-payg': {
244
+ display_name: 'MiMo Pay-as-you-go',
245
+ provider: 'xiaomi-payg',
246
+ base_url: 'https://api.xiaomimimo.com/anthropic',
247
+ api_key_env: 'MIMO_PAYG_API_KEY',
248
+ auth_header: 'api-key',
249
+ auth_type: 'api_key',
250
+ supports_streaming: true,
251
+ supports_tools: true,
252
+ default_variant: 'v2.5-pro',
253
+ variants: {
254
+ 'v2.5-pro': {
255
+ display_name: 'MiMo V2.5 Pro (Pay-as-you-go)',
256
+ model_id: 'mimo-v2.5-pro',
257
+ max_tokens: 131072,
258
+ context_window: 1048576,
259
+ },
260
+ 'v2.5': {
261
+ display_name: 'MiMo V2.5 (Pay-as-you-go)',
262
+ model_id: 'mimo-v2.5',
263
+ max_tokens: 131072,
264
+ context_window: 1048576,
265
+ },
266
+ },
92
267
  },
93
268
  },
269
+ models: {},
94
270
  aliases: {
95
- 'deepseek-v3': 'deepseek',
96
- 'deepseek-chat': 'deepseek',
97
- 'ds': 'deepseek',
98
- 'kimi-k2.5': 'kimi',
99
- 'kimi-k2': 'kimi',
100
- 'moonshot': 'kimi',
101
- 'minimax-m2.7': 'minimax',
102
- 'minimax-m2': 'minimax',
103
- 'mm': 'minimax',
104
- 'qwen3.5': 'qwen',
105
- 'qwen3.5-plus': 'qwen',
106
- 'tongyi': 'qwen',
107
- 'glm-5': 'glm',
108
- 'zhipu': 'glm',
109
- 'chatglm': 'glm',
110
- 'kat-coder': 'kat',
111
- 'kat-coder-pro-v2': 'kat',
112
- 'kuaishou': 'kat',
271
+ deepseek: 'deepseek-v4-pro',
272
+ 'deepseek-v4': 'deepseek-v4-pro',
273
+ 'deepseek-pro': 'deepseek-v4-pro',
274
+ 'deepseek-flash': 'deepseek-v4-flash',
275
+ 'deepseek-chat': 'deepseek-v4-flash',
276
+ ds: 'deepseek-v4-pro',
277
+ kimi: 'kimi-k2.6',
278
+ 'kimi-k2': 'kimi-k2.6',
279
+ 'kimi-k2.6': 'kimi-k2.6',
280
+ moonshot: 'kimi-k2.6',
281
+ minimax: 'minimax-m2.7',
282
+ 'minimax-cn': 'minimax-m2.7',
283
+ 'minimax-m2': 'minimax-m2.7',
284
+ 'minimax-highspeed': 'minimax-m2.7-highspeed',
285
+ 'minimax-cn-highspeed': 'minimax-m2.7-highspeed',
286
+ minimaxi: 'minimax-m2.7',
287
+ 'minimax-global': 'minimax-global-m2.7',
288
+ 'minimax-io': 'minimax-global-m2.7',
289
+ 'minimax-global-highspeed': 'minimax-global-m2.7-highspeed',
290
+ mm: 'minimax-m2.7',
291
+ qwen: 'qwen3.5-plus',
292
+ 'qwen3.5': 'qwen3.5-plus',
293
+ tongyi: 'qwen3.5-plus',
294
+ glm: 'glm-5.1',
295
+ 'glm-5': 'glm-5.1',
296
+ zhipu: 'glm-5.1',
297
+ chatglm: 'glm-5.1',
298
+ mimo: 'mimo-v2.5-pro',
299
+ 'mimo-pro': 'mimo-v2.5-pro',
300
+ 'mimo-token': 'mimo-v2.5-pro',
301
+ 'mimo-token-sgp': 'mimo-v2.5-pro',
302
+ 'mimo-sgp': 'mimo-v2.5-pro',
303
+ 'mimo-v2': 'mimo-v2.5',
304
+ 'mimo-v2.5': 'mimo-v2.5',
305
+ 'mimo-v2.5-pro': 'mimo-v2.5-pro',
306
+ 'mimo-token-cn': 'mimo-token-cn-v2.5-pro',
307
+ 'mimo-cn': 'mimo-token-cn-v2.5-pro',
308
+ 'mimo-token-cn-v2.5': 'mimo-token-cn-v2.5',
309
+ 'mimo-token-ams': 'mimo-token-ams-v2.5-pro',
310
+ 'mimo-ams': 'mimo-token-ams-v2.5-pro',
311
+ 'mimo-token-ams-v2.5': 'mimo-token-ams-v2.5',
312
+ 'mimo-payg': 'mimo-payg-v2.5-pro',
313
+ 'mimo-payg-pro': 'mimo-payg-v2.5-pro',
314
+ 'mimo-payg-v2.5': 'mimo-payg-v2.5',
315
+ xiaomi: 'mimo-v2.5-pro',
113
316
  },
114
317
  gateway: {
115
318
  host: '0.0.0.0',
@@ -139,7 +342,7 @@ class ConfigManager {
139
342
  try {
140
343
  const content = node_fs_1.default.readFileSync(p, 'utf-8');
141
344
  const parsed = js_yaml_1.default.load(content);
142
- return this.mergeConfig(parsed);
345
+ return this.mergeConfig(parsed ?? {});
143
346
  }
144
347
  catch (e) {
145
348
  console.warn(`Warning: Failed to parse config file ${p}:`, e);
@@ -147,17 +350,80 @@ class ConfigManager {
147
350
  }
148
351
  }
149
352
  // Return default config if no file found
150
- return DEFAULT_CONFIG;
353
+ return this.normalizeConfig(DEFAULT_CONFIG);
151
354
  }
152
355
  mergeConfig(parsed) {
153
- return {
356
+ return this.normalizeConfig({
154
357
  default_model: parsed.default_model ?? DEFAULT_CONFIG.default_model,
358
+ providers: this.mergeProviders(DEFAULT_CONFIG.providers ?? {}, parsed.providers ?? {}),
155
359
  models: { ...DEFAULT_CONFIG.models, ...parsed.models },
156
360
  aliases: { ...DEFAULT_CONFIG.aliases, ...parsed.aliases },
157
361
  gateway: { ...DEFAULT_CONFIG.gateway, ...parsed.gateway },
362
+ });
363
+ }
364
+ mergeProviders(defaults, overrides) {
365
+ const providers = { ...defaults };
366
+ for (const [providerKey, override] of Object.entries(overrides)) {
367
+ const base = providers[providerKey];
368
+ providers[providerKey] = base
369
+ ? {
370
+ ...base,
371
+ ...override,
372
+ variants: { ...base.variants, ...override.variants },
373
+ }
374
+ : override;
375
+ }
376
+ return providers;
377
+ }
378
+ normalizeConfig(config) {
379
+ const models = {};
380
+ for (const [providerKey, provider] of Object.entries(config.providers ?? {})) {
381
+ for (const [variantKey, variant] of Object.entries(provider.variants)) {
382
+ const modelKey = variant.model_key ?? `${providerKey}-${variantKey}`;
383
+ models[modelKey] = this.buildModelConfig(providerKey, variantKey, provider, variant);
384
+ }
385
+ if (provider.default_variant) {
386
+ const defaultVariant = provider.variants[provider.default_variant];
387
+ const defaultKey = defaultVariant?.model_key ?? `${providerKey}-${provider.default_variant}`;
388
+ if (models[defaultKey]) {
389
+ models[providerKey] = models[defaultKey];
390
+ }
391
+ }
392
+ }
393
+ for (const [modelKey, model] of Object.entries(config.models ?? {})) {
394
+ models[modelKey] = model;
395
+ }
396
+ return {
397
+ ...config,
398
+ default_model: this.resolveAlias(config.default_model, config.aliases ?? {}),
399
+ models,
400
+ aliases: config.aliases ?? {},
401
+ gateway: config.gateway,
158
402
  };
159
403
  }
404
+ buildModelConfig(providerKey, variantKey, provider, variant) {
405
+ return {
406
+ display_name: variant.display_name,
407
+ provider: provider.provider,
408
+ model_id: variant.model_id,
409
+ base_url: provider.base_url,
410
+ api_key_env: provider.api_key_env,
411
+ auth_header: provider.auth_header,
412
+ auth_type: provider.auth_type,
413
+ supports_streaming: variant.supports_streaming ?? provider.supports_streaming,
414
+ supports_tools: variant.supports_tools ?? provider.supports_tools,
415
+ max_tokens: variant.max_tokens,
416
+ context_window: variant.context_window,
417
+ provider_key: providerKey,
418
+ variant_key: variantKey,
419
+ provider_display_name: provider.display_name,
420
+ };
421
+ }
422
+ resolveAlias(name, aliases) {
423
+ return aliases[name] ?? name;
424
+ }
160
425
  loadApiKeys() {
426
+ this.apiKeys.clear();
161
427
  for (const [name, model] of Object.entries(this.config.models)) {
162
428
  const key = process.env[model.api_key_env];
163
429
  if (key) {
@@ -169,25 +435,11 @@ class ConfigManager {
169
435
  return this.config;
170
436
  }
171
437
  getModel(name) {
172
- // Check direct model name
173
- if (this.config.models[name]) {
174
- return this.config.models[name];
175
- }
176
- // Check aliases
177
- const aliasTarget = this.config.aliases[name];
178
- if (aliasTarget && this.config.models[aliasTarget]) {
179
- return this.config.models[aliasTarget];
180
- }
181
- return undefined;
438
+ const resolved = this.resolveModelName(name);
439
+ return this.config.models[resolved];
182
440
  }
183
441
  resolveModelName(name) {
184
- if (this.config.aliases[name]) {
185
- return this.config.aliases[name];
186
- }
187
- if (this.config.models[name]) {
188
- return name;
189
- }
190
- return name;
442
+ return this.resolveAlias(name, this.config.aliases);
191
443
  }
192
444
  getApiKey(modelName) {
193
445
  const resolved = this.resolveModelName(modelName);
@@ -196,9 +448,13 @@ class ConfigManager {
196
448
  listModels() {
197
449
  const result = {};
198
450
  for (const [name, model] of Object.entries(this.config.models)) {
451
+ if (model.provider_key && name === model.provider_key) {
452
+ continue;
453
+ }
199
454
  result[name] = {
200
455
  displayName: model.display_name,
201
456
  provider: model.provider,
457
+ variant: model.variant_key,
202
458
  available: this.apiKeys.has(name),
203
459
  };
204
460
  }
@@ -208,110 +464,292 @@ class ConfigManager {
208
464
  exports.ConfigManager = ConfigManager;
209
465
  // Generate default config file content
210
466
  function generateConfigFile() {
211
- return `# Claude Code Model Router Configuration
212
- # Place this file as models.yaml or .claude-router.yaml in your project root
213
-
214
- default_model: deepseek
215
-
216
- models:
217
- deepseek:
218
- display_name: "DeepSeek V3.2"
219
- provider: deepseek
220
- model_id: deepseek-chat
221
- base_url: https://api.deepseek.com/anthropic
222
- api_key_env: DEEPSEEK_API_KEY
223
- auth_header: x-api-key
224
- max_tokens: 128000
225
- context_window: 128000
226
-
227
- kimi:
228
- display_name: "Kimi K2.5"
229
- provider: moonshot
230
- model_id: kimi-for-coding
231
- base_url: https://api.kimi.com/coding/
232
- api_key_env: KIMI_API_KEY
233
- auth_header: x-api-key
234
- max_tokens: 32768
235
- context_window: 256000
236
-
237
- minimax:
238
- display_name: "MiniMax M2.7"
239
- provider: minimax
240
- model_id: MiniMax-M2.7
241
- base_url: https://api.minimaxi.com/anthropic
242
- api_key_env: MINIMAX_API_KEY
243
- auth_header: x-api-key
244
- max_tokens: 196608
245
- context_window: 204800
246
-
247
- qwen:
248
- display_name: "Qwen3.5 Plus"
249
- provider: alibaba
250
- model_id: qwen3.5-plus
251
- base_url: https://dashscope.aliyuncs.com/apps/anthropic
252
- api_key_env: QWEN_API_KEY
253
- auth_header: x-api-key
254
- max_tokens: 65536
255
- context_window: 1000000
256
-
257
- glm:
258
- display_name: "GLM-5"
259
- provider: zhipu
260
- model_id: glm-5
261
- base_url: https://open.bigmodel.cn/api/anthropic
262
- api_key_env: GLM_API_KEY
263
- auth_header: x-api-key
264
- max_tokens: 128000
265
- context_window: 200000
266
-
267
- kat:
268
- display_name: "KAT-Coder-Pro V2"
269
- provider: kuaishou
270
- model_id: kat-coder-pro-v2
271
- base_url: https://wanqing.streamlakeapi.com/api/gateway/coding/kat-coder-pro-v2/claude-code-proxy
272
- api_key_env: KAT_API_KEY
273
- auth_header: x-api-key
274
- max_tokens: 81920
275
- context_window: 262144
276
-
277
- aliases:
278
- ds: deepseek
279
- deepseek-v3.2: deepseek
280
- mm: minimax
281
- minimax-m2.7: minimax
282
- kimi-k2.5: kimi
283
- qwen3.5-plus: qwen
284
- glm-5: glm
285
- kat-coder: kat
286
- kat-coder-pro-v2: kat
287
- kuaishou: kat
288
-
289
- gateway:
290
- port: 8080
291
- timeout: 300
467
+ return `# Claude Code Model Router Configuration
468
+ # Place this file as models.yaml or .claude-router.yaml in your project root
469
+
470
+ default_model: deepseek-v4-pro
471
+
472
+ providers:
473
+ deepseek:
474
+ display_name: DeepSeek
475
+ provider: deepseek
476
+ base_url: https://api.deepseek.com/anthropic
477
+ api_key_env: DEEPSEEK_API_KEY
478
+ auth_header: x-api-key
479
+ auth_type: api_key
480
+ default_variant: v4-pro
481
+ variants:
482
+ v4-pro:
483
+ display_name: "DeepSeek V4 Pro"
484
+ model_id: deepseek-v4-pro
485
+ max_tokens: 393216
486
+ context_window: 1048576
487
+ v4-flash:
488
+ display_name: "DeepSeek V4 Flash"
489
+ model_id: deepseek-v4-flash
490
+ max_tokens: 393216
491
+ context_window: 1048576
492
+
493
+ kimi:
494
+ display_name: Kimi
495
+ provider: moonshot
496
+ base_url: https://api.moonshot.ai/anthropic
497
+ api_key_env: KIMI_API_KEY
498
+ auth_header: Authorization
499
+ auth_type: bearer
500
+ default_variant: k2.6
501
+ variants:
502
+ k2.6:
503
+ display_name: "Kimi K2.6"
504
+ model_id: kimi-k2.6
505
+ max_tokens: 32768
506
+ context_window: 262144
507
+
508
+ minimax:
509
+ display_name: MiniMax CN
510
+ provider: minimax-cn
511
+ base_url: https://api.minimaxi.com/anthropic
512
+ api_key_env: MINIMAX_API_KEY
513
+ auth_header: Authorization
514
+ auth_type: bearer
515
+ default_variant: m2.7
516
+ variants:
517
+ m2.7:
518
+ display_name: "MiniMax M2.7"
519
+ model_id: MiniMax-M2.7
520
+ max_tokens: 196608
521
+ context_window: 204800
522
+ m2.7-highspeed:
523
+ display_name: "MiniMax M2.7 Highspeed"
524
+ model_id: MiniMax-M2.7-highspeed
525
+ max_tokens: 196608
526
+ context_window: 204800
527
+
528
+ minimax-global:
529
+ display_name: MiniMax Global
530
+ provider: minimax-global
531
+ base_url: https://api.minimax.io/anthropic
532
+ api_key_env: MINIMAX_GLOBAL_API_KEY
533
+ auth_header: Authorization
534
+ auth_type: bearer
535
+ default_variant: m2.7
536
+ variants:
537
+ m2.7:
538
+ display_name: "MiniMax M2.7 (Global)"
539
+ model_id: MiniMax-M2.7
540
+ max_tokens: 196608
541
+ context_window: 204800
542
+ m2.7-highspeed:
543
+ display_name: "MiniMax M2.7 Highspeed (Global)"
544
+ model_id: MiniMax-M2.7-highspeed
545
+ max_tokens: 196608
546
+ context_window: 204800
547
+
548
+ qwen:
549
+ display_name: Qwen
550
+ provider: alibaba
551
+ base_url: https://dashscope.aliyuncs.com/apps/anthropic
552
+ api_key_env: QWEN_API_KEY
553
+ auth_header: x-api-key
554
+ auth_type: api_key
555
+ default_variant: 3.5-plus
556
+ variants:
557
+ 3.5-plus:
558
+ model_key: qwen3.5-plus
559
+ display_name: "Qwen3.5 Plus"
560
+ model_id: qwen3.5-plus
561
+ max_tokens: 65536
562
+ context_window: 1000000
563
+ 3.5-flash:
564
+ model_key: qwen3.5-flash
565
+ display_name: "Qwen3.5 Flash"
566
+ model_id: qwen3.5-flash
567
+ max_tokens: 65536
568
+ context_window: 1000000
569
+ 3-max:
570
+ model_key: qwen3-max
571
+ display_name: "Qwen3 Max"
572
+ model_id: qwen3-max
573
+ max_tokens: 65536
574
+ context_window: 1000000
575
+
576
+ glm:
577
+ display_name: GLM
578
+ provider: zhipu
579
+ base_url: https://open.bigmodel.cn/api/anthropic
580
+ api_key_env: GLM_API_KEY
581
+ auth_header: x-api-key
582
+ auth_type: api_key
583
+ default_variant: 5.1
584
+ variants:
585
+ 5.1:
586
+ display_name: "GLM-5.1"
587
+ model_id: glm-5.1
588
+ max_tokens: 131072
589
+ context_window: 204800
590
+
591
+ mimo:
592
+ display_name: MiMo Token Plan SGP
593
+ provider: xiaomi-token-sgp
594
+ base_url: https://token-plan-sgp.xiaomimimo.com/anthropic
595
+ api_key_env: MIMO_API_KEY
596
+ auth_header: api-key
597
+ auth_type: api_key
598
+ default_variant: v2.5-pro
599
+ variants:
600
+ v2.5-pro:
601
+ display_name: "MiMo V2.5 Pro"
602
+ model_id: mimo-v2.5-pro
603
+ max_tokens: 131072
604
+ context_window: 1048576
605
+ v2.5:
606
+ display_name: "MiMo V2.5"
607
+ model_id: mimo-v2.5
608
+ max_tokens: 131072
609
+ context_window: 1048576
610
+
611
+ mimo-token-cn:
612
+ display_name: MiMo Token Plan CN
613
+ provider: xiaomi-token-cn
614
+ base_url: https://token-plan-cn.xiaomimimo.com/anthropic
615
+ api_key_env: MIMO_TOKEN_CN_API_KEY
616
+ auth_header: api-key
617
+ auth_type: api_key
618
+ default_variant: v2.5-pro
619
+ variants:
620
+ v2.5-pro:
621
+ display_name: "MiMo V2.5 Pro (CN)"
622
+ model_id: mimo-v2.5-pro
623
+ max_tokens: 131072
624
+ context_window: 1048576
625
+ v2.5:
626
+ display_name: "MiMo V2.5 (CN)"
627
+ model_id: mimo-v2.5
628
+ max_tokens: 131072
629
+ context_window: 1048576
630
+
631
+ mimo-token-ams:
632
+ display_name: MiMo Token Plan AMS
633
+ provider: xiaomi-token-ams
634
+ base_url: https://token-plan-ams.xiaomimimo.com/anthropic
635
+ api_key_env: MIMO_TOKEN_AMS_API_KEY
636
+ auth_header: api-key
637
+ auth_type: api_key
638
+ default_variant: v2.5-pro
639
+ variants:
640
+ v2.5-pro:
641
+ display_name: "MiMo V2.5 Pro (AMS)"
642
+ model_id: mimo-v2.5-pro
643
+ max_tokens: 131072
644
+ context_window: 1048576
645
+ v2.5:
646
+ display_name: "MiMo V2.5 (AMS)"
647
+ model_id: mimo-v2.5
648
+ max_tokens: 131072
649
+ context_window: 1048576
650
+
651
+ mimo-payg:
652
+ display_name: MiMo Pay-as-you-go
653
+ provider: xiaomi-payg
654
+ base_url: https://api.xiaomimimo.com/anthropic
655
+ api_key_env: MIMO_PAYG_API_KEY
656
+ auth_header: api-key
657
+ auth_type: api_key
658
+ default_variant: v2.5-pro
659
+ variants:
660
+ v2.5-pro:
661
+ display_name: "MiMo V2.5 Pro (Pay-as-you-go)"
662
+ model_id: mimo-v2.5-pro
663
+ max_tokens: 131072
664
+ context_window: 1048576
665
+ v2.5:
666
+ display_name: "MiMo V2.5 (Pay-as-you-go)"
667
+ model_id: mimo-v2.5
668
+ max_tokens: 131072
669
+ context_window: 1048576
670
+
671
+ aliases:
672
+ deepseek: deepseek-v4-pro
673
+ deepseek-v4: deepseek-v4-pro
674
+ deepseek-pro: deepseek-v4-pro
675
+ deepseek-flash: deepseek-v4-flash
676
+ deepseek-chat: deepseek-v4-flash
677
+ ds: deepseek-v4-pro
678
+ kimi: kimi-k2.6
679
+ kimi-k2: kimi-k2.6
680
+ moonshot: kimi-k2.6
681
+ minimax: minimax-m2.7
682
+ minimax-cn: minimax-m2.7
683
+ minimax-m2: minimax-m2.7
684
+ minimax-highspeed: minimax-m2.7-highspeed
685
+ minimax-cn-highspeed: minimax-m2.7-highspeed
686
+ minimaxi: minimax-m2.7
687
+ minimax-global: minimax-global-m2.7
688
+ minimax-io: minimax-global-m2.7
689
+ minimax-global-highspeed: minimax-global-m2.7-highspeed
690
+ mm: minimax-m2.7
691
+ qwen: qwen3.5-plus
692
+ qwen3.5: qwen3.5-plus
693
+ tongyi: qwen3.5-plus
694
+ glm: glm-5.1
695
+ glm-5: glm-5.1
696
+ zhipu: glm-5.1
697
+ chatglm: glm-5.1
698
+ mimo: mimo-v2.5-pro
699
+ mimo-pro: mimo-v2.5-pro
700
+ mimo-token: mimo-v2.5-pro
701
+ mimo-token-sgp: mimo-v2.5-pro
702
+ mimo-sgp: mimo-v2.5-pro
703
+ mimo-v2: mimo-v2.5
704
+ mimo-v2.5: mimo-v2.5
705
+ mimo-v2.5-pro: mimo-v2.5-pro
706
+ mimo-token-cn: mimo-token-cn-v2.5-pro
707
+ mimo-cn: mimo-token-cn-v2.5-pro
708
+ mimo-token-cn-v2.5: mimo-token-cn-v2.5
709
+ mimo-token-ams: mimo-token-ams-v2.5-pro
710
+ mimo-ams: mimo-token-ams-v2.5-pro
711
+ mimo-token-ams-v2.5: mimo-token-ams-v2.5
712
+ mimo-payg: mimo-payg-v2.5-pro
713
+ mimo-payg-pro: mimo-payg-v2.5-pro
714
+ mimo-payg-v2.5: mimo-payg-v2.5
715
+ xiaomi: mimo-v2.5-pro
716
+
717
+ gateway:
718
+ port: 8080
719
+ timeout: 300
292
720
  `;
293
721
  }
294
722
  function generateEnvFile() {
295
- return `# Claude Code Model Router - API Keys
296
- # Fill in your API keys below
297
-
298
- # DeepSeek - https://platform.deepseek.com/
299
- DEEPSEEK_API_KEY=
300
-
301
- # Kimi - https://www.kimi.com/
302
- KIMI_API_KEY=
303
-
304
- # MiniMax - https://platform.minimax.io/
305
- MINIMAX_API_KEY=
306
-
307
- # Qwen - https://dashscope.console.aliyun.com/
308
- QWEN_API_KEY=
309
-
310
- # GLM - https://open.bigmodel.cn/
311
- GLM_API_KEY=
312
-
313
- # KAT-Coder (快手) - https://wanqing.streamlakeapi.com/
314
- KAT_API_KEY=
723
+ return `# Claude Code Model Router - API Keys
724
+ # Fill in your API keys below
725
+
726
+ # DeepSeek - https://platform.deepseek.com/
727
+ DEEPSEEK_API_KEY=
728
+
729
+ # Kimi / Moonshot - https://platform.kimi.ai/
730
+ KIMI_API_KEY=
731
+
732
+ # MiniMax CN / Token Plan - https://platform.minimaxi.com/
733
+ MINIMAX_API_KEY=
734
+
735
+ # MiniMax Global - https://platform.minimax.io/
736
+ MINIMAX_GLOBAL_API_KEY=
737
+
738
+ # Qwen - https://dashscope.console.aliyun.com/
739
+ QWEN_API_KEY=
740
+
741
+ # GLM - https://open.bigmodel.cn/
742
+ GLM_API_KEY=
743
+
744
+ # MiMo Token Plan (tp-*) - default SGP cluster
745
+ MIMO_API_KEY=
746
+
747
+ # MiMo Token Plan CN / AMS clusters (tp-*)
748
+ MIMO_TOKEN_CN_API_KEY=
749
+ MIMO_TOKEN_AMS_API_KEY=
750
+
751
+ # MiMo Pay-as-you-go (sk-*) - https://platform.xiaomimimo.com/
752
+ MIMO_PAYG_API_KEY=
315
753
  `;
316
754
  }
317
755
  //# sourceMappingURL=config.js.map