modelmix 4.6.14 → 4.6.15

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/README.md CHANGED
@@ -189,11 +189,14 @@ Here's a comprehensive list of available methods:
189
189
  | `gemini36flash()` | Google | gemini-3.6-flash | [\$1.50 / \$7.50][3] |
190
190
  | `gemini35flash()` | Google | gemini-3.5-flash | [\$0.75 / \$4.50][3] |
191
191
  | `gemini31flashLite()`| Google | gemini-3.1-flash-lite-preview | [\$0.25 / \$1.50][3] |
192
+ | `grok45()` | Grok | grok-4.5 | [\$2.00 / \$6.00][6] |
192
193
  | `grok43()` | Grok | grok-4.3 | [\$1.25 / \$2.50][6] |
193
194
  | `grok420multiAgent()`| Grok | grok-4.20-multi-agent-0309 | [\$1.25 / \$2.50][6] |
194
195
  | `grok420[think]()` | Grok | grok-4.20-0309 | [\$1.25 / \$2.50][6] |
195
196
  | `grok41[think]()` | Grok | grok-4-1-fast | [\$0.20 / \$0.50][6] |
196
197
  | `qwen36plus()` | Fireworks/Together | qwen3p6-plus / Qwen3.6-Plus | [\$0.50 / \$3.00][10] |
198
+ | `qwen37plus()` | Fireworks | models/qwen3p7-plus | [\$0.40 / \$1.60][10] |
199
+ | `qwen38max()` | OpenRouter | qwen/qwen3.8-max | [\$2.00 / \$6.00][12] |
197
200
  | `deepseekV4Flash()` | Fireworks | models/deepseek-v4-flash | [\$0.14 / \$0.28][10] |
198
201
  | `deepseekV4Pro()` | Fireworks | models/deepseek-v4-pro | [\$1.74 / \$3.48][10] |
199
202
  | `GLM52()` | Together | zai-org/GLM-5.2 | [\$1.40 / \$4.40][7] |
@@ -218,10 +221,12 @@ Here's a comprehensive list of available methods:
218
221
  [9]: https://platform.minimax.io/docs/api-reference/anthropic-api-compatible-cache#supported-models-and-pricing "MiniMax Pricing"
219
222
  [10]: https://fireworks.ai/pricing#serverless-pricing "Fireworks Pricing"
220
223
  [11]: https://platform.kimi.ai/docs/guide/kimi-k3-pricing "Kimi K3 Pricing"
224
+ [12]: https://openrouter.ai/qwen/qwen3.8-max "OpenRouter Pricing"
221
225
 
222
226
  Each method accepts optional `options`, `config`, and (for multi-provider methods) `mix` parameters to customize behavior.
223
227
  For NVIDIA on DeepSeek V4 Flash/Pro, use `deepseekV4Flash({ mix: { nvidia: true } })` or `deepseekV4Pro({ mix: { nvidia: true } })`.
224
228
  For Together on Qwen 3.6 Plus, use `qwen36plus({ mix: { fireworks: false, together: true } })`.
229
+ For OpenRouter on Qwen 3.7 Plus, use `qwen37plus({ mix: { fireworks: false, openrouter: true } })`.
225
230
  For OpenRouter instead of Moonshot's native API, use `kimiK3({ mix: { moonshot: false, openrouter: true } })`.
226
231
 
227
232
  ```javascript
package/index.d.ts CHANGED
@@ -324,6 +324,7 @@ export declare class ModelMix {
324
324
  sonar(args?: ModelAttachArgs): this;
325
325
 
326
326
  // Grok
327
+ grok45(args?: ModelAttachArgs): this;
327
328
  grok43(args?: ModelAttachArgs): this;
328
329
  grok420multiAgent(args?: ModelAttachArgs): this;
329
330
  grok420think(args?: ModelAttachArgs): this;
@@ -334,6 +335,8 @@ export declare class ModelMix {
334
335
  // Multi-provider
335
336
  qwen3(args?: ModelAttachArgs): this;
336
337
  qwen36plus(args?: ModelAttachArgs): this;
338
+ qwen37plus(args?: ModelAttachArgs): this;
339
+ qwen38max(args?: ModelAttachArgs): this;
337
340
  hermes3(args?: ModelAttachArgs): this;
338
341
  kimiK26think(args?: ModelAttachArgs): this;
339
342
  kimiK27Code(args?: ModelAttachArgs): this;
package/index.js CHANGED
@@ -88,6 +88,7 @@ const MODEL_PRICING = {
88
88
  'gemini-2.5-flash': [0.30, 2.50],
89
89
  'gemini-3.1-flash-lite-preview': [0.25, 1.50],
90
90
  // Grok
91
+ 'grok-4.5': [2.00, 6.00],
91
92
  'grok-4.3': [1.25, 2.50],
92
93
  'grok-4.20-multi-agent-0309': [1.25, 2.50],
93
94
  'grok-4.20-0309-reasoning': [1.25, 2.50],
@@ -106,6 +107,9 @@ const MODEL_PRICING = {
106
107
  'accounts/fireworks/models/kimi-k2p5': [0.50, 2.80],
107
108
  'accounts/fireworks/models/qwen3p6-plus': [0.50, 3.00],
108
109
  'Qwen/Qwen3.6-Plus': [0.50, 3.00],
110
+ 'accounts/fireworks/models/qwen3p7-plus': [0.40, 1.60],
111
+ 'qwen/qwen3.7-plus': [0.32, 1.28],
112
+ 'qwen/qwen3.8-max': [2.00, 6.00],
109
113
  'fireworks/glm-5': [1.00, 3.20],
110
114
  // MiniMax
111
115
  'MiniMax-M2.5': [0.30, 1.20],
@@ -497,6 +501,9 @@ class ModelMix {
497
501
  return this.attach('sonar', new MixPerplexity({ options, config }));
498
502
  }
499
503
 
504
+ grok45({ options = {}, config = {} } = {}) {
505
+ return this.attach('grok-4.5', new MixGrok({ options, config }));
506
+ }
500
507
  grok43({ options = {}, config = {} } = {}) {
501
508
  return this.attach('grok-4.3', new MixGrok({ options, config }));
502
509
  }
@@ -527,7 +534,20 @@ class ModelMix {
527
534
  if (mix.fireworks) this.attach('accounts/fireworks/models/qwen3p6-plus', new MixFireworks({ options, config }));
528
535
  if (mix.together) this.attach('Qwen/Qwen3.6-Plus', new MixTogether({ options, config }));
529
536
  return this;
530
- }
537
+ }
538
+
539
+ qwen37plus({ options = {}, config = {}, mix = { fireworks: true } } = {}) {
540
+ mix = { ...this.mix, ...mix };
541
+ if (mix.fireworks) this.attach('accounts/fireworks/models/qwen3p7-plus', new MixFireworks({ options, config }));
542
+ if (mix.openrouter) this.attach('qwen/qwen3.7-plus', new MixOpenRouter({ options, config }));
543
+ return this;
544
+ }
545
+
546
+ qwen38max({ options = {}, config = {}, mix = { openrouter: true } } = {}) {
547
+ mix = { ...this.mix, ...mix };
548
+ if (mix.openrouter) this.attach('qwen/qwen3.8-max', new MixOpenRouter({ options, config }));
549
+ return this;
550
+ }
531
551
 
532
552
  hermes3({ options = {}, config = {}, mix = {} } = {}) {
533
553
  mix = { ...this.mix, ...mix };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "modelmix",
3
- "version": "4.6.14",
3
+ "version": "4.6.15",
4
4
  "description": "🧬 Reliable interface with automatic fallback for AI LLMs.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -130,7 +130,7 @@ Thinking variants: append `think` — e.g. `fable5think()` `opus5think()` `opus4
130
130
  `gemini3pro()` `gemini3flash()` `gemini36flash()` `gemini35flash()` `gemini25pro()` `gemini25flash()`
131
131
 
132
132
  ### Grok
133
- `grok43()` `grok420multiAgent()` `grok420()` `grok420think()` `grok41()` `grok41think()`
133
+ `grok45()` `grok43()` `grok420multiAgent()` `grok420()` `grok420think()` `grok41()` `grok41think()`
134
134
 
135
135
  ### Perplexity
136
136
  `sonar()` `sonarPro()`
@@ -145,13 +145,13 @@ Thinking variants: append `think` — e.g. `fable5think()` `opus5think()` `opus4
145
145
  `minimaxM25()` `minimaxM27()` `minimaxM3()`
146
146
 
147
147
  ### Fireworks
148
- `deepseekV4Flash()` `deepseekV4Pro()` `GLM5()`
148
+ `qwen36plus()` `qwen37plus()` `deepseekV4Flash()` `deepseekV4Pro()` `GLM5()`
149
149
 
150
150
  ### Cerebras
151
151
  `GLM46()`
152
152
 
153
153
  ### OpenRouter
154
- `GLM45()`
154
+ `qwen38max()` `GLM45()`
155
155
 
156
156
  ### Multi-provider (auto-fallback across free/paid tiers)
157
157
  `hermes3()` `kimiK25think()`
package/test/grok.test.js CHANGED
@@ -3,6 +3,7 @@ const { ModelMix } = require('../index.js');
3
3
 
4
4
  describe('Grok Model Registration Tests', () => {
5
5
  const grokModels = [
6
+ { method: 'grok45', key: 'grok-4.5' },
6
7
  { method: 'grok43', key: 'grok-4.3' },
7
8
  { method: 'grok420multiAgent', key: 'grok-4.20-multi-agent-0309' },
8
9
  { method: 'grok420think', key: 'grok-4.20-0309-reasoning' },
package/test/qwen.test.js CHANGED
@@ -17,4 +17,36 @@ describe('Qwen Model Registration Tests', () => {
17
17
  expect(model.models).to.have.length(1);
18
18
  expect(model.models[0].key).to.equal('Qwen/Qwen3.6-Plus');
19
19
  });
20
+
21
+ it('should register Fireworks Qwen 3.7 Plus by default', () => {
22
+ const model = ModelMix.new();
23
+ model.qwen37plus({ mix: { fireworks: true, openrouter: false } });
24
+
25
+ expect(model.models).to.have.length(1);
26
+ expect(model.models[0].key).to.equal('accounts/fireworks/models/qwen3p7-plus');
27
+ expect(ModelMix.calculateCost('accounts/fireworks/models/qwen3p7-plus', {
28
+ input: 1_000_000,
29
+ output: 1_000_000
30
+ })).to.equal(2.00);
31
+ });
32
+
33
+ it('should register OpenRouter Qwen 3.7 Plus when openrouter mix is enabled', () => {
34
+ const model = ModelMix.new();
35
+ model.qwen37plus({ mix: { fireworks: false, openrouter: true } });
36
+
37
+ expect(model.models).to.have.length(1);
38
+ expect(model.models[0].key).to.equal('qwen/qwen3.7-plus');
39
+ });
40
+
41
+ it('should register OpenRouter Qwen 3.8 Max by default', () => {
42
+ const model = ModelMix.new();
43
+ model.qwen38max();
44
+
45
+ expect(model.models).to.have.length(1);
46
+ expect(model.models[0].key).to.equal('qwen/qwen3.8-max');
47
+ expect(ModelMix.calculateCost('qwen/qwen3.8-max', {
48
+ input: 1_000_000,
49
+ output: 1_000_000
50
+ })).to.equal(8.00);
51
+ });
20
52
  });