pi-tensorix-provider 1.0.4 → 1.0.6
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/AGENTS.md +1 -0
- package/README.md +5 -13
- package/deprecated-models.json +87 -0
- package/index.ts +34 -1
- package/models.json +10 -138
- package/package.json +1 -1
- package/patch.json +63 -44
- package/scripts/update-models.js +63 -0
package/AGENTS.md
CHANGED
|
@@ -7,6 +7,7 @@ The following files are **idempotent** and regenerated by `scripts/update-models
|
|
|
7
7
|
| File | Why it's auto-generated |
|
|
8
8
|
|------|------------------------|
|
|
9
9
|
| `models.json` | Built from the provider API. `update-models.js` fetches models, preserves curated data for known IDs, and writes this file. |
|
|
10
|
+
| `deprecated-models.json` | Graveyard for models the API delisted. update-models.js stamps them with deprecatedAt and pi keeps serving them for a 2-week grace period, then evicts them. Never edit by hand. |
|
|
10
11
|
| `README.md` (model table) | The table under `## Available Models` is replaced in-place by `update-models.js` after merging base models → patch → custom models. |
|
|
11
12
|
|
|
12
13
|
## Correct Files to Edit
|
package/README.md
CHANGED
|
@@ -27,31 +27,23 @@ _32 models — DeepSeek, Kimi, GLM, Qwen, MiniMax, Llama — all **free** for [p
|
|
|
27
27
|
| Model | Context | Vision | Reasoning | Input $/M | Output $/M |
|
|
28
28
|
|-------|---------|--------|-----------|-----------|------------|
|
|
29
29
|
| Chatterbox Turbo | 131K | ❌ | ❌ | **Free** | **Free** |
|
|
30
|
-
| Deepseek Chat V3.1 | 131K | ❌ | ❌ | **Free** | **Free** |
|
|
31
30
|
| Deepseek R1 0528 | 131K | ❌ | ✅ | **Free** | **Free** |
|
|
32
31
|
| Deepseek V3.2 | 164K | ❌ | ✅ | **Free** | **Free** |
|
|
33
32
|
| Deepseek V4 Flash | 1.0M | ❌ | ✅ | **Free** | **Free** |
|
|
34
|
-
| Deepseek V4 Flash
|
|
33
|
+
| Deepseek V4 Flash 0731 | 131K | ❌ | ✅ | **Free** | **Free** |
|
|
35
34
|
| Deepseek V4 Pro | 1.0M | ❌ | ✅ | **Free** | **Free** |
|
|
36
|
-
| Glm 4.7 | 203K | ❌ | ✅ | **Free** | **Free** |
|
|
37
35
|
| Glm 5 | 203K | ❌ | ✅ | **Free** | **Free** |
|
|
38
36
|
| Glm 5 Turbo | 203K | ❌ | ✅ | **Free** | **Free** |
|
|
39
37
|
| Glm 5.1 | 203K | ❌ | ✅ | **Free** | **Free** |
|
|
40
|
-
| Glm 5.2 | 131K | ❌ |
|
|
38
|
+
| Glm 5.2 | 131K | ❌ | ✅ | **Free** | **Free** |
|
|
41
39
|
| Glm 5v Turbo | 203K | ✅ | ✅ | **Free** | **Free** |
|
|
42
|
-
| Gpt Oss 120b | 131K | ❌ | ✅ | **Free** | **Free** |
|
|
43
|
-
| Gpt Oss 20b | 131K | ❌ | ✅ | **Free** | **Free** |
|
|
44
|
-
| Hy3 | 131K | ❌ | ❌ | **Free** | **Free** |
|
|
45
40
|
| Kimi K2.5 | 262K | ✅ | ✅ | **Free** | **Free** |
|
|
46
41
|
| Kimi K2.6 | 262K | ✅ | ✅ | **Free** | **Free** |
|
|
47
|
-
| Kimi K2.7 Code | 131K |
|
|
48
|
-
|
|
|
42
|
+
| Kimi K2.7 Code | 131K | ✅ | ✅ | **Free** | **Free** |
|
|
43
|
+
| Kimi K3 | 131K | ✅ | ✅ | **Free** | **Free** |
|
|
49
44
|
| Minimax M2.5 | 205K | ❌ | ✅ | **Free** | **Free** |
|
|
50
|
-
| Minimax M3 | 131K |
|
|
51
|
-
| Nemotron 3 Super 120b A12b | 4K | ❌ | ❌ | **Free** | **Free** |
|
|
45
|
+
| Minimax M3 | 131K | ✅ | ✅ | **Free** | **Free** |
|
|
52
46
|
| Qwen3 235b A22b 2507 | 262K | ❌ | ✅ | **Free** | **Free** |
|
|
53
|
-
| Qwen3 Coder 30b A3b Instruct | 262K | ❌ | ✅ | **Free** | **Free** |
|
|
54
|
-
| Qwen3 Vl 235b A22b Instruct | 262K | ✅ | ✅ | **Free** | **Free** |
|
|
55
47
|
| Qwen3.5 122b A10b | 262K | ❌ | ✅ | **Free** | **Free** |
|
|
56
48
|
| Qwen3.5 9b | 262K | ❌ | ✅ | **Free** | **Free** |
|
|
57
49
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"deepseek/deepseek-chat-v3.1": {
|
|
3
|
+
"id": "deepseek/deepseek-chat-v3.1",
|
|
4
|
+
"name": "Deepseek Chat V3.1",
|
|
5
|
+
"reasoning": false,
|
|
6
|
+
"input": [
|
|
7
|
+
"text"
|
|
8
|
+
],
|
|
9
|
+
"cost": {
|
|
10
|
+
"input": 0,
|
|
11
|
+
"output": 0,
|
|
12
|
+
"cacheRead": 0,
|
|
13
|
+
"cacheWrite": 0
|
|
14
|
+
},
|
|
15
|
+
"contextWindow": 131072,
|
|
16
|
+
"maxTokens": 131072,
|
|
17
|
+
"deprecatedAt": "2026-08-01T02:00:23.121Z"
|
|
18
|
+
},
|
|
19
|
+
"nvidia/nemotron-3-super-120b-a12b": {
|
|
20
|
+
"id": "nvidia/nemotron-3-super-120b-a12b",
|
|
21
|
+
"name": "Nemotron 3 Super 120b A12b",
|
|
22
|
+
"reasoning": false,
|
|
23
|
+
"input": [
|
|
24
|
+
"text"
|
|
25
|
+
],
|
|
26
|
+
"cost": {
|
|
27
|
+
"input": 0,
|
|
28
|
+
"output": 0,
|
|
29
|
+
"cacheRead": 0,
|
|
30
|
+
"cacheWrite": 0
|
|
31
|
+
},
|
|
32
|
+
"contextWindow": 131072,
|
|
33
|
+
"maxTokens": 131072,
|
|
34
|
+
"deprecatedAt": "2026-08-01T02:00:23.121Z"
|
|
35
|
+
},
|
|
36
|
+
"openai/gpt-oss-120b": {
|
|
37
|
+
"id": "openai/gpt-oss-120b",
|
|
38
|
+
"name": "Gpt Oss 120b",
|
|
39
|
+
"reasoning": false,
|
|
40
|
+
"input": [
|
|
41
|
+
"text"
|
|
42
|
+
],
|
|
43
|
+
"cost": {
|
|
44
|
+
"input": 0,
|
|
45
|
+
"output": 0,
|
|
46
|
+
"cacheRead": 0,
|
|
47
|
+
"cacheWrite": 0
|
|
48
|
+
},
|
|
49
|
+
"contextWindow": 131072,
|
|
50
|
+
"maxTokens": 131072,
|
|
51
|
+
"deprecatedAt": "2026-08-01T02:00:23.121Z"
|
|
52
|
+
},
|
|
53
|
+
"qwen/qwen3-coder-30b-a3b-instruct": {
|
|
54
|
+
"id": "qwen/qwen3-coder-30b-a3b-instruct",
|
|
55
|
+
"name": "Qwen3 Coder 30b A3b Instruct",
|
|
56
|
+
"reasoning": false,
|
|
57
|
+
"input": [
|
|
58
|
+
"text"
|
|
59
|
+
],
|
|
60
|
+
"cost": {
|
|
61
|
+
"input": 0,
|
|
62
|
+
"output": 0,
|
|
63
|
+
"cacheRead": 0,
|
|
64
|
+
"cacheWrite": 0
|
|
65
|
+
},
|
|
66
|
+
"contextWindow": 131072,
|
|
67
|
+
"maxTokens": 131072,
|
|
68
|
+
"deprecatedAt": "2026-08-01T02:00:23.121Z"
|
|
69
|
+
},
|
|
70
|
+
"qwen/qwen3-vl-235b-a22b-instruct": {
|
|
71
|
+
"id": "qwen/qwen3-vl-235b-a22b-instruct",
|
|
72
|
+
"name": "Qwen3 Vl 235b A22b Instruct",
|
|
73
|
+
"reasoning": false,
|
|
74
|
+
"input": [
|
|
75
|
+
"text"
|
|
76
|
+
],
|
|
77
|
+
"cost": {
|
|
78
|
+
"input": 0,
|
|
79
|
+
"output": 0,
|
|
80
|
+
"cacheRead": 0,
|
|
81
|
+
"cacheWrite": 0
|
|
82
|
+
},
|
|
83
|
+
"contextWindow": 131072,
|
|
84
|
+
"maxTokens": 131072,
|
|
85
|
+
"deprecatedAt": "2026-08-01T02:00:23.121Z"
|
|
86
|
+
}
|
|
87
|
+
}
|
package/index.ts
CHANGED
|
@@ -45,6 +45,7 @@ import { getAgentDir, type ExtensionAPI, type ModelRegistry } from "@earendil-wo
|
|
|
45
45
|
import modelsData from "./models.json" with { type: "json" };
|
|
46
46
|
import customModelsData from "./custom-models.json" with { type: "json" };
|
|
47
47
|
import patchData from "./patch.json" with { type: "json" };
|
|
48
|
+
import deprecatedData from "./deprecated-models.json" with { type: "json" };
|
|
48
49
|
import fs from "fs";
|
|
49
50
|
import path from "path";
|
|
50
51
|
|
|
@@ -129,7 +130,10 @@ function applyPatch(model: JsonModel, patch: PatchEntry): JsonModel {
|
|
|
129
130
|
function buildModels(base: JsonModel[], custom: JsonModel[], patch: PatchData): JsonModel[] {
|
|
130
131
|
const modelMap = new Map<string, JsonModel>();
|
|
131
132
|
|
|
132
|
-
|
|
133
|
+
// Seed with the base list plus grace-period deprecated models so patch.json
|
|
134
|
+
// entries apply to deprecated models exactly as while the model was live
|
|
135
|
+
// (withDeprecated keeps live data on id conflicts).
|
|
136
|
+
for (const model of withDeprecated(base)) {
|
|
133
137
|
modelMap.set(model.id, model);
|
|
134
138
|
}
|
|
135
139
|
|
|
@@ -257,6 +261,35 @@ function mergeWithEmbedded(liveModels: JsonModel[], embeddedModels: JsonModel[])
|
|
|
257
261
|
return result;
|
|
258
262
|
}
|
|
259
263
|
|
|
264
|
+
// Grace period for delisted models. When the provider API stops listing a
|
|
265
|
+
// model, update-models.js moves its last-known definition into
|
|
266
|
+
// deprecated-models.json (stamped with deprecatedAt) instead of dropping it.
|
|
267
|
+
// For 14 days the model keeps working here so in-flight sessions and saved
|
|
268
|
+
// model settings do not break; afterwards it is evicted permanently.
|
|
269
|
+
const DEPRECATED_MODEL_TTL_MS = 14 * 24 * 60 * 60 * 1000;
|
|
270
|
+
|
|
271
|
+
// Grace-period deprecated models with deprecation metadata stripped.
|
|
272
|
+
function activeDeprecatedModels(): JsonModel[] {
|
|
273
|
+
const now = Date.now();
|
|
274
|
+
const result: JsonModel[] = [];
|
|
275
|
+
for (const entry of Object.values(deprecatedData as Record<string, JsonModel & { deprecatedAt?: string }>)) {
|
|
276
|
+
if (!entry?.id) continue;
|
|
277
|
+
const removedAt = Date.parse(entry.deprecatedAt ?? "");
|
|
278
|
+
if (Number.isNaN(removedAt) || now - removedAt > DEPRECATED_MODEL_TTL_MS) continue;
|
|
279
|
+
const model = { ...entry } as JsonModel & { deprecatedAt?: string };
|
|
280
|
+
delete model.deprecatedAt;
|
|
281
|
+
result.push(model);
|
|
282
|
+
}
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Append grace-period deprecated models the list does not already have (live data wins).
|
|
287
|
+
function withDeprecated(models: JsonModel[]): JsonModel[] {
|
|
288
|
+
const seen = new Set(models.map((m) => m.id));
|
|
289
|
+
const extras = activeDeprecatedModels().filter((m) => !seen.has(m.id));
|
|
290
|
+
return extras.length > 0 ? [...models, ...extras] : models;
|
|
291
|
+
}
|
|
292
|
+
|
|
260
293
|
function loadStaleModels(embeddedModels: JsonModel[]): JsonModel[] {
|
|
261
294
|
const cached = loadCachedModels();
|
|
262
295
|
if (!cached || cached.length === 0) return embeddedModels;
|
package/models.json
CHANGED
|
@@ -16,24 +16,8 @@
|
|
|
16
16
|
"maxTokens": 131072
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
|
-
"id": "deepseek-
|
|
20
|
-
"name": "Deepseek
|
|
21
|
-
"reasoning": false,
|
|
22
|
-
"input": [
|
|
23
|
-
"text"
|
|
24
|
-
],
|
|
25
|
-
"cost": {
|
|
26
|
-
"input": 0,
|
|
27
|
-
"output": 0,
|
|
28
|
-
"cacheRead": 0,
|
|
29
|
-
"cacheWrite": 0
|
|
30
|
-
},
|
|
31
|
-
"contextWindow": 131072,
|
|
32
|
-
"maxTokens": 131072
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "deepseek/deepseek-chat-v3.1",
|
|
36
|
-
"name": "Deepseek Chat V3.1",
|
|
19
|
+
"id": "deepseek/deepseek-r1-0528",
|
|
20
|
+
"name": "Deepseek R1 0528",
|
|
37
21
|
"reasoning": false,
|
|
38
22
|
"input": [
|
|
39
23
|
"text"
|
|
@@ -48,8 +32,8 @@
|
|
|
48
32
|
"maxTokens": 131072
|
|
49
33
|
},
|
|
50
34
|
{
|
|
51
|
-
"id": "deepseek/deepseek-
|
|
52
|
-
"name": "Deepseek
|
|
35
|
+
"id": "deepseek/deepseek-v3.2",
|
|
36
|
+
"name": "Deepseek V3.2",
|
|
53
37
|
"reasoning": false,
|
|
54
38
|
"input": [
|
|
55
39
|
"text"
|
|
@@ -64,8 +48,8 @@
|
|
|
64
48
|
"maxTokens": 131072
|
|
65
49
|
},
|
|
66
50
|
{
|
|
67
|
-
"id": "deepseek/deepseek-
|
|
68
|
-
"name": "Deepseek
|
|
51
|
+
"id": "deepseek/deepseek-v4-flash",
|
|
52
|
+
"name": "Deepseek V4 Flash",
|
|
69
53
|
"reasoning": false,
|
|
70
54
|
"input": [
|
|
71
55
|
"text"
|
|
@@ -80,8 +64,8 @@
|
|
|
80
64
|
"maxTokens": 131072
|
|
81
65
|
},
|
|
82
66
|
{
|
|
83
|
-
"id": "deepseek/deepseek-v4-flash",
|
|
84
|
-
"name": "Deepseek V4 Flash",
|
|
67
|
+
"id": "deepseek/deepseek-v4-flash-0731",
|
|
68
|
+
"name": "Deepseek V4 Flash 0731",
|
|
85
69
|
"reasoning": false,
|
|
86
70
|
"input": [
|
|
87
71
|
"text"
|
|
@@ -192,40 +176,8 @@
|
|
|
192
176
|
"maxTokens": 131072
|
|
193
177
|
},
|
|
194
178
|
{
|
|
195
|
-
"id": "
|
|
196
|
-
"name": "
|
|
197
|
-
"reasoning": false,
|
|
198
|
-
"input": [
|
|
199
|
-
"text"
|
|
200
|
-
],
|
|
201
|
-
"cost": {
|
|
202
|
-
"input": 0,
|
|
203
|
-
"output": 0,
|
|
204
|
-
"cacheRead": 0,
|
|
205
|
-
"cacheWrite": 0
|
|
206
|
-
},
|
|
207
|
-
"contextWindow": 131072,
|
|
208
|
-
"maxTokens": 131072
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
"id": "openai/gpt-oss-120b",
|
|
212
|
-
"name": "Gpt Oss 120b",
|
|
213
|
-
"reasoning": false,
|
|
214
|
-
"input": [
|
|
215
|
-
"text"
|
|
216
|
-
],
|
|
217
|
-
"cost": {
|
|
218
|
-
"input": 0,
|
|
219
|
-
"output": 0,
|
|
220
|
-
"cacheRead": 0,
|
|
221
|
-
"cacheWrite": 0
|
|
222
|
-
},
|
|
223
|
-
"contextWindow": 131072,
|
|
224
|
-
"maxTokens": 131072
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
"id": "openai/gpt-oss-20b",
|
|
228
|
-
"name": "Gpt Oss 20b",
|
|
179
|
+
"id": "moonshotai/kimi-k3",
|
|
180
|
+
"name": "Kimi K3",
|
|
229
181
|
"reasoning": false,
|
|
230
182
|
"input": [
|
|
231
183
|
"text"
|
|
@@ -255,38 +207,6 @@
|
|
|
255
207
|
"contextWindow": 131072,
|
|
256
208
|
"maxTokens": 131072
|
|
257
209
|
},
|
|
258
|
-
{
|
|
259
|
-
"id": "qwen/qwen3-coder-30b-a3b-instruct",
|
|
260
|
-
"name": "Qwen3 Coder 30b A3b Instruct",
|
|
261
|
-
"reasoning": false,
|
|
262
|
-
"input": [
|
|
263
|
-
"text"
|
|
264
|
-
],
|
|
265
|
-
"cost": {
|
|
266
|
-
"input": 0,
|
|
267
|
-
"output": 0,
|
|
268
|
-
"cacheRead": 0,
|
|
269
|
-
"cacheWrite": 0
|
|
270
|
-
},
|
|
271
|
-
"contextWindow": 131072,
|
|
272
|
-
"maxTokens": 131072
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
"id": "qwen/qwen3-vl-235b-a22b-instruct",
|
|
276
|
-
"name": "Qwen3 Vl 235b A22b Instruct",
|
|
277
|
-
"reasoning": false,
|
|
278
|
-
"input": [
|
|
279
|
-
"text"
|
|
280
|
-
],
|
|
281
|
-
"cost": {
|
|
282
|
-
"input": 0,
|
|
283
|
-
"output": 0,
|
|
284
|
-
"cacheRead": 0,
|
|
285
|
-
"cacheWrite": 0
|
|
286
|
-
},
|
|
287
|
-
"contextWindow": 131072,
|
|
288
|
-
"maxTokens": 131072
|
|
289
|
-
},
|
|
290
210
|
{
|
|
291
211
|
"id": "qwen/qwen3.5-122b-a10b",
|
|
292
212
|
"name": "Qwen3.5 122b A10b",
|
|
@@ -319,54 +239,6 @@
|
|
|
319
239
|
"contextWindow": 131072,
|
|
320
240
|
"maxTokens": 131072
|
|
321
241
|
},
|
|
322
|
-
{
|
|
323
|
-
"id": "tencent/hy3",
|
|
324
|
-
"name": "Hy3",
|
|
325
|
-
"reasoning": false,
|
|
326
|
-
"input": [
|
|
327
|
-
"text"
|
|
328
|
-
],
|
|
329
|
-
"cost": {
|
|
330
|
-
"input": 0,
|
|
331
|
-
"output": 0,
|
|
332
|
-
"cacheRead": 0,
|
|
333
|
-
"cacheWrite": 0
|
|
334
|
-
},
|
|
335
|
-
"contextWindow": 131072,
|
|
336
|
-
"maxTokens": 131072
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
"id": "xiaomi/mimo-v2.5",
|
|
340
|
-
"name": "Mimo V2.5",
|
|
341
|
-
"reasoning": false,
|
|
342
|
-
"input": [
|
|
343
|
-
"text"
|
|
344
|
-
],
|
|
345
|
-
"cost": {
|
|
346
|
-
"input": 0,
|
|
347
|
-
"output": 0,
|
|
348
|
-
"cacheRead": 0,
|
|
349
|
-
"cacheWrite": 0
|
|
350
|
-
},
|
|
351
|
-
"contextWindow": 131072,
|
|
352
|
-
"maxTokens": 131072
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
"id": "z-ai/glm-4.7",
|
|
356
|
-
"name": "Glm 4.7",
|
|
357
|
-
"reasoning": false,
|
|
358
|
-
"input": [
|
|
359
|
-
"text"
|
|
360
|
-
],
|
|
361
|
-
"cost": {
|
|
362
|
-
"input": 0,
|
|
363
|
-
"output": 0,
|
|
364
|
-
"cacheRead": 0,
|
|
365
|
-
"cacheWrite": 0
|
|
366
|
-
},
|
|
367
|
-
"contextWindow": 131072,
|
|
368
|
-
"maxTokens": 131072
|
|
369
|
-
},
|
|
370
242
|
{
|
|
371
243
|
"id": "z-ai/glm-5",
|
|
372
244
|
"name": "Glm 5",
|
package/package.json
CHANGED
package/patch.json
CHANGED
|
@@ -38,16 +38,6 @@
|
|
|
38
38
|
"supportsReasoningEffort": true
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
|
-
"z-ai/glm-4.7": {
|
|
42
|
-
"reasoning": true,
|
|
43
|
-
"contextWindow": 202752,
|
|
44
|
-
"maxTokens": 131072,
|
|
45
|
-
"compat": {
|
|
46
|
-
"thinkingFormat": "openai",
|
|
47
|
-
"supportsDeveloperRole": true,
|
|
48
|
-
"supportsReasoningEffort": true
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
41
|
"z-ai/glm-5": {
|
|
52
42
|
"reasoning": true,
|
|
53
43
|
"contextWindow": 202752,
|
|
@@ -80,7 +70,10 @@
|
|
|
80
70
|
},
|
|
81
71
|
"z-ai/glm-5v-turbo": {
|
|
82
72
|
"reasoning": true,
|
|
83
|
-
"input": [
|
|
73
|
+
"input": [
|
|
74
|
+
"text",
|
|
75
|
+
"image"
|
|
76
|
+
],
|
|
84
77
|
"contextWindow": 202752,
|
|
85
78
|
"maxTokens": 131072,
|
|
86
79
|
"compat": {
|
|
@@ -99,19 +92,26 @@
|
|
|
99
92
|
"supportsReasoningEffort": true
|
|
100
93
|
}
|
|
101
94
|
},
|
|
102
|
-
"
|
|
95
|
+
"moonshotai/kimi-k2.5": {
|
|
103
96
|
"reasoning": true,
|
|
104
|
-
"
|
|
105
|
-
|
|
97
|
+
"input": [
|
|
98
|
+
"text",
|
|
99
|
+
"image"
|
|
100
|
+
],
|
|
101
|
+
"contextWindow": 262144,
|
|
102
|
+
"maxTokens": 262144,
|
|
106
103
|
"compat": {
|
|
107
104
|
"thinkingFormat": "openai",
|
|
108
105
|
"supportsDeveloperRole": true,
|
|
109
106
|
"supportsReasoningEffort": true
|
|
110
107
|
}
|
|
111
108
|
},
|
|
112
|
-
"moonshotai/kimi-k2.
|
|
109
|
+
"moonshotai/kimi-k2.6": {
|
|
113
110
|
"reasoning": true,
|
|
114
|
-
"input": [
|
|
111
|
+
"input": [
|
|
112
|
+
"text",
|
|
113
|
+
"image"
|
|
114
|
+
],
|
|
115
115
|
"contextWindow": 262144,
|
|
116
116
|
"maxTokens": 262144,
|
|
117
117
|
"compat": {
|
|
@@ -120,9 +120,8 @@
|
|
|
120
120
|
"supportsReasoningEffort": true
|
|
121
121
|
}
|
|
122
122
|
},
|
|
123
|
-
"
|
|
123
|
+
"qwen/qwen3-235b-a22b-2507": {
|
|
124
124
|
"reasoning": true,
|
|
125
|
-
"input": ["text", "image"],
|
|
126
125
|
"contextWindow": 262144,
|
|
127
126
|
"maxTokens": 262144,
|
|
128
127
|
"compat": {
|
|
@@ -131,9 +130,8 @@
|
|
|
131
130
|
"supportsReasoningEffort": true
|
|
132
131
|
}
|
|
133
132
|
},
|
|
134
|
-
"
|
|
133
|
+
"qwen/qwen3-coder-30b-a3b-instruct": {
|
|
135
134
|
"reasoning": true,
|
|
136
|
-
"input": ["text", "image"],
|
|
137
135
|
"contextWindow": 262144,
|
|
138
136
|
"maxTokens": 262144,
|
|
139
137
|
"compat": {
|
|
@@ -142,8 +140,12 @@
|
|
|
142
140
|
"supportsReasoningEffort": true
|
|
143
141
|
}
|
|
144
142
|
},
|
|
145
|
-
"qwen/qwen3-235b-a22b-
|
|
143
|
+
"qwen/qwen3-vl-235b-a22b-instruct": {
|
|
146
144
|
"reasoning": true,
|
|
145
|
+
"input": [
|
|
146
|
+
"text",
|
|
147
|
+
"image"
|
|
148
|
+
],
|
|
147
149
|
"contextWindow": 262144,
|
|
148
150
|
"maxTokens": 262144,
|
|
149
151
|
"compat": {
|
|
@@ -152,7 +154,7 @@
|
|
|
152
154
|
"supportsReasoningEffort": true
|
|
153
155
|
}
|
|
154
156
|
},
|
|
155
|
-
"qwen/qwen3-
|
|
157
|
+
"qwen/qwen3.5-122b-a10b": {
|
|
156
158
|
"reasoning": true,
|
|
157
159
|
"contextWindow": 262144,
|
|
158
160
|
"maxTokens": 262144,
|
|
@@ -162,9 +164,8 @@
|
|
|
162
164
|
"supportsReasoningEffort": true
|
|
163
165
|
}
|
|
164
166
|
},
|
|
165
|
-
"qwen/qwen3-
|
|
167
|
+
"qwen/qwen3.5-9b": {
|
|
166
168
|
"reasoning": true,
|
|
167
|
-
"input": ["text", "image"],
|
|
168
169
|
"contextWindow": 262144,
|
|
169
170
|
"maxTokens": 262144,
|
|
170
171
|
"compat": {
|
|
@@ -173,51 +174,69 @@
|
|
|
173
174
|
"supportsReasoningEffort": true
|
|
174
175
|
}
|
|
175
176
|
},
|
|
176
|
-
"
|
|
177
|
+
"openai/gpt-oss-120b": {
|
|
177
178
|
"reasoning": true,
|
|
178
|
-
"contextWindow":
|
|
179
|
-
"maxTokens":
|
|
179
|
+
"contextWindow": 131072,
|
|
180
|
+
"maxTokens": 32768,
|
|
180
181
|
"compat": {
|
|
181
|
-
"thinkingFormat": "openai",
|
|
182
182
|
"supportsDeveloperRole": true,
|
|
183
183
|
"supportsReasoningEffort": true
|
|
184
184
|
}
|
|
185
185
|
},
|
|
186
|
-
"
|
|
186
|
+
"nvidia/nemotron-3-super-120b-a12b": {
|
|
187
|
+
"contextWindow": 4096,
|
|
188
|
+
"maxTokens": 4096
|
|
189
|
+
},
|
|
190
|
+
"deepseek/deepseek-v4-flash-0731": {
|
|
187
191
|
"reasoning": true,
|
|
188
|
-
"contextWindow": 262144,
|
|
189
|
-
"maxTokens": 262144,
|
|
190
192
|
"compat": {
|
|
191
193
|
"thinkingFormat": "openai",
|
|
192
194
|
"supportsDeveloperRole": true,
|
|
193
195
|
"supportsReasoningEffort": true
|
|
194
196
|
}
|
|
195
197
|
},
|
|
196
|
-
"
|
|
198
|
+
"minimax/minimax-m3": {
|
|
197
199
|
"reasoning": true,
|
|
198
|
-
"
|
|
199
|
-
|
|
200
|
+
"input": [
|
|
201
|
+
"text",
|
|
202
|
+
"image"
|
|
203
|
+
],
|
|
200
204
|
"compat": {
|
|
205
|
+
"thinkingFormat": "openai",
|
|
201
206
|
"supportsDeveloperRole": true,
|
|
202
207
|
"supportsReasoningEffort": true
|
|
203
208
|
}
|
|
204
209
|
},
|
|
205
|
-
"
|
|
210
|
+
"moonshotai/kimi-k2.7-code": {
|
|
206
211
|
"reasoning": true,
|
|
207
|
-
"
|
|
208
|
-
|
|
212
|
+
"input": [
|
|
213
|
+
"text",
|
|
214
|
+
"image"
|
|
215
|
+
],
|
|
209
216
|
"compat": {
|
|
217
|
+
"thinkingFormat": "openai",
|
|
210
218
|
"supportsDeveloperRole": true,
|
|
211
219
|
"supportsReasoningEffort": true
|
|
212
220
|
}
|
|
213
221
|
},
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
|
|
222
|
+
"moonshotai/kimi-k3": {
|
|
223
|
+
"reasoning": true,
|
|
224
|
+
"input": [
|
|
225
|
+
"text",
|
|
226
|
+
"image"
|
|
227
|
+
],
|
|
228
|
+
"compat": {
|
|
229
|
+
"thinkingFormat": "openai",
|
|
230
|
+
"supportsDeveloperRole": true,
|
|
231
|
+
"supportsReasoningEffort": true
|
|
232
|
+
}
|
|
218
233
|
},
|
|
219
|
-
"
|
|
220
|
-
"
|
|
221
|
-
"
|
|
234
|
+
"z-ai/glm-5.2": {
|
|
235
|
+
"reasoning": true,
|
|
236
|
+
"compat": {
|
|
237
|
+
"thinkingFormat": "openai",
|
|
238
|
+
"supportsDeveloperRole": true,
|
|
239
|
+
"supportsReasoningEffort": true
|
|
240
|
+
}
|
|
222
241
|
}
|
|
223
242
|
}
|
package/scripts/update-models.js
CHANGED
|
@@ -198,6 +198,67 @@ function cleanModelForJson(model) {
|
|
|
198
198
|
|
|
199
199
|
// ─── Main ──────────────────────────────────────────────────────────────────────
|
|
200
200
|
|
|
201
|
+
// Grace period for delisted models: update-models.js moves models the API no
|
|
202
|
+
// longer lists into deprecated-models.json (stamped with deprecatedAt) instead
|
|
203
|
+
// of dropping them; the runtime appends them back so sessions and saved model
|
|
204
|
+
// settings keep working, and after 14 days they are evicted permanently.
|
|
205
|
+
const DEPRECATED_MODEL_TTL_MS = 14 * 24 * 60 * 60 * 1000;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Reconcile deprecated-models.json against the freshly fetched model list.
|
|
209
|
+
* - in old models.json but not the API: moved into the deprecated file
|
|
210
|
+
* (deprecatedAt = now; preserved on repeat runs so the grace clock is not reset)
|
|
211
|
+
* - back in the API: resurrected (dropped from the deprecated file)
|
|
212
|
+
* - deprecatedAt older than 14 days: evicted permanently
|
|
213
|
+
* Must run BEFORE the new models.json is written; it reads the old file itself.
|
|
214
|
+
*/
|
|
215
|
+
function updateDeprecatedModels(modelsJsonPath, newModels) {
|
|
216
|
+
const deprecatedPath = path.join(path.dirname(modelsJsonPath), 'deprecated-models.json');
|
|
217
|
+
|
|
218
|
+
let oldModels = [];
|
|
219
|
+
try {
|
|
220
|
+
const parsed = JSON.parse(fs.readFileSync(modelsJsonPath, 'utf8'));
|
|
221
|
+
if (Array.isArray(parsed)) oldModels = parsed;
|
|
222
|
+
} catch { /* first run: no previous models.json */ }
|
|
223
|
+
|
|
224
|
+
let deprecated = {};
|
|
225
|
+
try {
|
|
226
|
+
const parsed = JSON.parse(fs.readFileSync(deprecatedPath, 'utf8'));
|
|
227
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) deprecated = parsed;
|
|
228
|
+
} catch { /* no graveyard yet */ }
|
|
229
|
+
|
|
230
|
+
const currentIds = new Set(newModels.map(m => m.id));
|
|
231
|
+
const now = new Date().toISOString();
|
|
232
|
+
const added = [];
|
|
233
|
+
const resurrected = [];
|
|
234
|
+
const evicted = [];
|
|
235
|
+
|
|
236
|
+
for (const old of oldModels) {
|
|
237
|
+
if (old && old.id && !currentIds.has(old.id) && !deprecated[old.id]) {
|
|
238
|
+
deprecated[old.id] = { ...old, deprecatedAt: now };
|
|
239
|
+
added.push(old.id);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
for (const [id, entry] of Object.entries(deprecated)) {
|
|
244
|
+
if (currentIds.has(id)) {
|
|
245
|
+
delete deprecated[id];
|
|
246
|
+
resurrected.push(id);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const removedAt = Date.parse(entry && entry.deprecatedAt ? entry.deprecatedAt : '');
|
|
250
|
+
if (Number.isNaN(removedAt) || Date.now() - removedAt > DEPRECATED_MODEL_TTL_MS) {
|
|
251
|
+
delete deprecated[id];
|
|
252
|
+
evicted.push(id);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (added.length > 0 || resurrected.length > 0 || evicted.length > 0) {
|
|
257
|
+
fs.writeFileSync(deprecatedPath, JSON.stringify(deprecated, null, 2) + '\n');
|
|
258
|
+
console.log('Updated deprecated-models.json ' + JSON.stringify({ added, resurrected, evicted }));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
201
262
|
async function main() {
|
|
202
263
|
console.log(`Fetching models from ${MODELS_API_URL}...`);
|
|
203
264
|
|
|
@@ -244,6 +305,8 @@ async function main() {
|
|
|
244
305
|
|
|
245
306
|
// Update models.json — API-derived model list with curated specs preserved
|
|
246
307
|
const cleanModels = apiTransformed.map(cleanModelForJson);
|
|
308
|
+
// Move delisted models to deprecated-models.json BEFORE models.json is overwritten
|
|
309
|
+
updateDeprecatedModels(MODELS_JSON_PATH, cleanModels);
|
|
247
310
|
fs.writeFileSync(MODELS_JSON_PATH, JSON.stringify(cleanModels, null, 2) + '\n');
|
|
248
311
|
console.log('✓ Updated models.json (API model list with curated specs)');
|
|
249
312
|
|