claude-code-model-router 1.2.3 → 1.3.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/dist/config.js CHANGED
@@ -16,100 +16,177 @@ 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',
66
+ display_name: 'MiniMax',
47
67
  provider: 'minimax',
48
- model_id: 'MiniMax-M2.7',
49
- base_url: 'https://api.minimaxi.com/anthropic',
68
+ base_url: 'https://api.minimax.io/anthropic',
50
69
  api_key_env: 'MINIMAX_API_KEY',
51
- auth_header: 'x-api-key',
70
+ auth_header: 'Authorization',
71
+ auth_type: 'bearer',
52
72
  supports_streaming: true,
53
73
  supports_tools: true,
54
- max_tokens: 196608,
55
- context_window: 204800,
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
+ },
56
89
  },
57
90
  qwen: {
58
- display_name: 'Qwen3.5 Plus',
91
+ display_name: 'Qwen',
59
92
  provider: 'alibaba',
60
- model_id: 'qwen3.5-plus',
61
93
  base_url: 'https://dashscope.aliyuncs.com/apps/anthropic',
62
94
  api_key_env: 'QWEN_API_KEY',
63
95
  auth_header: 'x-api-key',
96
+ auth_type: 'api_key',
64
97
  supports_streaming: true,
65
98
  supports_tools: true,
66
- max_tokens: 65536,
67
- context_window: 1000000,
99
+ default_variant: '3.5-plus',
100
+ variants: {
101
+ '3.5-plus': {
102
+ model_key: 'qwen3.5-plus',
103
+ display_name: 'Qwen3.5 Plus',
104
+ model_id: 'qwen3.5-plus',
105
+ max_tokens: 65536,
106
+ context_window: 1000000,
107
+ },
108
+ '3.5-flash': {
109
+ model_key: 'qwen3.5-flash',
110
+ display_name: 'Qwen3.5 Flash',
111
+ model_id: 'qwen3.5-flash',
112
+ max_tokens: 65536,
113
+ context_window: 1000000,
114
+ },
115
+ '3-max': {
116
+ model_key: 'qwen3-max',
117
+ display_name: 'Qwen3 Max',
118
+ model_id: 'qwen3-max',
119
+ max_tokens: 65536,
120
+ context_window: 1000000,
121
+ },
122
+ },
68
123
  },
69
124
  glm: {
70
- display_name: 'GLM-5',
125
+ display_name: 'GLM',
71
126
  provider: 'zhipu',
72
- model_id: 'glm-5',
73
127
  base_url: 'https://open.bigmodel.cn/api/anthropic',
74
128
  api_key_env: 'GLM_API_KEY',
75
129
  auth_header: 'x-api-key',
130
+ auth_type: 'api_key',
76
131
  supports_streaming: true,
77
132
  supports_tools: true,
78
- max_tokens: 128000,
79
- context_window: 200000,
133
+ default_variant: '5.1',
134
+ variants: {
135
+ '5.1': {
136
+ display_name: 'GLM-5.1',
137
+ model_id: 'glm-5.1',
138
+ max_tokens: 131072,
139
+ context_window: 204800,
140
+ },
141
+ },
80
142
  },
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',
143
+ mimo: {
144
+ display_name: 'MiMo',
145
+ provider: 'xiaomi',
146
+ base_url: 'https://api.xiaomimimo.com/anthropic',
147
+ api_key_env: 'MIMO_API_KEY',
148
+ auth_header: 'api-key',
149
+ auth_type: 'api_key',
88
150
  supports_streaming: true,
89
151
  supports_tools: true,
90
- max_tokens: 81920,
91
- context_window: 262144,
152
+ default_variant: 'v2.5',
153
+ variants: {
154
+ 'v2.5': {
155
+ display_name: 'MiMo V2.5',
156
+ model_id: 'mimo-v2.5',
157
+ max_tokens: 131072,
158
+ context_window: 1048576,
159
+ },
160
+ },
92
161
  },
93
162
  },
163
+ models: {},
94
164
  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',
165
+ deepseek: 'deepseek-v4-pro',
166
+ 'deepseek-v4': 'deepseek-v4-pro',
167
+ 'deepseek-pro': 'deepseek-v4-pro',
168
+ 'deepseek-flash': 'deepseek-v4-flash',
169
+ 'deepseek-chat': 'deepseek-v4-flash',
170
+ ds: 'deepseek-v4-pro',
171
+ kimi: 'kimi-k2.6',
172
+ 'kimi-k2': 'kimi-k2.6',
173
+ 'kimi-k2.6': 'kimi-k2.6',
174
+ moonshot: 'kimi-k2.6',
175
+ minimax: 'minimax-m2.7',
176
+ 'minimax-m2': 'minimax-m2.7',
177
+ 'minimax-highspeed': 'minimax-m2.7-highspeed',
178
+ mm: 'minimax-m2.7',
179
+ qwen: 'qwen3.5-plus',
180
+ 'qwen3.5': 'qwen3.5-plus',
181
+ tongyi: 'qwen3.5-plus',
182
+ glm: 'glm-5.1',
183
+ 'glm-5': 'glm-5.1',
184
+ zhipu: 'glm-5.1',
185
+ chatglm: 'glm-5.1',
186
+ mimo: 'mimo-v2.5',
187
+ 'mimo-v2': 'mimo-v2.5',
188
+ 'mimo-v2.5': 'mimo-v2.5',
189
+ xiaomi: 'mimo-v2.5',
113
190
  },
114
191
  gateway: {
115
192
  host: '0.0.0.0',
@@ -139,7 +216,7 @@ class ConfigManager {
139
216
  try {
140
217
  const content = node_fs_1.default.readFileSync(p, 'utf-8');
141
218
  const parsed = js_yaml_1.default.load(content);
142
- return this.mergeConfig(parsed);
219
+ return this.mergeConfig(parsed ?? {});
143
220
  }
144
221
  catch (e) {
145
222
  console.warn(`Warning: Failed to parse config file ${p}:`, e);
@@ -147,17 +224,80 @@ class ConfigManager {
147
224
  }
148
225
  }
149
226
  // Return default config if no file found
150
- return DEFAULT_CONFIG;
227
+ return this.normalizeConfig(DEFAULT_CONFIG);
151
228
  }
152
229
  mergeConfig(parsed) {
153
- return {
230
+ return this.normalizeConfig({
154
231
  default_model: parsed.default_model ?? DEFAULT_CONFIG.default_model,
232
+ providers: this.mergeProviders(DEFAULT_CONFIG.providers ?? {}, parsed.providers ?? {}),
155
233
  models: { ...DEFAULT_CONFIG.models, ...parsed.models },
156
234
  aliases: { ...DEFAULT_CONFIG.aliases, ...parsed.aliases },
157
235
  gateway: { ...DEFAULT_CONFIG.gateway, ...parsed.gateway },
236
+ });
237
+ }
238
+ mergeProviders(defaults, overrides) {
239
+ const providers = { ...defaults };
240
+ for (const [providerKey, override] of Object.entries(overrides)) {
241
+ const base = providers[providerKey];
242
+ providers[providerKey] = base
243
+ ? {
244
+ ...base,
245
+ ...override,
246
+ variants: { ...base.variants, ...override.variants },
247
+ }
248
+ : override;
249
+ }
250
+ return providers;
251
+ }
252
+ normalizeConfig(config) {
253
+ const models = {};
254
+ for (const [providerKey, provider] of Object.entries(config.providers ?? {})) {
255
+ for (const [variantKey, variant] of Object.entries(provider.variants)) {
256
+ const modelKey = variant.model_key ?? `${providerKey}-${variantKey}`;
257
+ models[modelKey] = this.buildModelConfig(providerKey, variantKey, provider, variant);
258
+ }
259
+ if (provider.default_variant) {
260
+ const defaultVariant = provider.variants[provider.default_variant];
261
+ const defaultKey = defaultVariant?.model_key ?? `${providerKey}-${provider.default_variant}`;
262
+ if (models[defaultKey]) {
263
+ models[providerKey] = models[defaultKey];
264
+ }
265
+ }
266
+ }
267
+ for (const [modelKey, model] of Object.entries(config.models ?? {})) {
268
+ models[modelKey] = model;
269
+ }
270
+ return {
271
+ ...config,
272
+ default_model: this.resolveAlias(config.default_model, config.aliases ?? {}),
273
+ models,
274
+ aliases: config.aliases ?? {},
275
+ gateway: config.gateway,
276
+ };
277
+ }
278
+ buildModelConfig(providerKey, variantKey, provider, variant) {
279
+ return {
280
+ display_name: variant.display_name,
281
+ provider: provider.provider,
282
+ model_id: variant.model_id,
283
+ base_url: provider.base_url,
284
+ api_key_env: provider.api_key_env,
285
+ auth_header: provider.auth_header,
286
+ auth_type: provider.auth_type,
287
+ supports_streaming: variant.supports_streaming ?? provider.supports_streaming,
288
+ supports_tools: variant.supports_tools ?? provider.supports_tools,
289
+ max_tokens: variant.max_tokens,
290
+ context_window: variant.context_window,
291
+ provider_key: providerKey,
292
+ variant_key: variantKey,
293
+ provider_display_name: provider.display_name,
158
294
  };
159
295
  }
296
+ resolveAlias(name, aliases) {
297
+ return aliases[name] ?? name;
298
+ }
160
299
  loadApiKeys() {
300
+ this.apiKeys.clear();
161
301
  for (const [name, model] of Object.entries(this.config.models)) {
162
302
  const key = process.env[model.api_key_env];
163
303
  if (key) {
@@ -169,25 +309,11 @@ class ConfigManager {
169
309
  return this.config;
170
310
  }
171
311
  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;
312
+ const resolved = this.resolveModelName(name);
313
+ return this.config.models[resolved];
182
314
  }
183
315
  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;
316
+ return this.resolveAlias(name, this.config.aliases);
191
317
  }
192
318
  getApiKey(modelName) {
193
319
  const resolved = this.resolveModelName(modelName);
@@ -196,9 +322,13 @@ class ConfigManager {
196
322
  listModels() {
197
323
  const result = {};
198
324
  for (const [name, model] of Object.entries(this.config.models)) {
325
+ if (model.provider_key && name === model.provider_key) {
326
+ continue;
327
+ }
199
328
  result[name] = {
200
329
  displayName: model.display_name,
201
330
  provider: model.provider,
331
+ variant: model.variant_key,
202
332
  available: this.apiKeys.has(name),
203
333
  };
204
334
  }
@@ -208,110 +338,177 @@ class ConfigManager {
208
338
  exports.ConfigManager = ConfigManager;
209
339
  // Generate default config file content
210
340
  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
341
+ return `# Claude Code Model Router Configuration
342
+ # Place this file as models.yaml or .claude-router.yaml in your project root
343
+
344
+ default_model: deepseek-v4-pro
345
+
346
+ providers:
347
+ deepseek:
348
+ display_name: DeepSeek
349
+ provider: deepseek
350
+ base_url: https://api.deepseek.com/anthropic
351
+ api_key_env: DEEPSEEK_API_KEY
352
+ auth_header: x-api-key
353
+ auth_type: api_key
354
+ default_variant: v4-pro
355
+ variants:
356
+ v4-pro:
357
+ display_name: "DeepSeek V4 Pro"
358
+ model_id: deepseek-v4-pro
359
+ max_tokens: 393216
360
+ context_window: 1048576
361
+ v4-flash:
362
+ display_name: "DeepSeek V4 Flash"
363
+ model_id: deepseek-v4-flash
364
+ max_tokens: 393216
365
+ context_window: 1048576
366
+
367
+ kimi:
368
+ display_name: Kimi
369
+ provider: moonshot
370
+ base_url: https://api.moonshot.ai/anthropic
371
+ api_key_env: KIMI_API_KEY
372
+ auth_header: Authorization
373
+ auth_type: bearer
374
+ default_variant: k2.6
375
+ variants:
376
+ k2.6:
377
+ display_name: "Kimi K2.6"
378
+ model_id: kimi-k2.6
379
+ max_tokens: 32768
380
+ context_window: 262144
381
+
382
+ minimax:
383
+ display_name: MiniMax
384
+ provider: minimax
385
+ base_url: https://api.minimax.io/anthropic
386
+ api_key_env: MINIMAX_API_KEY
387
+ auth_header: Authorization
388
+ auth_type: bearer
389
+ default_variant: m2.7
390
+ variants:
391
+ m2.7:
392
+ display_name: "MiniMax M2.7"
393
+ model_id: MiniMax-M2.7
394
+ max_tokens: 196608
395
+ context_window: 204800
396
+ m2.7-highspeed:
397
+ display_name: "MiniMax M2.7 Highspeed"
398
+ model_id: MiniMax-M2.7-highspeed
399
+ max_tokens: 196608
400
+ context_window: 204800
401
+
402
+ qwen:
403
+ display_name: Qwen
404
+ provider: alibaba
405
+ base_url: https://dashscope.aliyuncs.com/apps/anthropic
406
+ api_key_env: QWEN_API_KEY
407
+ auth_header: x-api-key
408
+ auth_type: api_key
409
+ default_variant: 3.5-plus
410
+ variants:
411
+ 3.5-plus:
412
+ model_key: qwen3.5-plus
413
+ display_name: "Qwen3.5 Plus"
414
+ model_id: qwen3.5-plus
415
+ max_tokens: 65536
416
+ context_window: 1000000
417
+ 3.5-flash:
418
+ model_key: qwen3.5-flash
419
+ display_name: "Qwen3.5 Flash"
420
+ model_id: qwen3.5-flash
421
+ max_tokens: 65536
422
+ context_window: 1000000
423
+ 3-max:
424
+ model_key: qwen3-max
425
+ display_name: "Qwen3 Max"
426
+ model_id: qwen3-max
427
+ max_tokens: 65536
428
+ context_window: 1000000
429
+
430
+ glm:
431
+ display_name: GLM
432
+ provider: zhipu
433
+ base_url: https://open.bigmodel.cn/api/anthropic
434
+ api_key_env: GLM_API_KEY
435
+ auth_header: x-api-key
436
+ auth_type: api_key
437
+ default_variant: 5.1
438
+ variants:
439
+ 5.1:
440
+ display_name: "GLM-5.1"
441
+ model_id: glm-5.1
442
+ max_tokens: 131072
443
+ context_window: 204800
444
+
445
+ mimo:
446
+ display_name: MiMo
447
+ provider: xiaomi
448
+ base_url: https://api.xiaomimimo.com/anthropic
449
+ api_key_env: MIMO_API_KEY
450
+ auth_header: api-key
451
+ auth_type: api_key
452
+ default_variant: v2.5
453
+ variants:
454
+ v2.5:
455
+ display_name: "MiMo V2.5"
456
+ model_id: mimo-v2.5
457
+ max_tokens: 131072
458
+ context_window: 1048576
459
+
460
+ aliases:
461
+ deepseek: deepseek-v4-pro
462
+ deepseek-v4: deepseek-v4-pro
463
+ deepseek-pro: deepseek-v4-pro
464
+ deepseek-flash: deepseek-v4-flash
465
+ deepseek-chat: deepseek-v4-flash
466
+ ds: deepseek-v4-pro
467
+ kimi: kimi-k2.6
468
+ kimi-k2: kimi-k2.6
469
+ moonshot: kimi-k2.6
470
+ minimax: minimax-m2.7
471
+ minimax-m2: minimax-m2.7
472
+ minimax-highspeed: minimax-m2.7-highspeed
473
+ mm: minimax-m2.7
474
+ qwen: qwen3.5-plus
475
+ qwen3.5: qwen3.5-plus
476
+ tongyi: qwen3.5-plus
477
+ glm: glm-5.1
478
+ glm-5: glm-5.1
479
+ zhipu: glm-5.1
480
+ chatglm: glm-5.1
481
+ mimo: mimo-v2.5
482
+ mimo-v2: mimo-v2.5
483
+ mimo-v2.5: mimo-v2.5
484
+ xiaomi: mimo-v2.5
485
+
486
+ gateway:
487
+ port: 8080
488
+ timeout: 300
292
489
  `;
293
490
  }
294
491
  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=
492
+ return `# Claude Code Model Router - API Keys
493
+ # Fill in your API keys below
494
+
495
+ # DeepSeek - https://platform.deepseek.com/
496
+ DEEPSEEK_API_KEY=
497
+
498
+ # Kimi / Moonshot - https://platform.kimi.ai/
499
+ KIMI_API_KEY=
500
+
501
+ # MiniMax - https://platform.minimax.io/
502
+ MINIMAX_API_KEY=
503
+
504
+ # Qwen - https://dashscope.console.aliyun.com/
505
+ QWEN_API_KEY=
506
+
507
+ # GLM - https://open.bigmodel.cn/
508
+ GLM_API_KEY=
509
+
510
+ # MiMo - https://platform.xiaomimimo.com/
511
+ MIMO_API_KEY=
315
512
  `;
316
513
  }
317
514
  //# sourceMappingURL=config.js.map