pi-ollama-cloud 0.12.0 → 0.12.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/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.12.1] - 2026-09-14
6
+
7
+ - Omit empty `openRouterRouting` / `vercelGatewayRouting` from `buildCompat` (set to `undefined`, not `{}`): pi-ai reads the raw `model.compat` and treats `{}` as truthy, sending a stray `provider: {}` on every Ollama chat completion. Fixes #60. Thanks @0xbentang (#61).
8
+
5
9
  ## [0.12.0] - 2026-09-11
6
10
 
7
11
  - Source per-model thinking levels from models.dev instead of hardcoded maps. `scripts/generate-reasoning.ts` fetches the `ollama-cloud` provider's `reasoning_options` into `reasoning.generated.ts`, and `thinking-levels.ts` maps each model's effort values onto Pi's levels (toggle-only models become a binary on/off map; models with no models.dev entry fall back to `DEFAULT`). The `off` switch is handled by a small override table for models verified not to honor `reasoning_effort:"none"` (`gpt-oss:20b`, `gpt-oss:120b`, `minimax-m2.7`). Removed the now-stale per-family maps and the `docs/think-experiment.md` doc.
@@ -1,6 +1,6 @@
1
1
  // Auto-generated by scripts/generate-models.ts
2
2
  // Do not edit manually.
3
- // Generated: 2026-09-12T02:41:57.025Z
3
+ // Generated: 2026-09-14T10:27:20.856Z
4
4
  // Model count: 20
5
5
 
6
6
  import type { ProviderModelConfig } from "@earendil-works/pi-coding-agent";
@@ -11,7 +11,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
11
11
  name: "deepseek-v4-flash:0731",
12
12
  compat: {
13
13
  maxTokensField: "max_tokens",
14
- openRouterRouting: {},
15
14
  requiresAssistantAfterToolResult: false,
16
15
  requiresReasoningContentOnAssistantMessages: false,
17
16
  requiresThinkingAsText: false,
@@ -24,7 +23,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
24
23
  supportsStrictMode: false,
25
24
  supportsUsageInStreaming: true,
26
25
  thinkingFormat: "openai",
27
- vercelGatewayRouting: {},
28
26
  zaiToolStream: false,
29
27
  },
30
28
  contextWindow: 1048576,
@@ -51,7 +49,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
51
49
  name: "deepseek-v4-pro:0813",
52
50
  compat: {
53
51
  maxTokensField: "max_tokens",
54
- openRouterRouting: {},
55
52
  requiresAssistantAfterToolResult: false,
56
53
  requiresReasoningContentOnAssistantMessages: false,
57
54
  requiresThinkingAsText: false,
@@ -64,7 +61,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
64
61
  supportsStrictMode: false,
65
62
  supportsUsageInStreaming: true,
66
63
  thinkingFormat: "openai",
67
- vercelGatewayRouting: {},
68
64
  zaiToolStream: false,
69
65
  },
70
66
  contextWindow: 1048576,
@@ -91,7 +87,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
91
87
  name: "deepseek-v4.1-flash",
92
88
  compat: {
93
89
  maxTokensField: "max_tokens",
94
- openRouterRouting: {},
95
90
  requiresAssistantAfterToolResult: false,
96
91
  requiresReasoningContentOnAssistantMessages: false,
97
92
  requiresThinkingAsText: false,
@@ -104,7 +99,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
104
99
  supportsStrictMode: false,
105
100
  supportsUsageInStreaming: true,
106
101
  thinkingFormat: "openai",
107
- vercelGatewayRouting: {},
108
102
  zaiToolStream: false,
109
103
  },
110
104
  contextWindow: 1048576,
@@ -131,7 +125,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
131
125
  name: "gemma4:31b",
132
126
  compat: {
133
127
  maxTokensField: "max_tokens",
134
- openRouterRouting: {},
135
128
  requiresAssistantAfterToolResult: false,
136
129
  requiresReasoningContentOnAssistantMessages: false,
137
130
  requiresThinkingAsText: false,
@@ -144,7 +137,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
144
137
  supportsStrictMode: false,
145
138
  supportsUsageInStreaming: true,
146
139
  thinkingFormat: "openai",
147
- vercelGatewayRouting: {},
148
140
  zaiToolStream: false,
149
141
  },
150
142
  contextWindow: 262144,
@@ -171,7 +163,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
171
163
  name: "glm-5.1",
172
164
  compat: {
173
165
  maxTokensField: "max_tokens",
174
- openRouterRouting: {},
175
166
  requiresAssistantAfterToolResult: false,
176
167
  requiresReasoningContentOnAssistantMessages: false,
177
168
  requiresThinkingAsText: false,
@@ -184,7 +175,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
184
175
  supportsStrictMode: false,
185
176
  supportsUsageInStreaming: true,
186
177
  thinkingFormat: "openai",
187
- vercelGatewayRouting: {},
188
178
  zaiToolStream: false,
189
179
  },
190
180
  contextWindow: 202752,
@@ -211,7 +201,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
211
201
  name: "glm-5.2",
212
202
  compat: {
213
203
  maxTokensField: "max_tokens",
214
- openRouterRouting: {},
215
204
  requiresAssistantAfterToolResult: false,
216
205
  requiresReasoningContentOnAssistantMessages: false,
217
206
  requiresThinkingAsText: false,
@@ -224,7 +213,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
224
213
  supportsStrictMode: false,
225
214
  supportsUsageInStreaming: true,
226
215
  thinkingFormat: "openai",
227
- vercelGatewayRouting: {},
228
216
  zaiToolStream: false,
229
217
  },
230
218
  contextWindow: 1048576,
@@ -251,7 +239,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
251
239
  name: "glm-5.3",
252
240
  compat: {
253
241
  maxTokensField: "max_tokens",
254
- openRouterRouting: {},
255
242
  requiresAssistantAfterToolResult: false,
256
243
  requiresReasoningContentOnAssistantMessages: false,
257
244
  requiresThinkingAsText: false,
@@ -264,7 +251,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
264
251
  supportsStrictMode: false,
265
252
  supportsUsageInStreaming: true,
266
253
  thinkingFormat: "openai",
267
- vercelGatewayRouting: {},
268
254
  zaiToolStream: false,
269
255
  },
270
256
  contextWindow: 1048576,
@@ -291,7 +277,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
291
277
  name: "glm-5.3-flash",
292
278
  compat: {
293
279
  maxTokensField: "max_tokens",
294
- openRouterRouting: {},
295
280
  requiresAssistantAfterToolResult: false,
296
281
  requiresReasoningContentOnAssistantMessages: false,
297
282
  requiresThinkingAsText: false,
@@ -304,7 +289,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
304
289
  supportsStrictMode: false,
305
290
  supportsUsageInStreaming: true,
306
291
  thinkingFormat: "openai",
307
- vercelGatewayRouting: {},
308
292
  zaiToolStream: false,
309
293
  },
310
294
  contextWindow: 1048576,
@@ -331,7 +315,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
331
315
  name: "gpt-oss:120b",
332
316
  compat: {
333
317
  maxTokensField: "max_tokens",
334
- openRouterRouting: {},
335
318
  requiresAssistantAfterToolResult: false,
336
319
  requiresReasoningContentOnAssistantMessages: false,
337
320
  requiresThinkingAsText: false,
@@ -344,7 +327,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
344
327
  supportsStrictMode: false,
345
328
  supportsUsageInStreaming: true,
346
329
  thinkingFormat: "openai",
347
- vercelGatewayRouting: {},
348
330
  zaiToolStream: false,
349
331
  },
350
332
  contextWindow: 131072,
@@ -371,7 +353,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
371
353
  name: "gpt-oss:20b",
372
354
  compat: {
373
355
  maxTokensField: "max_tokens",
374
- openRouterRouting: {},
375
356
  requiresAssistantAfterToolResult: false,
376
357
  requiresReasoningContentOnAssistantMessages: false,
377
358
  requiresThinkingAsText: false,
@@ -384,7 +365,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
384
365
  supportsStrictMode: false,
385
366
  supportsUsageInStreaming: true,
386
367
  thinkingFormat: "openai",
387
- vercelGatewayRouting: {},
388
368
  zaiToolStream: false,
389
369
  },
390
370
  contextWindow: 131072,
@@ -411,7 +391,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
411
391
  name: "kimi-k2.6",
412
392
  compat: {
413
393
  maxTokensField: "max_tokens",
414
- openRouterRouting: {},
415
394
  requiresAssistantAfterToolResult: false,
416
395
  requiresReasoningContentOnAssistantMessages: false,
417
396
  requiresThinkingAsText: false,
@@ -424,7 +403,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
424
403
  supportsStrictMode: false,
425
404
  supportsUsageInStreaming: true,
426
405
  thinkingFormat: "openai",
427
- vercelGatewayRouting: {},
428
406
  zaiToolStream: false,
429
407
  },
430
408
  contextWindow: 262144,
@@ -451,7 +429,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
451
429
  name: "kimi-k2.7-code",
452
430
  compat: {
453
431
  maxTokensField: "max_tokens",
454
- openRouterRouting: {},
455
432
  requiresAssistantAfterToolResult: false,
456
433
  requiresReasoningContentOnAssistantMessages: false,
457
434
  requiresThinkingAsText: false,
@@ -464,7 +441,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
464
441
  supportsStrictMode: false,
465
442
  supportsUsageInStreaming: true,
466
443
  thinkingFormat: "openai",
467
- vercelGatewayRouting: {},
468
444
  zaiToolStream: false,
469
445
  },
470
446
  contextWindow: 262144,
@@ -491,7 +467,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
491
467
  name: "kimi-k3",
492
468
  compat: {
493
469
  maxTokensField: "max_tokens",
494
- openRouterRouting: {},
495
470
  requiresAssistantAfterToolResult: false,
496
471
  requiresReasoningContentOnAssistantMessages: false,
497
472
  requiresThinkingAsText: false,
@@ -504,7 +479,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
504
479
  supportsStrictMode: false,
505
480
  supportsUsageInStreaming: true,
506
481
  thinkingFormat: "openai",
507
- vercelGatewayRouting: {},
508
482
  zaiToolStream: false,
509
483
  },
510
484
  contextWindow: 1048576,
@@ -531,7 +505,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
531
505
  name: "minimax-m2.7",
532
506
  compat: {
533
507
  maxTokensField: "max_tokens",
534
- openRouterRouting: {},
535
508
  requiresAssistantAfterToolResult: false,
536
509
  requiresReasoningContentOnAssistantMessages: false,
537
510
  requiresThinkingAsText: false,
@@ -544,7 +517,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
544
517
  supportsStrictMode: false,
545
518
  supportsUsageInStreaming: true,
546
519
  thinkingFormat: "openai",
547
- vercelGatewayRouting: {},
548
520
  zaiToolStream: false,
549
521
  },
550
522
  contextWindow: 196608,
@@ -571,7 +543,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
571
543
  name: "minimax-m3",
572
544
  compat: {
573
545
  maxTokensField: "max_tokens",
574
- openRouterRouting: {},
575
546
  requiresAssistantAfterToolResult: false,
576
547
  requiresReasoningContentOnAssistantMessages: false,
577
548
  requiresThinkingAsText: false,
@@ -584,7 +555,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
584
555
  supportsStrictMode: false,
585
556
  supportsUsageInStreaming: true,
586
557
  thinkingFormat: "openai",
587
- vercelGatewayRouting: {},
588
558
  zaiToolStream: false,
589
559
  },
590
560
  contextWindow: 512000,
@@ -611,7 +581,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
611
581
  name: "mistral-large-3:675b",
612
582
  compat: {
613
583
  maxTokensField: "max_tokens",
614
- openRouterRouting: {},
615
584
  requiresAssistantAfterToolResult: false,
616
585
  requiresReasoningContentOnAssistantMessages: false,
617
586
  requiresThinkingAsText: false,
@@ -624,7 +593,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
624
593
  supportsStrictMode: false,
625
594
  supportsUsageInStreaming: true,
626
595
  thinkingFormat: "openai",
627
- vercelGatewayRouting: {},
628
596
  zaiToolStream: false,
629
597
  },
630
598
  contextWindow: 262144,
@@ -643,7 +611,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
643
611
  name: "nemotron-3-nano:30b",
644
612
  compat: {
645
613
  maxTokensField: "max_tokens",
646
- openRouterRouting: {},
647
614
  requiresAssistantAfterToolResult: false,
648
615
  requiresReasoningContentOnAssistantMessages: false,
649
616
  requiresThinkingAsText: false,
@@ -656,7 +623,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
656
623
  supportsStrictMode: false,
657
624
  supportsUsageInStreaming: true,
658
625
  thinkingFormat: "openai",
659
- vercelGatewayRouting: {},
660
626
  zaiToolStream: false,
661
627
  },
662
628
  contextWindow: 262144,
@@ -683,7 +649,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
683
649
  name: "nemotron-3-super",
684
650
  compat: {
685
651
  maxTokensField: "max_tokens",
686
- openRouterRouting: {},
687
652
  requiresAssistantAfterToolResult: false,
688
653
  requiresReasoningContentOnAssistantMessages: false,
689
654
  requiresThinkingAsText: false,
@@ -696,7 +661,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
696
661
  supportsStrictMode: false,
697
662
  supportsUsageInStreaming: true,
698
663
  thinkingFormat: "openai",
699
- vercelGatewayRouting: {},
700
664
  zaiToolStream: false,
701
665
  },
702
666
  contextWindow: 262144,
@@ -723,7 +687,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
723
687
  name: "nemotron-3-ultra",
724
688
  compat: {
725
689
  maxTokensField: "max_tokens",
726
- openRouterRouting: {},
727
690
  requiresAssistantAfterToolResult: false,
728
691
  requiresReasoningContentOnAssistantMessages: false,
729
692
  requiresThinkingAsText: false,
@@ -736,7 +699,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
736
699
  supportsStrictMode: false,
737
700
  supportsUsageInStreaming: true,
738
701
  thinkingFormat: "openai",
739
- vercelGatewayRouting: {},
740
702
  zaiToolStream: false,
741
703
  },
742
704
  contextWindow: 262144,
@@ -763,7 +725,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
763
725
  name: "qwen3.5:397b",
764
726
  compat: {
765
727
  maxTokensField: "max_tokens",
766
- openRouterRouting: {},
767
728
  requiresAssistantAfterToolResult: false,
768
729
  requiresReasoningContentOnAssistantMessages: false,
769
730
  requiresThinkingAsText: false,
@@ -776,7 +737,6 @@ export const GENERATED_MODELS: ProviderModelConfig[] = [
776
737
  supportsStrictMode: false,
777
738
  supportsUsageInStreaming: true,
778
739
  thinkingFormat: "openai",
779
- vercelGatewayRouting: {},
780
740
  zaiToolStream: false,
781
741
  },
782
742
  contextWindow: 262144,
package/models.ts CHANGED
@@ -113,18 +113,28 @@ function buildCompat(): ProviderModelConfig["compat"] {
113
113
  thinkingFormat: "openai",
114
114
  // Ollama does not support tool_choice, so strict mode is unavailable (ollama: docs.ollama.com/api/openai-compatibility, pi: types.ts#supportsStrictMode).
115
115
  supportsStrictMode: false,
116
- // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).
117
- // Explicitly undefined: JSON.stringify drops undefined values, keeping
118
- // models.generated.ts structurally consistent with assembleModels() runtime output.
119
116
  // Session affinity headers not relevant for Ollama (pi: types.ts#sendSessionAffinityHeaders).
120
117
  sendSessionAffinityHeaders: false,
121
118
  // No explicit cache-retention API (pi: types.ts#supportsLongCacheRetention).
122
119
  supportsLongCacheRetention: false,
123
120
  // Not z.ai (pi: types.ts#zaiToolStream).
124
121
  zaiToolStream: false,
122
+ // Anthropic cache_control not relevant; Ollama has implicit KV cache only (pi: types.ts#cacheControlFormat).
123
+ // Explicitly undefined: JSON.stringify drops undefined values, keeping
124
+ // models.generated.ts structurally consistent with assembleModels() runtime output.
125
125
  cacheControlFormat: undefined,
126
- openRouterRouting: {},
127
- vercelGatewayRouting: {},
126
+ // OpenRouter / Vercel AI Gateway routing prefs. pi-ai's OpenAI transport
127
+ // truthiness-checks the raw model.compat (not the resolved getCompat() value)
128
+ // and forwards it verbatim: `if (model.compat?.openRouterRouting)
129
+ // params.provider = ...` in packages/ai/src/api/openai-completions.ts. `{}` is
130
+ // truthy, so baking it in sent a stray `provider: {}` on every Ollama request.
131
+ // Express "none" as undefined, never `{}`; undefined is falsy at the wire site
132
+ // and JSON.stringify drops it from models.generated.ts. The boolean flags above
133
+ // stay explicit `false` on purpose: omitting a boolean makes getCompat() fall
134
+ // back to detectCompat's generic-OpenAI defaults, which are wrong for Ollama
135
+ // (e.g. maxTokensField -> "max_completion_tokens", supportsStrictMode -> true).
136
+ openRouterRouting: undefined,
137
+ vercelGatewayRouting: undefined,
128
138
  };
129
139
  }
130
140
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-ollama-cloud",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "type": "module",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -1,6 +1,6 @@
1
1
  // Auto-generated by scripts/generate-pricing.ts
2
2
  // Do not edit manually.
3
- // Generated: 2026-09-12T02:41:55.206Z
3
+ // Generated: 2026-09-14T10:27:19.243Z
4
4
  // Model count: 20
5
5
 
6
6
  export interface ModelPrice {
@@ -1,6 +1,6 @@
1
1
  // Auto-generated by scripts/generate-reasoning.ts
2
2
  // Do not edit manually.
3
- // Model count: 22
3
+ // Model count: 23
4
4
 
5
5
  export type ModelsDevReasoningOption =
6
6
  | { type: "toggle" }
@@ -13,6 +13,7 @@ export const MODEL_REASONING_OPTIONS: Record<string, ModelsDevReasoningOption[]>
13
13
  "deepseek-v4-flash": [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }],
14
14
  "deepseek-v4-flash:0731": [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }],
15
15
  "deepseek-v4-pro": [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }],
16
+ "deepseek-v4-pro:0813": [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }],
16
17
  "deepseek-v4.1-flash": [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }],
17
18
  "gemma4:31b": [{ type: "toggle" }],
18
19
  "glm-5.1": [{ type: "toggle" }],