@blockrun/clawrouter 0.12.257 → 0.12.259
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 +34 -30
- package/dist/cli.js +538 -142
- package/dist/index.js +538 -142
- package/dist/router/index.js +43 -30
- package/docs/9-free-ai-models-zero-cost-blockrun.md +79 -86
- package/docs/anthropic-cost-savings.md +4 -4
- package/docs/anthropic-third-party-harness-changes.md +4 -4
- package/docs/clawrouter-cuts-llm-api-costs-500x.md +1 -1
- package/docs/clawrouter-vs-openrouter-llm-routing-comparison.md +4 -4
- package/docs/features.md +9 -8
- package/docs/routing-profiles.md +27 -23
- package/docs/subscription-failover.md +1 -1
- package/package.json +3 -3
- package/scripts/benchmark.py +2 -2
- package/scripts/reinstall.sh +7 -5
- package/skills/clawrouter/SKILL.md +4 -4
- package/src/top-models.json +11 -4
package/dist/cli.js
CHANGED
|
@@ -35033,6 +35033,13 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
35033
35033
|
supportsTools: true,
|
|
35034
35034
|
supportsVision: true
|
|
35035
35035
|
},
|
|
35036
|
+
"cohere/north-mini-code": {
|
|
35037
|
+
// supportsTools: not probed — fails closed
|
|
35038
|
+
contextWindow: 256e3,
|
|
35039
|
+
maxOutputTokens: 16384,
|
|
35040
|
+
supportsTools: false,
|
|
35041
|
+
supportsVision: false
|
|
35042
|
+
},
|
|
35036
35043
|
"deepseek/deepseek-chat": {
|
|
35037
35044
|
contextWindow: 1048576,
|
|
35038
35045
|
maxOutputTokens: 65536,
|
|
@@ -35123,8 +35130,15 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
35123
35130
|
supportsTools: true,
|
|
35124
35131
|
supportsVision: true
|
|
35125
35132
|
},
|
|
35126
|
-
"nvidia/
|
|
35127
|
-
// supportsTools:
|
|
35133
|
+
"nvidia/llama-3.2-11b-vision": {
|
|
35134
|
+
// supportsTools: not probed — fails closed
|
|
35135
|
+
contextWindow: 128e3,
|
|
35136
|
+
maxOutputTokens: 16384,
|
|
35137
|
+
supportsTools: false,
|
|
35138
|
+
supportsVision: true
|
|
35139
|
+
},
|
|
35140
|
+
"nvidia/nemotron-3-nano-30b": {
|
|
35141
|
+
// supportsTools: not probed — fails closed
|
|
35128
35142
|
contextWindow: 131072,
|
|
35129
35143
|
maxOutputTokens: 16384,
|
|
35130
35144
|
supportsTools: false,
|
|
@@ -35136,21 +35150,16 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
35136
35150
|
supportsTools: false,
|
|
35137
35151
|
supportsVision: true
|
|
35138
35152
|
},
|
|
35139
|
-
"nvidia/nemotron-
|
|
35140
|
-
// supportsTools:
|
|
35141
|
-
contextWindow:
|
|
35142
|
-
maxOutputTokens: 16384,
|
|
35143
|
-
supportsTools: false,
|
|
35144
|
-
supportsVision: true
|
|
35145
|
-
},
|
|
35146
|
-
"nvidia/nemotron-nano-9b-v2": {
|
|
35147
|
-
contextWindow: 131072,
|
|
35153
|
+
"nvidia/nemotron-3-ultra-550b": {
|
|
35154
|
+
// supportsTools: not probed — fails closed
|
|
35155
|
+
contextWindow: 1e6,
|
|
35148
35156
|
maxOutputTokens: 16384,
|
|
35149
35157
|
supportsTools: false,
|
|
35150
35158
|
supportsVision: false
|
|
35151
35159
|
},
|
|
35152
|
-
"nvidia/
|
|
35153
|
-
|
|
35160
|
+
"nvidia/nemotron-3.5-lightning": {
|
|
35161
|
+
// supportsTools: not probed — fails closed
|
|
35162
|
+
contextWindow: 1e6,
|
|
35154
35163
|
maxOutputTokens: 16384,
|
|
35155
35164
|
supportsTools: false,
|
|
35156
35165
|
supportsVision: false
|
|
@@ -35210,13 +35219,6 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
35210
35219
|
supportsTools: false,
|
|
35211
35220
|
supportsVision: true
|
|
35212
35221
|
},
|
|
35213
|
-
"openai/gpt-5.3": {
|
|
35214
|
-
// supportsTools: gateway unavailable at probe time — fails closed
|
|
35215
|
-
contextWindow: 128e3,
|
|
35216
|
-
maxOutputTokens: 128e3,
|
|
35217
|
-
supportsTools: false,
|
|
35218
|
-
supportsVision: true
|
|
35219
|
-
},
|
|
35220
35222
|
"openai/gpt-5.3-codex": {
|
|
35221
35223
|
// supportsTools: gateway unavailable at probe time — fails closed; override: 2026-08-29 probe: every request (6 plain + 3 tool attempts) returned a gateway 500, so the probe measured an incident, not the model. Codex's function calling is established by the 2026-07 Terminal-Bench / tau2 calibration trajectories in portfolio.ts. Hosts observing the 500s should drop it with RouterOptions.unavailableModels rather than this snapshot claiming the model cannot call tools.
|
|
35222
35224
|
contextWindow: 4e5,
|
|
@@ -35322,6 +35324,13 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
35322
35324
|
supportsTools: true,
|
|
35323
35325
|
supportsVision: false
|
|
35324
35326
|
},
|
|
35327
|
+
"poolside/laguna-xs-2.1": {
|
|
35328
|
+
// supportsTools: not probed — fails closed
|
|
35329
|
+
contextWindow: 131072,
|
|
35330
|
+
maxOutputTokens: 16384,
|
|
35331
|
+
supportsTools: false,
|
|
35332
|
+
supportsVision: false
|
|
35333
|
+
},
|
|
35325
35334
|
"qwen/qwen3.7-flash": {
|
|
35326
35335
|
contextWindow: 1e6,
|
|
35327
35336
|
maxOutputTokens: 65536,
|
|
@@ -37237,8 +37246,8 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
37237
37246
|
// $0.20/$1.25, 1M ctx
|
|
37238
37247
|
"google/gemini-2.5-flash-lite",
|
|
37239
37248
|
// $0.10/$0.40
|
|
37240
|
-
"nvidia/
|
|
37241
|
-
// FREE backstop — NVIDIA free tier (probed 2026-08-
|
|
37249
|
+
"nvidia/nemotron-3.5-lightning"
|
|
37250
|
+
// FREE backstop — NVIDIA free tier (probed 2026-08-30)
|
|
37242
37251
|
]
|
|
37243
37252
|
},
|
|
37244
37253
|
MEDIUM: {
|
|
@@ -37327,15 +37336,19 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
37327
37336
|
// Eco tier configs - absolute cheapest (blockrun/eco)
|
|
37328
37337
|
ecoTiers: {
|
|
37329
37338
|
SIMPLE: {
|
|
37330
|
-
primary: "nvidia/
|
|
37331
|
-
// FREE — NVIDIA free tier flagship
|
|
37339
|
+
primary: "nvidia/nemotron-3.5-lightning",
|
|
37340
|
+
// FREE — NVIDIA free tier flagship, 1M ctx
|
|
37332
37341
|
fallback: [
|
|
37333
|
-
"nvidia/nemotron-nano-
|
|
37334
|
-
// FREE —
|
|
37342
|
+
"nvidia/nemotron-3-nano-30b",
|
|
37343
|
+
// FREE — fastest free model (~121 tok/s)
|
|
37335
37344
|
// The free head keeps rotting with NVIDIA's hosting (deepseek-v4-flash
|
|
37336
37345
|
// 410 2026-08-12, seed-oss-36b 410 2026-08-03, gpt-oss-120b/20b 400
|
|
37337
|
-
// 2026-08-21
|
|
37338
|
-
//
|
|
37346
|
+
// 2026-08-21, and on 2026-08-30 FOUR of the five visible free models at
|
|
37347
|
+
// once — step-3.7-flash, nemotron-nano-9b-v2 and nemotron-nano-12b-v2-vl
|
|
37348
|
+
// all 410, mistral-nemotron hung). Each retirement retargets the two
|
|
37349
|
+
// free rungs to the current free tier; the paid rungs below never move.
|
|
37350
|
+
// The head follows blockrun's own redirect of the model it replaces, so
|
|
37351
|
+
// the router and the gateway never name different models.
|
|
37339
37352
|
"google/gemini-2.5-flash-lite",
|
|
37340
37353
|
// $0.10/$0.40 — cheapest paid rung
|
|
37341
37354
|
"zai/glm-5.3-flash",
|
|
@@ -37479,7 +37492,7 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
37479
37492
|
// strongest open-weight reasoner
|
|
37480
37493
|
"deepseek/deepseek-chat",
|
|
37481
37494
|
// Cheap, reliable
|
|
37482
|
-
"nvidia/
|
|
37495
|
+
"nvidia/nemotron-3.5-lightning"
|
|
37483
37496
|
// NVIDIA free ultimate backstop
|
|
37484
37497
|
]
|
|
37485
37498
|
},
|
|
@@ -37583,7 +37596,7 @@ ${value.slice(-(scanLimit - prefixLength))}`;
|
|
|
37583
37596
|
// retail high-risk 3/3
|
|
37584
37597
|
"deepseek/deepseek-chat",
|
|
37585
37598
|
// cheap, reliable
|
|
37586
|
-
"nvidia/
|
|
37599
|
+
"nvidia/nemotron-3.5-lightning"
|
|
37587
37600
|
// NVIDIA free ultimate backstop
|
|
37588
37601
|
]
|
|
37589
37602
|
},
|
|
@@ -37665,22 +37678,29 @@ var init_top_models = __esm({
|
|
|
37665
37678
|
"xai/grok-4.5",
|
|
37666
37679
|
"xai/grok-4.3",
|
|
37667
37680
|
"xai/grok-build-0.1",
|
|
37681
|
+
"zai/glm-5.3",
|
|
37682
|
+
"zai/glm-5.3-flash",
|
|
37668
37683
|
"zai/glm-5.2",
|
|
37669
37684
|
"zai/glm-5.1",
|
|
37670
37685
|
"zai/glm-5-turbo",
|
|
37671
37686
|
"zai/glm-5",
|
|
37687
|
+
"xiaomi/mimo-v2.5",
|
|
37672
37688
|
"minimax/minimax-m3",
|
|
37673
37689
|
"minimax/minimax-m2.7",
|
|
37674
37690
|
"moonshot/kimi-k3",
|
|
37675
37691
|
"qwen/qwen3.7-max",
|
|
37692
|
+
"qwen/qwen3.8-flash",
|
|
37693
|
+
"deepseek/deepseek-v4-flash-vision-exp",
|
|
37676
37694
|
"deepseek/deepseek-v4-pro",
|
|
37677
37695
|
"deepseek/deepseek-chat",
|
|
37678
37696
|
"deepseek/deepseek-reasoner",
|
|
37697
|
+
"free/nemotron-3.5-lightning",
|
|
37698
|
+
"free/nemotron-3-nano-30b",
|
|
37699
|
+
"free/laguna-xs-2.1",
|
|
37700
|
+
"free/north-mini-code",
|
|
37679
37701
|
"free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
37680
|
-
"free/
|
|
37681
|
-
"free/
|
|
37682
|
-
"free/nemotron-nano-9b-v2",
|
|
37683
|
-
"free/nemotron-nano-12b-v2-vl"
|
|
37702
|
+
"free/nemotron-3-ultra-550b",
|
|
37703
|
+
"free/llama-3.2-11b-vision"
|
|
37684
37704
|
];
|
|
37685
37705
|
}
|
|
37686
37706
|
});
|
|
@@ -37932,6 +37952,19 @@ var init_models = __esm({
|
|
|
37932
37952
|
// `kimi` on K2.7. (`grok` WAS promoted to 4.5, but only after the cost
|
|
37933
37953
|
// tradeoff was argued explicitly; there's no such case for qwen yet.)
|
|
37934
37954
|
"qwen3.7-max": "qwen/qwen3.7-max",
|
|
37955
|
+
// Qwen3.8 Flash — newer generation than the whole 3.7 line, and cheaper than
|
|
37956
|
+
// the 3.7-plus tier it beats. Bare `qwen` stays UNBOUND (every other qwen*
|
|
37957
|
+
// shorthand resolves to a free model, so binding the short name to a paid
|
|
37958
|
+
// flagship would bill callers expecting free).
|
|
37959
|
+
"qwen3.8-flash": "qwen/qwen3.8-flash",
|
|
37960
|
+
"qwen3-8-flash": "qwen/qwen3.8-flash",
|
|
37961
|
+
"qwen-vision": "qwen/qwen3.8-flash",
|
|
37962
|
+
// DeepSeek's first image-capable SKU. Bare `deepseek` stays on deepseek-chat.
|
|
37963
|
+
"deepseek-vision": "deepseek/deepseek-v4-flash-vision-exp",
|
|
37964
|
+
"v4-flash-vision": "deepseek/deepseek-v4-flash-vision-exp",
|
|
37965
|
+
// Xiaomi MiMo V2.5 — the natively multimodal SKU, distinct from mimo-v2.5-pro
|
|
37966
|
+
// (text-only upstream). `mimo` stays on the Pro entry it has always named.
|
|
37967
|
+
"mimo-vision": "xiaomi/mimo-v2.5",
|
|
37935
37968
|
"qwen-3.7-max": "qwen/qwen3.7-max",
|
|
37936
37969
|
"qwen3-7-max": "qwen/qwen3.7-max",
|
|
37937
37970
|
// Plus/Flash tiers (2026-08-03) — explicit pins, same rule as Max.
|
|
@@ -37946,7 +37979,15 @@ var init_models = __esm({
|
|
|
37946
37979
|
hunyuan: "tencent/hy3",
|
|
37947
37980
|
mimo: "xiaomi/mimo-v2.5-pro",
|
|
37948
37981
|
"mimo-v2.5-pro": "xiaomi/mimo-v2.5-pro",
|
|
37949
|
-
|
|
37982
|
+
// RETARGETED 2026-08-30, Pro -> the real thing. This key used to point at
|
|
37983
|
+
// `xiaomi/mimo-v2.5-pro`, which was harmless while no model owned the name —
|
|
37984
|
+
// but blockrun then listed an actual `xiaomi/mimo-v2.5`, a DIFFERENT and
|
|
37985
|
+
// natively-multimodal SKU at $0.14/$0.28 against Pro's $0.435/$0.87. Leaving
|
|
37986
|
+
// it would have billed 3x for the text-only model when the caller named the
|
|
37987
|
+
// cheaper multimodal one. (The key itself is safe: it is not equal to the
|
|
37988
|
+
// catalog id, so it shadows nothing — the rule that bans `opus-5`-style keys
|
|
37989
|
+
// does not apply to a bare shorthand.)
|
|
37990
|
+
"mimo-v2.5": "xiaomi/mimo-v2.5",
|
|
37950
37991
|
xiaomi: "xiaomi/mimo-v2.5-pro",
|
|
37951
37992
|
// Google
|
|
37952
37993
|
// gemini-3-pro-preview delisted by Google 2026-06-06 — mirror the gateway
|
|
@@ -37993,14 +38034,20 @@ var init_models = __esm({
|
|
|
37993
38034
|
"xai/grok-3-fast": "xai/grok-4-fast-reasoning",
|
|
37994
38035
|
// delisted (too expensive)
|
|
37995
38036
|
// NVIDIA — backward compat aliases (nvidia/xxx → free/xxx)
|
|
37996
|
-
// Default free model is
|
|
37997
|
-
// opens the eco SIMPLE tier on. It replaced
|
|
37998
|
-
//
|
|
37999
|
-
//
|
|
38000
|
-
//
|
|
38001
|
-
//
|
|
38002
|
-
//
|
|
38003
|
-
|
|
38037
|
+
// Default free model is nemotron-3.5-lightning — the same model
|
|
38038
|
+
// @blockrun/router-core opens the eco SIMPLE tier on. It replaced
|
|
38039
|
+
// step-3.7-flash on 2026-08-30, when NVIDIA retired FOUR of the five visible
|
|
38040
|
+
// free models in a single sweep (blockrun #448): step-3.7-flash,
|
|
38041
|
+
// nemotron-nano-9b-v2 and nemotron-nano-12b-v2-vl all published 410 Gone, and
|
|
38042
|
+
// mistral-nemotron went the quiet way — still listed, >150s and zero bytes.
|
|
38043
|
+
// We follow blockrun's own retarget of step-3.7-flash rather than picking a
|
|
38044
|
+
// different survivor, so the proxy and the gateway name the same model.
|
|
38045
|
+
//
|
|
38046
|
+
// gpt-oss-120b/20b RECOVERED on the same probe run and are reachable again,
|
|
38047
|
+
// but they stay withheld from blockrun's public catalog over NVIDIA's
|
|
38048
|
+
// prompt-retention terms — so pins that NAME gpt-oss stay routable below and
|
|
38049
|
+
// nothing generic may land on it.
|
|
38050
|
+
nvidia: "free/nemotron-3.5-lightning",
|
|
38004
38051
|
"gpt-120b": "free/gpt-oss-120b",
|
|
38005
38052
|
// names the model itself — gateway redirects
|
|
38006
38053
|
"gpt-20b": "free/gpt-oss-20b",
|
|
@@ -38013,10 +38060,10 @@ var init_models = __esm({
|
|
|
38013
38060
|
// straight to gpt-oss-120b. Ids naming v4-flash itself keep the real id (the
|
|
38014
38061
|
// gateway redirects them); the v3.2/v4-pro ids follow blockrun's retarget
|
|
38015
38062
|
// rather than chaining through a second dead model.
|
|
38016
|
-
"nvidia/deepseek-v3.2": "free/
|
|
38017
|
-
"free/deepseek-v3.2": "free/
|
|
38018
|
-
"nvidia/deepseek-v4-pro": "free/
|
|
38019
|
-
"free/deepseek-v4-pro": "free/
|
|
38063
|
+
"nvidia/deepseek-v3.2": "free/nemotron-3.5-lightning",
|
|
38064
|
+
"free/deepseek-v3.2": "free/nemotron-3.5-lightning",
|
|
38065
|
+
"nvidia/deepseek-v4-pro": "free/nemotron-3.5-lightning",
|
|
38066
|
+
"free/deepseek-v4-pro": "free/nemotron-3.5-lightning",
|
|
38020
38067
|
"nvidia/deepseek-v4-flash": "free/deepseek-v4-flash",
|
|
38021
38068
|
"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38022
38069
|
// qwen3-coder-480b retired (NVIDIA EOL 2026-06-14). Its server-side redirect used
|
|
@@ -38043,16 +38090,16 @@ var init_models = __esm({
|
|
|
38043
38090
|
// Retired free IDs → successors (mirror blockrun's 2026-07-17 redirect map:
|
|
38044
38091
|
// ultra-253b redirects to gpt-oss-120b; the two supers have NO server redirect —
|
|
38045
38092
|
// they stay hidden-but-routable, so their pins pass through to the real ids).
|
|
38046
|
-
"nvidia/nemotron-ultra-253b": "free/
|
|
38093
|
+
"nvidia/nemotron-ultra-253b": "free/nemotron-3.5-lightning",
|
|
38047
38094
|
// mistral-large-3-675b un-retired 2026-06-14, then EOL'd for good 2026-07-28:
|
|
38048
38095
|
// blockrun's re-probe got HTTP 410 Gone from NVIDIA on both passes (baa967b).
|
|
38049
38096
|
// Pin stays routable — the gateway redirects it to gpt-oss-120b.
|
|
38050
38097
|
"nvidia/mistral-large-3-675b": "free/mistral-large-3-675b",
|
|
38051
38098
|
"nvidia/qwen3.5-122b-a10b": "free/qwen3.5-122b-a10b",
|
|
38052
38099
|
// devstral-2-123b died upstream; blockrun redirects it to gpt-oss-120b (2026-07-17 map)
|
|
38053
|
-
"nvidia/devstral-2-123b": "free/
|
|
38054
|
-
"free/nemotron-ultra-253b": "free/
|
|
38055
|
-
"free/devstral-2-123b": "free/
|
|
38100
|
+
"nvidia/devstral-2-123b": "free/nemotron-3.5-lightning",
|
|
38101
|
+
"free/nemotron-ultra-253b": "free/nemotron-3.5-lightning",
|
|
38102
|
+
"free/devstral-2-123b": "free/nemotron-3.5-lightning",
|
|
38056
38103
|
// Explicit-ish pins — dead upstream since 2026-07-28, gateway redirects to gpt-oss-120b
|
|
38057
38104
|
"mistral-large": "free/mistral-large-3-675b",
|
|
38058
38105
|
"mistral-large-3-675b": "free/mistral-large-3-675b",
|
|
@@ -38063,74 +38110,128 @@ var init_models = __esm({
|
|
|
38063
38110
|
// gateway's retarget (blockrun's /free-deepseek page points at gpt-oss-120b
|
|
38064
38111
|
// too). Shorthands naming v4-flash itself stay on the real id — the gateway
|
|
38065
38112
|
// redirects them, same treatment as seed-oss/mistral-large pins.
|
|
38066
|
-
"deepseek-free": "free/
|
|
38067
|
-
"deepseek-v4-pro": "free/
|
|
38113
|
+
"deepseek-free": "free/nemotron-3.5-lightning",
|
|
38114
|
+
"deepseek-v4-pro": "free/nemotron-3.5-lightning",
|
|
38068
38115
|
// free shorthand; pro dead upstream (410)
|
|
38069
38116
|
"deepseek-v4-flash": "free/deepseek-v4-flash",
|
|
38070
|
-
"v4-pro": "free/
|
|
38117
|
+
"v4-pro": "free/nemotron-3.5-lightning",
|
|
38071
38118
|
"v4-flash": "free/deepseek-v4-flash",
|
|
38072
|
-
|
|
38073
|
-
//
|
|
38074
|
-
|
|
38119
|
+
// mistral-nemotron died 2026-08-30 and it was the LAST free Mistral anywhere —
|
|
38120
|
+
// blockrun's own /free-mistral page now says so plainly instead of naming one.
|
|
38121
|
+
// Point the generic shorthand at the free default rather than advertise a
|
|
38122
|
+
// Mistral we cannot serve.
|
|
38123
|
+
"mistral-free": "free/nemotron-3.5-lightning",
|
|
38124
|
+
"glm-free": "free/nemotron-3.5-lightning",
|
|
38075
38125
|
// seed-oss-36b (the prior target) EOL'd 2026-08-03
|
|
38076
|
-
|
|
38077
|
-
//
|
|
38126
|
+
// A free Llama exists again: nemotron-super-49b (Llama-3.3-based) hit 410 on
|
|
38127
|
+
// 2026-08-30, and a 12-model sweep of what NVIDIA still serves found Llama 3.2
|
|
38128
|
+
// 11B Vision as the only one that finishes a real completion.
|
|
38129
|
+
"llama-free": "free/llama-3.2-11b-vision",
|
|
38078
38130
|
// qwen3-coder-480b retired 2026-06-14 → seed-oss-36b, which then EOL'd 2026-08-03.
|
|
38079
38131
|
// Follow the gateway's own retarget rather than chaining to a second dead model.
|
|
38080
|
-
"qwen-coder": "free/
|
|
38132
|
+
"qwen-coder": "free/nemotron-3.5-lightning",
|
|
38081
38133
|
// no live free Qwen; follows the free default
|
|
38082
|
-
"qwen-coder-free": "free/
|
|
38083
|
-
"qwen-thinking": "free/
|
|
38134
|
+
"qwen-coder-free": "free/nemotron-3.5-lightning",
|
|
38135
|
+
"qwen-thinking": "free/nemotron-3.5-lightning",
|
|
38084
38136
|
// qwen3-next died 2026-07-17; no live free Qwen left
|
|
38085
38137
|
"qwen3-next": "free/qwen3-next-80b-a3b-instruct",
|
|
38086
38138
|
// explicit-ish pin — gateway redirects
|
|
38087
38139
|
"qwen3-next-80b": "free/qwen3-next-80b-a3b-instruct",
|
|
38088
|
-
"mistral-small": "free/
|
|
38089
|
-
//
|
|
38140
|
+
"mistral-small": "free/nemotron-3.5-lightning",
|
|
38141
|
+
// no free Mistral left upstream (2026-08-30)
|
|
38090
38142
|
// New live free models (2026-06-14 BlockRun free-tier refresh)
|
|
38091
38143
|
// seed-oss pins name the model itself — kept routable, the gateway redirects them.
|
|
38092
38144
|
"seed-oss": "free/seed-oss-36b",
|
|
38093
38145
|
"seed-oss-36b": "free/seed-oss-36b",
|
|
38094
|
-
|
|
38095
|
-
//
|
|
38146
|
+
// A free coder exists again — two of them, both sub-second. north-mini-code is
|
|
38147
|
+
// the faster (607ms median) and 256K ctx against laguna's 131K.
|
|
38148
|
+
"coder-free": "free/north-mini-code",
|
|
38096
38149
|
"mistral-nemotron": "free/mistral-nemotron",
|
|
38097
38150
|
"step-flash": "free/step-3.7-flash",
|
|
38098
38151
|
"step-3.7-flash": "free/step-3.7-flash",
|
|
38099
|
-
|
|
38100
|
-
|
|
38101
|
-
|
|
38102
|
-
"nano-
|
|
38152
|
+
// nemotron-nano-9b-v2 hit 410 on 2026-08-30; the generic shorthands follow
|
|
38153
|
+
// blockrun's redirect to its replacement, while the 9b-naming pins above stay
|
|
38154
|
+
// on the real id (the gateway resolves them).
|
|
38155
|
+
"nemotron-nano-9b": "free/nemotron-3-nano-30b",
|
|
38156
|
+
"nemotron-nano": "free/nemotron-3-nano-30b",
|
|
38157
|
+
// nemotron-nano-12b-v2-vl hit 410 the same day; vision in, vision out — the
|
|
38158
|
+
// target is blockrun's own, and nano-omni is the only vision-capable free
|
|
38159
|
+
// model left.
|
|
38160
|
+
"nemotron-nano-vl": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38161
|
+
"nano-vl": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38103
38162
|
// Vision-capable free models
|
|
38104
38163
|
"nemotron-omni": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38105
38164
|
"nano-omni": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38165
|
+
// `vision-free` kept for backward compatibility ONLY — it still resolves to
|
|
38166
|
+
// nano-omni, which is the strongest free model, but the free tier no longer
|
|
38167
|
+
// claims working image input on either chain (see the catalog note). Do not
|
|
38168
|
+
// advertise this alias as a way to get free vision.
|
|
38106
38169
|
"vision-free": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
38107
38170
|
// Retired shorthand aliases redirect to live successors. The catch-all target
|
|
38108
38171
|
// moved llama-4-maverick → gpt-oss-120b (2026-07-17) → step-3.7-flash
|
|
38109
|
-
// (2026-08-29
|
|
38110
|
-
nemotron: "free/nemotron-3-
|
|
38172
|
+
// (2026-08-29) → nemotron-3.5-lightning (2026-08-30, blockrun #448).
|
|
38173
|
+
nemotron: "free/nemotron-3.5-lightning",
|
|
38111
38174
|
// strongest live Nemotron
|
|
38112
|
-
"nemotron-ultra": "free/
|
|
38113
|
-
"nemotron-253b": "free/
|
|
38114
|
-
"nemotron-super": "free/
|
|
38115
|
-
"nemotron-49b": "free/
|
|
38116
|
-
"nemotron-120b": "free/
|
|
38117
|
-
devstral: "free/
|
|
38175
|
+
"nemotron-ultra": "free/nemotron-3.5-lightning",
|
|
38176
|
+
"nemotron-253b": "free/nemotron-3.5-lightning",
|
|
38177
|
+
"nemotron-super": "free/nemotron-3.5-lightning",
|
|
38178
|
+
"nemotron-49b": "free/nemotron-3.5-lightning",
|
|
38179
|
+
"nemotron-120b": "free/nemotron-3.5-lightning",
|
|
38180
|
+
devstral: "free/nemotron-3.5-lightning",
|
|
38118
38181
|
// seed-oss-36b EOL'd 2026-08-03
|
|
38119
|
-
"devstral-2": "free/
|
|
38182
|
+
"devstral-2": "free/nemotron-3.5-lightning",
|
|
38120
38183
|
maverick: "free/llama-4-maverick",
|
|
38121
38184
|
// explicit-ish pin — gateway redirects
|
|
38185
|
+
// ── The 2026-08-30 free lineup (blockrun #448) ────────────────────────────
|
|
38186
|
+
// nvidia/* bridges for the four NVIDIA-hosted additions.
|
|
38187
|
+
"nvidia/nemotron-3.5-lightning": "free/nemotron-3.5-lightning",
|
|
38188
|
+
"nvidia/nemotron-3-nano-30b": "free/nemotron-3-nano-30b",
|
|
38189
|
+
"nvidia/nemotron-3-ultra-550b": "free/nemotron-3-ultra-550b",
|
|
38190
|
+
"nvidia/llama-3.2-11b-vision": "free/llama-3.2-11b-vision",
|
|
38191
|
+
// The two non-NVIDIA free models keep the `free/` picker convention; their
|
|
38192
|
+
// real upstream ids are accepted as pins and rewritten in toUpstreamModelId
|
|
38193
|
+
// (see FREE_UPSTREAM_OVERRIDES in proxy.ts).
|
|
38194
|
+
"cohere/north-mini-code": "free/north-mini-code",
|
|
38195
|
+
"poolside/laguna-xs-2.1": "free/laguna-xs-2.1",
|
|
38196
|
+
// Shorthands.
|
|
38197
|
+
lightning: "free/nemotron-3.5-lightning",
|
|
38198
|
+
"nemotron-lightning": "free/nemotron-3.5-lightning",
|
|
38199
|
+
"nemotron-3.5-lightning": "free/nemotron-3.5-lightning",
|
|
38200
|
+
"nano-30b": "free/nemotron-3-nano-30b",
|
|
38201
|
+
"nemotron-nano-30b": "free/nemotron-3-nano-30b",
|
|
38202
|
+
"ultra-550b": "free/nemotron-3-ultra-550b",
|
|
38203
|
+
"nemotron-ultra-550b": "free/nemotron-3-ultra-550b",
|
|
38204
|
+
"llama-vision": "free/llama-3.2-11b-vision",
|
|
38205
|
+
"llama-3.2-vision": "free/llama-3.2-11b-vision",
|
|
38206
|
+
"north-mini": "free/north-mini-code",
|
|
38207
|
+
"north-mini-code": "free/north-mini-code",
|
|
38208
|
+
laguna: "free/laguna-xs-2.1",
|
|
38209
|
+
"laguna-xs": "free/laguna-xs-2.1",
|
|
38122
38210
|
// `free` = the free-tier default. Must equal router-core's ecoTiers.SIMPLE
|
|
38123
38211
|
// primary and the head of proxy.ts FREE_MODELS so `/model free`, the eco
|
|
38124
38212
|
// profile and the budget-cap free fallback all agree on one live model.
|
|
38125
|
-
free: "free/
|
|
38213
|
+
free: "free/nemotron-3.5-lightning",
|
|
38126
38214
|
// MiniMax (minimax → current flagship: M3)
|
|
38127
38215
|
minimax: "minimax/minimax-m3",
|
|
38128
38216
|
"minimax-m3": "minimax/minimax-m3",
|
|
38129
38217
|
"minimax-m2.7": "minimax/minimax-m2.7",
|
|
38130
38218
|
"minimax-m2.5": "minimax/minimax-m2.5",
|
|
38131
38219
|
// Z.AI GLM-5
|
|
38132
|
-
glm
|
|
38133
|
-
//
|
|
38220
|
+
// Bare `glm` PROMOTED 5.2 → 5.3 (2026-08-30). Same rule as `opus` 4.8 → 5: the
|
|
38221
|
+
// cost tradeoff is zero — identical $1.40/$4.40 AND an identical 1M ctx /
|
|
38222
|
+
// 131072 maxOutput envelope, so nothing can bill or truncate differently for a
|
|
38223
|
+
// caller who never typed a version. blockrun's own copy already names glm-5.3
|
|
38224
|
+
// the Z.AI flagship, so leaving `glm` on 5.2 would make the proxy disagree
|
|
38225
|
+
// with the gateway it fronts. `glm-5.2` and every other version pin still
|
|
38226
|
+
// resolve to their own model.
|
|
38227
|
+
glm: "zai/glm-5.3",
|
|
38228
|
+
"glm-5.3": "zai/glm-5.3",
|
|
38229
|
+
"glm-5-3": "zai/glm-5.3",
|
|
38230
|
+
// GLM-5.3 Flash — Z.AI's first natively multimodal GLM-5. Also router-core's
|
|
38231
|
+
// eco MEDIUM and COMPLEX primary.
|
|
38232
|
+
"glm-5.3-flash": "zai/glm-5.3-flash",
|
|
38233
|
+
"glm-5-3-flash": "zai/glm-5.3-flash",
|
|
38234
|
+
"glm-flash": "zai/glm-5.3-flash",
|
|
38134
38235
|
"glm-5.2": "zai/glm-5.2",
|
|
38135
38236
|
"glm-5": "zai/glm-5",
|
|
38136
38237
|
"glm-5.1": "zai/glm-5.1",
|
|
@@ -38192,10 +38293,10 @@ var init_models = __esm({
|
|
|
38192
38293
|
},
|
|
38193
38294
|
{
|
|
38194
38295
|
id: "free",
|
|
38195
|
-
name: "Free \u2192
|
|
38296
|
+
name: "Free \u2192 Nemotron 3.5 Lightning",
|
|
38196
38297
|
inputPrice: 0,
|
|
38197
38298
|
outputPrice: 0,
|
|
38198
|
-
contextWindow:
|
|
38299
|
+
contextWindow: 1e6,
|
|
38199
38300
|
maxOutput: 16384,
|
|
38200
38301
|
reasoning: true
|
|
38201
38302
|
},
|
|
@@ -38236,7 +38337,7 @@ var init_models = __esm({
|
|
|
38236
38337
|
inputPrice: 0.25,
|
|
38237
38338
|
outputPrice: 2,
|
|
38238
38339
|
contextWindow: 2e5,
|
|
38239
|
-
maxOutput:
|
|
38340
|
+
maxOutput: 128e3,
|
|
38240
38341
|
toolCalling: true
|
|
38241
38342
|
},
|
|
38242
38343
|
{
|
|
@@ -38246,7 +38347,7 @@ var init_models = __esm({
|
|
|
38246
38347
|
inputPrice: 0.05,
|
|
38247
38348
|
outputPrice: 0.4,
|
|
38248
38349
|
contextWindow: 128e3,
|
|
38249
|
-
maxOutput:
|
|
38350
|
+
maxOutput: 128e3,
|
|
38250
38351
|
toolCalling: true,
|
|
38251
38352
|
deprecated: true,
|
|
38252
38353
|
fallbackModel: "openai/gpt-5.4-nano"
|
|
@@ -38330,8 +38431,8 @@ var init_models = __esm({
|
|
|
38330
38431
|
id: "openai/gpt-5.6-terra-pro",
|
|
38331
38432
|
name: "GPT-5.6 Terra Pro",
|
|
38332
38433
|
version: "5.6",
|
|
38333
|
-
inputPrice:
|
|
38334
|
-
outputPrice:
|
|
38434
|
+
inputPrice: 2,
|
|
38435
|
+
outputPrice: 12,
|
|
38335
38436
|
contextWindow: 105e4,
|
|
38336
38437
|
maxOutput: 128e3,
|
|
38337
38438
|
reasoning: true,
|
|
@@ -38343,8 +38444,8 @@ var init_models = __esm({
|
|
|
38343
38444
|
id: "openai/gpt-5.6-luna-pro",
|
|
38344
38445
|
name: "GPT-5.6 Luna Pro",
|
|
38345
38446
|
version: "5.6",
|
|
38346
|
-
inputPrice: 0.
|
|
38347
|
-
outputPrice:
|
|
38447
|
+
inputPrice: 0.2,
|
|
38448
|
+
outputPrice: 1.2,
|
|
38348
38449
|
contextWindow: 105e4,
|
|
38349
38450
|
maxOutput: 128e3,
|
|
38350
38451
|
reasoning: true,
|
|
@@ -38407,7 +38508,7 @@ var init_models = __esm({
|
|
|
38407
38508
|
version: "5.4",
|
|
38408
38509
|
inputPrice: 2.5,
|
|
38409
38510
|
outputPrice: 15,
|
|
38410
|
-
contextWindow:
|
|
38511
|
+
contextWindow: 105e4,
|
|
38411
38512
|
maxOutput: 128e3,
|
|
38412
38513
|
reasoning: true,
|
|
38413
38514
|
vision: true,
|
|
@@ -38432,7 +38533,7 @@ var init_models = __esm({
|
|
|
38432
38533
|
version: "5.4",
|
|
38433
38534
|
inputPrice: 30,
|
|
38434
38535
|
outputPrice: 180,
|
|
38435
|
-
contextWindow:
|
|
38536
|
+
contextWindow: 105e4,
|
|
38436
38537
|
maxOutput: 128e3,
|
|
38437
38538
|
reasoning: true,
|
|
38438
38539
|
vision: true,
|
|
@@ -38445,7 +38546,7 @@ var init_models = __esm({
|
|
|
38445
38546
|
inputPrice: 0.2,
|
|
38446
38547
|
outputPrice: 1.25,
|
|
38447
38548
|
contextWindow: 105e4,
|
|
38448
|
-
maxOutput:
|
|
38549
|
+
maxOutput: 128e3,
|
|
38449
38550
|
toolCalling: true
|
|
38450
38551
|
},
|
|
38451
38552
|
// OpenAI GPT-5.3 Family
|
|
@@ -38456,7 +38557,7 @@ var init_models = __esm({
|
|
|
38456
38557
|
inputPrice: 1.75,
|
|
38457
38558
|
outputPrice: 14,
|
|
38458
38559
|
contextWindow: 128e3,
|
|
38459
|
-
maxOutput:
|
|
38560
|
+
maxOutput: 128e3,
|
|
38460
38561
|
reasoning: true,
|
|
38461
38562
|
vision: true,
|
|
38462
38563
|
agentic: true,
|
|
@@ -38482,7 +38583,7 @@ var init_models = __esm({
|
|
|
38482
38583
|
inputPrice: 2,
|
|
38483
38584
|
outputPrice: 8,
|
|
38484
38585
|
contextWindow: 128e3,
|
|
38485
|
-
maxOutput:
|
|
38586
|
+
maxOutput: 32768,
|
|
38486
38587
|
vision: true,
|
|
38487
38588
|
toolCalling: true
|
|
38488
38589
|
},
|
|
@@ -38493,7 +38594,7 @@ var init_models = __esm({
|
|
|
38493
38594
|
inputPrice: 0.4,
|
|
38494
38595
|
outputPrice: 1.6,
|
|
38495
38596
|
contextWindow: 128e3,
|
|
38496
|
-
maxOutput:
|
|
38597
|
+
maxOutput: 32768,
|
|
38497
38598
|
toolCalling: true
|
|
38498
38599
|
},
|
|
38499
38600
|
{
|
|
@@ -38503,7 +38604,7 @@ var init_models = __esm({
|
|
|
38503
38604
|
inputPrice: 0.1,
|
|
38504
38605
|
outputPrice: 0.4,
|
|
38505
38606
|
contextWindow: 128e3,
|
|
38506
|
-
maxOutput:
|
|
38607
|
+
maxOutput: 32768,
|
|
38507
38608
|
toolCalling: true
|
|
38508
38609
|
},
|
|
38509
38610
|
{
|
|
@@ -38569,7 +38670,7 @@ var init_models = __esm({
|
|
|
38569
38670
|
inputPrice: 1.1,
|
|
38570
38671
|
outputPrice: 4.4,
|
|
38571
38672
|
contextWindow: 128e3,
|
|
38572
|
-
maxOutput:
|
|
38673
|
+
maxOutput: 1e5,
|
|
38573
38674
|
reasoning: true,
|
|
38574
38675
|
toolCalling: true
|
|
38575
38676
|
},
|
|
@@ -38580,7 +38681,7 @@ var init_models = __esm({
|
|
|
38580
38681
|
inputPrice: 1.1,
|
|
38581
38682
|
outputPrice: 4.4,
|
|
38582
38683
|
contextWindow: 128e3,
|
|
38583
|
-
maxOutput:
|
|
38684
|
+
maxOutput: 1e5,
|
|
38584
38685
|
reasoning: true,
|
|
38585
38686
|
toolCalling: true
|
|
38586
38687
|
},
|
|
@@ -38593,7 +38694,7 @@ var init_models = __esm({
|
|
|
38593
38694
|
inputPrice: 1,
|
|
38594
38695
|
outputPrice: 5,
|
|
38595
38696
|
contextWindow: 2e5,
|
|
38596
|
-
maxOutput:
|
|
38697
|
+
maxOutput: 64e3,
|
|
38597
38698
|
vision: true,
|
|
38598
38699
|
agentic: true,
|
|
38599
38700
|
toolCalling: true
|
|
@@ -38617,8 +38718,8 @@ var init_models = __esm({
|
|
|
38617
38718
|
version: "4.6",
|
|
38618
38719
|
inputPrice: 3,
|
|
38619
38720
|
outputPrice: 15,
|
|
38620
|
-
contextWindow:
|
|
38621
|
-
maxOutput:
|
|
38721
|
+
contextWindow: 1e6,
|
|
38722
|
+
maxOutput: 128e3,
|
|
38622
38723
|
reasoning: true,
|
|
38623
38724
|
vision: true,
|
|
38624
38725
|
agentic: true,
|
|
@@ -38648,7 +38749,7 @@ var init_models = __esm({
|
|
|
38648
38749
|
inputPrice: 5,
|
|
38649
38750
|
outputPrice: 25,
|
|
38650
38751
|
contextWindow: 2e5,
|
|
38651
|
-
maxOutput:
|
|
38752
|
+
maxOutput: 64e3,
|
|
38652
38753
|
reasoning: true,
|
|
38653
38754
|
vision: true,
|
|
38654
38755
|
agentic: true,
|
|
@@ -38732,7 +38833,7 @@ var init_models = __esm({
|
|
|
38732
38833
|
version: "3.1",
|
|
38733
38834
|
inputPrice: 2,
|
|
38734
38835
|
outputPrice: 12,
|
|
38735
|
-
contextWindow:
|
|
38836
|
+
contextWindow: 1048576,
|
|
38736
38837
|
maxOutput: 65536,
|
|
38737
38838
|
reasoning: true,
|
|
38738
38839
|
vision: true,
|
|
@@ -38744,7 +38845,7 @@ var init_models = __esm({
|
|
|
38744
38845
|
version: "3.0",
|
|
38745
38846
|
inputPrice: 2,
|
|
38746
38847
|
outputPrice: 12,
|
|
38747
|
-
contextWindow:
|
|
38848
|
+
contextWindow: 1048576,
|
|
38748
38849
|
maxOutput: 65536,
|
|
38749
38850
|
reasoning: true,
|
|
38750
38851
|
vision: true,
|
|
@@ -38796,7 +38897,7 @@ var init_models = __esm({
|
|
|
38796
38897
|
version: "3.0",
|
|
38797
38898
|
inputPrice: 0.5,
|
|
38798
38899
|
outputPrice: 3,
|
|
38799
|
-
contextWindow:
|
|
38900
|
+
contextWindow: 1048576,
|
|
38800
38901
|
maxOutput: 65536,
|
|
38801
38902
|
reasoning: true,
|
|
38802
38903
|
vision: true
|
|
@@ -38807,7 +38908,7 @@ var init_models = __esm({
|
|
|
38807
38908
|
version: "2.5",
|
|
38808
38909
|
inputPrice: 1.25,
|
|
38809
38910
|
outputPrice: 10,
|
|
38810
|
-
contextWindow:
|
|
38911
|
+
contextWindow: 1048576,
|
|
38811
38912
|
maxOutput: 65536,
|
|
38812
38913
|
reasoning: true,
|
|
38813
38914
|
vision: true,
|
|
@@ -38819,7 +38920,7 @@ var init_models = __esm({
|
|
|
38819
38920
|
version: "2.5",
|
|
38820
38921
|
inputPrice: 0.3,
|
|
38821
38922
|
outputPrice: 2.5,
|
|
38822
|
-
contextWindow:
|
|
38923
|
+
contextWindow: 1048576,
|
|
38823
38924
|
maxOutput: 65536,
|
|
38824
38925
|
vision: true,
|
|
38825
38926
|
toolCalling: true
|
|
@@ -38830,7 +38931,7 @@ var init_models = __esm({
|
|
|
38830
38931
|
version: "2.5",
|
|
38831
38932
|
inputPrice: 0.1,
|
|
38832
38933
|
outputPrice: 0.4,
|
|
38833
|
-
contextWindow:
|
|
38934
|
+
contextWindow: 1048576,
|
|
38834
38935
|
maxOutput: 65536,
|
|
38835
38936
|
toolCalling: true
|
|
38836
38937
|
},
|
|
@@ -38840,8 +38941,8 @@ var init_models = __esm({
|
|
|
38840
38941
|
version: "3.1",
|
|
38841
38942
|
inputPrice: 0.25,
|
|
38842
38943
|
outputPrice: 1.5,
|
|
38843
|
-
contextWindow:
|
|
38844
|
-
maxOutput:
|
|
38944
|
+
contextWindow: 1048576,
|
|
38945
|
+
maxOutput: 65536,
|
|
38845
38946
|
toolCalling: true
|
|
38846
38947
|
},
|
|
38847
38948
|
// DeepSeek — V4 family (2026-04-24). The legacy deepseek-chat/reasoner
|
|
@@ -38854,8 +38955,8 @@ var init_models = __esm({
|
|
|
38854
38955
|
version: "4-flash",
|
|
38855
38956
|
inputPrice: 0.14,
|
|
38856
38957
|
outputPrice: 0.28,
|
|
38857
|
-
contextWindow:
|
|
38858
|
-
maxOutput:
|
|
38958
|
+
contextWindow: 1048576,
|
|
38959
|
+
maxOutput: 65536,
|
|
38859
38960
|
toolCalling: true
|
|
38860
38961
|
},
|
|
38861
38962
|
{
|
|
@@ -38864,8 +38965,8 @@ var init_models = __esm({
|
|
|
38864
38965
|
version: "4-flash",
|
|
38865
38966
|
inputPrice: 0.14,
|
|
38866
38967
|
outputPrice: 0.28,
|
|
38867
|
-
contextWindow:
|
|
38868
|
-
maxOutput:
|
|
38968
|
+
contextWindow: 1048576,
|
|
38969
|
+
maxOutput: 65536,
|
|
38869
38970
|
reasoning: true,
|
|
38870
38971
|
toolCalling: true
|
|
38871
38972
|
},
|
|
@@ -38877,8 +38978,8 @@ var init_models = __esm({
|
|
|
38877
38978
|
id: "deepseek/deepseek-v4-pro",
|
|
38878
38979
|
name: "DeepSeek V4 Pro",
|
|
38879
38980
|
version: "4-pro",
|
|
38880
|
-
inputPrice:
|
|
38881
|
-
outputPrice:
|
|
38981
|
+
inputPrice: 1.32,
|
|
38982
|
+
outputPrice: 3.96,
|
|
38882
38983
|
contextWindow: 1048576,
|
|
38883
38984
|
maxOutput: 65536,
|
|
38884
38985
|
reasoning: true,
|
|
@@ -38991,7 +39092,7 @@ var init_models = __esm({
|
|
|
38991
39092
|
inputPrice: 0.6,
|
|
38992
39093
|
outputPrice: 3,
|
|
38993
39094
|
contextWindow: 262144,
|
|
38994
|
-
maxOutput:
|
|
39095
|
+
maxOutput: 65536,
|
|
38995
39096
|
reasoning: true,
|
|
38996
39097
|
vision: true,
|
|
38997
39098
|
agentic: true,
|
|
@@ -39004,7 +39105,7 @@ var init_models = __esm({
|
|
|
39004
39105
|
inputPrice: 0.6,
|
|
39005
39106
|
outputPrice: 3,
|
|
39006
39107
|
contextWindow: 262144,
|
|
39007
|
-
maxOutput:
|
|
39108
|
+
maxOutput: 16384,
|
|
39008
39109
|
reasoning: true,
|
|
39009
39110
|
vision: true,
|
|
39010
39111
|
agentic: true,
|
|
@@ -39042,7 +39143,7 @@ var init_models = __esm({
|
|
|
39042
39143
|
version: "4",
|
|
39043
39144
|
inputPrice: 0.2,
|
|
39044
39145
|
outputPrice: 0.5,
|
|
39045
|
-
contextWindow:
|
|
39146
|
+
contextWindow: 2e6,
|
|
39046
39147
|
maxOutput: 16384,
|
|
39047
39148
|
reasoning: true,
|
|
39048
39149
|
toolCalling: true
|
|
@@ -39053,7 +39154,7 @@ var init_models = __esm({
|
|
|
39053
39154
|
version: "4",
|
|
39054
39155
|
inputPrice: 0.2,
|
|
39055
39156
|
outputPrice: 0.5,
|
|
39056
|
-
contextWindow:
|
|
39157
|
+
contextWindow: 2e6,
|
|
39057
39158
|
maxOutput: 16384,
|
|
39058
39159
|
toolCalling: true
|
|
39059
39160
|
},
|
|
@@ -39063,7 +39164,7 @@ var init_models = __esm({
|
|
|
39063
39164
|
version: "4.1",
|
|
39064
39165
|
inputPrice: 0.2,
|
|
39065
39166
|
outputPrice: 0.5,
|
|
39066
|
-
contextWindow:
|
|
39167
|
+
contextWindow: 2e6,
|
|
39067
39168
|
maxOutput: 16384,
|
|
39068
39169
|
reasoning: true,
|
|
39069
39170
|
toolCalling: true
|
|
@@ -39074,7 +39175,7 @@ var init_models = __esm({
|
|
|
39074
39175
|
version: "4.1",
|
|
39075
39176
|
inputPrice: 0.2,
|
|
39076
39177
|
outputPrice: 0.5,
|
|
39077
|
-
contextWindow:
|
|
39178
|
+
contextWindow: 2e6,
|
|
39078
39179
|
maxOutput: 16384,
|
|
39079
39180
|
toolCalling: true
|
|
39080
39181
|
},
|
|
@@ -39086,7 +39187,7 @@ var init_models = __esm({
|
|
|
39086
39187
|
version: "4-0709",
|
|
39087
39188
|
inputPrice: 3,
|
|
39088
39189
|
outputPrice: 15,
|
|
39089
|
-
contextWindow:
|
|
39190
|
+
contextWindow: 256e3,
|
|
39090
39191
|
maxOutput: 16384,
|
|
39091
39192
|
reasoning: true,
|
|
39092
39193
|
toolCalling: true
|
|
@@ -39097,7 +39198,7 @@ var init_models = __esm({
|
|
|
39097
39198
|
version: "2",
|
|
39098
39199
|
inputPrice: 2,
|
|
39099
39200
|
outputPrice: 10,
|
|
39100
|
-
contextWindow:
|
|
39201
|
+
contextWindow: 32768,
|
|
39101
39202
|
maxOutput: 16384,
|
|
39102
39203
|
vision: true,
|
|
39103
39204
|
toolCalling: true
|
|
@@ -39336,8 +39437,21 @@ var init_models = __esm({
|
|
|
39336
39437
|
outputPrice: 0,
|
|
39337
39438
|
contextWindow: 256e3,
|
|
39338
39439
|
maxOutput: 16384,
|
|
39339
|
-
reasoning: true
|
|
39340
|
-
vision: true
|
|
39440
|
+
reasoning: true
|
|
39441
|
+
// NO `vision: true` — 2026-08-31. Both catalogs advertise vision on this
|
|
39442
|
+
// model and blockrun #448 cites an 8x8 PNG answering "Red", but a 64x64
|
|
39443
|
+
// solid-red probe does not hold up: 1 of 4 correct on Base (the others
|
|
39444
|
+
// "I'm not able to view the image" or leaked reasoning), and on sol it
|
|
39445
|
+
// answered "white" twice, once with the response's own `model` field
|
|
39446
|
+
// reading `nemotron-3-super-120b (fallback: ...nano-omni)` — the image is
|
|
39447
|
+
// silently dropped and a text model answers.
|
|
39448
|
+
//
|
|
39449
|
+
// `vision: true` is what makes filterByVision() route real image turns
|
|
39450
|
+
// here, so the flag does not merely describe the model, it aims traffic at
|
|
39451
|
+
// it. HTTP 200 with a confident wrong colour is worse than no free vision:
|
|
39452
|
+
// there is no error for a caller to branch on. Image turns go to paid
|
|
39453
|
+
// vision models until a correctly-sized probe comes back right on both
|
|
39454
|
+
// chains. Independently confirmed on Solana by the blockrun-sol owner.
|
|
39341
39455
|
},
|
|
39342
39456
|
// 2026-06-14: BlockRun re-featured these two as free flagships (catalog sweep).
|
|
39343
39457
|
// Added to the auto-pick set behind gpt-oss to strengthen the mid/back of the
|
|
@@ -39402,7 +39516,13 @@ var init_models = __esm({
|
|
|
39402
39516
|
maxOutput: 16384
|
|
39403
39517
|
},
|
|
39404
39518
|
{
|
|
39405
|
-
// Mistral × NVIDIA hybrid
|
|
39519
|
+
// Mistral × NVIDIA hybrid, 131K context. DEAD 2026-08-30 — the QUIET kind:
|
|
39520
|
+
// NVIDIA still LISTS it but a completion returns zero bytes after >150s on
|
|
39521
|
+
// both of blockrun's probe passes (blockrun #448, the #391 shape). Upstream
|
|
39522
|
+
// hid it and redirects callers to a live workhorse. Entry kept so explicit
|
|
39523
|
+
// pins stay routable; off the picker and the FREE_MODELS cascade.
|
|
39524
|
+
// There is no free Mistral left on NVIDIA — do not point a generic
|
|
39525
|
+
// "a free mistral" shorthand at one.
|
|
39406
39526
|
id: "free/mistral-nemotron",
|
|
39407
39527
|
name: "[Free] Mistral Nemotron",
|
|
39408
39528
|
version: "nemotron",
|
|
@@ -39412,7 +39532,13 @@ var init_models = __esm({
|
|
|
39412
39532
|
maxOutput: 16384
|
|
39413
39533
|
},
|
|
39414
39534
|
{
|
|
39415
|
-
// StepFun Step 3.7 Flash: reasoning-focused, 131K context.
|
|
39535
|
+
// StepFun Step 3.7 Flash: reasoning-focused, 131K context. EOL'd 2026-08-30
|
|
39536
|
+
// — NVIDIA published 410 Gone on both of blockrun's probe passes (#448), in
|
|
39537
|
+
// the same sweep that took nemotron-nano-9b-v2, nemotron-nano-12b-v2-vl and
|
|
39538
|
+
// (hidden) nemotron-super-49b. It had been ClawRouter's free default since
|
|
39539
|
+
// 2026-08-29; the gateway redirects it to nemotron-3.5-lightning, which is
|
|
39540
|
+
// exactly why nothing looked broken. Entry kept so explicit pins stay
|
|
39541
|
+
// routable; off the picker and the FREE_MODELS cascade.
|
|
39416
39542
|
id: "free/step-3.7-flash",
|
|
39417
39543
|
name: "[Free] StepFun Step 3.7 Flash",
|
|
39418
39544
|
version: "3.7-flash",
|
|
@@ -39424,6 +39550,8 @@ var init_models = __esm({
|
|
|
39424
39550
|
},
|
|
39425
39551
|
{
|
|
39426
39552
|
// NVIDIA Nemotron Nano 9B v2: fast lightweight generalist, 131K context.
|
|
39553
|
+
// EOL'd 2026-08-30 (410 Gone, same sweep). Gateway redirects it to
|
|
39554
|
+
// nemotron-3-nano-30b. Entry kept for pins; off the picker and the cascade.
|
|
39427
39555
|
id: "free/nemotron-nano-9b-v2",
|
|
39428
39556
|
name: "[Free] Nemotron Nano 9B v2",
|
|
39429
39557
|
version: "nano-9b-v2",
|
|
@@ -39435,6 +39563,9 @@ var init_models = __esm({
|
|
|
39435
39563
|
},
|
|
39436
39564
|
{
|
|
39437
39565
|
// NVIDIA Nemotron Nano 12B v2 VL: vision-language (text + image), 131K context.
|
|
39566
|
+
// EOL'd 2026-08-30 (410 Gone, same sweep). Gateway redirects it to
|
|
39567
|
+
// nemotron-3-nano-omni, the only vision-capable free model left. Entry kept
|
|
39568
|
+
// for pins; off the picker and the cascade.
|
|
39438
39569
|
id: "free/nemotron-nano-12b-v2-vl",
|
|
39439
39570
|
name: "[Free] Nemotron Nano 12B v2 VL",
|
|
39440
39571
|
version: "nano-12b-v2-vl",
|
|
@@ -39442,12 +39573,217 @@ var init_models = __esm({
|
|
|
39442
39573
|
outputPrice: 0,
|
|
39443
39574
|
contextWindow: 131072,
|
|
39444
39575
|
maxOutput: 16384,
|
|
39576
|
+
reasoning: true
|
|
39577
|
+
// Vision flag dropped 2026-08-31 with the rest of the free tier: this id is
|
|
39578
|
+
// 410 Gone and the gateway redirects it to nano-omni, whose image path does
|
|
39579
|
+
// not work either (see above). A pinned caller sending an image would have
|
|
39580
|
+
// been told, by the flag, that it would be seen.
|
|
39581
|
+
},
|
|
39582
|
+
// ── 2026-08-30 free-tier rebuild (blockrun #448) ─────────────────────────
|
|
39583
|
+
// NVIDIA retired FOUR of the five VISIBLE free models in one sweep. blockrun
|
|
39584
|
+
// replaced them and moved two survivors onto OpenRouter's $0 ":free" pool,
|
|
39585
|
+
// taking the visible free set from 5 to 7 and spanning three hosts for the
|
|
39586
|
+
// first time (NVIDIA, OpenRouter, and two non-NVIDIA makers).
|
|
39587
|
+
//
|
|
39588
|
+
// All seven live free models were tool-probed through the gateway on
|
|
39589
|
+
// 2026-08-30 and every one returned a structured `tool_calls` array with
|
|
39590
|
+
// valid JSON args and finish_reason: "tool_calls" (nemotron-3-nano-30b looked
|
|
39591
|
+
// like a textual leak at max_tokens:120 — that was truncation; at 300 it is
|
|
39592
|
+
// structured). The evidence is recorded here on purpose, but `toolCalling` is
|
|
39593
|
+
// deliberately NOT set: no free entry has ever carried it, filterByToolCalling
|
|
39594
|
+
// keeps the free tier out of tool-bearing requests, and the budget pre-check
|
|
39595
|
+
// at proxy.ts:5217 is written on the same assumption. Flipping the tier into
|
|
39596
|
+
// agentic eligibility is its own change with its own evidence bar.
|
|
39597
|
+
{
|
|
39598
|
+
// Nemotron 3.5 Lightning 30B-A3B — the new free default. blockrun's own
|
|
39599
|
+
// redirect target for the retired step-3.7-flash, so following it keeps the
|
|
39600
|
+
// proxy and the gateway naming the same model. Served from OpenRouter's $0
|
|
39601
|
+
// pool (4.9s median vs 16.3s direct) which also publishes a 1M window
|
|
39602
|
+
// against the 131K the NVIDIA NIM path gives; blockrun carries a hidden
|
|
39603
|
+
// "-nim" twin as its fallback. Probed 1.3s with tools.
|
|
39604
|
+
id: "free/nemotron-3.5-lightning",
|
|
39605
|
+
name: "[Free] Nemotron 3.5 Lightning",
|
|
39606
|
+
version: "3.5-lightning",
|
|
39607
|
+
inputPrice: 0,
|
|
39608
|
+
outputPrice: 0,
|
|
39609
|
+
contextWindow: 1e6,
|
|
39610
|
+
maxOutput: 16384,
|
|
39611
|
+
reasoning: true
|
|
39612
|
+
},
|
|
39613
|
+
{
|
|
39614
|
+
// Nemotron 3 Nano 30B-A3B — the fastest free model in the catalog
|
|
39615
|
+
// (~121 tok/s on a realistic workload, not a 16-token ping). Returns
|
|
39616
|
+
// reasoning_content. Also the tertiary rung of blockrun's own free cascade.
|
|
39617
|
+
id: "free/nemotron-3-nano-30b",
|
|
39618
|
+
name: "[Free] Nemotron 3 Nano 30B",
|
|
39619
|
+
version: "3-nano-30b",
|
|
39620
|
+
inputPrice: 0,
|
|
39621
|
+
outputPrice: 0,
|
|
39622
|
+
contextWindow: 131072,
|
|
39623
|
+
maxOutput: 16384,
|
|
39624
|
+
reasoning: true
|
|
39625
|
+
},
|
|
39626
|
+
{
|
|
39627
|
+
// Nemotron 3 Ultra 550B-A55B — the largest free model ever listed, 1M ctx,
|
|
39628
|
+
// reachable ONLY through OpenRouter's $0 pool (build.nvidia.com answers 503).
|
|
39629
|
+
// Deliberately LOW in the cascade: 16.8s on the tools probe, and blockrun
|
|
39630
|
+
// measured 3 of 15 calls coming back as an HTTP 200 carrying an upstream
|
|
39631
|
+
// 502/503 error object instead of choices.
|
|
39632
|
+
id: "free/nemotron-3-ultra-550b",
|
|
39633
|
+
name: "[Free] Nemotron 3 Ultra 550B",
|
|
39634
|
+
version: "3-ultra-550b",
|
|
39635
|
+
inputPrice: 0,
|
|
39636
|
+
outputPrice: 0,
|
|
39637
|
+
contextWindow: 1e6,
|
|
39638
|
+
maxOutput: 16384,
|
|
39639
|
+
reasoning: true
|
|
39640
|
+
},
|
|
39641
|
+
{
|
|
39642
|
+
// Meta Llama 3.2 11B Vision — restores a free Llama after nemotron-super-49b
|
|
39643
|
+
// (Llama-3.3-based) hit NVIDIA's 410 EOL. A 12-model sweep found exactly two
|
|
39644
|
+
// survivors and only the 11B finishes a real completion. Older than the rest
|
|
39645
|
+
// of the tier and deliberately so: it is a real Llama that actually answers.
|
|
39646
|
+
// Slowest in the tier (~18 tok/s) — last rung of the cascade.
|
|
39647
|
+
id: "free/llama-3.2-11b-vision",
|
|
39648
|
+
name: "[Free] Llama 3.2 11B Vision",
|
|
39649
|
+
version: "3.2-11b-vision",
|
|
39650
|
+
inputPrice: 0,
|
|
39651
|
+
outputPrice: 0,
|
|
39652
|
+
contextWindow: 128e3,
|
|
39653
|
+
maxOutput: 16384
|
|
39654
|
+
// NO `vision: true` despite the name and blockrun's `categories:
|
|
39655
|
+
// ["chat","vision"]` — 2026-08-31, three consecutive 64x64 PNG probes came
|
|
39656
|
+
// back "I'm unable to see the image" / "you haven't provided an image",
|
|
39657
|
+
// while a plain-text control on the same id answered fine. The model is
|
|
39658
|
+
// alive; the image path is not. Mirroring the catalog's claim here would
|
|
39659
|
+
// have routed image turns to it. See the nano-omni note above.
|
|
39660
|
+
},
|
|
39661
|
+
{
|
|
39662
|
+
// Cohere North Mini Code, on OpenRouter's $0 pool — 607ms median, the
|
|
39663
|
+
// fastest thing in the tier. Emits reasoning_content (content is clean once
|
|
39664
|
+
// the budget is large enough to finish, verified live).
|
|
39665
|
+
// NOTE: NOT an nvidia/* id upstream — see FREE_UPSTREAM_OVERRIDES in proxy.ts.
|
|
39666
|
+
id: "free/north-mini-code",
|
|
39667
|
+
name: "[Free] Cohere North Mini Code",
|
|
39668
|
+
version: "north-mini-code",
|
|
39669
|
+
inputPrice: 0,
|
|
39670
|
+
outputPrice: 0,
|
|
39671
|
+
contextWindow: 256e3,
|
|
39672
|
+
maxOutput: 16384,
|
|
39673
|
+
reasoning: true
|
|
39674
|
+
},
|
|
39675
|
+
{
|
|
39676
|
+
// Poolside Laguna XS 2.1 on OUR NVIDIA key (~161 tok/s). Deliberately not
|
|
39677
|
+
// the OpenRouter twin, which 429s on every attempt — so this rung and
|
|
39678
|
+
// north-mini-code sit on DIFFERENT capacity pools, which is why they are
|
|
39679
|
+
// adjacent in the cascade.
|
|
39680
|
+
// NOTE: NOT an nvidia/* id upstream — see FREE_UPSTREAM_OVERRIDES in proxy.ts.
|
|
39681
|
+
id: "free/laguna-xs-2.1",
|
|
39682
|
+
name: "[Free] Poolside Laguna XS 2.1",
|
|
39683
|
+
version: "xs-2.1",
|
|
39684
|
+
inputPrice: 0,
|
|
39685
|
+
outputPrice: 0,
|
|
39686
|
+
contextWindow: 131072,
|
|
39687
|
+
maxOutput: 16384
|
|
39688
|
+
},
|
|
39689
|
+
// ── 2026-08-30 paid catalog refresh (blockrun #449) ─────────────────────
|
|
39690
|
+
// Three additions, each probe-verified upstream with a real completion AND a
|
|
39691
|
+
// real image before listing. All three carry `vision: true` on that evidence
|
|
39692
|
+
// — unlike the free tier, where the same claim did not survive a probe.
|
|
39693
|
+
{
|
|
39694
|
+
// Alibaba's 3.8 generation: 125B MoE, one tier above the whole 3.7 line and
|
|
39695
|
+
// cheaper than the qwen3.7-plus ($0.32/$1.28) it outperforms.
|
|
39696
|
+
// Vision took two probes to establish upstream: the first 400'd with
|
|
39697
|
+
// `invalid_parameter_error` on an 8x8 PNG because the model requires >10px
|
|
39698
|
+
// per side; 64x64 answered correctly. A single 400 is not a capability gap.
|
|
39699
|
+
id: "qwen/qwen3.8-flash",
|
|
39700
|
+
name: "Qwen3.8 Flash",
|
|
39701
|
+
version: "3.8-flash",
|
|
39702
|
+
inputPrice: 0.15,
|
|
39703
|
+
outputPrice: 0.47,
|
|
39704
|
+
contextWindow: 1e6,
|
|
39705
|
+
maxOutput: 131072,
|
|
39445
39706
|
reasoning: true,
|
|
39446
|
-
vision: true
|
|
39707
|
+
vision: true,
|
|
39708
|
+
toolCalling: true
|
|
39709
|
+
},
|
|
39710
|
+
{
|
|
39711
|
+
// The first DeepSeek SKU that takes images. Priced at DeepSeek's PEAK rate
|
|
39712
|
+
// on purpose: they now split peak/off-peak and off-peak is half, so listing
|
|
39713
|
+
// the lower number would sell under cost for seven hours every weekday.
|
|
39714
|
+
id: "deepseek/deepseek-v4-flash-vision-exp",
|
|
39715
|
+
name: "DeepSeek V4 Flash Vision",
|
|
39716
|
+
version: "v4-flash-vision-exp",
|
|
39717
|
+
inputPrice: 0.44,
|
|
39718
|
+
outputPrice: 1.32,
|
|
39719
|
+
contextWindow: 1048576,
|
|
39720
|
+
maxOutput: 65536,
|
|
39721
|
+
reasoning: true,
|
|
39722
|
+
vision: true,
|
|
39723
|
+
toolCalling: true
|
|
39724
|
+
},
|
|
39725
|
+
{
|
|
39726
|
+
// NOT a cheaper mimo-v2.5-pro — a different, natively multimodal SKU. The
|
|
39727
|
+
// Pro entry is text-only upstream while this one takes images, at a third
|
|
39728
|
+
// of the price. Keep both.
|
|
39729
|
+
id: "xiaomi/mimo-v2.5",
|
|
39730
|
+
name: "Xiaomi MiMo V2.5",
|
|
39731
|
+
version: "2.5",
|
|
39732
|
+
inputPrice: 0.14,
|
|
39733
|
+
outputPrice: 0.28,
|
|
39734
|
+
contextWindow: 1048576,
|
|
39735
|
+
maxOutput: 131072,
|
|
39736
|
+
reasoning: true,
|
|
39737
|
+
vision: true,
|
|
39738
|
+
toolCalling: true
|
|
39447
39739
|
},
|
|
39448
39740
|
// Z.AI GLM-5 Models
|
|
39449
39741
|
{
|
|
39450
|
-
//
|
|
39742
|
+
// Z.AI's flagship, live-probed by blockrun 2026-08-19 against api.z.ai
|
|
39743
|
+
// (real completion in 2s, content alongside reasoning tokens). $1.40/$4.40,
|
|
39744
|
+
// cached input $0.26, off the international USD price list.
|
|
39745
|
+
// maxOutput is 131072, NOT the 1M context: that is the hard ceiling the API
|
|
39746
|
+
// enforces (error 1210 above it), the same on every GLM-5 SKU.
|
|
39747
|
+
// Thinking is ALWAYS ON here and cannot be disabled.
|
|
39748
|
+
id: "zai/glm-5.3",
|
|
39749
|
+
name: "GLM-5.3",
|
|
39750
|
+
version: "5.3",
|
|
39751
|
+
inputPrice: 1.4,
|
|
39752
|
+
outputPrice: 4.4,
|
|
39753
|
+
contextWindow: 1e6,
|
|
39754
|
+
maxOutput: 131072,
|
|
39755
|
+
reasoning: true,
|
|
39756
|
+
toolCalling: true
|
|
39757
|
+
},
|
|
39758
|
+
{
|
|
39759
|
+
// Z.AI's first natively multimodal GLM-5 — 320B/18B MoE. blockrun probed
|
|
39760
|
+
// text, vision (base64 data URL → correct answer), tools
|
|
39761
|
+
// (finish_reason=tool_calls with well-formed arguments) and streaming live
|
|
39762
|
+
// on 2026-08-27 before listing it.
|
|
39763
|
+
//
|
|
39764
|
+
// MUST be in this catalog, not just router-core's: it is router-core's eco
|
|
39765
|
+
// MEDIUM and COMPLEX primary, and estimateAmount() returns undefined for an
|
|
39766
|
+
// id we do not carry — which makes the request skip the maxCostPerRun filter
|
|
39767
|
+
// AND never accumulate into session cost. An uncatalogued routing target is
|
|
39768
|
+
// a cost-cap hole, not a logging gap.
|
|
39769
|
+
//
|
|
39770
|
+
// Price is the LIST rate. Z.AI is running a 50% launch promo ($0.075/$0.25)
|
|
39771
|
+
// that ENDS 2026-09-09; listing the promo rate would put us under COGS the
|
|
39772
|
+
// morning it lapses. Thinking is always on, as on glm-5.3.
|
|
39773
|
+
id: "zai/glm-5.3-flash",
|
|
39774
|
+
name: "GLM-5.3 Flash",
|
|
39775
|
+
version: "5.3-flash",
|
|
39776
|
+
inputPrice: 0.15,
|
|
39777
|
+
outputPrice: 0.5,
|
|
39778
|
+
contextWindow: 1e6,
|
|
39779
|
+
maxOutput: 131072,
|
|
39780
|
+
reasoning: true,
|
|
39781
|
+
vision: true,
|
|
39782
|
+
toolCalling: true
|
|
39783
|
+
},
|
|
39784
|
+
{
|
|
39785
|
+
// Launched 2026-06-16. Was Z.AI's flagship until glm-5.3 (above) took the
|
|
39786
|
+
// slot on 2026-08-19. 1M-token context,
|
|
39451
39787
|
// beats GPT-5.5 on long-horizon coding at a fraction of the cost.
|
|
39452
39788
|
// Paid per-token at $1.40/$4.40 (same as glm-5.1, cached $0.26).
|
|
39453
39789
|
id: "zai/glm-5.2",
|
|
@@ -39456,7 +39792,7 @@ var init_models = __esm({
|
|
|
39456
39792
|
inputPrice: 1.4,
|
|
39457
39793
|
outputPrice: 4.4,
|
|
39458
39794
|
contextWindow: 1e6,
|
|
39459
|
-
maxOutput:
|
|
39795
|
+
maxOutput: 131072,
|
|
39460
39796
|
reasoning: true,
|
|
39461
39797
|
toolCalling: true
|
|
39462
39798
|
},
|
|
@@ -89687,13 +90023,44 @@ import { homedir as homedir7 } from "os";
|
|
|
89687
90023
|
import { join as join10 } from "path";
|
|
89688
90024
|
import { mkdir as mkdir4, writeFile as writeFile2, readFile as readFile2, stat as fsStat } from "fs/promises";
|
|
89689
90025
|
import { readFileSync as readFileSync2, existsSync as existsSync2 } from "fs";
|
|
90026
|
+
async function loadGatewayCatalog(apiBase) {
|
|
90027
|
+
try {
|
|
90028
|
+
const controller = new AbortController();
|
|
90029
|
+
const timer2 = setTimeout(() => controller.abort(), GATEWAY_CATALOG_TIMEOUT_MS);
|
|
90030
|
+
const res = await fetch(`${apiBase}/v1/models`, { signal: controller.signal });
|
|
90031
|
+
clearTimeout(timer2);
|
|
90032
|
+
if (!res.ok) return;
|
|
90033
|
+
const body = await res.json();
|
|
90034
|
+
const ids = (body.data ?? []).map((m) => m.id).filter((id2) => !!id2);
|
|
90035
|
+
if (ids.length === 0) return;
|
|
90036
|
+
gatewayModelIds = new Set(ids);
|
|
90037
|
+
const unserved = [...FREE_MODELS].filter((m) => !gatewayModelIds.has(toUpstreamModelId(m)));
|
|
90038
|
+
if (unserved.length > 0) {
|
|
90039
|
+
console.log(
|
|
90040
|
+
`[ClawRouter] Free models not served by this gateway (skipped in the cascade): ${unserved.join(", ")}`
|
|
90041
|
+
);
|
|
90042
|
+
}
|
|
90043
|
+
} catch {
|
|
90044
|
+
}
|
|
90045
|
+
}
|
|
90046
|
+
function isServedByGateway(modelId) {
|
|
90047
|
+
if (!gatewayModelIds) return true;
|
|
90048
|
+
return gatewayModelIds.has(toUpstreamModelId(modelId));
|
|
90049
|
+
}
|
|
89690
90050
|
function pickFreeModel(excludeList) {
|
|
90051
|
+
for (const m of FREE_MODELS) {
|
|
90052
|
+
if (excludeList?.has(m)) continue;
|
|
90053
|
+
if (!isServedByGateway(m)) continue;
|
|
90054
|
+
return m;
|
|
90055
|
+
}
|
|
89691
90056
|
for (const m of FREE_MODELS) {
|
|
89692
90057
|
if (!excludeList?.has(m)) return m;
|
|
89693
90058
|
}
|
|
89694
90059
|
return void 0;
|
|
89695
90060
|
}
|
|
89696
90061
|
function toUpstreamModelId(modelId) {
|
|
90062
|
+
const override = FREE_UPSTREAM_OVERRIDES[modelId];
|
|
90063
|
+
if (override) return override;
|
|
89697
90064
|
if (modelId.startsWith("free/")) {
|
|
89698
90065
|
return "nvidia/" + modelId.slice("free/".length);
|
|
89699
90066
|
}
|
|
@@ -90025,6 +90392,9 @@ function detectDegradedSuccessResponse(body) {
|
|
|
90025
90392
|
return `degraded response: ${errorText.slice(0, 120)}`;
|
|
90026
90393
|
}
|
|
90027
90394
|
const choices = parsed.choices;
|
|
90395
|
+
if (Array.isArray(choices) && choices.length === 0) {
|
|
90396
|
+
return "degraded response: no choices returned";
|
|
90397
|
+
}
|
|
90028
90398
|
if (Array.isArray(choices) && choices.length > 0) {
|
|
90029
90399
|
const choice = choices[0];
|
|
90030
90400
|
const msg = choice.message ?? choice.delta;
|
|
@@ -90515,6 +90885,7 @@ async function startProxy(options) {
|
|
|
90515
90885
|
} else if (paymentChain === "solana") {
|
|
90516
90886
|
console.log(`[ClawRouter] Payment chain: Solana (${BLOCKRUN_SOLANA_API})`);
|
|
90517
90887
|
}
|
|
90888
|
+
void loadGatewayCatalog(apiBase);
|
|
90518
90889
|
const listenPort = options.port ?? getProxyPort();
|
|
90519
90890
|
const existingProxy = await checkExistingProxy(listenPort);
|
|
90520
90891
|
if (existingProxy) {
|
|
@@ -93048,6 +93419,22 @@ data: [DONE]
|
|
|
93048
93419
|
} else {
|
|
93049
93420
|
modelsToTry = modelId ? [modelId] : [];
|
|
93050
93421
|
}
|
|
93422
|
+
if (modelsToTry.length > 0) {
|
|
93423
|
+
const unservedFree = modelsToTry.filter((m) => FREE_MODELS.has(m) && !isServedByGateway(m));
|
|
93424
|
+
if (unservedFree.length > 0) {
|
|
93425
|
+
const servedFree = [...FREE_MODELS].filter(
|
|
93426
|
+
(m) => isServedByGateway(m) && !excludeList?.has(m)
|
|
93427
|
+
);
|
|
93428
|
+
const replacement = servedFree[0];
|
|
93429
|
+
if (replacement) {
|
|
93430
|
+
modelsToTry = modelsToTry.map((m) => unservedFree.includes(m) ? replacement : m);
|
|
93431
|
+
modelsToTry = modelsToTry.filter((m, i) => modelsToTry.indexOf(m) === i);
|
|
93432
|
+
console.log(
|
|
93433
|
+
`[ClawRouter] ${unservedFree.join(", ")} not served on this chain \u2014 using ${replacement}`
|
|
93434
|
+
);
|
|
93435
|
+
}
|
|
93436
|
+
}
|
|
93437
|
+
}
|
|
93051
93438
|
if (!hasTools && routingDecision) {
|
|
93052
93439
|
const freeFallback = pickFreeModel(excludeList);
|
|
93053
93440
|
if (freeFallback && !modelsToTry.includes(freeFallback)) {
|
|
@@ -93928,7 +94315,7 @@ data: [DONE]
|
|
|
93928
94315
|
});
|
|
93929
94316
|
}
|
|
93930
94317
|
}
|
|
93931
|
-
var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, FREE_MODEL, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, ClientDisconnectedError, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, IMAGE_MODEL_IDS, IMAGE_MODEL_SIZES, IMAGE_MODEL_ALIASES, VIDEO_PRICING, PHONE_PRICING;
|
|
94318
|
+
var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, gatewayModelIds, FREE_MODEL, FREE_UPSTREAM_OVERRIDES, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, GATEWAY_CATALOG_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, ClientDisconnectedError, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, IMAGE_MODEL_IDS, IMAGE_MODEL_SIZES, IMAGE_MODEL_ALIASES, VIDEO_PRICING, PHONE_PRICING;
|
|
93932
94319
|
var init_proxy = __esm({
|
|
93933
94320
|
"src/proxy.ts"() {
|
|
93934
94321
|
"use strict";
|
|
@@ -93979,22 +94366,31 @@ var init_proxy = __esm({
|
|
|
93979
94366
|
"premium"
|
|
93980
94367
|
]);
|
|
93981
94368
|
FREE_MODELS = /* @__PURE__ */ new Set([
|
|
93982
|
-
"free/
|
|
93983
|
-
//
|
|
93984
|
-
"free/nemotron-nano-
|
|
93985
|
-
//
|
|
93986
|
-
"free/
|
|
93987
|
-
//
|
|
94369
|
+
"free/nemotron-3.5-lightning",
|
|
94370
|
+
// free-tier default — 1M ctx, thinking mode
|
|
94371
|
+
"free/nemotron-3-nano-30b",
|
|
94372
|
+
// fastest free model (~121 tok/s)
|
|
94373
|
+
"free/laguna-xs-2.1",
|
|
94374
|
+
// coding, ~161 tok/s — on our NVIDIA key
|
|
94375
|
+
"free/north-mini-code",
|
|
94376
|
+
// coding, 607ms median — OpenRouter $0 pool
|
|
93988
94377
|
"free/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
93989
94378
|
// vision (text/image/video/audio)
|
|
93990
|
-
"free/nemotron-
|
|
93991
|
-
//
|
|
94379
|
+
"free/nemotron-3-ultra-550b",
|
|
94380
|
+
// largest free model, 1M ctx — but slow + flaky
|
|
94381
|
+
"free/llama-3.2-11b-vision"
|
|
94382
|
+
// only free Llama left; slowest, so last
|
|
93992
94383
|
]);
|
|
93993
|
-
FREE_MODEL = "free/
|
|
94384
|
+
FREE_MODEL = "free/nemotron-3.5-lightning";
|
|
94385
|
+
FREE_UPSTREAM_OVERRIDES = {
|
|
94386
|
+
"free/north-mini-code": "cohere/north-mini-code",
|
|
94387
|
+
"free/laguna-xs-2.1": "poolside/laguna-xs-2.1"
|
|
94388
|
+
};
|
|
93994
94389
|
MAX_MESSAGES = 200;
|
|
93995
94390
|
CONTEXT_LIMIT_KB = 5120;
|
|
93996
94391
|
HEARTBEAT_INTERVAL_MS = 2e3;
|
|
93997
94392
|
BALANCE_CHECK_TIMEOUT_MS = 2500;
|
|
94393
|
+
GATEWAY_CATALOG_TIMEOUT_MS = 5e3;
|
|
93998
94394
|
DEFAULT_REQUEST_TIMEOUT_MS = 3e5;
|
|
93999
94395
|
PER_MODEL_TIMEOUT_MS = 6e4;
|
|
94000
94396
|
REASONING_MODEL_TIMEOUT_MS = 18e4;
|