@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/README.md +28 -21
- package/dist/cli.js +275 -70
- package/dist/index.d.ts +9 -2
- package/dist/index.js +275 -70
- package/dist/router/index.js +48 -34
- package/docs/configuration.md +2 -9
- package/package.json +3 -3
- package/skills/clawrouter/SKILL.md +4 -4
- package/src/top-models.json +0 -1
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(
|
|
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
|
-
] :
|
|
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
|
-
"
|
|
36177
|
-
//
|
|
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: "
|
|
36251
|
-
// FREE! $0.00/$0.00 —
|
|
36263
|
+
primary: "nvidia/step-3.7-flash",
|
|
36264
|
+
// FREE! $0.00/$0.00 — new NVIDIA free tier flagship
|
|
36252
36265
|
fallback: [
|
|
36253
|
-
"
|
|
36254
|
-
// FREE —
|
|
36255
|
-
|
|
36256
|
-
//
|
|
36257
|
-
//
|
|
36258
|
-
//
|
|
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
|
-
"
|
|
36376
|
-
// NVIDIA free ultimate backstop (was
|
|
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
|
-
"
|
|
36466
|
-
// NVIDIA free ultimate backstop (was
|
|
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
|
|
36870
|
-
//
|
|
36871
|
-
|
|
36872
|
-
|
|
36873
|
-
|
|
36874
|
-
|
|
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
|
|
36917
|
-
"
|
|
36918
|
-
|
|
36919
|
-
//
|
|
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/
|
|
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
|
|
37130
|
-
outputPrice:
|
|
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
|
-
//
|
|
37550
|
-
// 2026-
|
|
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:
|
|
37555
|
-
outputPrice:
|
|
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.
|
|
37623
|
-
outputPrice: 0.
|
|
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.
|
|
37633
|
-
outputPrice: 0.
|
|
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.
|
|
37997
|
-
//
|
|
37998
|
-
//
|
|
37999
|
-
//
|
|
38000
|
-
//
|
|
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
|
|
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:
|
|
38193
|
-
outputPrice:
|
|
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
|
-
/**
|
|
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
|
|
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
|