@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/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/mistral-nemotron": {
35127
- // supportsTools: gateway unavailable at probe time — fails closed
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-nano-12b-v2-vl": {
35140
- // supportsTools: gateway unavailable at probe time — fails closed
35141
- contextWindow: 131072,
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/step-3.7-flash": {
35153
- contextWindow: 131072,
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/step-3.7-flash"
37241
- // FREE backstop — NVIDIA free tier (probed 2026-08-21)
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/step-3.7-flash",
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-9b-v2",
37334
- // FREE — compact + fast, high-volume light tasks
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). Each retirement retargets the two free rungs to the
37338
- // current free tier; the paid rungs below never move.
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/step-3.7-flash"
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/step-3.7-flash"
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/mistral-nemotron",
37681
- "free/step-3.7-flash",
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
- "mimo-v2.5": "xiaomi/mimo-v2.5-pro",
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 step-3.7-flash — the same model @blockrun/router-core
37997
- // opens the eco SIMPLE tier on. It replaced gpt-oss-120b on 2026-08-29:
37998
- // gpt-oss-120b went dead upstream on 2026-08-16 (NVIDIA still LISTS it, but a
37999
- // completion hangs until the client gives up — blockrun #391 retargeted its
38000
- // whole free cascade off it, and the gateway now answers 400 Unknown model
38001
- // for the `free/` id). Pins that NAME gpt-oss stay routable below — the
38002
- // gateway server-redirects them — but nothing generic may land on it.
38003
- nvidia: "free/step-3.7-flash",
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/gpt-oss-120b",
38017
- "free/deepseek-v3.2": "free/gpt-oss-120b",
38018
- "nvidia/deepseek-v4-pro": "free/gpt-oss-120b",
38019
- "free/deepseek-v4-pro": "free/gpt-oss-120b",
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/gpt-oss-120b",
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/gpt-oss-120b",
38054
- "free/nemotron-ultra-253b": "free/gpt-oss-120b",
38055
- "free/devstral-2-123b": "free/gpt-oss-120b",
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/gpt-oss-120b",
38067
- "deepseek-v4-pro": "free/gpt-oss-120b",
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/gpt-oss-120b",
38117
+ "v4-pro": "free/nemotron-3.5-lightning",
38071
38118
  "v4-flash": "free/deepseek-v4-flash",
38072
- "mistral-free": "free/mistral-nemotron",
38073
- // mistral-large-3-675b EOL'd 2026-07-28 → last live free Mistral (blockrun demoted its /free-mistral primary the same way)
38074
- "glm-free": "free/gpt-oss-120b",
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
- "llama-free": "free/gpt-oss-120b",
38077
- // no live free Llama left (maverick died 2026-07)
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/step-3.7-flash",
38132
+ "qwen-coder": "free/nemotron-3.5-lightning",
38081
38133
  // no live free Qwen; follows the free default
38082
- "qwen-coder-free": "free/step-3.7-flash",
38083
- "qwen-thinking": "free/step-3.7-flash",
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/mistral-nemotron",
38089
- // closest live Mistral-family free model
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
- "coder-free": "free/step-3.7-flash",
38095
- // generic "a free coder" → follows the free default
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
- "nemotron-nano-9b": "free/nemotron-nano-9b-v2",
38100
- "nemotron-nano": "free/nemotron-nano-9b-v2",
38101
- "nemotron-nano-vl": "free/nemotron-nano-12b-v2-vl",
38102
- "nano-vl": "free/nemotron-nano-12b-v2-vl",
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, gpt-oss-120b hung upstream; see the NVIDIA block above).
38110
- nemotron: "free/nemotron-3-nano-omni-30b-a3b-reasoning",
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/step-3.7-flash",
38113
- "nemotron-253b": "free/step-3.7-flash",
38114
- "nemotron-super": "free/step-3.7-flash",
38115
- "nemotron-49b": "free/step-3.7-flash",
38116
- "nemotron-120b": "free/step-3.7-flash",
38117
- devstral: "free/step-3.7-flash",
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/step-3.7-flash",
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/step-3.7-flash",
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: "zai/glm-5.2",
38133
- // bare alias tracks newest flagship (launched 2026-06-16)
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 Step 3.7 Flash",
38296
+ name: "Free \u2192 Nemotron 3.5 Lightning",
38196
38297
  inputPrice: 0,
38197
38298
  outputPrice: 0,
38198
- contextWindow: 131072,
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: 65536,
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: 32768,
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: 1,
38334
- outputPrice: 6,
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.1,
38347
- outputPrice: 0.6,
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: 4e5,
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: 4e5,
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: 32768,
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: 16e3,
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: 16384,
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: 16384,
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: 16384,
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: 65536,
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: 65536,
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: 8192,
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: 2e5,
38621
- maxOutput: 64e3,
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: 32e3,
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: 105e4,
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: 105e4,
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: 1e6,
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: 105e4,
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: 1e6,
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: 1e6,
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: 1e6,
38844
- maxOutput: 8192,
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: 1e6,
38858
- maxOutput: 8192,
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: 1e6,
38868
- maxOutput: 8192,
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: 0.435,
38881
- outputPrice: 0.87,
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: 16384,
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: 8192,
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: 131072,
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: 131072,
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: 131072,
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: 131072,
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: 131072,
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: 131072,
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: strong instruction following, 131K context.
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
- // Launched 2026-06-16 — Z.AI's newest flagship. 1M-token context,
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: 262144,
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/step-3.7-flash",
93983
- // reasoning-focused — free-tier flagship
93984
- "free/nemotron-nano-9b-v2",
93985
- // fast lightweight generalist (~0.7s)
93986
- "free/mistral-nemotron",
93987
- // strong instruction following
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-nano-12b-v2-vl"
93991
- // vision-language (text + image)
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/step-3.7-flash";
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;