From 9aa611026c71bf7283ed6501a21f1ec936aa8bf5 Mon Sep 17 00:00:00 2001 From: 1bcMax Date: Tue, 29 Sep 2026 20:48:29 +0800 Subject: [PATCH] chore: publish the 84% savings figure everywhere, and drop the delisted nemotron-3-nano-30b Savings. src/index.ts said 78% and openclaw.plugin.json said 92%. Every synced surface says 84%: the published auto-vs-Opus-5 figure (eco is 98%). Neither file can hold a marker, so brand-numbers.test.ts now asserts every "NN% cost savings" in both equals savings.autoVsBaselinePct and that at least one such claim exists. Free lineup. blockrun delisted nvidia/nemotron-3-nano-30b on 2026-09-08 (NVIDIA deprovisioned it for the account) and redirects it to nano-omni. It stayed in FREE_MODELS, where startup logged it as unserved and skipped it on every boot. It was also in the picker, the eco SIMPLE chain (via router-core) and five aliases. - FREE_MODELS, top-models.json: removed. The cascade is now the six live free models, in the same relative order. - Aliases nano-30b, nemotron-nano-30b, nvidia/nemotron-3-nano-30b, nemotron-nano and nemotron-nano-9b now follow the gateway's redirect to free/nemotron-3-nano-omni-30b-a3b-reasoning. The count stays 259, which is published in brand-numbers.json. - The catalog entry stays, marked delisted, like the other retired free ids. That keeps explicit pins routable. - @blockrun/router-core re-pinned to e38958b (router-core#3). That moves eco SIMPLE's second rung to nano-omni and marks nano-omni supportsVision:false, so image turns still skip it. free-model-liveness.test.ts failed on the old pin once the picker dropped nano-30b, which is the guard doing its job. It also gains a named regression for this id. - README, routing-profiles.md, the free-models article and reinstall.sh no longer list it. Counts go from seven to six. Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 5 ++-- docs/9-free-ai-models-zero-cost-blockrun.md | 18 ++++------- docs/routing-profiles.md | 18 +++++------ openclaw.plugin.json | 2 +- package-lock.json | 6 ++-- package.json | 2 +- scripts/reinstall.sh | 1 - src/index.ts | 4 +-- src/models.test.ts | 2 +- src/models.ts | 33 +++++++++++++-------- src/proxy.ts | 16 ++++++---- src/router/brand-numbers.test.ts | 23 ++++++++++++++ src/router/free-model-liveness.test.ts | 13 ++++++++ src/top-models.json | 1 - 14 files changed, 91 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 2f8b44f2..766f5eca 100644 --- a/README.md +++ b/README.md @@ -491,7 +491,6 @@ No Surf account, no API key — settles directly to Surf's Base treasury in USDC | Model | Input $/M | Output $/M | ~$/request | Context | Features | | ------------------------------------------- | --------: | ---------: | ---------: | ------- | -------------------------------------------- | | free/nemotron-3.5-lightning | **FREE** | **FREE** | **$0** | 1M | reasoning (thinking mode) — the free default | -| free/nemotron-3-nano-30b | **FREE** | **FREE** | **$0** | 131K | fastest free model (~121 tok/s) | | free/laguna-xs-2.1 | **FREE** | **FREE** | **$0** | 131K | coding (Poolside, ~161 tok/s) | | free/north-mini-code | **FREE** | **FREE** | **$0** | 256K | coding (Cohere, sub-second) | | free/nemotron-3-nano-omni-30b-a3b-reasoning | **FREE** | **FREE** | **$0** | 256K | reasoning (text only — see note) | @@ -575,7 +574,7 @@ No Surf account, no API key — settles directly to Surf's Base treasury in USDC | openai/gpt-5.4-pro | $30.00 | $180.00 | $0.1050 | 400K | reasoning, tools | | openai/gpt-5.5-pro | $30.00 | $180.00 | $0.1050 | 1M | reasoning, vision, tools | -> **Free tier:** 6 open-weight models cost nothing — `/model free` pins the free default (`nemotron-3.5-lightning`, with the other six as fallbacks), `/model eco` opens on it, or pick one directly (e.g., `/model lightning` for 1M-context reasoning, `/model north-mini` or `/model laguna` for fast coding, `/model nano-30b` for the fastest). +> **Free tier:** 6 open-weight models cost nothing — `/model free` pins the free default (`nemotron-3.5-lightning`, with the other five as fallbacks), `/model eco` opens on it, or pick one directly (e.g., `/model lightning` for 1M-context reasoning, `/model north-mini` or `/model laguna` for fast coding). > > **No free vision.** Two free models are catalogued as vision-capable and neither reliably is: on a 64×64 solid-colour probe `nemotron-3-nano-omni` was right 1 of 4 times on Base and answered "white" for red on Solana, and `llama-3.2-11b-vision` replied "I'm unable to see the image" 3 of 3 while answering text fine. Both return HTTP 200, so a wrong answer arrives with no error to branch on. ClawRouter therefore does not flag them for vision, and requests carrying an `image_url` route to a paid vision model instead. > **Best value:** `gpt-5-nano` and `gemini-2.5-flash-lite` deliver strong results at ~$0.0003/request. @@ -972,7 +971,7 @@ wallet, no key, no signup. See [Paying with a credit card](#paying-with-a-credit ### Is ClawRouter free? -ClawRouter itself is free and MIT licensed. You pay only for the LLM API calls routed through it — and several open-weight models (`nemotron-3.5-lightning`, `nemotron-3-nano-30b`, `laguna-xs-2.1`, `north-mini-code`, `nemotron-3-nano-omni-30b-a3b-reasoning`, `nemotron-3-ultra-550b`, `llama-3.2-11b-vision`) are completely free (text only). Use `/model free` to smart-route across them, or pick any by name. +ClawRouter itself is free and MIT licensed. You pay only for the LLM API calls routed through it — and several open-weight models (`nemotron-3.5-lightning`, `laguna-xs-2.1`, `north-mini-code`, `nemotron-3-nano-omni-30b-a3b-reasoning`, `nemotron-3-ultra-550b`, `llama-3.2-11b-vision`) are completely free (text only). Use `/model free` to smart-route across them, or pick any by name. --- diff --git a/docs/9-free-ai-models-zero-cost-blockrun.md b/docs/9-free-ai-models-zero-cost-blockrun.md index 61e12745..39913a81 100644 --- a/docs/9-free-ai-models-zero-cost-blockrun.md +++ b/docs/9-free-ai-models-zero-cost-blockrun.md @@ -25,12 +25,11 @@ BlockRun's answer: just take them. ## The Lineup: 6 Models, $0.00 -Through [ClawRouter](https://github.com/BlockRunAI/ClawRouter) — BlockRun's local AI routing proxy — you get zero-cost access to the following (verified live 2026-08-30): +Through [ClawRouter](https://github.com/BlockRunAI/ClawRouter) — BlockRun's local AI routing proxy — you get zero-cost access to the following (checked against the live catalog 2026-09-29): | Model | Context | Reasoning | Best For | | ---------------------------- | ------- | --------- | ------------------------------------------ | | **Nemotron 3.5 Lightning** | 1M | ✅ | The free default — thinking-mode reasoning | -| **Nemotron 3 Nano 30B** | 131K | ✅ | Fastest free model (~121 tok/s) | | **Nemotron 3 Ultra 550B** | 1M | ✅ | Largest free model — 550B / 55B active MoE | | **Nemotron 3 Nano Omni 30B** | 256K | ✅ | Strong generalist (text only in practice) | | **Llama 3.2 11B Vision** | 128K | — | Meta Llama (text only in practice) | @@ -99,12 +98,6 @@ A 30B-A3B mixture-of-experts model with a **1M-token context** and thinking-mode **Best for:** Long-context reasoning, multi-step planning, anything where the input is big. If you remember one free model name, remember this one. -### Nemotron 3 Nano 30B — The Fast One - -The **fastest free model in the catalog** — around 121 tokens/second on realistic workloads, not just short pings. Returns reasoning content. When you are iterating rapidly and each round-trip is a tax on your attention, this is the one to pin. - -**Best for:** Rapid iteration, prompt engineering, high-volume light tasks. - ### Nemotron 3 Ultra 550B — The Big One 550 billion total parameters, 55B active, 1M context — the **largest free model ever listed**. It is genuinely strong, and it is genuinely slower than the rest of the tier; treat it as the one you reach for when the task is hard rather than the one you leave pinned. @@ -176,7 +169,6 @@ If you're using Claude Code, one command switches you to any free model: ``` /model free → Nemotron 3.5 Lightning (1M ctx, the default) -/model nano-30b → Nemotron 3 Nano 30B (fastest) /model ultra-550b → Nemotron 3 Ultra 550B (largest) /model vision-free → Nemotron 3 Nano Omni (text only, see below) /model llama-vision → Llama 3.2 11B Vision (text only, see below) @@ -198,17 +190,17 @@ The gateway will return structured tool calls from these models, but ClawRouter ### 2. Reasoning Has a Ceiling -Five of the seven are reasoning-capable and handle most tasks well. On the hardest problems — competition-level math, formal proofs, deep multi-step planning — they don't match Claude Opus 5 or Sonnet 5. That's why ClawRouter's REASONING tier doesn't use free models. +Four of the six are reasoning-capable and handle most tasks well. On the hardest problems — competition-level math, formal proofs, deep multi-step planning — they don't match Claude Opus 5 or Sonnet 5. That's why ClawRouter's REASONING tier doesn't use free models. ### 3. There Is No Working Free Vision -Two of the seven are catalogued as vision-capable, and neither survives a real probe. On a 64×64 solid-red PNG, `nemotron-3-nano-omni` answered correctly 1 time in 4 on Base and returned "white" on Solana — where the response's own `model` field revealed a silent fallback to a text model. `llama-3.2-11b-vision` replied "I'm unable to see the image" on 3 of 3 attempts while answering plain text fine. Every one of those failures is an **HTTP 200**: the image is dropped and a confident wrong answer comes back with no error to branch on. +Two of the six are catalogued as vision-capable, and neither survives a real probe. On a 64×64 solid-red PNG, `nemotron-3-nano-omni` answered correctly 1 time in 4 on Base and returned "white" on Solana — where the response's own `model` field revealed a silent fallback to a text model. `llama-3.2-11b-vision` replied "I'm unable to see the image" on 3 of 3 attempts while answering plain text fine. Every one of those failures is an **HTTP 200**: the image is dropped and a confident wrong answer comes back with no error to branch on. ClawRouter therefore ships no `vision` flag on any free model, so requests carrying an image route to a paid vision model instead. The general lesson is worth more than the specific finding: **a catalog's capability list is a claim, not a measurement** — and one passing sample is not a measurement either. The first probe here returned the right colour; it took four to see that was luck. ### 4. Free Hosting Is Volatile -This is the real limitation, and it is worth more than the other two. On 2026-08-30 NVIDIA retired four of the five visible free models in one sweep, and none of the nine models this article originally listed is still in the tier. Free capacity comes from whatever a provider is willing to give away this quarter. Pin a free model if you like — but build so that losing it costs you a config line, not a rewrite. That is the entire argument for putting a router in front of them. +This is the real limitation, and it is worth more than the other two. On 2026-08-30 NVIDIA retired four of the five visible free models in one sweep, and none of the nine models this article originally listed is still in the tier. Nine days after the replacements were listed, NVIDIA deprovisioned one of them — `nemotron-3-nano-30b`, the fastest in the tier — and it was delisted on 2026-09-08. Free capacity comes from whatever a provider is willing to give away this quarter. Pin a free model if you like — but build so that losing it costs you a config line, not a rewrite. That is the entire argument for putting a router in front of them. --- @@ -219,7 +211,7 @@ This is the real limitation, and it is worth more than the other two. On 2026-08 Don't use one model for everything. Route by task type: ``` -Quick chat, formatting → Nemotron 3 Nano 30B (fastest) +Quick chat, formatting → Nemotron 3 Nano Omni 30B Code generation → North Mini Code or Laguna XS 2.1 Reasoning required → Nemotron 3.5 Lightning (1M ctx) Hardest free reasoning → Nemotron 3 Ultra 550B diff --git a/docs/routing-profiles.md b/docs/routing-profiles.md index c487ce06..776f0c55 100644 --- a/docs/routing-profiles.md +++ b/docs/routing-profiles.md @@ -32,12 +32,12 @@ Use `blockrun/auto` (or `/model auto`) for the best quality/price balance. Use `blockrun/eco` for maximum cost savings. The first stop is the free tier, so simple requests can cost $0.00. -| Tier | Primary Model | Input | Output | Fallback chain (in order) | -| --------- | --------------------------- | ----- | ------ | ------------------------------------------------------------------------------------------------------------------------ | -| SIMPLE | free/nemotron-3.5-lightning | $0.00 | $0.00 | nemotron-3-nano-30b (free) → gemini-2.5-flash-lite → glm-5.3-flash → gpt-5.6-luna → gpt-5.4-nano → gemini-3.1-flash-lite | -| MEDIUM | zai/glm-5.3-flash | $0.15 | $0.50 | deepseek-chat → gemini-3.1-flash-lite → gpt-5.6-luna → gpt-5.4-nano → gemini-2.5-flash-lite → gemini-2.5-flash | -| COMPLEX | zai/glm-5.3-flash | $0.15 | $0.50 | deepseek-chat → minimax-m3 → deepseek-v4-pro → gemini-3.1-flash-lite → gemini-2.5-flash | -| REASONING | deepseek/deepseek-reasoner | $0.14 | $0.28 | deepseek-v4-pro → qwen3.7-plus → minimax-m3 → glm-5.3-flash | +| Tier | Primary Model | Input | Output | Fallback chain (in order) | +| --------- | --------------------------- | ----- | ------ | ------------------------------------------------------------------------------------------------------------------------- | +| SIMPLE | free/nemotron-3.5-lightning | $0.00 | $0.00 | nemotron-3-nano-omni (free) → gemini-2.5-flash-lite → glm-5.3-flash → gpt-5.6-luna → gpt-5.4-nano → gemini-3.1-flash-lite | +| MEDIUM | zai/glm-5.3-flash | $0.15 | $0.50 | deepseek-chat → gemini-3.1-flash-lite → gpt-5.6-luna → gpt-5.4-nano → gemini-2.5-flash-lite → gemini-2.5-flash | +| COMPLEX | zai/glm-5.3-flash | $0.15 | $0.50 | deepseek-chat → minimax-m3 → deepseek-v4-pro → gemini-3.1-flash-lite → gemini-2.5-flash | +| REASONING | deepseek/deepseek-reasoner | $0.14 | $0.28 | deepseek-v4-pro → qwen3.7-plus → minimax-m3 → glm-5.3-flash | The two free rungs at the head of ECO SIMPLE follow NVIDIA's free hosting, which retires models without notice (deepseek-v4-flash 410'd 2026-08-12, seed-oss-36b 2026-08-03, gpt-oss-120b hung 2026-08-16, and on 2026-08-30 NVIDIA retired FOUR of the five visible free models at once). Each retirement retargets the free rungs to the current free tier; the paid rungs never move. `src/router/free-model-liveness.test.ts` fails the build if a chain names a free model the picker no longer lists. @@ -75,11 +75,11 @@ Set `routing.overrides.agenticMode: false` to disable the agentic tier set, or ` ## FREE (`/model free`) -`free` is an alias, not a routed profile: it pins the free-tier default, currently **`free/nemotron-3.5-lightning`** — the same model that opens ECO SIMPLE. If that model is excluded (`/exclude add lightning`) or the budget cap forces a free fallback, the proxy walks the free cascade in this order: nemotron-3.5-lightning → nemotron-3-nano-30b → laguna-xs-2.1 → north-mini-code → nemotron-3-nano-omni-30b-a3b-reasoning → nemotron-3-ultra-550b → llama-3.2-11b-vision. All seven are $0.00 and need no USDC, and all seven are treated as **text-only** — see the vision note below. +`free` is an alias, not a routed profile: it pins the free-tier default, currently **`free/nemotron-3.5-lightning`** — the same model that opens ECO SIMPLE. If that model is excluded (`/exclude add lightning`) or the budget cap forces a free fallback, the proxy walks the free cascade in this order: nemotron-3.5-lightning → laguna-xs-2.1 → north-mini-code → nemotron-3-nano-omni-30b-a3b-reasoning → nemotron-3-ultra-550b → llama-3.2-11b-vision. All six are $0.00 and need no USDC, and all six are treated as **text-only** — see the vision note below. -The order is not arbitrary. The head is whatever the gateway itself redirects the previous head to, so the proxy and the gateway never name different models. After it comes the fastest rung, then the two sub-second coders — adjacent on purpose, because they sit on _different_ capacity pools (our own NVIDIA key vs OpenRouter's $0 pool), so one pool's outage cannot take both. The vision model sits mid-chain, and the two slowest rungs go last. The tier stopped being NVIDIA-only on 2026-08-30: two of the seven come from Cohere and Poolside. +The order is not arbitrary. The head is whatever the gateway itself redirects the previous head to, so the proxy and the gateway never name different models. After it come the two sub-second coders — adjacent on purpose, because they sit on _different_ capacity pools (our own NVIDIA key vs OpenRouter's $0 pool), so one pool's outage cannot take both. The vision model sits mid-chain, and the two slowest rungs go last. The tier stopped being NVIDIA-only on 2026-08-30: two of the six come from Cohere and Poolside. The fastest rung, `nemotron-3-nano-30b`, left on 2026-09-08 when NVIDIA deprovisioned it for blockrun's account; its aliases (`nano-30b`, `nemotron-nano`) now follow the gateway's redirect to `nemotron-3-nano-omni`. -Pin any of them directly with `/model lightning`, `/model nano-30b`, `/model laguna`, `/model north-mini`, `/model nemotron-omni`, `/model ultra-550b` or `/model llama-vision`. +Pin any of them directly with `/model lightning`, `/model laguna`, `/model north-mini`, `/model nemotron-omni`, `/model ultra-550b` or `/model llama-vision`. **No free model carries the `vision` flag,** even the two the upstream catalogs advertise as vision-capable. A 64×64 solid-colour probe on 2026-08-31 got the right answer 1 time in 4 from `nemotron-3-nano-omni` on Base, and "white" for red on Solana — where the response's own `model` field showed a silent fallback to a text model. `llama-3.2-11b-vision`, despite the name, said "I'm unable to see the image" on 3 of 3 while a plain-text control passed. Every one of those is an HTTP 200, so the caller gets a confident wrong answer with nothing to branch on. Since `vision` is what `filterByVision()` uses to _aim_ image turns at a model, flagging them would route real traffic into that. Requests carrying an `image_url` go to a paid vision model. diff --git a/openclaw.plugin.json b/openclaw.plugin.json index 0e4e55e3..8ac7bde0 100644 --- a/openclaw.plugin.json +++ b/openclaw.plugin.json @@ -1,7 +1,7 @@ { "id": "blockrun-clawrouter", "name": "BlockRun ClawRouter", - "description": "Smart LLM router \u2014 82 models, x402 micropayments, 92% cost savings. Phone lookup + AI voice calls (Twilio + Bland.ai). Surf crypto-data API (84 endpoints, on-chain SQL, 100M+ labeled wallets) via skill.", + "description": "Smart LLM router \u2014 82 models, x402 micropayments, 84% cost savings. Phone lookup + AI voice calls (Twilio + Bland.ai). Surf crypto-data API (84 endpoints, on-chain SQL, 100M+ labeled wallets) via skill.", "skills": ["./skills"], "activation": { "onStartup": true diff --git a/package-lock.json b/package-lock.json index 17a6a01b..ba2a0956 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "clawrouter": "dist/cli.js" }, "devDependencies": { - "@blockrun/router-core": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/5ee7c23c993013a8052588191569db5cf7fb793c", + "@blockrun/router-core": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/e38958bba9af0aaa788c5baafbdaff539638b7c9", "@eslint/js": "^10.0.1", "eslint": "^10.2.0", "openclaw": "^2026.7.2-beta.7", @@ -147,8 +147,8 @@ }, "node_modules/@blockrun/router-core": { "version": "0.1.0", - "resolved": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/5ee7c23c993013a8052588191569db5cf7fb793c", - "integrity": "sha512-5rId2POyRYqH2/cq20IfGFHhaZYXLxCdXchiECzJwtX5qqCYtVVLNT0re2QeNnyGiVfi+H7GF/ipSZCeKf9BDw==", + "resolved": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/e38958bba9af0aaa788c5baafbdaff539638b7c9", + "integrity": "sha512-c384lZ8TMhNpDIdZG6xPNFClpe02EZJehhNlDDIJ14R6aHwpw7lElrh3XuwPvaGl6SLu1pc5z1klTr8dbwXyDQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 399bb888..e8fd4666 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ } }, "devDependencies": { - "@blockrun/router-core": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/5ee7c23c993013a8052588191569db5cf7fb793c", + "@blockrun/router-core": "https://codeload.github.com/BlockRunAI/router-core/tar.gz/e38958bba9af0aaa788c5baafbdaff539638b7c9", "@eslint/js": "^10.0.1", "eslint": "^10.2.0", "openclaw": "^2026.7.2-beta.7", diff --git a/scripts/reinstall.sh b/scripts/reinstall.sh index fe5d9fe8..bf849396 100755 --- a/scripts/reinstall.sh +++ b/scripts/reinstall.sh @@ -988,7 +988,6 @@ echo " /model free → nemotron-3.5-lightning (default free)" echo "" echo "Free models (no wallet needed):" echo " /model lightning → nemotron-3.5-lightning (1M ctx, reasoning)" -echo " /model nano-30b → nemotron-3-nano-30b (fastest, ~121 tok/s)" echo " /model north-mini → north-mini-code (Cohere, coding, sub-second)" echo " /model laguna → laguna-xs-2.1 (Poolside, coding, ~161 tok/s)" echo " /model vision-free → nemotron-3-nano-omni (text/image/video/audio)" diff --git a/src/index.ts b/src/index.ts index ce66c6ec..fae4e840 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ /** * @blockrun/clawrouter * - * Smart LLM router for OpenClaw — 82 models, x402 micropayments, 78% cost savings. + * Smart LLM router for OpenClaw — 82 models, x402 micropayments, 84% cost savings. * Routes each request to the cheapest model that can handle it. * * Usage: @@ -1977,7 +1977,7 @@ const plugin: OpenClawPluginDefinition = { // product, different id. See #305. id: BLOCKRUN_PLUGIN_ID, name: "BlockRun ClawRouter", - description: "Smart LLM router — 82 models, x402 micropayments, 78% cost savings", + description: "Smart LLM router — 82 models, x402 micropayments, 84% cost savings", version: VERSION, register(api: OpenClawPluginApi) { diff --git a/src/models.test.ts b/src/models.test.ts index aedb952d..fa134447 100644 --- a/src/models.test.ts +++ b/src/models.test.ts @@ -256,7 +256,7 @@ describe("capability flags vs blockrun's catalog", () => { for (const id of [ "google/gemini-3-flash-preview", "free/nemotron-3.5-lightning", - "free/nemotron-3-nano-30b", + "free/nemotron-3-nano-omni-30b-a3b-reasoning", "free/nemotron-3-ultra-550b", "free/north-mini-code", "zai/glm-5.3", diff --git a/src/models.ts b/src/models.ts index c72a0742..cc4e806a 100644 --- a/src/models.ts +++ b/src/models.ts @@ -348,9 +348,12 @@ export const MODEL_ALIASES: Record = { "step-3.7-flash": "free/step-3.7-flash", // nemotron-nano-9b-v2 hit 410 on 2026-08-30; the generic shorthands follow // blockrun's redirect to its replacement, while the 9b-naming pins above stay - // on the real id (the gateway resolves them). - "nemotron-nano-9b": "free/nemotron-3-nano-30b", - "nemotron-nano": "free/nemotron-3-nano-30b", + // on the real id (the gateway resolves them). That replacement, + // nemotron-3-nano-30b, was itself delisted 2026-09-08 and blockrun now sends + // both ids to nano-omni, so these follow it there rather than chain through a + // dead model. + "nemotron-nano-9b": "free/nemotron-3-nano-omni-30b-a3b-reasoning", + "nemotron-nano": "free/nemotron-3-nano-omni-30b-a3b-reasoning", // nemotron-nano-12b-v2-vl hit 410 the same day; vision in, vision out — the // target is blockrun's own, and nano-omni is the only vision-capable free // model left. @@ -377,9 +380,11 @@ export const MODEL_ALIASES: Record = { "devstral-2": "free/nemotron-3.5-lightning", maverick: "free/llama-4-maverick", // explicit-ish pin — gateway redirects // ── The 2026-08-30 free lineup (blockrun #448) ──────────────────────────── - // nvidia/* bridges for the four NVIDIA-hosted additions. + // nvidia/* bridges for the four NVIDIA-hosted additions. nemotron-3-nano-30b + // was delisted 2026-09-08 (per-account 404 at NVIDIA); its names follow + // blockrun's own redirect to nano-omni, the same family and size (30B-A3B). "nvidia/nemotron-3.5-lightning": "free/nemotron-3.5-lightning", - "nvidia/nemotron-3-nano-30b": "free/nemotron-3-nano-30b", + "nvidia/nemotron-3-nano-30b": "free/nemotron-3-nano-omni-30b-a3b-reasoning", "nvidia/nemotron-3-ultra-550b": "free/nemotron-3-ultra-550b", "nvidia/llama-3.2-11b-vision": "free/llama-3.2-11b-vision", // The two non-NVIDIA free models keep the `free/` picker convention; their @@ -391,8 +396,8 @@ export const MODEL_ALIASES: Record = { lightning: "free/nemotron-3.5-lightning", "nemotron-lightning": "free/nemotron-3.5-lightning", "nemotron-3.5-lightning": "free/nemotron-3.5-lightning", - "nano-30b": "free/nemotron-3-nano-30b", - "nemotron-nano-30b": "free/nemotron-3-nano-30b", + "nano-30b": "free/nemotron-3-nano-omni-30b-a3b-reasoning", // delisted 2026-09-08 — see above + "nemotron-nano-30b": "free/nemotron-3-nano-omni-30b-a3b-reasoning", "ultra-550b": "free/nemotron-3-ultra-550b", "nemotron-ultra-550b": "free/nemotron-3-ultra-550b", "llama-vision": "free/llama-3.2-11b-vision", @@ -1903,8 +1908,9 @@ export const BLOCKRUN_MODELS: BlockRunModel[] = [ }, { // NVIDIA Nemotron Nano 9B v2: fast lightweight generalist, 131K context. - // EOL'd 2026-08-30 (410 Gone, same sweep). Gateway redirects it to - // nemotron-3-nano-30b. Entry kept for pins; off the picker and the cascade. + // EOL'd 2026-08-30 (410 Gone, same sweep). Gateway redirected it to + // nemotron-3-nano-30b until that was delisted too (2026-09-08); both now go + // to nano-omni. Entry kept for pins; off the picker and the cascade. id: "free/nemotron-nano-9b-v2", name: "[Free] Nemotron Nano 9B v2", version: "nano-9b-v2", @@ -1965,9 +1971,12 @@ export const BLOCKRUN_MODELS: BlockRunModel[] = [ reasoning: true, }, { - // Nemotron 3 Nano 30B-A3B — the fastest free model in the catalog - // (~121 tok/s on a realistic workload, not a 16-token ping). Returns - // reasoning_content. Also the tertiary rung of blockrun's own free cascade. + // Nemotron 3 Nano 30B-A3B — was the fastest free model in the catalog + // (~121 tok/s). DELISTED 2026-09-08: NVIDIA deprovisioned it for blockrun's + // account (a structured per-account 404, nine days after listing), and the + // gateway now redirects it to nano-omni. Entry kept so explicit pins stay + // routable; off the picker and the FREE_MODELS cascade, and every alias + // that named it follows the gateway's redirect. id: "free/nemotron-3-nano-30b", name: "[Free] Nemotron 3 Nano 30B", version: "3-nano-30b", diff --git a/src/proxy.ts b/src/proxy.ts index ba8155bc..b80ee881 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -194,20 +194,24 @@ const ROUTING_PROFILES = new Set([ // gateway probe of every rung: // 1. lightning — blockrun's own retarget of the old head, so the proxy and // the gateway name the same model. 1M ctx, 1.3s with tools. -// 2. nano-30b — fastest in the tier (~121 tok/s). -// 3/4. laguna + north-mini — both sub-second coders, and deliberately adjacent +// 2/3. laguna + north-mini — both sub-second coders, and deliberately adjacent // because they sit on DIFFERENT capacity pools (our NVIDIA key // vs OpenRouter's $0 pool), so one pool's outage does not take // both rungs. -// 5. nano-omni — the only vision-capable free model left. -// 6. ultra-550b — 1M ctx and the largest we list, but 16.8s and blockrun +// 4. nano-omni — the only vision-capable free model left. +// 5. ultra-550b — 1M ctx and the largest we list, but 16.8s and blockrun // measured 3 of 15 calls returning an HTTP 200 that carried an // upstream 502/503 error object instead of choices. -// 7. llama-vision — slowest (~18 tok/s), so last; it is here because it is the +// 6. llama-vision — slowest (~18 tok/s), so last; it is here because it is the // only free Llama NVIDIA still serves. +// +// 2026-09-08: nemotron-3-nano-30b (was rung 2, "fastest in the tier") left the +// cascade. NVIDIA deprovisioned it for blockrun's account — a structured +// per-account 404 — and the gateway delisted it and now redirects it to +// nano-omni. It stayed here three weeks, so startup logged it as unserved and +// skipped it on every boot. const FREE_MODELS = new Set([ "free/nemotron-3.5-lightning", // free-tier default — 1M ctx, thinking mode - "free/nemotron-3-nano-30b", // fastest free model (~121 tok/s) "free/laguna-xs-2.1", // coding, ~161 tok/s — on our NVIDIA key "free/north-mini-code", // coding, 607ms median — OpenRouter $0 pool "free/nemotron-3-nano-omni-30b-a3b-reasoning", // vision (text/image/video/audio) diff --git a/src/router/brand-numbers.test.ts b/src/router/brand-numbers.test.ts index 11e22858..cbe6a1b4 100644 --- a/src/router/brand-numbers.test.ts +++ b/src/router/brand-numbers.test.ts @@ -85,6 +85,29 @@ describe("package.json description", () => { }); }); +describe("plugin descriptions", () => { + // openclaw.plugin.json is JSON and src/index.ts is code, so neither can hold a + // marker. They said 92% and 78% while every synced surface said 84%. Every + // "NN% cost savings" in them must be the published auto figure, and at least + // one must exist — a claim reworded out of the pattern should fail here, not + // pass because nothing matched. + const pct = ( + JSON.parse(readFileSync("brand-numbers.json", "utf8")) as { + savings: { autoVsBaselinePct: number }; + } + ).savings.autoVsBaselinePct; + + for (const file of ["openclaw.plugin.json", "src/index.ts"]) { + it(`${file} quotes the published savings figure`, () => { + const claims = [...readFileSync(file, "utf8").matchAll(/(\d+)% cost savings/g)].map((m) => + Number(m[1]), + ); + expect(claims.length, `no "NN% cost savings" claim found in ${file}`).toBeGreaterThan(0); + expect(claims).toEqual(claims.map(() => pct)); + }); + } +}); + describe("README hero badge", () => { // The free-model count is baked into a shields URL and its alt text. A marker // cannot go inside an HTML attribute without breaking the tag, so this is the diff --git a/src/router/free-model-liveness.test.ts b/src/router/free-model-liveness.test.ts index 8ef8f872..33f5ac2d 100644 --- a/src/router/free-model-liveness.test.ts +++ b/src/router/free-model-liveness.test.ts @@ -21,6 +21,7 @@ import { describe, it, expect } from "vitest"; import { DEFAULT_ROUTING_CONFIG } from "@blockrun/router-core"; import topModels from "../top-models.json" with { type: "json" }; +import { MODEL_ALIASES } from "../models.js"; /** * The free tier spans two namespaces: the picker lists `free/*` ids while the @@ -104,4 +105,16 @@ describe("router free-model liveness", () => { const seedOss = freeModelReferences().filter(([, m]) => m.includes("seed-oss")); expect(seedOss).toEqual([]); }); + + it("specifically excludes nemotron-3-nano-30b, delisted 2026-09-08", () => { + // Deprovisioned at NVIDIA for blockrun's account (a per-account 404) and + // redirected by the gateway to nano-omni. It sat in ecoTiers.SIMPLE, the + // picker, the FREE_MODELS cascade and five aliases for three weeks after. + const nano = freeModelReferences().filter(([, m]) => m.endsWith("/nemotron-3-nano-30b")); + expect(nano).toEqual([]); + const aliased = Object.entries(MODEL_ALIASES).filter( + ([, target]) => target === "free/nemotron-3-nano-30b", + ); + expect(aliased).toEqual([]); + }); }); diff --git a/src/top-models.json b/src/top-models.json index dfed628d..a6320841 100644 --- a/src/top-models.json +++ b/src/top-models.json @@ -49,7 +49,6 @@ "deepseek/deepseek-chat", "deepseek/deepseek-reasoner", "free/nemotron-3.5-lightning", - "free/nemotron-3-nano-30b", "free/laguna-xs-2.1", "free/north-mini-code", "free/nemotron-3-nano-omni-30b-a3b-reasoning",