@oh-my-pi/pi-catalog 18.14.2 → 18.16.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/types/compat/auth-ids.d.ts +2 -2
  3. package/dist/types/compat/catalog-policy.d.ts +6 -4
  4. package/dist/types/compat/factory-droid.d.ts +7 -1
  5. package/dist/types/compat/provider-ids.d.ts +1 -1
  6. package/dist/types/compat/resolve.d.ts +1 -1
  7. package/dist/types/compat/revision.d.ts +2 -0
  8. package/dist/types/compat/server-side-fallback.d.ts +6 -4
  9. package/dist/types/compat/types.d.ts +3 -1
  10. package/dist/types/discovery/openai-compatible.d.ts +6 -0
  11. package/dist/types/models.d.ts +16 -0
  12. package/dist/types/pricing.d.ts +66 -6
  13. package/dist/types/provider-models/openai-compat.d.ts +18 -0
  14. package/dist/types/types.d.ts +11 -5
  15. package/dist/types/utils.d.ts +8 -0
  16. package/package.json +4 -4
  17. package/src/compat/auth-ids.ts +5 -0
  18. package/src/compat/axes.ts +5 -2
  19. package/src/compat/catalog-policy.ts +14 -10
  20. package/src/compat/collapse.ts +1 -1
  21. package/src/compat/factory-droid.ts +9 -1
  22. package/src/compat/provider-ids.ts +2 -0
  23. package/src/compat/resolve.ts +4 -2
  24. package/src/compat/revision.ts +10 -0
  25. package/src/compat/rules/README.md +2 -0
  26. package/src/compat/rules/auth/_order.kdl +1 -1
  27. package/src/compat/rules/auth/mistral.kdl +4 -0
  28. package/src/compat/rules/auth/modular.kdl +9 -0
  29. package/src/compat/rules/auth/scaleway.kdl +17 -0
  30. package/src/compat/rules/providers/factory-droid.kdl +219 -13
  31. package/src/compat/rules/providers/modular.kdl +35 -0
  32. package/src/compat/rules/providers/sambanova.kdl +2 -0
  33. package/src/compat/rules/providers/scaleway.kdl +179 -0
  34. package/src/compat/rules/runtime/behavior.kdl +13 -0
  35. package/src/compat/rules.json +1 -1
  36. package/src/compat/server-side-fallback.ts +7 -5
  37. package/src/compat/types.ts +3 -1
  38. package/src/discovery/codex.ts +2 -9
  39. package/src/discovery/factory-droid.ts +35 -11
  40. package/src/discovery/openai-compatible.ts +1 -1
  41. package/src/model-cache.ts +32 -58
  42. package/src/model-catalog-format.ts +5 -8
  43. package/src/model-manager.ts +27 -121
  44. package/src/model-tokenizer.ts +13 -12
  45. package/src/models.json +1 -1
  46. package/src/models.ts +32 -1
  47. package/src/pricing.ts +59 -94
  48. package/src/provider-models/descriptors.ts +2 -0
  49. package/src/provider-models/openai-compat.ts +60 -59
  50. package/src/types.ts +11 -4
  51. package/src/utils.ts +18 -0
  52. package/src/wire/factory-droid.ts +4 -3
@@ -258,6 +258,8 @@ Opted in: Muse Code `muse-spark-1.3`, `muse-spark-1.3-contributor`, and the four
258
258
 
259
259
  The routed-subscription registry axes (`upstream-rotation`, `region-upstreams-global|us|eu`, `region-limits-eu`, `credit-rates`, `list-price-from`, `routing-family`, `policy-aliases`, `entitlement`, `default-reasoning-off`) describe a gateway whose proxy fans one model out to several upstreams. They are read through `src/compat/factory-droid.ts` by Factory Droid discovery and its request provider, not materialized by `buildModel`. A provider-wide `region-upstreams-*` rule is the upstream serving table and a model rule replaces it for that region. `list-price-from "<provider>" ["<id>"]` shows a bundled row's list price beside the subscription's own billing; unlike seed values it is resolved at runtime and degrades to the seed's zero cost when the row is gone. See [`providers/factory-droid.kdl`](providers/factory-droid.kdl), whose wire and billing pool per model are `api-routes` and `quota-tiers` rules in `runtime/behavior.kdl`.
260
260
 
261
+ `credit-rates` accepts the same optional `effective-rates` block of named dated cards as `cost-patch`, parsed by the same code: each card has a distinct ISO UTC `effective-from` and any of `input`/`output`/`cache-read`, and the latest card at or before the moment the model browser renders overwrites the legs it names. A vendor credit promotion is two cards, the discounted rate from its start and the base rate again from its end, so a card left behind after the end changes nothing. See [`providers/factory-droid.kdl`](providers/factory-droid.kdl).
262
+
261
263
  ### Time-based pricing
262
264
 
263
265
  The catalog object axis `time-based-cost` materializes into `ModelCost.timeBased`. It uses **named child objects**, not KDL arrays or repeated anonymous windows. For example, inside a matching provider/model scope:
@@ -10,4 +10,4 @@ login-order "openai-codex" "anthropic" "zai" "zai-coding-plan" "kimi-code" "open
10
10
  "qianfan" "venice" "siliconflow" "siliconflow-cn" "synthetic" "nanogpt" "wafer-serverless" "coreweave" \
11
11
  "vercel-ai-gateway" "cloudflare-ai-gateway" "cloudflare-workers-ai" "snowflake" "litellm" "kilo" "zenmux" "opencode-zen" "opencode-go" \
12
12
  "yolo-auto" "tavily" "kagi" "exa" "parallel" "typesafe" "ollama" "ollama-cloud" "lm-studio" "llama.cpp" "vllm" \
13
- "gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech" "coralbricks"
13
+ "gmi-cloud" "stencil" "singularityapi-dev" "singularityapi-tech" "coralbricks" "modular" "mistral" "scaleway"
@@ -1,3 +1,7 @@
1
+ // Browser sign-in mirrors the Mistral Vibe CLI and mints a regular API key billed
2
+ // against the plan's Vibe Code quota; the hook returns it as a plain API key.
1
3
  auth "mistral" {
2
4
  name "Mistral"
5
+ env "MISTRAL_API_KEY"
6
+ login "custom" hook="mistral-vibe-sign-in"
3
7
  }
@@ -0,0 +1,9 @@
1
+ auth "modular" {
2
+ name "Modular"
3
+ login "api-key" {
4
+ auth-url "https://console.modular.com/api_keys"
5
+ instructions "Create an API key in the Modular Console"
6
+ prompt "Paste your Modular API key" placeholder="..."
7
+ validate "models-endpoint" label="Modular" url="https://api.modular.com/v1/models"
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ auth "scaleway" {
2
+ name "Scaleway"
3
+ login "api-key" {
4
+ auth-url "https://console.scaleway.com/iam/api-keys"
5
+ instructions "Create an API key on the Scaleway console and paste its Secret Key (SCW_SECRET_KEY)"
6
+ // Scaleway secret keys are UUID-shaped opaque strings with no `sk-`
7
+ // prefix, so the placeholder must not teach a credential shape the
8
+ // console never issues.
9
+ prompt "Paste your Scaleway secret key" placeholder="..."
10
+ normalize "strip-bearer"
11
+ // `/v1/models` is key-protected: it answers 401 without a bearer key
12
+ // and 403 to a rejected one (verified 2026-10-21), so login validates
13
+ // the pasted key there. The probe bills nothing, unlike a
14
+ // chat-completions round-trip against a prepaid balance.
15
+ validate "models-endpoint" label="Scaleway" url="https://api.scaleway.ai/v1/models"
16
+ }
17
+ }
@@ -141,24 +141,54 @@ provider "factory-droid" {
141
141
  cost input=0 output=0 cache-read=0 cache-write=0
142
142
  limits context=922000 max-tokens=128000
143
143
  }
144
+ model "gpt-6-astra-ultrafast" name="GPT-6 Astra Ultra Fast" {
145
+ reasoning #true
146
+ input "text" "image"
147
+ cost input=0 output=0 cache-read=0 cache-write=0
148
+ limits context=922000 max-tokens=128000
149
+ }
144
150
  model "gpt-6.1-sol" name="GPT-6.1 Sol" {
145
151
  reasoning #true
146
152
  input "text" "image"
147
153
  cost input=0 output=0 cache-read=0 cache-write=0
148
154
  limits context=922000 max-tokens=128000
149
155
  }
156
+ model "gpt-6.1-sol-ultrafast" name="GPT-6.1 Sol Ultra Fast" {
157
+ reasoning #true
158
+ input "text" "image"
159
+ cost input=0 output=0 cache-read=0 cache-write=0
160
+ limits context=922000 max-tokens=128000
161
+ }
162
+ model "gpt-6.1-terra" name="GPT-6.1 Terra" {
163
+ reasoning #true
164
+ input "text" "image"
165
+ cost input=0 output=0 cache-read=0 cache-write=0
166
+ limits context=922000 max-tokens=128000
167
+ }
150
168
  model "gpt-6-sol" name="GPT-6 Sol" {
151
169
  reasoning #true
152
170
  input "text" "image"
153
171
  cost input=0 output=0 cache-read=0 cache-write=0
154
172
  limits context=922000 max-tokens=128000
155
173
  }
174
+ model "gpt-6-sol-fast" name="GPT-6 Sol Fast Mode" {
175
+ reasoning #true
176
+ input "text" "image"
177
+ cost input=0 output=0 cache-read=0 cache-write=0
178
+ limits context=922000 max-tokens=128000
179
+ }
156
180
  model "gpt-6-luna" name="GPT-6 Luna" {
157
181
  reasoning #true
158
182
  input "text" "image"
159
183
  cost input=0 output=0 cache-read=0 cache-write=0
160
184
  limits context=922000 max-tokens=128000
161
185
  }
186
+ model "gpt-6-luna-fast" name="GPT-6 Luna Fast Mode" {
187
+ reasoning #true
188
+ input "text" "image"
189
+ cost input=0 output=0 cache-read=0 cache-write=0
190
+ limits context=922000 max-tokens=128000
191
+ }
162
192
  model "gpt-5.6-sol" name="GPT-5.6 Sol" {
163
193
  reasoning #true
164
194
  input "text" "image"
@@ -339,12 +369,36 @@ provider "factory-droid" {
339
369
  cost input=0 output=0 cache-read=0 cache-write=0
340
370
  limits context=131072 max-tokens=131072
341
371
  }
372
+ model "nemotron-3.5-super" name="Nemotron 3.5 Super" {
373
+ reasoning #true
374
+ input "text" "image"
375
+ cost input=0 output=0 cache-read=0 cache-write=0
376
+ limits context=934464 max-tokens=65536
377
+ }
342
378
  model "nemotron-3-ultra" name="Nemotron 3 Ultra" {
343
379
  reasoning #true
344
380
  input "text"
345
381
  cost input=0 output=0 cache-read=0 cache-write=0
346
382
  limits context=136464 max-tokens=65536
347
383
  }
384
+ model "muse-spark-open" name="Muse Spark Open" {
385
+ reasoning #true
386
+ input "text" "image"
387
+ cost input=0 output=0 cache-read=0 cache-write=0
388
+ limits context=908928 max-tokens=131072
389
+ }
390
+ model "muse-spark-1.2" name="Muse Spark 1.2" {
391
+ reasoning #true
392
+ input "text"
393
+ cost input=0 output=0 cache-read=0 cache-write=0
394
+ limits context=908928 max-tokens=131072
395
+ }
396
+ model "beam-1.0" name="Beam 1.0" {
397
+ reasoning #true
398
+ input "text"
399
+ cost input=0 output=0 cache-read=0 cache-write=0
400
+ limits context=1015808 max-tokens=32768
401
+ }
348
402
  model "deepseek-v4.1-flash-1017" name="DeepSeek V4.1 Flash 1017" {
349
403
  reasoning #true
350
404
  input "text" "image"
@@ -446,7 +500,10 @@ provider "factory-droid" {
446
500
  // Per-model registry entries: live-routing family, upstream rotation (first
447
501
  // entry is the default `x-api-provider`), region overrides, Standard Credits
448
502
  // rates, list-price source, org-policy aliases, the effort ladder (an off/none
449
- // rung means `thinking-requires-effort #false`), and account gates.
503
+ // rung means `thinking-requires-effort #false`), and account gates. A credit
504
+ // promotion is two dated `effective-rates` cards copied from the droid
505
+ // release's model registry: the discounted `input` from its start and the
506
+ // base again from its end.
450
507
  models "claude-fable-5.1" {
451
508
  routing-family "anthropic"
452
509
  upstream-rotation "anthropic" "vertex_anthropic" "bedrock_anthropic"
@@ -484,7 +541,7 @@ provider "factory-droid" {
484
541
  thinking-efforts "low" "medium" "high" "xhigh" "max"
485
542
  thinking-requires-effort #true
486
543
  thinking-default-level "medium"
487
- entitlement { feature-flag "claude_opus_5_5_fast"; base-variant "claude-opus-5-5" }
544
+ entitlement { base-variant "claude-opus-5-5" }
488
545
  }
489
546
  models "claude-opus-5" {
490
547
  routing-family "anthropic"
@@ -621,6 +678,20 @@ provider "factory-droid" {
621
678
  thinking-requires-effort #true
622
679
  thinking-default-level "medium"
623
680
  }
681
+ models "gpt-6-astra-ultrafast" {
682
+ routing-family "openai"
683
+ upstream-rotation "openai"
684
+ region-upstreams-eu
685
+ credit-rates { input 24; output 5 }
686
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
687
+ thinking-requires-effort #true
688
+ thinking-default-level "medium"
689
+ entitlement {
690
+ feature-flag "gpt_6_astra_ultrafast"
691
+ base-variant "gpt-6-astra"
692
+ requires-explicit-opt-in #true
693
+ }
694
+ }
624
695
  models "gpt-6.1-sol" {
625
696
  routing-family "openai"
626
697
  upstream-rotation "openai" "bedrock_openai" "databricks"
@@ -629,7 +700,28 @@ provider "factory-droid" {
629
700
  thinking-efforts "low" "medium" "high" "xhigh" "max"
630
701
  thinking-requires-effort #true
631
702
  thinking-default-level "medium"
632
- entitlement { feature-flag "gpt_6_1_sol" }
703
+ }
704
+ models "gpt-6.1-sol-ultrafast" {
705
+ routing-family "openai"
706
+ upstream-rotation "openai"
707
+ credit-rates { input 4.8; output 5; cache-read 0.05 }
708
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
709
+ thinking-requires-effort #true
710
+ thinking-default-level "medium"
711
+ entitlement {
712
+ base-variant "gpt-6.1-sol"
713
+ requires-explicit-opt-in #true
714
+ }
715
+ }
716
+ models "gpt-6.1-terra" {
717
+ routing-family "openai"
718
+ upstream-rotation "openai"
719
+ credit-rates { input 0.4; output 5; cache-read 0.05 }
720
+ list-price-from "openai"
721
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
722
+ thinking-requires-effort #false
723
+ thinking-default-level "medium"
724
+ entitlement { feature-flag "gpt_6_1_terra" }
633
725
  }
634
726
  models "gpt-6-sol" {
635
727
  routing-family "openai"
@@ -641,6 +733,15 @@ provider "factory-droid" {
641
733
  thinking-requires-effort #false
642
734
  thinking-default-level "medium"
643
735
  }
736
+ models "gpt-6-sol-fast" {
737
+ routing-family "openai"
738
+ upstream-rotation "openai"
739
+ credit-rates { input 1.6; output 5 }
740
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
741
+ thinking-requires-effort #false
742
+ thinking-default-level "medium"
743
+ entitlement { base-variant "gpt-6-sol" }
744
+ }
644
745
  models "gpt-6-luna" {
645
746
  routing-family "openai"
646
747
  upstream-rotation "openai" "bedrock_openai" "azure_openai"
@@ -651,11 +752,33 @@ provider "factory-droid" {
651
752
  thinking-requires-effort #false
652
753
  thinking-default-level "medium"
653
754
  }
755
+ models "gpt-6-luna-fast" {
756
+ routing-family "openai"
757
+ upstream-rotation "openai"
758
+ credit-rates { input 0.08; output 5 }
759
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
760
+ thinking-requires-effort #false
761
+ thinking-default-level "medium"
762
+ entitlement { base-variant "gpt-6-luna" }
763
+ }
654
764
  models "gpt-5.6-sol" {
655
765
  routing-family "openai"
656
766
  upstream-rotation "openai" "bedrock_openai" "azure_openai" "snowflake" "databricks"
657
767
  region-upstreams-eu "openai"
658
- credit-rates { input 2; output 5 }
768
+ credit-rates {
769
+ input 2
770
+ output 5
771
+ effective-rates {
772
+ promotion {
773
+ effective-from "2026-08-22T00:00:00Z"
774
+ input 1.6
775
+ }
776
+ standard {
777
+ effective-from "2026-11-22T00:00:00Z"
778
+ input 2
779
+ }
780
+ }
781
+ }
659
782
  list-price-from "openai"
660
783
  thinking-efforts "low" "medium" "high" "xhigh" "max"
661
784
  thinking-requires-effort #false
@@ -664,7 +787,20 @@ provider "factory-droid" {
664
787
  models "gpt-5.6-sol-fast" {
665
788
  routing-family "openai"
666
789
  upstream-rotation "openai" "azure_openai"
667
- credit-rates { input 4; output 5 }
790
+ credit-rates {
791
+ input 4
792
+ output 5
793
+ effective-rates {
794
+ promotion {
795
+ effective-from "2026-08-22T00:00:00Z"
796
+ input 3.2
797
+ }
798
+ standard {
799
+ effective-from "2026-11-22T00:00:00Z"
800
+ input 4
801
+ }
802
+ }
803
+ }
668
804
  policy-aliases "gpt-5.6-fast"
669
805
  thinking-efforts "low" "medium" "high" "xhigh" "max"
670
806
  thinking-requires-effort #false
@@ -693,7 +829,7 @@ provider "factory-droid" {
693
829
  }
694
830
  models "gpt-5.5" {
695
831
  routing-family "openai"
696
- upstream-rotation "openai" "bedrock_openai" "azure_openai" "snowflake" "databricks"
832
+ upstream-rotation "openai" "bedrock_openai" "azure_openai" "databricks"
697
833
  region-upstreams-eu "openai"
698
834
  credit-rates { input 2; output 6 }
699
835
  list-price-from "openai"
@@ -816,7 +952,20 @@ provider "factory-droid" {
816
952
  routing-family "google"
817
953
  upstream-rotation "google"
818
954
  region-upstreams-eu "google"
819
- credit-rates { input 0.6; output 5 }
955
+ credit-rates {
956
+ input 0.6
957
+ output 5
958
+ effective-rates {
959
+ promotion {
960
+ effective-from "2026-08-17T21:10:19Z"
961
+ input 0.3
962
+ }
963
+ standard {
964
+ effective-from "2027-01-01T08:00:00Z"
965
+ input 0.6
966
+ }
967
+ }
968
+ }
820
969
  list-price-from "google"
821
970
  thinking-efforts "low" "medium" "high"
822
971
  thinking-requires-effort #true
@@ -826,7 +975,20 @@ provider "factory-droid" {
826
975
  routing-family "google"
827
976
  upstream-rotation "google"
828
977
  region-upstreams-eu "google"
829
- credit-rates { input 0.6; output 5 }
978
+ credit-rates {
979
+ input 0.6
980
+ output 5
981
+ effective-rates {
982
+ promotion {
983
+ effective-from "2026-08-17T21:10:19Z"
984
+ input 0.3
985
+ }
986
+ standard {
987
+ effective-from "2027-01-01T08:00:00Z"
988
+ input 0.6
989
+ }
990
+ }
991
+ }
830
992
  list-price-from "google"
831
993
  thinking-efforts "low" "medium" "high"
832
994
  thinking-requires-effort #true
@@ -972,6 +1134,15 @@ provider "factory-droid" {
972
1134
  thinking-requires-effort #true
973
1135
  thinking-default-level "xhigh"
974
1136
  }
1137
+ models "nemotron-3.5-super" {
1138
+ routing-family "factory"
1139
+ upstream-rotation "baseten"
1140
+ credit-rates { input 0.08; output 2.5; cache-read 0.2 }
1141
+ thinking-efforts "high"
1142
+ thinking-requires-effort #false
1143
+ thinking-default-level "high"
1144
+ entitlement { feature-flag "nemotron_3_5_super" }
1145
+ }
975
1146
  models "nemotron-3-ultra" {
976
1147
  routing-family "factory"
977
1148
  upstream-rotation "baseten" "fireworks"
@@ -981,6 +1152,34 @@ provider "factory-droid" {
981
1152
  thinking-requires-effort #false
982
1153
  thinking-default-level "high"
983
1154
  }
1155
+ models "muse-spark-open" {
1156
+ routing-family "factory"
1157
+ upstream-rotation "baseten"
1158
+ credit-rates { input 0.5; output 3.4; cache-read 0.12 }
1159
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
1160
+ thinking-requires-effort #true
1161
+ thinking-default-level "high"
1162
+ entitlement { feature-flag "muse_spark_open" }
1163
+ }
1164
+ // Factory serves no `minimal` rung, so this ladder outranks the Meta class ladder.
1165
+ models "muse-spark-1.2" priority=1 {
1166
+ routing-family "factory"
1167
+ upstream-rotation "fireworks"
1168
+ credit-rates { input 0.5; output 3.4; cache-read 0.12 }
1169
+ list-price-from "meta"
1170
+ thinking-efforts "low" "medium" "high" "xhigh"
1171
+ thinking-requires-effort #true
1172
+ thinking-default-level "high"
1173
+ }
1174
+ models "beam-1.0" {
1175
+ routing-family "factory"
1176
+ upstream-rotation "baseten"
1177
+ credit-rates { input 0.52; output 3.3077 }
1178
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
1179
+ thinking-requires-effort #true
1180
+ thinking-default-level "high"
1181
+ entitlement { feature-flag "beam_1_0" }
1182
+ }
984
1183
  models "deepseek-v4.1-flash-1017" {
985
1184
  routing-family "factory"
986
1185
  upstream-rotation "fireworks" "baseten" "databricks"
@@ -1029,7 +1228,6 @@ provider "factory-droid" {
1029
1228
  thinking-efforts "high"
1030
1229
  thinking-requires-effort #true
1031
1230
  thinking-default-level "high"
1032
- entitlement { feature-flag "minimax_m3" }
1033
1231
  }
1034
1232
  models "grok-4.7" {
1035
1233
  routing-family "xai"
@@ -1109,8 +1307,8 @@ provider "factory-droid" {
1109
1307
  // Native declares every Responses tool `strict: false`; the field must reach the wire.
1110
1308
  supports-strict-mode #true
1111
1309
  }
1112
- models "glm-*" "kimi-*" "deepseek-*" "nemotron-*" "inkling" "mistral-medium-3.5" "mistral-large-4" "qwen3.8-max" \
1113
- "minimax-m3" {
1310
+ models "glm-*" "kimi-*" "deepseek-*" "nemotron-*" "muse-spark-open" "muse-spark-1.2" "beam-1.0" "inkling" \
1311
+ "mistral-medium-3.5" "mistral-large-4" "qwen3.8-max" "minimax-m3" {
1114
1312
  clamp-output-to-model-max #true
1115
1313
  completions-reasoning-mode "none"
1116
1314
  completions-reasoning-history "omit"
@@ -1136,6 +1334,10 @@ provider "factory-droid" {
1136
1334
  completions-reasoning-mode "opt-in"
1137
1335
  }
1138
1336
  }
1337
+ // Beam tolerates tool-call turns that arrive without reasoning.
1338
+ models "beam-1.0" {
1339
+ completions-allow-missing-thinking #true
1340
+ }
1139
1341
  models "deepseek-*" {
1140
1342
  on-upstream "baseten" priority=10 {
1141
1343
  completions-reasoning-mode "forced-on"
@@ -1241,7 +1443,7 @@ provider "factory-droid" {
1241
1443
  fast-mode #true
1242
1444
  }
1243
1445
  // Refusals retry server-side only on the first-party Anthropic upstream.
1244
- models "claude-fable-5" "claude-fable-5.1" {
1446
+ models "claude-fable-5" "claude-fable-5.1" "claude-opus-5-5" {
1245
1447
  on-upstream "anthropic" {
1246
1448
  server-side-fallback-models "claude-opus-5"
1247
1449
  }
@@ -1283,7 +1485,8 @@ provider "factory-droid" {
1283
1485
  }
1284
1486
  // GPT models whose ladder has an Off/None rung send the literal `none`
1285
1487
  // tier on every upstream.
1286
- models "gpt-5.2" "gpt-5.6-sol" "gpt-5.6-sol-fast" "gpt-5.6-terra" "gpt-5.6-luna" "gpt-6-sol" "gpt-6-luna" {
1488
+ models "gpt-5.2" "gpt-5.6-sol" "gpt-5.6-sol-fast" "gpt-5.6-terra" "gpt-5.6-luna" "gpt-6.1-terra" "gpt-6-sol" \
1489
+ "gpt-6-sol-fast" "gpt-6-luna" "gpt-6-luna-fast" {
1287
1490
  reasoning-disable-mode "none-effort"
1288
1491
  }
1289
1492
  models "gpt-*" {
@@ -1306,6 +1509,9 @@ provider "factory-droid" {
1306
1509
  models "gpt-*-fast" {
1307
1510
  responses-service-tier "priority"
1308
1511
  }
1512
+ models "gpt-*-ultrafast" {
1513
+ responses-service-tier "ultrafast"
1514
+ }
1309
1515
  models "grok-*" {
1310
1516
  supports-reasoning-summary #false
1311
1517
  }
@@ -0,0 +1,35 @@
1
+ // Provider-wire compat for "modular". Modular Cloud serves open models on an
2
+ // OpenAI-compatible API. The provider is catalog-only: models, prices, and
3
+ // limits come from the models.dev `modular` entry. Reasoning controls differ
4
+ // per model and were measured against the API.
5
+
6
+ provider "modular" {
7
+ default-model "google/gemma-4-31b-it"
8
+ env "MODULAR_API_KEY"
9
+
10
+ thinking-mode "effort"
11
+ // The API takes OpenRouter's `reasoning` object for every model, so a model
12
+ // models.dev adds later works without its own block: on sends
13
+ // `reasoning.effort`, off sends `reasoning.enabled = false`.
14
+ thinking-format "openrouter"
15
+
16
+ // MiniMax M3.1 Flash takes a nested `reasoning.effort` and always thinks:
17
+ // `reasoning.enabled = false` still returns reasoning tokens.
18
+ models "MiniMaxAI/MiniMax-M3.1-Flash" {
19
+ thinking-requires-effort #true
20
+ thinking-efforts "low" "medium" "high" "xhigh" "max"
21
+ }
22
+ // MiniMax M3 and Gemma 4 31B switch reasoning with `reasoning.enabled` and
23
+ // ignore any effort, so the ladder is one on-rung beside off: off sends
24
+ // `enabled: false`, and on replaces the effort with `enabled: true`.
25
+ models "minimax/minimax-m3" "google/gemma-4-31b-it" {
26
+ thinking-efforts "high"
27
+ when-thinking {
28
+ extra-body {
29
+ reasoning {
30
+ enabled #true
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
@@ -28,6 +28,8 @@ provider "sambanova" {
28
28
  // (https://docs.sambanova.ai/docs/api-reference/chat-completions/create-chat-based-completion).
29
29
  thinking-mode "effort"
30
30
  thinking-format "openai"
31
+ // Replay the streamed `reasoning` field so turn-N prompts hit the gateway's prefix cache.
32
+ replay-reasoning-content #true
31
33
  class "gpt-oss" {
32
34
  thinking-efforts "low" "medium" "high"
33
35
  thinking-upgrade-neutral #true
@@ -0,0 +1,179 @@
1
+ // Provider-wire compat for "scaleway": Scaleway Generative APIs, an
2
+ // OpenAI-compatible gateway at https://api.scaleway.ai/v1 serving serverless
3
+ // open-weight chat models. Verified live 2026-10-21: /v1/models returns bare
4
+ // OpenAI rows with no capability metadata, reasoning traces stream back on
5
+ // the message `reasoning` field, and reasoning_effort accepts `max`, `xhigh`,
6
+ // and `none` (the request-schema enum is stale; `none` answers with
7
+ // reasoning_tokens 0), so the ladders below follow the model cards, not the
8
+ // schema.
9
+ // Docs: https://www.scaleway.com/en/docs/generative-apis/reference-content/supported-models/
10
+ // Pricing (EUR/Mtok, pre-tax): https://www.scaleway.com/en/pricing/model-as-a-service/
11
+
12
+ provider "scaleway" {
13
+ default-model "glm-5.3"
14
+ env "SCW_SECRET_KEY" "SCW_API_KEY"
15
+ // The key-protected `/v1/models` roster is the serverless catalog: a
16
+ // successful fetch prunes bundled rows Scaleway has retired (glm-5.2 is
17
+ // routed to glm-5.3 after 2026-11-16). Same-id rows on other hosts carry
18
+ // other deployments' limits and modalities (zai serves glm-5.3 at
19
+ // 1M/131k), so the generator must never backfill from them.
20
+ dynamic-models-authoritative #true
21
+ skip-cross-provider-reference-fills #true
22
+ discovery label="Scaleway"
23
+
24
+ // Documented serverless catalog (supported-models + pricing pages,
25
+ // 2026-11-02). `/v1/models` carries ids only, so these rows are the
26
+ // bundle in every regeneration and outrank the bare discovered rows; at
27
+ // runtime they are the reference discovery merges names, modalities,
28
+ // prices, and limits from. Prices are EUR list rates converted at the
29
+ // 2026-10-21 ECB reference rate (1 EUR = 1.1234 USD); Scaleway publishes
30
+ // no cache-write rate and cache-read only where listed. Limits read the
31
+ // documented "k" as 1,000 tokens, never overstating a serverless cap.
32
+ seed api="openai-completions" base-url="https://api.scaleway.ai/v1" bundle="always" precedence="seed" {
33
+ model "glm-5.3" name="GLM 5.3" {
34
+ reasoning #true
35
+ input "text"
36
+ cost input=2.02 output=6.18 cache-read=0 cache-write=0
37
+ limits context=256000 max-tokens=16000
38
+ }
39
+ model "glm-5.2" name="GLM 5.2" {
40
+ reasoning #true
41
+ input "text"
42
+ cost input=2.02 output=6.18 cache-read=0 cache-write=0
43
+ limits context=256000 max-tokens=16000
44
+ }
45
+ model "deepseek-v4.1-flash" name="DeepSeek V4.1 Flash" {
46
+ reasoning #true
47
+ input "text" "image"
48
+ cost input=0.67 output=2.02 cache-read=0.13 cache-write=0
49
+ limits context=256000 max-tokens=32000
50
+ }
51
+ model "deepseek-v4-flash-0731" name="DeepSeek V4 Flash 0731" {
52
+ reasoning #true
53
+ input "text"
54
+ cost input=0.45 output=0.9 cache-read=0.09 cache-write=0
55
+ limits context=256000 max-tokens=32000
56
+ }
57
+ model "qwen3.8-27b" name="Qwen3.8 27B" {
58
+ reasoning #true
59
+ input "text" "image"
60
+ cost input=0.67 output=3.71 cache-read=0.13 cache-write=0
61
+ limits context=256000 max-tokens=32000
62
+ }
63
+ model "qwen3.6-35b-a3b" name="Qwen3.6 35B A3B" {
64
+ reasoning #true
65
+ input "text" "image"
66
+ cost input=0.28 output=1.69 cache-read=0 cache-write=0
67
+ limits context=256000 max-tokens=32000
68
+ }
69
+ model "qwen3.5-397b-a17b" name="Qwen3.5 397B A17B" {
70
+ reasoning #true
71
+ input "text" "image"
72
+ cost input=0.67 output=4.04 cache-read=0 cache-write=0
73
+ limits context=250000 max-tokens=16000
74
+ }
75
+ model "qwen3-235b-a22b-instruct-2507" name="Qwen3 235B A22B Instruct 2507" {
76
+ reasoning #false
77
+ input "text"
78
+ cost input=0.84 output=2.53 cache-read=0 cache-write=0
79
+ limits context=250000 max-tokens=16000
80
+ }
81
+ model "gemma-4-26b-a4b-it" name="Gemma 4 26B A4B IT" {
82
+ reasoning #true
83
+ input "text" "image"
84
+ cost input=0.28 output=0.56 cache-read=0 cache-write=0
85
+ limits context=256000 max-tokens=32000
86
+ }
87
+ model "mistral-medium-3.5-128b" name="Mistral Medium 3.5 128B" {
88
+ reasoning #true
89
+ input "text" "image"
90
+ cost input=1.69 output=8.43 cache-read=0 cache-write=0
91
+ limits context=180000 max-tokens=16000
92
+ }
93
+ model "mistral-small-3.2-24b-instruct-2506" name="Mistral Small 3.2 24B Instruct 2506" {
94
+ reasoning #false
95
+ input "text" "image"
96
+ cost input=0.17 output=0.39 cache-read=0 cache-write=0
97
+ limits context=128000 max-tokens=32000
98
+ }
99
+ model "llama-3.3-70b-instruct" name="Llama 3.3 70B Instruct" {
100
+ reasoning #false
101
+ input "text"
102
+ cost input=1.01 output=1.01 cache-read=0 cache-write=0
103
+ limits context=100000 max-tokens=16000
104
+ }
105
+ }
106
+
107
+ thinking-mode "effort"
108
+
109
+ // Scaleway takes OpenAI reasoning_effort on every lineage it serves —
110
+ // never Qwen-native enable_thinking — and documents `none` as the off
111
+ // value on every reasoning model it serves over Chat Completions, so
112
+ // thinking-off must send `none`: omitting the field would fall back to
113
+ // the server default (medium) and keep reasoning on.
114
+ class "qwen" {
115
+ thinking-format "openai"
116
+ reasoning-disable-mode "none-effort"
117
+ }
118
+ class "glm" {
119
+ reasoning-disable-mode "none-effort"
120
+ }
121
+ class "deepseek" {
122
+ reasoning-disable-mode "none-effort"
123
+ }
124
+ class "gemma" {
125
+ reasoning-disable-mode "none-effort"
126
+ }
127
+ class "mistral" {
128
+ reasoning-disable-mode "none-effort"
129
+ }
130
+
131
+ // The ladders below are cascade rules rather than seed thinking so they
132
+ // also reach bare discovered rows that have no bundled reference yet.
133
+ // GLM 5.3 diverges from the lineage glob (classes/glm.kdl priority=10:
134
+ // low/high/max, thinking cannot be disabled): Scaleway's card documents
135
+ // none/low/high/max and `none` is verified to disable reasoning, so this
136
+ // residue outranks the glob; the default effort stays the lineage's `max`.
137
+ models "glm-5.3" priority=20 {
138
+ thinking-upgrade-neutral #true
139
+ thinking-efforts "low" "high" "max"
140
+ thinking-requires-effort #false
141
+ }
142
+ // GLM 5.2 documents none/high/max, dropping the lineage's
143
+ // minimal/low/medium tiers.
144
+ models "glm-5.2" priority=20 {
145
+ thinking-upgrade-neutral #true
146
+ thinking-efforts "high" "max"
147
+ thinking-default-level "max"
148
+ thinking-requires-effort #false
149
+ }
150
+ // DeepSeek Flash ladders match the lineage's wire-exact low/high/max;
151
+ // `none` is documented on both cards. Restated here because the
152
+ // vendor-suffixed -v4.1-flash and dated -0731 ids have no same-id census
153
+ // row the family ladder could ride in on.
154
+ models "deepseek-v4.1-flash" "deepseek-v4-flash-0731" {
155
+ thinking-upgrade-neutral #true
156
+ thinking-efforts "low" "high" "max"
157
+ }
158
+ // Qwen cards: 3.8 keeps its native xhigh tier; 3.6 and 3.5 stop at high.
159
+ models "qwen3.8-27b" {
160
+ thinking-upgrade-neutral #true
161
+ thinking-efforts "low" "medium" "xhigh"
162
+ }
163
+ models "qwen3.6-35b-a3b" "qwen3.5-397b-a17b" {
164
+ thinking-upgrade-neutral #true
165
+ thinking-efforts "low" "medium" "high"
166
+ }
167
+ // Gemma 4 documents none/low/medium/high.
168
+ models "gemma-4-26b-a4b-it" {
169
+ thinking-upgrade-neutral #true
170
+ thinking-efforts "low" "medium" "high"
171
+ }
172
+ // Mistral Medium 3.5 documents none/high only; the server default
173
+ // (medium) is not a valid tier, so the omp default pins high.
174
+ models "mistral-medium-3.5-128b" {
175
+ thinking-upgrade-neutral #true
176
+ thinking-efforts "high"
177
+ thinking-default-level "high"
178
+ }
179
+ }