@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.
- package/CHANGELOG.md +30 -0
- package/dist/types/compat/auth-ids.d.ts +2 -2
- package/dist/types/compat/catalog-policy.d.ts +6 -4
- package/dist/types/compat/factory-droid.d.ts +7 -1
- package/dist/types/compat/provider-ids.d.ts +1 -1
- package/dist/types/compat/resolve.d.ts +1 -1
- package/dist/types/compat/revision.d.ts +2 -0
- package/dist/types/compat/server-side-fallback.d.ts +6 -4
- package/dist/types/compat/types.d.ts +3 -1
- package/dist/types/discovery/openai-compatible.d.ts +6 -0
- package/dist/types/models.d.ts +16 -0
- package/dist/types/pricing.d.ts +66 -6
- package/dist/types/provider-models/openai-compat.d.ts +18 -0
- package/dist/types/types.d.ts +11 -5
- package/dist/types/utils.d.ts +8 -0
- package/package.json +4 -4
- package/src/compat/auth-ids.ts +5 -0
- package/src/compat/axes.ts +5 -2
- package/src/compat/catalog-policy.ts +14 -10
- package/src/compat/collapse.ts +1 -1
- package/src/compat/factory-droid.ts +9 -1
- package/src/compat/provider-ids.ts +2 -0
- package/src/compat/resolve.ts +4 -2
- package/src/compat/revision.ts +10 -0
- package/src/compat/rules/README.md +2 -0
- package/src/compat/rules/auth/_order.kdl +1 -1
- package/src/compat/rules/auth/mistral.kdl +4 -0
- package/src/compat/rules/auth/modular.kdl +9 -0
- package/src/compat/rules/auth/scaleway.kdl +17 -0
- package/src/compat/rules/providers/factory-droid.kdl +219 -13
- package/src/compat/rules/providers/modular.kdl +35 -0
- package/src/compat/rules/providers/sambanova.kdl +2 -0
- package/src/compat/rules/providers/scaleway.kdl +179 -0
- package/src/compat/rules/runtime/behavior.kdl +13 -0
- package/src/compat/rules.json +1 -1
- package/src/compat/server-side-fallback.ts +7 -5
- package/src/compat/types.ts +3 -1
- package/src/discovery/codex.ts +2 -9
- package/src/discovery/factory-droid.ts +35 -11
- package/src/discovery/openai-compatible.ts +1 -1
- package/src/model-cache.ts +32 -58
- package/src/model-catalog-format.ts +5 -8
- package/src/model-manager.ts +27 -121
- package/src/model-tokenizer.ts +13 -12
- package/src/models.json +1 -1
- package/src/models.ts +32 -1
- package/src/pricing.ts +59 -94
- package/src/provider-models/descriptors.ts +2 -0
- package/src/provider-models/openai-compat.ts +60 -59
- package/src/types.ts +11 -4
- package/src/utils.ts +18 -0
- 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 {
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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" "
|
|
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 {
|
|
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 {
|
|
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-*" "
|
|
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-
|
|
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
|
+
}
|