@blockrun/clawrouter 0.12.244 → 0.12.246

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
@@ -33594,6 +33594,21 @@ function applyPromotions(tierConfigs, promotions, profile, now2 = /* @__PURE__ *
33594
33594
  }
33595
33595
  return result;
33596
33596
  }
33597
+ function applyUnavailableModels(tierConfigs, unavailableModels) {
33598
+ if (!unavailableModels || unavailableModels.length === 0) return tierConfigs;
33599
+ const dead = new Set(unavailableModels);
33600
+ let result = tierConfigs;
33601
+ for (const tier of Object.keys(tierConfigs)) {
33602
+ const config = tierConfigs[tier];
33603
+ const alive = [config.primary, ...config.fallback].filter((model) => !dead.has(model));
33604
+ if (alive.length === 0 || alive[0] === config.primary && alive.length === config.fallback.length + 1) {
33605
+ continue;
33606
+ }
33607
+ if (result === tierConfigs) result = { ...tierConfigs };
33608
+ result[tier] = { primary: alive[0], fallback: alive.slice(1) };
33609
+ }
33610
+ return result;
33611
+ }
33597
33612
  function getStrategy(name) {
33598
33613
  const strategy = registry.get(name);
33599
33614
  if (!strategy) {
@@ -34291,6 +34306,7 @@ ${value.slice(-(scanLimit - prefixLength))}`;
34291
34306
  profile = useAgenticTiers ? "agentic" : "auto";
34292
34307
  }
34293
34308
  tierConfigs = applyPromotions(tierConfigs, config.promotions, profile, options.now);
34309
+ tierConfigs = applyUnavailableModels(tierConfigs, options.unavailableModels);
34294
34310
  const agenticScoreValue = ruleResult.agenticScore;
34295
34311
  if (estimatedTokens > config.overrides.maxTokensForceComplex) {
34296
34312
  const decision2 = selectModel(
@@ -34419,18 +34435,6 @@ ${value.slice(-(scanLimit - prefixLength))}`;
34419
34435
  supportsTools: false,
34420
34436
  supportsVision: false
34421
34437
  },
34422
- "free/gpt-oss-120b": {
34423
- contextWindow: 128e3,
34424
- maxOutputTokens: 16384,
34425
- supportsTools: false,
34426
- supportsVision: false
34427
- },
34428
- "free/gpt-oss-20b": {
34429
- contextWindow: 128e3,
34430
- maxOutputTokens: 16384,
34431
- supportsTools: false,
34432
- supportsVision: false
34433
- },
34434
34438
  "free/seed-oss-36b": {
34435
34439
  contextWindow: 131072,
34436
34440
  maxOutputTokens: 16384,
@@ -34503,6 +34507,18 @@ ${value.slice(-(scanLimit - prefixLength))}`;
34503
34507
  supportsTools: true,
34504
34508
  supportsVision: true
34505
34509
  },
34510
+ "nvidia/nemotron-nano-9b-v2": {
34511
+ contextWindow: 131072,
34512
+ maxOutputTokens: 16384,
34513
+ supportsTools: false,
34514
+ supportsVision: false
34515
+ },
34516
+ "nvidia/step-3.7-flash": {
34517
+ contextWindow: 131072,
34518
+ maxOutputTokens: 16384,
34519
+ supportsTools: false,
34520
+ supportsVision: false
34521
+ },
34506
34522
  "openai/gpt-4.1": {
34507
34523
  contextWindow: 128e3,
34508
34524
  maxOutputTokens: 16384,
@@ -34976,9 +34992,12 @@ ${value.slice(-(scanLimit - prefixLength))}`;
34976
34992
  const targetTier = (features.taskType === "reasoning_mcq" || features.taskType === "reasoning_math") && (base3.tier === "SIMPLE" || base3.tier === "MEDIUM") ? "REASONING" : base3.tier;
34977
34993
  const tierConfig = tierConfigs[targetTier];
34978
34994
  const configuredCandidates = tierConfig ? getFallbackChain(targetTier, tierConfigs) : [];
34995
+ const unavailable = new Set(options.unavailableModels ?? []);
34979
34996
  const chain3 = [
34980
34997
  .../* @__PURE__ */ new Set([...configuredCandidates, ...evidenceCandidates(features.taskType)])
34981
- ].filter((model2) => typeof model2 === "string" && model2.length > 0);
34998
+ ].filter(
34999
+ (model2) => typeof model2 === "string" && model2.length > 0 && !unavailable.has(model2)
35000
+ );
34982
35001
  const eligible = chain3.filter(
34983
35002
  (model2) => isEligible(model2, features, maxOutputTokens, options)
34984
35003
  );
@@ -35055,13 +35074,7 @@ ${value.slice(-(scanLimit - prefixLength))}`;
35055
35074
  ...eligibleCandidates.filter(
35056
35075
  (model2) => !scoredModels.includes(model2) && !webResearchFallbackOrder.includes(model2)
35057
35076
  )
35058
- ] : features.taskType === "tool_agent" || features.taskType === "tool_agent_parallel" && features.agentDomain !== "other" ? [
35059
- ...scoredModels,
35060
- ...eligibleCandidates.filter((model2) => !scoredModels.includes(model2))
35061
- ] : [
35062
- ...scoredModels,
35063
- ...eligibleCandidates.filter((model2) => !scoredModels.includes(model2))
35064
- ];
35077
+ ] : [...scoredModels, ...eligibleCandidates.filter((model2) => !scoredModels.includes(model2))];
35065
35078
  const model = ranked[0] ?? base3.model;
35066
35079
  const selectedTierConfigs = {
35067
35080
  ...tierConfigs,
@@ -36173,8 +36186,8 @@ ${value.slice(-(scanLimit - prefixLength))}`;
36173
36186
  // $0.20/$1.25, 1M context
36174
36187
  "xai/grok-4-fast-non-reasoning",
36175
36188
  // 1,143ms, $0.20/$0.50 — fast fallback
36176
- "free/gpt-oss-120b"
36177
- // 1,252ms, FREE fallback (hidden from /v1/models but direct calls work)
36189
+ "nvidia/step-3.7-flash"
36190
+ // FREE backstop — new NVIDIA free tier (gpt-oss-120b now 400s; probed 2026-08-21)
36178
36191
  ]
36179
36192
  },
36180
36193
  MEDIUM: {
@@ -36247,15 +36260,15 @@ ${value.slice(-(scanLimit - prefixLength))}`;
36247
36260
  // Eco tier configs - absolute cheapest (blockrun/eco)
36248
36261
  ecoTiers: {
36249
36262
  SIMPLE: {
36250
- primary: "free/gpt-oss-120b",
36251
- // FREE! $0.00/$0.00 — heavy user default
36263
+ primary: "nvidia/step-3.7-flash",
36264
+ // FREE! $0.00/$0.00 — new NVIDIA free tier flagship
36252
36265
  fallback: [
36253
- "free/gpt-oss-20b",
36254
- // FREE — smaller, faster
36255
- "free/deepseek-v4-flash",
36256
- // FREE — 1M ctx; slow (~10 tok/s, 07-28 probe) but completes
36257
- // seed-oss-36b sat here as the free coder until it EOL'd 2026-08-03 (HTTP 410).
36258
- // gpt-oss-120b/20b already head this chain, so the rung is dropped, not retargeted.
36266
+ "nvidia/nemotron-nano-9b-v2",
36267
+ // FREE — compact + fast (~0.7s), high-volume light tasks
36268
+ // This head keeps rotting with NVIDIA's free hosting: deepseek-v4-flash
36269
+ // (410, 2026-08-12), seed-oss-36b (410, 2026-08-03), then gpt-oss-120b/20b
36270
+ // (400 Unknown model, probed 2026-08-21). Each retirement retargets the
36271
+ // two free rungs to the current free tier; the paid rungs below never move.
36259
36272
  "google/gemini-3.1-flash-lite",
36260
36273
  // $0.25/$1.50 — newest flash-lite
36261
36274
  "openai/gpt-5.4-nano",
@@ -36372,8 +36385,8 @@ ${value.slice(-(scanLimit - prefixLength))}`;
36372
36385
  "openai/gpt-5.3-codex",
36373
36386
  "deepseek/deepseek-chat",
36374
36387
  // Cheap, reliable
36375
- "free/gpt-oss-120b"
36376
- // NVIDIA free ultimate backstop (was seed-oss-36b; EOL'd 2026-08-03)
36388
+ "nvidia/step-3.7-flash"
36389
+ // NVIDIA free ultimate backstop (was gpt-oss-120b; 400s since ~2026-08)
36377
36390
  ]
36378
36391
  },
36379
36392
  REASONING: {
@@ -36462,8 +36475,8 @@ ${value.slice(-(scanLimit - prefixLength))}`;
36462
36475
  // Previous flagship — 6,213ms, reliable
36463
36476
  "deepseek/deepseek-chat",
36464
36477
  // 1,431ms — cheap, reliable
36465
- "free/gpt-oss-120b"
36466
- // NVIDIA free ultimate backstop (was seed-oss-36b; EOL'd 2026-08-03)
36478
+ "nvidia/step-3.7-flash"
36479
+ // NVIDIA free ultimate backstop (was gpt-oss-120b; 400s since ~2026-08)
36467
36480
  ]
36468
36481
  },
36469
36482
  REASONING: {
@@ -36564,7 +36577,6 @@ var init_top_models = __esm({
36564
36577
  "deepseek/deepseek-v4-pro",
36565
36578
  "deepseek/deepseek-chat",
36566
36579
  "deepseek/deepseek-reasoner",
36567
- "free/deepseek-v4-flash",
36568
36580
  "free/nemotron-3-nano-omni-30b-a3b-reasoning",
36569
36581
  "free/mistral-nemotron",
36570
36582
  "free/step-3.7-flash",
@@ -36764,6 +36776,14 @@ var init_models = __esm({
36764
36776
  "gpt-5.6-sol": "openai/gpt-5.6-sol",
36765
36777
  "gpt-5.6-terra": "openai/gpt-5.6-terra",
36766
36778
  "gpt-5.6-luna": "openai/gpt-5.6-luna",
36779
+ // Pro reasoning tiers (2026-08-03). Explicit pins only — the generic
36780
+ // shorthands above stay on standard Terra.
36781
+ "gpt-5.6-sol-pro": "openai/gpt-5.6-sol-pro",
36782
+ "gpt-5.6-terra-pro": "openai/gpt-5.6-terra-pro",
36783
+ "gpt-5.6-luna-pro": "openai/gpt-5.6-luna-pro",
36784
+ "sol-pro": "openai/gpt-5.6-sol-pro",
36785
+ "terra-pro": "openai/gpt-5.6-terra-pro",
36786
+ "luna-pro": "openai/gpt-5.6-luna-pro",
36767
36787
  "gpt-5.5": "openai/gpt-5.5",
36768
36788
  "gpt-5.5-pro": "openai/gpt-5.5-pro",
36769
36789
  // ChatGPT Instant. `chat-latest` is a rolling upstream id — pinning it means
@@ -36815,6 +36835,20 @@ var init_models = __esm({
36815
36835
  "qwen3.7-max": "qwen/qwen3.7-max",
36816
36836
  "qwen-3.7-max": "qwen/qwen3.7-max",
36817
36837
  "qwen3-7-max": "qwen/qwen3.7-max",
36838
+ // Plus/Flash tiers (2026-08-03) — explicit pins, same rule as Max.
36839
+ "qwen3.7-plus": "qwen/qwen3.7-plus",
36840
+ "qwen-3.7-plus": "qwen/qwen3.7-plus",
36841
+ "qwen3.7-flash": "qwen/qwen3.7-flash",
36842
+ "qwen-3.7-flash": "qwen/qwen3.7-flash",
36843
+ // Tencent + Xiaomi (2026-07-25) — each maker has exactly one model, so the
36844
+ // bare maker names are safe to bind.
36845
+ hy3: "tencent/hy3",
36846
+ tencent: "tencent/hy3",
36847
+ hunyuan: "tencent/hy3",
36848
+ mimo: "xiaomi/mimo-v2.5-pro",
36849
+ "mimo-v2.5-pro": "xiaomi/mimo-v2.5-pro",
36850
+ "mimo-v2.5": "xiaomi/mimo-v2.5-pro",
36851
+ xiaomi: "xiaomi/mimo-v2.5-pro",
36818
36852
  // Google
36819
36853
  // gemini-3-pro-preview delisted by Google 2026-06-06 — mirror the gateway
36820
36854
  // redirect to its successor so pinned callers land on 3.1-pro, not an error.
@@ -36830,7 +36864,10 @@ var init_models = __esm({
36830
36864
  flash: "google/gemini-2.5-flash",
36831
36865
  "gemini-3.1-pro-preview": "google/gemini-3.1-pro",
36832
36866
  "google/gemini-3.1-pro-preview": "google/gemini-3.1-pro",
36867
+ "gemini-3.6-flash": "google/gemini-3.6-flash",
36868
+ "gemini-3.6": "google/gemini-3.6-flash",
36833
36869
  "gemini-3.5-flash": "google/gemini-3.5-flash",
36870
+ "gemini-3.5-flash-lite": "google/gemini-3.5-flash-lite",
36834
36871
  "gemini-3.1-flash-lite": "google/gemini-3.1-flash-lite",
36835
36872
  "gemini-2.5-flash-lite": "google/gemini-2.5-flash-lite",
36836
36873
  // xAI — grok-4.3 is the public flagship since 2026-06-04 (grok-3 and the
@@ -36866,12 +36903,17 @@ var init_models = __esm({
36866
36903
  "gpt-20b": "free/gpt-oss-20b",
36867
36904
  "nvidia/gpt-oss-120b": "free/gpt-oss-120b",
36868
36905
  "nvidia/gpt-oss-20b": "free/gpt-oss-20b",
36869
- // deepseek family → v4-flash, matching blockrun's 2026-07-17 redirect map
36870
- // (v4-flash recovered in the live re-probe; v3.2/v4-pro stay dead upstream).
36871
- "nvidia/deepseek-v3.2": "free/deepseek-v4-flash",
36872
- "free/deepseek-v3.2": "free/deepseek-v4-flash",
36873
- "nvidia/deepseek-v4-pro": "free/deepseek-v4-flash",
36874
- "free/deepseek-v4-pro": "free/deepseek-v4-flash",
36906
+ // deepseek free family: v4-flash EOL'd 2026-08-12 (HTTP 410 from NVIDIA on both
36907
+ // probe passes; prod gate fired [ALERT][free-model-dead] kind=gone twice that
36908
+ // morning). The whole nvidia/deepseek-* family is now dead upstream — blockrun
36909
+ // hid flash and retargeted v3.2/v4-pro (whose redirects chained through flash)
36910
+ // straight to gpt-oss-120b. Ids naming v4-flash itself keep the real id (the
36911
+ // gateway redirects them); the v3.2/v4-pro ids follow blockrun's retarget
36912
+ // rather than chaining through a second dead model.
36913
+ "nvidia/deepseek-v3.2": "free/gpt-oss-120b",
36914
+ "free/deepseek-v3.2": "free/gpt-oss-120b",
36915
+ "nvidia/deepseek-v4-pro": "free/gpt-oss-120b",
36916
+ "free/deepseek-v4-pro": "free/gpt-oss-120b",
36875
36917
  "nvidia/deepseek-v4-flash": "free/deepseek-v4-flash",
36876
36918
  "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": "free/nemotron-3-nano-omni-30b-a3b-reasoning",
36877
36919
  // qwen3-coder-480b retired (NVIDIA EOL 2026-06-14). Its server-side redirect used
@@ -36913,13 +36955,16 @@ var init_models = __esm({
36913
36955
  "mistral-large-3-675b": "free/mistral-large-3-675b",
36914
36956
  "qwen3.5-122b": "free/qwen3.5-122b-a10b",
36915
36957
  "qwen3-122b": "free/qwen3.5-122b-a10b",
36916
- // Free model shorthand aliases (v4-flash recovered 2026-07-17 — live again)
36917
- "deepseek-free": "free/deepseek-v4-flash",
36918
- "deepseek-v4-pro": "free/deepseek-v4-flash",
36919
- // free shorthand → flash (pro still hung)
36958
+ // Free model shorthand aliases. v4-flash EOL'd 2026-08-12 — no free DeepSeek
36959
+ // is left anywhere, so the generic "a free deepseek" shorthand follows the
36960
+ // gateway's retarget (blockrun's /free-deepseek page points at gpt-oss-120b
36961
+ // too). Shorthands naming v4-flash itself stay on the real id — the gateway
36962
+ // redirects them, same treatment as seed-oss/mistral-large pins.
36963
+ "deepseek-free": "free/gpt-oss-120b",
36964
+ "deepseek-v4-pro": "free/gpt-oss-120b",
36965
+ // free shorthand; pro dead upstream (410)
36920
36966
  "deepseek-v4-flash": "free/deepseek-v4-flash",
36921
- "v4-pro": "free/deepseek-v4-flash",
36922
- // V4 Pro NVIDIA hung → flash
36967
+ "v4-pro": "free/gpt-oss-120b",
36923
36968
  "v4-flash": "free/deepseek-v4-flash",
36924
36969
  "mistral-free": "free/mistral-nemotron",
36925
36970
  // mistral-large-3-675b EOL'd 2026-07-28 → last live free Mistral (blockrun demoted its /free-mistral primary the same way)
@@ -36999,6 +37044,10 @@ var init_models = __esm({
36999
37044
  banana: "google/nano-banana",
37000
37045
  "banana-pro": "google/nano-banana-pro",
37001
37046
  "nano-banana-pro": "google/nano-banana-pro",
37047
+ // Nano Banana 2 (Gemini 3.1 Flash imagegen, 2026-08-03). Explicit pins —
37048
+ // bare `nano-banana`/`banana` stay on the original.
37049
+ "nano-banana-2": "google/nano-banana-2",
37050
+ "banana-2": "google/nano-banana-2",
37002
37051
  seedream: "bytedance/seedream-5-pro",
37003
37052
  "grok-imagine": "xai/grok-imagine-image",
37004
37053
  "grok-imagine-pro": "xai/grok-imagine-image-pro",
@@ -37015,7 +37064,12 @@ var init_models = __esm({
37015
37064
  "seedance-2-fast": "bytedance/seedance-2.0-fast",
37016
37065
  "seedance-2": "bytedance/seedance-2.0",
37017
37066
  "seedance-2.5": "bytedance/seedance-2.5",
37018
- "seedance-2-5": "bytedance/seedance-2.5"
37067
+ "seedance-2-5": "bytedance/seedance-2.5",
37068
+ // Seedance 2.0 Mini (2026-08-12): 720p + synced audio at half the flagship
37069
+ // rate. Note it is NOT cheaper than 1.5-pro, so bare `seedance` stays put.
37070
+ "seedance-2-mini": "bytedance/seedance-2.0-mini",
37071
+ "seedance-2.0-mini": "bytedance/seedance-2.0-mini",
37072
+ "seedance-mini": "bytedance/seedance-2.0-mini"
37019
37073
  };
37020
37074
  BLOCKRUN_MODELS = [
37021
37075
  // Smart routing meta-models — proxy replaces with actual model
@@ -37123,11 +37177,12 @@ var init_models = __esm({
37123
37177
  toolCalling: true
37124
37178
  },
37125
37179
  {
37180
+ // Terra/Luna repriced 2026-07-30 (OpenAI price cut, blockrun #326).
37126
37181
  id: "openai/gpt-5.6-terra",
37127
37182
  name: "GPT-5.6 Terra",
37128
37183
  version: "5.6",
37129
- inputPrice: 2.5,
37130
- outputPrice: 15,
37184
+ inputPrice: 2,
37185
+ outputPrice: 12,
37131
37186
  contextWindow: 105e4,
37132
37187
  maxOutput: 128e3,
37133
37188
  reasoning: true,
@@ -37139,10 +37194,52 @@ var init_models = __esm({
37139
37194
  id: "openai/gpt-5.6-luna",
37140
37195
  name: "GPT-5.6 Luna",
37141
37196
  version: "5.6",
37197
+ inputPrice: 0.2,
37198
+ outputPrice: 1.2,
37199
+ contextWindow: 105e4,
37200
+ maxOutput: 128e3,
37201
+ vision: true,
37202
+ agentic: true,
37203
+ toolCalling: true
37204
+ },
37205
+ // GPT-5.6 Pro tiers (blockrun #329, 2026-08-03): each base tier with pro
37206
+ // reasoning mode. Terra Pro lands at half the standard Terra rate; Luna Pro
37207
+ // is the budget deep-reasoning tier.
37208
+ {
37209
+ id: "openai/gpt-5.6-sol-pro",
37210
+ name: "GPT-5.6 Sol Pro",
37211
+ version: "5.6",
37212
+ inputPrice: 5,
37213
+ outputPrice: 30,
37214
+ contextWindow: 105e4,
37215
+ maxOutput: 128e3,
37216
+ reasoning: true,
37217
+ vision: true,
37218
+ agentic: true,
37219
+ toolCalling: true
37220
+ },
37221
+ {
37222
+ id: "openai/gpt-5.6-terra-pro",
37223
+ name: "GPT-5.6 Terra Pro",
37224
+ version: "5.6",
37142
37225
  inputPrice: 1,
37143
37226
  outputPrice: 6,
37144
37227
  contextWindow: 105e4,
37145
37228
  maxOutput: 128e3,
37229
+ reasoning: true,
37230
+ vision: true,
37231
+ agentic: true,
37232
+ toolCalling: true
37233
+ },
37234
+ {
37235
+ id: "openai/gpt-5.6-luna-pro",
37236
+ name: "GPT-5.6 Luna Pro",
37237
+ version: "5.6",
37238
+ inputPrice: 0.1,
37239
+ outputPrice: 0.6,
37240
+ contextWindow: 105e4,
37241
+ maxOutput: 128e3,
37242
+ reasoning: true,
37146
37243
  vision: true,
37147
37244
  agentic: true,
37148
37245
  toolCalling: true
@@ -37546,19 +37643,45 @@ var init_models = __esm({
37546
37643
  toolCalling: true
37547
37644
  },
37548
37645
  {
37549
- // Latest-generation Flash with built-in thinking mode (backend
37550
- // 2026-05-19) — frontier-class quality at Flash pricing.
37646
+ // Newest-generation Flash with built-in thinking mode (blockrun #329,
37647
+ // 2026-08-03). 17% cheaper output than 3.5 Flash.
37648
+ id: "google/gemini-3.6-flash",
37649
+ name: "Gemini 3.6 Flash",
37650
+ version: "3.6",
37651
+ inputPrice: 1.5,
37652
+ outputPrice: 7.5,
37653
+ contextWindow: 1048576,
37654
+ maxOutput: 65536,
37655
+ reasoning: true,
37656
+ vision: true,
37657
+ toolCalling: true
37658
+ },
37659
+ {
37660
+ // Repriced 0.5/3.0 → 1.5/9.0 (blockrun #304: it was billed at 1/3 of
37661
+ // Google's real rate).
37551
37662
  id: "google/gemini-3.5-flash",
37552
37663
  name: "Gemini 3.5 Flash",
37553
37664
  version: "3.5",
37554
- inputPrice: 0.5,
37555
- outputPrice: 3,
37665
+ inputPrice: 1.5,
37666
+ outputPrice: 9,
37556
37667
  contextWindow: 1048576,
37557
37668
  maxOutput: 65536,
37558
37669
  reasoning: true,
37559
37670
  vision: true,
37560
37671
  toolCalling: true
37561
37672
  },
37673
+ {
37674
+ // Ultra-fast lightweight tier with thinking mode (blockrun #329).
37675
+ id: "google/gemini-3.5-flash-lite",
37676
+ name: "Gemini 3.5 Flash Lite",
37677
+ version: "3.5",
37678
+ inputPrice: 0.3,
37679
+ outputPrice: 2.5,
37680
+ contextWindow: 1048576,
37681
+ maxOutput: 65536,
37682
+ reasoning: true,
37683
+ toolCalling: true
37684
+ },
37562
37685
  {
37563
37686
  id: "google/gemini-3-flash-preview",
37564
37687
  name: "Gemini 3 Flash Preview",
@@ -37615,12 +37738,14 @@ var init_models = __esm({
37615
37738
  },
37616
37739
  // DeepSeek — V4 family (2026-04-24). The legacy deepseek-chat/reasoner
37617
37740
  // aliases are served upstream as V4 Flash non-thinking / thinking modes.
37741
+ // Repriced 0.20/0.40 → 0.14/0.28 (blockrun #354: DeepSeek's published
37742
+ // deepseek-v4-flash rate; the old numbers were 1.43x the real rate).
37618
37743
  {
37619
37744
  id: "deepseek/deepseek-chat",
37620
37745
  name: "DeepSeek V4 Flash Chat",
37621
37746
  version: "4-flash",
37622
- inputPrice: 0.2,
37623
- outputPrice: 0.4,
37747
+ inputPrice: 0.14,
37748
+ outputPrice: 0.28,
37624
37749
  contextWindow: 1e6,
37625
37750
  maxOutput: 8192,
37626
37751
  toolCalling: true
@@ -37629,8 +37754,8 @@ var init_models = __esm({
37629
37754
  id: "deepseek/deepseek-reasoner",
37630
37755
  name: "DeepSeek V4 Flash Reasoner",
37631
37756
  version: "4-flash",
37632
- inputPrice: 0.2,
37633
- outputPrice: 0.4,
37757
+ inputPrice: 0.14,
37758
+ outputPrice: 0.28,
37634
37759
  contextWindow: 1e6,
37635
37760
  maxOutput: 8192,
37636
37761
  reasoning: true,
@@ -37709,6 +37834,32 @@ var init_models = __esm({
37709
37834
  agentic: true,
37710
37835
  toolCalling: true
37711
37836
  },
37837
+ // Qwen3.7 Plus/Flash (blockrun #329, 2026-08-03): the balanced and
37838
+ // latency tiers under Max. Plus genuinely caps output at 131072 while
37839
+ // Flash and Max cap at 65536 (endpoint-probed upstream).
37840
+ {
37841
+ id: "qwen/qwen3.7-plus",
37842
+ name: "Qwen3.7 Plus",
37843
+ version: "3.7-plus",
37844
+ inputPrice: 0.32,
37845
+ outputPrice: 1.28,
37846
+ contextWindow: 1e6,
37847
+ maxOutput: 131072,
37848
+ reasoning: true,
37849
+ agentic: true,
37850
+ toolCalling: true
37851
+ },
37852
+ {
37853
+ id: "qwen/qwen3.7-flash",
37854
+ name: "Qwen3.7 Flash",
37855
+ version: "3.7-flash",
37856
+ inputPrice: 0.03,
37857
+ outputPrice: 0.13,
37858
+ contextWindow: 1e6,
37859
+ maxOutput: 65536,
37860
+ reasoning: true,
37861
+ toolCalling: true
37862
+ },
37712
37863
  // Kimi K2.6 — superseded by K2.7 (2026-06-13), hidden on BlockRun but still routable.
37713
37864
  {
37714
37865
  id: "moonshot/kimi-k2.6",
@@ -37920,6 +38071,34 @@ var init_models = __esm({
37920
38071
  agentic: true,
37921
38072
  toolCalling: true
37922
38073
  },
38074
+ // Tencent + Xiaomi (blockrun 2026-07-25): the two largest real demand gaps
38075
+ // in the catalog — Hy3 held the #1 usage slot on the biggest public
38076
+ // aggregator for 19 days; MiMo ran ~22% weekly share in April. Both are
38077
+ // reasoning models resold via blockrun's OpenRouter pool. toolCalling
38078
+ // LIVE-VERIFIED 2026-08-12: both returned a structured tool_calls array
38079
+ // (name + valid JSON args, finish_reason "tool_calls") through the gateway.
38080
+ {
38081
+ id: "tencent/hy3",
38082
+ name: "Tencent Hy3",
38083
+ version: "hy3",
38084
+ inputPrice: 0.132,
38085
+ outputPrice: 0.528,
38086
+ contextWindow: 262144,
38087
+ maxOutput: 128e3,
38088
+ reasoning: true,
38089
+ toolCalling: true
38090
+ },
38091
+ {
38092
+ id: "xiaomi/mimo-v2.5-pro",
38093
+ name: "Xiaomi MiMo-V2.5 Pro",
38094
+ version: "v2.5-pro",
38095
+ inputPrice: 0.435,
38096
+ outputPrice: 0.87,
38097
+ contextWindow: 1048576,
38098
+ maxOutput: 131072,
38099
+ reasoning: true,
38100
+ toolCalling: true
38101
+ },
37923
38102
  // MiniMax
37924
38103
  {
37925
38104
  id: "minimax/minimax-m3",
@@ -37993,11 +38172,13 @@ var init_models = __esm({
37993
38172
  maxOutput: 16384
37994
38173
  },
37995
38174
  {
37996
- // V4 Flash: 284B / 13B active MoE, 1M context. ~5x faster than V4 Pro.
37997
- // Strong on chat/summarization (MMLU-Pro 86.2). Caveat: weaker factual
37998
- // recall (SimpleQA 34% vs Pro's 58%) — pick V4 Pro for fact-heavy loops.
37999
- // Recovered in blockrun's 2026-07-17 live re-probe (3.2s both passes) —
38000
- // un-hidden upstream and back in the advertised free 8.
38175
+ // V4 Flash: 284B / 13B active MoE, 1M context. EOL'd 2026-08-12 — NVIDIA
38176
+ // published 410 Gone ("has reached its end of life") on both probe passes
38177
+ // and blockrun's prod gate fired [ALERT][free-model-dead] kind=gone twice
38178
+ // that morning. The whole nvidia/deepseek-* family is dead upstream; there
38179
+ // is no free DeepSeek left anywhere. Blockrun hid it and redirects calls to
38180
+ // gpt-oss-120b. Entry kept so explicit pins stay routable; off the picker,
38181
+ // the FREE_MODELS cascade, and the router fallback chains.
38001
38182
  id: "free/deepseek-v4-flash",
38002
38183
  name: "[Free] DeepSeek V4 Flash",
38003
38184
  version: "v4-flash",
@@ -38081,7 +38262,8 @@ var init_models = __esm({
38081
38262
  // 2026-06-16: BlockRun's 2026-06-14 free-tier refresh (self-healing health gate
38082
38263
  // + probe-verified lineup, blockrun commit 5817ecd) added these live NVIDIA free
38083
38264
  // models. Status per blockrun's 2026-07-17 live re-probe: qwen3-coder-480b and
38084
- // glm-4.7 stay dead (server-redirected); deepseek-v4-flash recovered (see above).
38265
+ // glm-4.7 stay dead (server-redirected); deepseek-v4-flash recovered then
38266
+ // EOL'd for good 2026-08-12 (see above).
38085
38267
  {
38086
38268
  // Qwen3-Next 80B (A3B active MoE): 262K context. DIED in the 2026-07-17
38087
38269
  // re-probe (">60s / DEGRADED") — hidden upstream, gateway redirects pinned
@@ -38186,11 +38368,12 @@ var init_models = __esm({
38186
38368
  },
38187
38369
  {
38188
38370
  // Flat-rate launch promo ended 2026-06-06 — backend bills per-token now.
38371
+ // Repriced 0.60/1.92 → 1.00/3.20 (blockrun #354 correction).
38189
38372
  id: "zai/glm-5",
38190
38373
  name: "GLM-5",
38191
38374
  version: "5",
38192
- inputPrice: 0.6,
38193
- outputPrice: 1.92,
38375
+ inputPrice: 1,
38376
+ outputPrice: 3.2,
38194
38377
  contextWindow: 2e5,
38195
38378
  maxOutput: 128e3,
38196
38379
  reasoning: true,
@@ -57765,6 +57948,14 @@ Then run: npx @blockrun/clawrouter`
57765
57948
  solanaAddress = await getSolanaAddress(derived.solanaPrivateKeyBytes);
57766
57949
  } catch {
57767
57950
  }
57951
+ let solanaDefaultSaved = false;
57952
+ if (solanaAddress) {
57953
+ try {
57954
+ await savePaymentChain("solana");
57955
+ solanaDefaultSaved = true;
57956
+ } catch {
57957
+ }
57958
+ }
57768
57959
  console.log(`[ClawRouter]`);
57769
57960
  console.log(`[ClawRouter] \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`);
57770
57961
  console.log(`[ClawRouter] NEW WALLET GENERATED \u2014 BACK UP YOUR KEY NOW`);
@@ -57777,6 +57968,12 @@ Then run: npx @blockrun/clawrouter`
57777
57968
  console.log(`[ClawRouter] Mnemonic : ${MNEMONIC_FILE}`);
57778
57969
  console.log(`[ClawRouter]`);
57779
57970
  console.log(`[ClawRouter] Both EVM (Base) and Solana wallets are ready.`);
57971
+ if (solanaDefaultSaved) {
57972
+ console.log(
57973
+ `[ClawRouter] Default payment chain: Solana \u2014 fund the Solana address above with USDC.`
57974
+ );
57975
+ console.log(`[ClawRouter] To switch to Base, run in OpenClaw: /wallet base`);
57976
+ }
57780
57977
  console.log(`[ClawRouter] To back up, run in OpenClaw:`);
57781
57978
  console.log(`[ClawRouter] /wallet export`);
57782
57979
  console.log(`[ClawRouter]`);
@@ -92587,8 +92784,6 @@ var init_proxy = __esm({
92587
92784
  FREE_MODELS = /* @__PURE__ */ new Set([
92588
92785
  "free/gpt-oss-120b",
92589
92786
  "free/gpt-oss-20b",
92590
- "free/deepseek-v4-flash",
92591
- // 1M ctx; slow (~10 tok/s, 07-28 probe) but completes
92592
92787
  "free/mistral-nemotron",
92593
92788
  // strong instruction following
92594
92789
  "free/step-3.7-flash",
@@ -92685,6 +92880,8 @@ var init_proxy = __esm({
92685
92880
  sizes: { "1024x1024": 0.045, "2048x1024": 0.045, "2048x2048": 0.09 }
92686
92881
  },
92687
92882
  "google/nano-banana": { default: 0.05 },
92883
+ // Nano Banana 2 (Gemini 3.1 Flash imagegen, blockrun #329): $0.09/image at 1K.
92884
+ "google/nano-banana-2": { default: 0.09, sizes: { "1024x1024": 0.09 } },
92688
92885
  "google/nano-banana-pro": {
92689
92886
  default: 0.1,
92690
92887
  sizes: { "1024x1024": 0.1, "2048x2048": 0.1, "4096x4096": 0.15 }
@@ -92718,6 +92915,13 @@ var init_proxy = __esm({
92718
92915
  pricePerSecond: 0.227,
92719
92916
  defaultDurationSeconds: 5
92720
92917
  },
92918
+ // Seedance 2.0 Mini (blockrun #366/#368, 2026-08-12): 720p + synced audio at
92919
+ // half the flagship rate, 480p/720p only, 4–15s. blockrun signs the 3dp-floored
92920
+ // per-second value (0.079, not the raw 0.0797) — mirror the signed number.
92921
+ "bytedance/seedance-2.0-mini": {
92922
+ pricePerSecond: 0.079,
92923
+ defaultDurationSeconds: 5
92924
+ },
92721
92925
  // Seedance 2.5: 720p with synced audio, up to 30s. Not a replacement for 2.0
92722
92926
  // Pro — that is still the one for 1080p/4K. No OpenRouter failover exists for
92723
92927
  // 2.5, so a token360 outage surfaces as an error instead of quietly rendering
@@ -226066,6 +226270,7 @@ function buildVideoGenerationProvider() {
226066
226270
  "bytedance/seedance-1.5-pro",
226067
226271
  "bytedance/seedance-2.0-fast",
226068
226272
  "bytedance/seedance-2.0",
226273
+ "bytedance/seedance-2.0-mini",
226069
226274
  "bytedance/seedance-2.5"
226070
226275
  ],
226071
226276
  capabilities: {
@@ -226567,7 +226772,7 @@ var init_index = __esm({
226567
226772
  const parsed = parseGenArgs(ctx.args ?? "");
226568
226773
  if (!parsed.prompt) {
226569
226774
  return {
226570
- text: "Usage: `/cr-imagegen <prompt> [--model=<alias>] [--size=1024x1024] [--n=1]`\n\nAliases: `nano-banana` (default), `banana-pro`, `dalle`, `gpt-image`, `flux`, `grok-imagine`, `grok-imagine-pro`, `cogview`."
226775
+ text: "Usage: `/cr-imagegen <prompt> [--model=<alias>] [--size=1024x1024] [--n=1]`\n\nAliases: `nano-banana` (default), `banana-2` (Gemini 3.1 Flash quality), `banana-pro`, `dalle`, `gpt-image`, `flux`, `grok-imagine`, `grok-imagine-pro`, `cogview`."
226571
226776
  };
226572
226777
  }
226573
226778
  const model = resolveModelAlias(parsed.model ?? "nano-banana");
@@ -226619,7 +226824,7 @@ ${errText}`
226619
226824
  const parsed = parseGenArgs(ctx.args ?? "");
226620
226825
  if (!parsed.prompt) {
226621
226826
  return {
226622
- text: "Usage: `/videogen <prompt> [--model=<alias>] [--duration=5|8|10]`\n\nAliases: `seedance` (1.5-pro, default \u2014 cheapest), `seedance-2-fast`, `seedance-2`, `seedance-2.5` (720p + synced audio, long-form), `grok-video`.\n\n\u23F1\uFE0F Generation takes 60\u2013180 seconds. Payment settles only on success."
226827
+ text: "Usage: `/videogen <prompt> [--model=<alias>] [--duration=5|8|10]`\n\nAliases: `seedance` (1.5-pro, default \u2014 cheapest), `seedance-2-fast`, `seedance-2`, `seedance-2-mini` (720p + audio, half the flagship rate), `seedance-2.5` (720p + synced audio, long-form), `grok-video`.\n\n\u23F1\uFE0F Generation takes 60\u2013180 seconds. Payment settles only on success."
226623
226828
  };
226624
226829
  }
226625
226830
  const model = resolveModelAlias(parsed.model ?? "seedance");
package/dist/index.d.ts CHANGED
@@ -767,7 +767,11 @@ type PaymentChain = "base" | "solana";
767
767
  type ProxyOptions = {
768
768
  wallet: WalletConfig;
769
769
  apiBase?: string;
770
- /** Payment chain: "base" (default) or "solana". Can also be set via CLAWROUTER_PAYMENT_CHAIN env var. */
770
+ /**
771
+ * Payment chain: "base" or "solana". New installs persist "solana" at wallet
772
+ * generation; absent config resolves to "base" for pre-existing installs.
773
+ * Can also be set via CLAWROUTER_PAYMENT_CHAIN env var.
774
+ */
771
775
  paymentChain?: PaymentChain;
772
776
  /** Port to listen on (default: 8402) */
773
777
  port?: number;
@@ -895,6 +899,8 @@ declare function savePaymentChain(chain: "base" | "solana"): Promise<void>;
895
899
  /**
896
900
  * Load the persisted payment chain selection from disk.
897
901
  * Returns "base" if no file exists or the file is invalid.
902
+ * New installs persist "solana" at wallet generation, so an absent file
903
+ * means a pre-existing install whose funds live on Base.
898
904
  */
899
905
  declare function loadPaymentChain(): Promise<"base" | "solana">;
900
906
  /**
@@ -1488,7 +1494,8 @@ declare function buildPartnerTools(proxyBaseUrl: string): PartnerToolDefinition[
1488
1494
  * # Install the plugin
1489
1495
  * openclaw plugins install @blockrun/clawrouter
1490
1496
  *
1491
- * # Fund your wallet with USDC on Base (address printed on install)
1497
+ * # Fund your wallet with USDC (Solana for new installs, Base for existing ones;
1498
+ * # the funding address is printed on install)
1492
1499
  *
1493
1500
  * # Use smart routing (auto-picks cheapest model)
1494
1501
  * openclaw models set blockrun/auto