pi-io-provider 1.1.2 → 1.1.3

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
@@ -16,37 +16,38 @@ A [pi](https://github.com/badlogic/pi-mono) extension that adds [IO Intelligence
16
16
 
17
17
  | Model | ID | Context | Max Output | Vision | Reasoning | Cache | Input $/M | Output $/M |
18
18
  |-------|----|---------|------------|--------|-----------|-------|-----------|------------|
19
+ | Kimi K2.5 | `moonshotai/Kimi-K2.5` | 262K | 262K | ✅ | ✅ | ✅ | $0.56 | $2.82 |
20
+ | Kimi K2.6 | `moonshotai/Kimi-K2.6` | 262K | 262K | ✅ | ✅ | ✅ | $0.84 | $3.76 |
21
+ | Kimi K2.7 Code | `moonshotai/Kimi-K2.7-Code` | 262K | 262K | ✅ | ✅ | ✅ | $1.07 | $4.65 |
22
+ | Kimi K3 | `moonshotai/Kimi-K3` | 1.0M | 1.0M | ✅ | ✅ | ✅ | $3.60 | $18.00 |
23
+ | Qwen3.6 27B | `Qwen/Qwen3.6-27B` | 33K | 33K | ✅ | ✅ | ✅ | $0.37 | $3.19 |
24
+ | Qwen3.6 35B A3B | `Qwen/Qwen3.6-35B-A3B` | 262K | 262K | ✅ | ✅ | ✅ | $0.17 | $1.12 |
19
25
  | DeepSeek R1 0528 | `deepseek-ai/DeepSeek-R1-0528` | 128K | 128K | ❌ | ✅ | ✅ | $0.57 | $2.28 |
26
+ | DeepSeek V3.2 | `deepseek-ai/DeepSeek-V3.2` | 164K | 164K | ❌ | ✅ | ✅ | $0.90 | $1.76 |
27
+ | DeepSeek V4 Flash | `deepseek-ai/DeepSeek-V4-Flash` | 33K | 33K | ❌ | ✅ | ✅ | $0.20 | $0.37 |
28
+ | DeepSeek V4 Flash 0731 | `deepseek-ai/DeepSeek-V4-Flash-0731` | 262K | 66K | ❌ | ✅ | ✅ | $0.14 | $0.28 |
29
+ | DeepSeek V4 Pro | `deepseek-ai/DeepSeek-V4-Pro` | 1.0M | 600K | ❌ | ✅ | ✅ | $1.52 | $3.04 |
30
+ | Gemma 4 26B A4B | `google/gemma-4-26b-a4b-it` | 262K | 262K | ❌ | ✅ | ✅ | $0.13 | $0.43 |
31
+ | MiniMax M2.5 | `MiniMaxAI/MiniMax-M2.5` | 197K | 197K | ❌ | ✅ | ✅ | $0.29 | $1.15 |
32
+ | MiniMax M2.7 | `MiniMaxAI/MiniMax-M2.7` | 262K | 66K | ❌ | ✅ | ✅ | $0.44 | $1.72 |
20
33
  | Kimi K2 Thinking | `moonshotai/Kimi-K2-Thinking` | 262K | 262K | ❌ | ✅ | ✅ | $0.60 | $2.50 |
34
+ | gpt-oss-120b | `openai/gpt-oss-120b` | 131K | 131K | ❌ | ✅ | ✅ | $0.19 | $0.70 |
35
+ | gpt-oss-20b | `openai/gpt-oss-20b` | 64K | 64K | ❌ | ✅ | ✅ | $0.05 | $0.22 |
36
+ | MiMo-V2.5 | `XiaomiMiMo/MiMo-V2.5` | 262K | 262K | ❌ | ✅ | ✅ | $0.20 | $0.64 |
37
+ | GLM-4.5-Air | `zai-org/GLM-4.5-Air` | 131K | 131K | ❌ | ✅ | ✅ | $0.16 | $0.94 |
38
+ | GLM 4.6 | `zai-org/GLM-4.6` | 131K | 131K | ❌ | ✅ | ✅ | $0.54 | $2.07 |
39
+ | GLM 4.7 | `zai-org/GLM-4.7` | 203K | 203K | ❌ | ✅ | ✅ | $0.86 | $2.24 |
40
+ | GLM 4.7 Flash | `zai-org/GLM-4.7-Flash` | 200K | 200K | ❌ | ✅ | ✅ | $0.08 | $0.42 |
41
+ | GLM 5 | `zai-org/GLM-5` | 203K | 203K | ❌ | ✅ | ✅ | $0.85 | $2.62 |
42
+ | GLM 5.1 | `zai-org/GLM-5.1` | 203K | 33K | ❌ | ✅ | ✅ | $1.27 | $4.13 |
43
+ | GLM 5.2 | `zai-org/GLM-5.2` | 262K | 66K | ❌ | ✅ | ✅ | $1.96 | $6.16 |
21
44
  | Llama 3.2 90B Vision Instruct | `meta-llama/Llama-3.2-90B-Vision-Instruct` | 16K | 16K | ✅ | ❌ | ✅ | $0.34 | $0.34 |
22
45
  | Llama 4 Maverick 17B 128E Instruct FP8 | `meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8` | 430K | 430K | ✅ | ❌ | ✅ | $0.28 | $0.93 |
23
- | Kimi K2.5 | `moonshotai/Kimi-K2.5` | 262K | 262K | | ❌ | ✅ | $0.53 | $2.79 |
24
- | Kimi K2.6 | `moonshotai/Kimi-K2.6` | 262K | 262K | ✅ | ❌ | ✅ | $0.84 | $3.76 |
25
- | DeepSeek V3.2 | `deepseek-ai/DeepSeek-V3.2` | 164K | 164K | ❌ | ❌ | ✅ | $0.90 | $1.76 |
26
- | DeepSeek V4 Flash | `deepseek-ai/DeepSeek-V4-Flash` | 33K | 33K | ❌ | ❌ | ✅ | $0.20 | $0.37 |
27
- | DeepSeek V4 Pro | `deepseek-ai/DeepSeek-V4-Pro` | 1.0M | 600K | ❌ | ❌ | ✅ | $1.62 | $3.25 |
28
- | Gemma 4 26B A4B | `google/gemma-4-26b-a4b-it` | 262K | 262K | ❌ | ❌ | ✅ | $0.12 | $0.39 |
29
- | Qwen3 Coder 480B A35B Instruct INT4 Mixed AR | `Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar` | 106K | 106K | ❌ | ❌ | ✅ | $0.58 | $2.25 |
46
+ | Qwen3 Coder 480B A35B Instruct INT4 Mixed AR | `Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar` | 106K | 106K | | ❌ | ✅ | $0.57 | $2.13 |
30
47
  | Llama 3.3 70B Instruct | `meta-llama/Llama-3.3-70B-Instruct` | 128K | 128K | ❌ | ❌ | ✅ | $0.51 | $1.04 |
31
- | MiniMax M2.5 | `MiniMaxAI/MiniMax-M2.5` | 197K | 197K | ❌ | ❌ | ✅ | $0.28 | $1.13 |
32
- | MiniMax M2.7 | `MiniMaxAI/MiniMax-M2.7` | 205K | 205K | ❌ | ❌ | ✅ | $0.42 | $1.62 |
33
48
  | Mistral Nemo Instruct 2407 | `mistralai/Mistral-Nemo-Instruct-2407` | 128K | 128K | ❌ | ❌ | ✅ | $0.07 | $0.12 |
34
49
  | Kimi K2 Instruct 0905 | `moonshotai/Kimi-K2-Instruct-0905` | 262K | 262K | ❌ | ❌ | ✅ | $0.57 | $2.30 |
35
- | Kimi K2.7 Code | `moonshotai/Kimi-K2.7-Code` | 262K | 262K | ❌ | ❌ | ✅ | $1.10 | $4.70 |
36
- | Kimi K3 | `moonshotai/Kimi-K3` | 1.0M | 1.0M | ❌ | ❌ | ✅ | $3.28 | $16.30 |
37
- | gpt-oss-120b | `openai/gpt-oss-120b` | 131K | 131K | ❌ | ❌ | ✅ | $0.19 | $0.70 |
38
- | gpt-oss-20b | `openai/gpt-oss-20b` | 64K | 64K | ❌ | ❌ | ✅ | $0.06 | $0.22 |
39
50
  | Qwen3 Next 80B A3B Instruct | `Qwen/Qwen3-Next-80B-A3B-Instruct` | 262K | 262K | ❌ | ❌ | ✅ | $0.12 | $1.14 |
40
- | Qwen3.6 27B | `Qwen/Qwen3.6-27B` | 33K | 33K | ❌ | ❌ | ✅ | $0.40 | $3.09 |
41
- | Qwen3.6 35B A3B | `Qwen/Qwen3.6-35B-A3B` | 262K | 262K | ❌ | ❌ | ✅ | $0.18 | $1.19 |
42
- | MiMo-V2.5 | `XiaomiMiMo/MiMo-V2.5` | 262K | 262K | ❌ | ❌ | ✅ | $0.20 | $0.64 |
43
- | GLM-4.5-Air | `zai-org/GLM-4.5-Air` | 131K | 131K | ❌ | ❌ | ✅ | $0.16 | $0.94 |
44
- | GLM 4.6 | `zai-org/GLM-4.6` | 131K | 131K | ❌ | ❌ | ✅ | $0.54 | $2.07 |
45
- | GLM 4.7 | `zai-org/GLM-4.7` | 203K | 203K | ❌ | ❌ | ✅ | $0.86 | $2.24 |
46
- | GLM 4.7 Flash | `zai-org/GLM-4.7-Flash` | 200K | 200K | ❌ | ❌ | ✅ | $0.08 | $0.42 |
47
- | GLM 5 | `zai-org/GLM-5` | 203K | 203K | ❌ | ❌ | ✅ | $0.86 | $2.78 |
48
- | GLM 5.1 | `zai-org/GLM-5.1` | 203K | 33K | ❌ | ❌ | ✅ | $1.29 | $4.22 |
49
- | GLM 5.2 | `zai-org/GLM-5.2` | 262K | 66K | ❌ | ❌ | ✅ | $1.96 | $6.16 |
50
51
 
51
52
  *Costs are per million tokens. Cache read/write pricing available on most models.*
52
53
 
package/index.ts CHANGED
@@ -59,12 +59,14 @@ interface JsonModel {
59
59
  };
60
60
  contextWindow: number;
61
61
  maxTokens: number;
62
+ thinkingLevelMap?: Record<string, string | null>;
62
63
  compat?: {
63
64
  supportsDeveloperRole?: boolean;
64
65
  supportsStore?: boolean;
65
66
  maxTokensField?: "max_completion_tokens" | "max_tokens";
66
67
  thinkingFormat?: "openai" | "zai" | "qwen" | "qwen-chat-template";
67
68
  supportsReasoningEffort?: boolean;
69
+ requiresReasoningContentOnAssistantMessages?: boolean;
68
70
  };
69
71
  }
70
72
 
@@ -80,6 +82,7 @@ interface PatchEntry {
80
82
  };
81
83
  contextWindow?: number;
82
84
  maxTokens?: number;
85
+ thinkingLevelMap?: Record<string, string | null>;
83
86
  compat?: Record<string, unknown>;
84
87
  }
85
88
 
@@ -95,6 +98,7 @@ function applyPatch(model: JsonModel, patch: PatchEntry): JsonModel {
95
98
  if (patch.input !== undefined) result.input = patch.input;
96
99
  if (patch.contextWindow !== undefined) result.contextWindow = patch.contextWindow;
97
100
  if (patch.maxTokens !== undefined) result.maxTokens = patch.maxTokens;
101
+ if (patch.thinkingLevelMap !== undefined) result.thinkingLevelMap = { ...patch.thinkingLevelMap };
98
102
 
99
103
  if (patch.cost) {
100
104
  result.cost = {
@@ -111,6 +115,9 @@ function applyPatch(model: JsonModel, patch: PatchEntry): JsonModel {
111
115
  if (!result.reasoning && result.compat?.thinkingFormat) {
112
116
  delete result.compat.thinkingFormat;
113
117
  }
118
+ if (!result.reasoning && result.thinkingLevelMap) {
119
+ delete result.thinkingLevelMap;
120
+ }
114
121
  if (result.compat && Object.keys(result.compat).length === 0) {
115
122
  delete result.compat;
116
123
  }
@@ -164,7 +171,7 @@ const LIVE_FETCH_TIMEOUT_MS = 8000;
164
171
 
165
172
  /** Transform a model from the IO Intelligence /v1/models API to JsonModel format. */
166
173
  function transformApiModel(apiModel: any): JsonModel | null {
167
- const hasVision = apiModel.supports_images_input === true;
174
+ const hasVision = apiModel.supports_images_input === true || (apiModel.input_modalities || []).includes("image");
168
175
  // IO returns per-token pricing, convert to per-million. Round to 6 decimals to
169
176
  // normalize float noise from the ×1e6 multiply and preserve sub-cent cache prices.
170
177
  const toPerM = (v: any) => Math.round((typeof v === "number" ? v * 1_000_000 : 0) * 1e6) / 1e6;
@@ -181,13 +188,14 @@ function transformApiModel(apiModel: any): JsonModel | null {
181
188
  cacheWrite: toPerM(apiModel.cache_write_token_price),
182
189
  },
183
190
  contextWindow: apiModel.context_window || 131072,
184
- maxTokens: apiModel.max_tokens || 0,
191
+ maxTokens: apiModel.max_tokens || apiModel.context_window || 131072,
192
+ compat: {
193
+ supportsStore: false,
194
+ supportsDeveloperRole: false,
195
+ maxTokensField: "max_tokens",
196
+ ...(hasReasoning ? { supportsReasoningEffort: true } : {}),
197
+ },
185
198
  };
186
- if (hasReasoning) {
187
- model.compat = {
188
- supportsReasoningEffort: true,
189
- };
190
- }
191
199
  return model;
192
200
  }
193
201
 
package/models.json CHANGED
@@ -1,24 +1,53 @@
1
1
  [
2
+ {
3
+ "id": "deepseek-ai/DeepSeek-V4-Flash-0731",
4
+ "name": "DeepSeek V4 Flash 0731",
5
+ "reasoning": true,
6
+ "input": [
7
+ "text"
8
+ ],
9
+ "cost": {
10
+ "input": 0.14,
11
+ "output": 0.28,
12
+ "cacheRead": 0.07,
13
+ "cacheWrite": 0
14
+ },
15
+ "contextWindow": 262100,
16
+ "maxTokens": 65536,
17
+ "compat": {
18
+ "supportsStore": false,
19
+ "supportsDeveloperRole": false,
20
+ "maxTokensField": "max_tokens",
21
+ "supportsReasoningEffort": true
22
+ }
23
+ },
2
24
  {
3
25
  "id": "moonshotai/Kimi-K3",
4
26
  "name": "Kimi K3",
5
- "reasoning": false,
27
+ "reasoning": true,
6
28
  "input": [
7
- "text"
29
+ "text",
30
+ "image"
8
31
  ],
9
32
  "cost": {
10
- "input": 3.28,
11
- "output": 16.3,
12
- "cacheRead": 1.64,
33
+ "input": 3.6,
34
+ "output": 18,
35
+ "cacheRead": 1.8,
13
36
  "cacheWrite": 0
14
37
  },
15
38
  "contextWindow": 1048576,
16
- "maxTokens": 1048576
39
+ "maxTokens": 1048576,
40
+ "compat": {
41
+ "supportsStore": false,
42
+ "supportsDeveloperRole": false,
43
+ "maxTokensField": "max_tokens",
44
+ "supportsReasoningEffort": true
45
+ }
17
46
  },
18
47
  {
19
48
  "id": "XiaomiMiMo/MiMo-V2.5",
20
49
  "name": "MiMo-V2.5",
21
- "reasoning": false,
50
+ "reasoning": true,
22
51
  "input": [
23
52
  "text"
24
53
  ],
@@ -29,12 +58,18 @@
29
58
  "cacheWrite": 0
30
59
  },
31
60
  "contextWindow": 262144,
32
- "maxTokens": 262144
61
+ "maxTokens": 262144,
62
+ "compat": {
63
+ "supportsStore": false,
64
+ "supportsDeveloperRole": false,
65
+ "maxTokensField": "max_tokens",
66
+ "supportsReasoningEffort": true
67
+ }
33
68
  },
34
69
  {
35
70
  "id": "zai-org/GLM-5.2",
36
71
  "name": "GLM 5.2",
37
- "reasoning": false,
72
+ "reasoning": true,
38
73
  "input": [
39
74
  "text"
40
75
  ],
@@ -45,76 +80,109 @@
45
80
  "cacheWrite": 0
46
81
  },
47
82
  "contextWindow": 262144,
48
- "maxTokens": 65536
83
+ "maxTokens": 65536,
84
+ "compat": {
85
+ "supportsStore": false,
86
+ "supportsDeveloperRole": false,
87
+ "maxTokensField": "max_tokens",
88
+ "supportsReasoningEffort": true
89
+ }
49
90
  },
50
91
  {
51
92
  "id": "moonshotai/Kimi-K2.7-Code",
52
93
  "name": "Kimi K2.7 Code",
53
- "reasoning": false,
94
+ "reasoning": true,
54
95
  "input": [
55
- "text"
96
+ "text",
97
+ "image"
56
98
  ],
57
99
  "cost": {
58
- "input": 1.098,
59
- "output": 4.7,
60
- "cacheRead": 0.549,
100
+ "input": 1.072,
101
+ "output": 4.65,
102
+ "cacheRead": 0.536,
61
103
  "cacheWrite": 0
62
104
  },
63
105
  "contextWindow": 262144,
64
- "maxTokens": 262144
106
+ "maxTokens": 262144,
107
+ "compat": {
108
+ "supportsStore": false,
109
+ "supportsDeveloperRole": false,
110
+ "maxTokensField": "max_tokens",
111
+ "supportsReasoningEffort": true
112
+ }
65
113
  },
66
114
  {
67
115
  "id": "Qwen/Qwen3.6-35B-A3B",
68
116
  "name": "Qwen3.6 35B A3B",
69
- "reasoning": false,
117
+ "reasoning": true,
70
118
  "input": [
71
- "text"
119
+ "text",
120
+ "image"
72
121
  ],
73
122
  "cost": {
74
- "input": 0.1752,
75
- "output": 1.19275,
76
- "cacheRead": 0.0876,
123
+ "input": 0.1672,
124
+ "output": 1.11675,
125
+ "cacheRead": 0.0836,
77
126
  "cacheWrite": 0
78
127
  },
79
128
  "contextWindow": 262140,
80
- "maxTokens": 262140
129
+ "maxTokens": 262140,
130
+ "compat": {
131
+ "supportsStore": false,
132
+ "supportsDeveloperRole": false,
133
+ "maxTokensField": "max_tokens",
134
+ "supportsReasoningEffort": true
135
+ }
81
136
  },
82
137
  {
83
138
  "id": "Qwen/Qwen3.6-27B",
84
139
  "name": "Qwen3.6 27B",
85
- "reasoning": false,
140
+ "reasoning": true,
86
141
  "input": [
87
- "text"
142
+ "text",
143
+ "image"
88
144
  ],
89
145
  "cost": {
90
- "input": 0.403,
91
- "output": 3.09,
92
- "cacheRead": 0.2015,
146
+ "input": 0.373,
147
+ "output": 3.19,
148
+ "cacheRead": 0.1865,
93
149
  "cacheWrite": 0
94
150
  },
95
151
  "contextWindow": 32768,
96
- "maxTokens": 32768
152
+ "maxTokens": 32768,
153
+ "compat": {
154
+ "supportsStore": false,
155
+ "supportsDeveloperRole": false,
156
+ "maxTokensField": "max_tokens",
157
+ "supportsReasoningEffort": true
158
+ }
97
159
  },
98
160
  {
99
161
  "id": "MiniMaxAI/MiniMax-M2.7",
100
162
  "name": "MiniMax M2.7",
101
- "reasoning": false,
163
+ "reasoning": true,
102
164
  "input": [
103
165
  "text"
104
166
  ],
105
167
  "cost": {
106
- "input": 0.42,
107
- "output": 1.62,
108
- "cacheRead": 0.21,
168
+ "input": 0.436,
169
+ "output": 1.72,
170
+ "cacheRead": 0.218,
109
171
  "cacheWrite": 0
110
172
  },
111
- "contextWindow": 204800,
112
- "maxTokens": 204800
173
+ "contextWindow": 262100,
174
+ "maxTokens": 65536,
175
+ "compat": {
176
+ "supportsStore": false,
177
+ "supportsDeveloperRole": false,
178
+ "maxTokensField": "max_tokens",
179
+ "supportsReasoningEffort": true
180
+ }
113
181
  },
114
182
  {
115
183
  "id": "deepseek-ai/DeepSeek-V4-Flash",
116
184
  "name": "DeepSeek V4 Flash",
117
- "reasoning": false,
185
+ "reasoning": true,
118
186
  "input": [
119
187
  "text"
120
188
  ],
@@ -125,110 +193,152 @@
125
193
  "cacheWrite": 0
126
194
  },
127
195
  "contextWindow": 32768,
128
- "maxTokens": 32768
196
+ "maxTokens": 32768,
197
+ "compat": {
198
+ "supportsStore": false,
199
+ "supportsDeveloperRole": false,
200
+ "maxTokensField": "max_tokens",
201
+ "supportsReasoningEffort": true
202
+ }
129
203
  },
130
204
  {
131
205
  "id": "deepseek-ai/DeepSeek-V4-Pro",
132
206
  "name": "DeepSeek V4 Pro",
133
- "reasoning": false,
207
+ "reasoning": true,
134
208
  "input": [
135
209
  "text"
136
210
  ],
137
211
  "cost": {
138
- "input": 1.624,
139
- "output": 3.2482,
140
- "cacheRead": 0.812,
212
+ "input": 1.52044,
213
+ "output": 3.04088,
214
+ "cacheRead": 0.76022,
141
215
  "cacheWrite": 0
142
216
  },
143
217
  "contextWindow": 1048576,
144
- "maxTokens": 600000
218
+ "maxTokens": 600000,
219
+ "compat": {
220
+ "supportsStore": false,
221
+ "supportsDeveloperRole": false,
222
+ "maxTokensField": "max_tokens",
223
+ "supportsReasoningEffort": true
224
+ }
145
225
  },
146
226
  {
147
227
  "id": "moonshotai/Kimi-K2.6",
148
228
  "name": "Kimi K2.6",
149
- "reasoning": false,
229
+ "reasoning": true,
150
230
  "input": [
151
231
  "text",
152
232
  "image"
153
233
  ],
154
234
  "cost": {
155
- "input": 0.84,
235
+ "input": 0.842,
156
236
  "output": 3.762,
157
- "cacheRead": 0.42,
237
+ "cacheRead": 0.421,
158
238
  "cacheWrite": 0
159
239
  },
160
240
  "contextWindow": 262142,
161
- "maxTokens": 262142
241
+ "maxTokens": 262142,
242
+ "compat": {
243
+ "supportsStore": false,
244
+ "supportsDeveloperRole": false,
245
+ "maxTokensField": "max_tokens",
246
+ "supportsReasoningEffort": true
247
+ }
162
248
  },
163
249
  {
164
250
  "id": "zai-org/GLM-5.1",
165
251
  "name": "GLM 5.1",
166
- "reasoning": false,
252
+ "reasoning": true,
167
253
  "input": [
168
254
  "text"
169
255
  ],
170
256
  "cost": {
171
- "input": 1.29,
172
- "output": 4.22,
173
- "cacheRead": 0.645,
257
+ "input": 1.2732,
258
+ "output": 4.1272,
259
+ "cacheRead": 0.6366,
174
260
  "cacheWrite": 0
175
261
  },
176
262
  "contextWindow": 202750,
177
- "maxTokens": 32768
263
+ "maxTokens": 32768,
264
+ "compat": {
265
+ "supportsStore": false,
266
+ "supportsDeveloperRole": false,
267
+ "maxTokensField": "max_tokens",
268
+ "supportsReasoningEffort": true
269
+ }
178
270
  },
179
271
  {
180
272
  "id": "MiniMaxAI/MiniMax-M2.5",
181
273
  "name": "MiniMax M2.5",
182
- "reasoning": false,
274
+ "reasoning": true,
183
275
  "input": [
184
276
  "text"
185
277
  ],
186
278
  "cost": {
187
- "input": 0.282,
188
- "output": 1.128,
189
- "cacheRead": 0.141,
279
+ "input": 0.287,
280
+ "output": 1.152,
281
+ "cacheRead": 0.1435,
190
282
  "cacheWrite": 0
191
283
  },
192
284
  "contextWindow": 196600,
193
- "maxTokens": 196600
285
+ "maxTokens": 196600,
286
+ "compat": {
287
+ "supportsStore": false,
288
+ "supportsDeveloperRole": false,
289
+ "maxTokensField": "max_tokens",
290
+ "supportsReasoningEffort": true
291
+ }
194
292
  },
195
293
  {
196
294
  "id": "moonshotai/Kimi-K2.5",
197
295
  "name": "Kimi K2.5",
198
- "reasoning": false,
296
+ "reasoning": true,
199
297
  "input": [
200
298
  "text",
201
299
  "image"
202
300
  ],
203
301
  "cost": {
204
- "input": 0.528,
205
- "output": 2.79,
206
- "cacheRead": 0.264,
302
+ "input": 0.564,
303
+ "output": 2.82,
304
+ "cacheRead": 0.282,
207
305
  "cacheWrite": 1.1
208
306
  },
209
307
  "contextWindow": 262144,
210
- "maxTokens": 262144
308
+ "maxTokens": 262144,
309
+ "compat": {
310
+ "supportsStore": false,
311
+ "supportsDeveloperRole": false,
312
+ "maxTokensField": "max_tokens",
313
+ "supportsReasoningEffort": true
314
+ }
211
315
  },
212
316
  {
213
317
  "id": "zai-org/GLM-5",
214
318
  "name": "GLM 5",
215
- "reasoning": false,
319
+ "reasoning": true,
216
320
  "input": [
217
321
  "text"
218
322
  ],
219
323
  "cost": {
220
- "input": 0.86,
221
- "output": 2.784,
222
- "cacheRead": 0.43,
324
+ "input": 0.85,
325
+ "output": 2.622,
326
+ "cacheRead": 0.425,
223
327
  "cacheWrite": 0
224
328
  },
225
329
  "contextWindow": 202752,
226
- "maxTokens": 202752
330
+ "maxTokens": 202752,
331
+ "compat": {
332
+ "supportsStore": false,
333
+ "supportsDeveloperRole": false,
334
+ "maxTokensField": "max_tokens",
335
+ "supportsReasoningEffort": true
336
+ }
227
337
  },
228
338
  {
229
339
  "id": "deepseek-ai/DeepSeek-V3.2",
230
340
  "name": "DeepSeek V3.2",
231
- "reasoning": false,
341
+ "reasoning": true,
232
342
  "input": [
233
343
  "text"
234
344
  ],
@@ -239,7 +349,13 @@
239
349
  "cacheWrite": 0.5
240
350
  },
241
351
  "contextWindow": 163840,
242
- "maxTokens": 163840
352
+ "maxTokens": 163840,
353
+ "compat": {
354
+ "supportsStore": false,
355
+ "supportsDeveloperRole": false,
356
+ "maxTokensField": "max_tokens",
357
+ "supportsReasoningEffort": true
358
+ }
243
359
  },
244
360
  {
245
361
  "id": "moonshotai/Kimi-K2-Thinking",
@@ -255,12 +371,18 @@
255
371
  "cacheWrite": 0.64
256
372
  },
257
373
  "contextWindow": 262144,
258
- "maxTokens": 262144
374
+ "maxTokens": 262144,
375
+ "compat": {
376
+ "supportsStore": false,
377
+ "supportsDeveloperRole": false,
378
+ "maxTokensField": "max_tokens",
379
+ "supportsReasoningEffort": true
380
+ }
259
381
  },
260
382
  {
261
383
  "id": "zai-org/GLM-4.5-Air",
262
384
  "name": "GLM-4.5-Air",
263
- "reasoning": false,
385
+ "reasoning": true,
264
386
  "input": [
265
387
  "text"
266
388
  ],
@@ -271,28 +393,40 @@
271
393
  "cacheWrite": 0
272
394
  },
273
395
  "contextWindow": 131070,
274
- "maxTokens": 131070
396
+ "maxTokens": 131070,
397
+ "compat": {
398
+ "supportsStore": false,
399
+ "supportsDeveloperRole": false,
400
+ "maxTokensField": "max_tokens",
401
+ "supportsReasoningEffort": true
402
+ }
275
403
  },
276
404
  {
277
405
  "id": "google/gemma-4-26b-a4b-it",
278
406
  "name": "Gemma 4 26B A4B",
279
- "reasoning": false,
407
+ "reasoning": true,
280
408
  "input": [
281
409
  "text"
282
410
  ],
283
411
  "cost": {
284
- "input": 0.122,
285
- "output": 0.388,
286
- "cacheRead": 0.061,
412
+ "input": 0.13,
413
+ "output": 0.43,
414
+ "cacheRead": 0.065,
287
415
  "cacheWrite": 0
288
416
  },
289
417
  "contextWindow": 262142,
290
- "maxTokens": 262142
418
+ "maxTokens": 262142,
419
+ "compat": {
420
+ "supportsStore": false,
421
+ "supportsDeveloperRole": false,
422
+ "maxTokensField": "max_tokens",
423
+ "supportsReasoningEffort": true
424
+ }
291
425
  },
292
426
  {
293
427
  "id": "zai-org/GLM-4.7-Flash",
294
428
  "name": "GLM 4.7 Flash",
295
- "reasoning": false,
429
+ "reasoning": true,
296
430
  "input": [
297
431
  "text"
298
432
  ],
@@ -303,12 +437,18 @@
303
437
  "cacheWrite": 0.14
304
438
  },
305
439
  "contextWindow": 200000,
306
- "maxTokens": 200000
440
+ "maxTokens": 200000,
441
+ "compat": {
442
+ "supportsStore": false,
443
+ "supportsDeveloperRole": false,
444
+ "maxTokensField": "max_tokens",
445
+ "supportsReasoningEffort": true
446
+ }
307
447
  },
308
448
  {
309
449
  "id": "zai-org/GLM-4.7",
310
450
  "name": "GLM 4.7",
311
- "reasoning": false,
451
+ "reasoning": true,
312
452
  "input": [
313
453
  "text"
314
454
  ],
@@ -319,7 +459,13 @@
319
459
  "cacheWrite": 0.6
320
460
  },
321
461
  "contextWindow": 202752,
322
- "maxTokens": 202752
462
+ "maxTokens": 202752,
463
+ "compat": {
464
+ "supportsStore": false,
465
+ "supportsDeveloperRole": false,
466
+ "maxTokensField": "max_tokens",
467
+ "supportsReasoningEffort": true
468
+ }
323
469
  },
324
470
  {
325
471
  "id": "moonshotai/Kimi-K2-Instruct-0905",
@@ -335,7 +481,12 @@
335
481
  "cacheWrite": 0.78
336
482
  },
337
483
  "contextWindow": 262144,
338
- "maxTokens": 262144
484
+ "maxTokens": 262144,
485
+ "compat": {
486
+ "supportsStore": false,
487
+ "supportsDeveloperRole": false,
488
+ "maxTokensField": "max_tokens"
489
+ }
339
490
  },
340
491
  {
341
492
  "id": "meta-llama/Llama-3.2-90B-Vision-Instruct",
@@ -352,12 +503,17 @@
352
503
  "cacheWrite": 0.7
353
504
  },
354
505
  "contextWindow": 16000,
355
- "maxTokens": 16000
506
+ "maxTokens": 16000,
507
+ "compat": {
508
+ "supportsStore": false,
509
+ "supportsDeveloperRole": false,
510
+ "maxTokensField": "max_tokens"
511
+ }
356
512
  },
357
513
  {
358
514
  "id": "openai/gpt-oss-120b",
359
515
  "name": "gpt-oss-120b",
360
- "reasoning": false,
516
+ "reasoning": true,
361
517
  "input": [
362
518
  "text"
363
519
  ],
@@ -368,7 +524,13 @@
368
524
  "cacheWrite": 0.04
369
525
  },
370
526
  "contextWindow": 131072,
371
- "maxTokens": 131072
527
+ "maxTokens": 131072,
528
+ "compat": {
529
+ "supportsStore": false,
530
+ "supportsDeveloperRole": false,
531
+ "maxTokensField": "max_tokens",
532
+ "supportsReasoningEffort": true
533
+ }
372
534
  },
373
535
  {
374
536
  "id": "deepseek-ai/DeepSeek-R1-0528",
@@ -384,12 +546,18 @@
384
546
  "cacheWrite": 0.8
385
547
  },
386
548
  "contextWindow": 128000,
387
- "maxTokens": 128000
549
+ "maxTokens": 128000,
550
+ "compat": {
551
+ "supportsStore": false,
552
+ "supportsDeveloperRole": false,
553
+ "maxTokensField": "max_tokens",
554
+ "supportsReasoningEffort": true
555
+ }
388
556
  },
389
557
  {
390
558
  "id": "zai-org/GLM-4.6",
391
559
  "name": "GLM 4.6",
392
- "reasoning": false,
560
+ "reasoning": true,
393
561
  "input": [
394
562
  "text"
395
563
  ],
@@ -400,7 +568,13 @@
400
568
  "cacheWrite": 0.7
401
569
  },
402
570
  "contextWindow": 131072,
403
- "maxTokens": 131072
571
+ "maxTokens": 131072,
572
+ "compat": {
573
+ "supportsStore": false,
574
+ "supportsDeveloperRole": false,
575
+ "maxTokensField": "max_tokens",
576
+ "supportsReasoningEffort": true
577
+ }
404
578
  },
405
579
  {
406
580
  "id": "Qwen/Qwen3-Next-80B-A3B-Instruct",
@@ -416,7 +590,12 @@
416
590
  "cacheWrite": 0.12
417
591
  },
418
592
  "contextWindow": 262144,
419
- "maxTokens": 262144
593
+ "maxTokens": 262144,
594
+ "compat": {
595
+ "supportsStore": false,
596
+ "supportsDeveloperRole": false,
597
+ "maxTokensField": "max_tokens"
598
+ }
420
599
  },
421
600
  {
422
601
  "id": "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar",
@@ -426,13 +605,18 @@
426
605
  "text"
427
606
  ],
428
607
  "cost": {
429
- "input": 0.585,
430
- "output": 2.245,
431
- "cacheRead": 0.2925,
608
+ "input": 0.569,
609
+ "output": 2.135,
610
+ "cacheRead": 0.2845,
432
611
  "cacheWrite": 0.44
433
612
  },
434
613
  "contextWindow": 106000,
435
- "maxTokens": 106000
614
+ "maxTokens": 106000,
615
+ "compat": {
616
+ "supportsStore": false,
617
+ "supportsDeveloperRole": false,
618
+ "maxTokensField": "max_tokens"
619
+ }
436
620
  },
437
621
  {
438
622
  "id": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
@@ -449,7 +633,12 @@
449
633
  "cacheWrite": 0.3
450
634
  },
451
635
  "contextWindow": 430000,
452
- "maxTokens": 430000
636
+ "maxTokens": 430000,
637
+ "compat": {
638
+ "supportsStore": false,
639
+ "supportsDeveloperRole": false,
640
+ "maxTokensField": "max_tokens"
641
+ }
453
642
  },
454
643
  {
455
644
  "id": "mistralai/Mistral-Nemo-Instruct-2407",
@@ -465,23 +654,34 @@
465
654
  "cacheWrite": 0.04
466
655
  },
467
656
  "contextWindow": 128000,
468
- "maxTokens": 128000
657
+ "maxTokens": 128000,
658
+ "compat": {
659
+ "supportsStore": false,
660
+ "supportsDeveloperRole": false,
661
+ "maxTokensField": "max_tokens"
662
+ }
469
663
  },
470
664
  {
471
665
  "id": "openai/gpt-oss-20b",
472
666
  "name": "gpt-oss-20b",
473
- "reasoning": false,
667
+ "reasoning": true,
474
668
  "input": [
475
669
  "text"
476
670
  ],
477
671
  "cost": {
478
- "input": 0.059,
672
+ "input": 0.053,
479
673
  "output": 0.216,
480
- "cacheRead": 0.0295,
674
+ "cacheRead": 0.0265,
481
675
  "cacheWrite": 0.03
482
676
  },
483
677
  "contextWindow": 64000,
484
- "maxTokens": 64000
678
+ "maxTokens": 64000,
679
+ "compat": {
680
+ "supportsStore": false,
681
+ "supportsDeveloperRole": false,
682
+ "maxTokensField": "max_tokens",
683
+ "supportsReasoningEffort": true
684
+ }
485
685
  },
486
686
  {
487
687
  "id": "meta-llama/Llama-3.3-70B-Instruct",
@@ -497,6 +697,11 @@
497
697
  "cacheWrite": 0.2
498
698
  },
499
699
  "contextWindow": 128000,
500
- "maxTokens": 128000
700
+ "maxTokens": 128000,
701
+ "compat": {
702
+ "supportsStore": false,
703
+ "supportsDeveloperRole": false,
704
+ "maxTokensField": "max_tokens"
705
+ }
501
706
  }
502
707
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-io-provider",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "IO Intelligence provider extension for pi - Access DeepSeek, Kimi, GLM, Llama, Qwen, Mistral, and more through the IO Intelligence API",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -81,9 +81,17 @@ function convertModel(apiModel, existingModelsMap) {
81
81
  if (priceOut > 0) existing.cost.output = Math.round(priceOut * 1e6) / 1e6;
82
82
  if (cacheRead > 0) existing.cost.cacheRead = Math.round(cacheRead * 1e6) / 1e6;
83
83
  if (cacheWrite > 0) existing.cost.cacheWrite = Math.round(cacheWrite * 1e6) / 1e6;
84
- if (apiModel.supports_images_input && !existing.input.includes('image')) {
85
- existing.input = ['text', 'image'];
86
- }
84
+ const hasVision = apiModel.supports_images_input === true || (apiModel.input_modalities || []).includes('image');
85
+ const hasReasoning = apiModel.capabilities?.reasoning === true || apiModel.supports_reasoning === true;
86
+ existing.input = hasVision ? ['text', 'image'] : ['text'];
87
+ existing.reasoning = hasReasoning;
88
+ existing.compat = {
89
+ ...(existing.compat || {}),
90
+ supportsStore: false,
91
+ supportsDeveloperRole: false,
92
+ maxTokensField: 'max_tokens',
93
+ ...(hasReasoning ? { supportsReasoningEffort: true } : {}),
94
+ };
87
95
  return existing;
88
96
  }
89
97
 
@@ -91,7 +99,7 @@ function convertModel(apiModel, existingModelsMap) {
91
99
  const ctx = apiModel.context_window || 0;
92
100
  const maxTok = apiModel.max_tokens || ctx;
93
101
  const input = ['text'];
94
- if (apiModel.supports_images_input) input.push('image');
102
+ if (apiModel.supports_images_input === true || (apiModel.input_modalities || []).includes('image')) input.push('image');
95
103
 
96
104
  const priceIn = (apiModel.input_token_price || 0) * 1_000_000;
97
105
  const priceOut = (apiModel.output_token_price || 0) * 1_000_000;
@@ -101,7 +109,7 @@ function convertModel(apiModel, existingModelsMap) {
101
109
  return {
102
110
  id,
103
111
  name: cleanName(apiModel.name, id),
104
- reasoning: false,
112
+ reasoning: apiModel.capabilities?.reasoning === true || apiModel.supports_reasoning === true,
105
113
  input,
106
114
  cost: {
107
115
  input: Math.round(priceIn * 1e6) / 1e6,
@@ -111,6 +119,14 @@ function convertModel(apiModel, existingModelsMap) {
111
119
  },
112
120
  contextWindow: ctx,
113
121
  maxTokens: maxTok,
122
+ compat: {
123
+ supportsStore: false,
124
+ supportsDeveloperRole: false,
125
+ maxTokensField: 'max_tokens',
126
+ ...((apiModel.capabilities?.reasoning === true || apiModel.supports_reasoning === true)
127
+ ? { supportsReasoningEffort: true }
128
+ : {}),
129
+ },
114
130
  };
115
131
  }
116
132
 
@@ -123,6 +139,7 @@ function applyPatch(model, patch) {
123
139
  if (patch.input !== undefined) result.input = patch.input;
124
140
  if (patch.contextWindow !== undefined) result.contextWindow = patch.contextWindow;
125
141
  if (patch.maxTokens !== undefined) result.maxTokens = patch.maxTokens;
142
+ if (patch.thinkingLevelMap !== undefined) result.thinkingLevelMap = { ...patch.thinkingLevelMap };
126
143
  if (patch.cost) {
127
144
  result.cost = {
128
145
  input: patch.cost.input ?? result.cost.input,
@@ -137,6 +154,9 @@ function applyPatch(model, patch) {
137
154
  if (!result.reasoning && result.compat?.thinkingFormat) {
138
155
  delete result.compat.thinkingFormat;
139
156
  }
157
+ if (!result.reasoning && result.thinkingLevelMap) {
158
+ delete result.thinkingLevelMap;
159
+ }
140
160
  if (result.compat && Object.keys(result.compat).length === 0) {
141
161
  delete result.compat;
142
162
  }