free-coding-models 0.5.63 → 0.5.65

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 CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  <p align="center">
8
8
  <strong>Find the fastest free coding model in seconds</strong><br>
9
- Track ~191 models across 20 trusted free or free-limited AI providers in real time<br><br>
9
+ Track ~222 models across 20 trusted free or free-limited AI providers in real time<br><br>
10
10
  <strong>Install Free API endpoints to your favorite AI coding tools:</strong><br>
11
11
  OpenCode CLI / Desktop / WebUI, OpenClaw, Crush, Goose, Aider, Kilo CLI, Qwen Code, OpenHands, Amp, Hermes, Continue, Cline, Xcode, Pi, ZCode and more...<br><br>
12
12
  <strong>Use Kimi K2, DeepSeek V3, GPT-OSS, Qwen3, MiniMax M3, GLM, Llama 4, Gemma 4, Devstral and more — for free</strong>
@@ -16,7 +16,7 @@
16
16
  <img src="https://img.shields.io/npm/v/free-coding-models?color=3d6b00&label=npm&logo=npm" alt="npm version" width="200"><br>
17
17
  <img src="https://img.shields.io/node/v/free-coding-models?color=3d6b00&logo=node.js" alt="node version" width="200"><br>
18
18
  <img src="https://img.shields.io/npm/l/free-coding-models?color=3d6b00" alt="license" width="200"><br>
19
- <img src="https://img.shields.io/badge/models-191-3d6b00?logo=nvidia" alt="models count" width="200"><br>
19
+ <img src="https://img.shields.io/badge/models-222-3d6b00?logo=nvidia" alt="models count" width="200"><br>
20
20
  <img src="https://img.shields.io/badge/providers-20-1a56db" alt="providers count" width="200">
21
21
  </p>
22
22
 
@@ -59,7 +59,7 @@ free-coding-models
59
59
 
60
60
  ## 💡 Why this tool?
61
61
 
62
- There are **~191 cataloged free or free-limited coding models** across 20 vetted providers. Which one is fastest right now? Which one is actually stable versus just lucky on the last ping?
62
+ There are **~222 cataloged free or free-limited coding models** across 20 vetted providers. Which one is fastest right now? Which one is actually stable versus just lucky on the last ping?
63
63
 
64
64
  This CLI pings them all in parallel, shows live latency, and calculates a **live Stability Score (0-100)**. Average latency alone is misleading if a model randomly spikes to 6 seconds; the stability score measures true reliability by combining **p95 latency** (30%), **jitter/variance** (30%), **spike rate** (20%), and **uptime** (20%).
65
65
 
@@ -73,7 +73,7 @@ It then writes the model you pick directly into your coding tool's config — so
73
73
 
74
74
  Create a free account on one provider below to get started. A few providers (`Kilo`, `LLM7`, OVHcloud sandbox) can also answer without a key, with tighter shared limits.
75
75
 
76
- **~191 coding models** across 20 active providers, ranked by practical free-tier usefulness.
76
+ **~222 coding models** across 20 active providers, ranked by practical free-tier usefulness.
77
77
 
78
78
  | # | Provider | Models | Tier range | Free tier | Env var |
79
79
  |---|----------|--------|-----------|-----------|--------|
@@ -102,6 +102,17 @@ Create a free account on one provider below to get started. A few providers (`Ki
102
102
 
103
103
  > 🧹 Audit cleanup: `iFlow` was removed because it shut down on April 17, 2026. `Together AI`, `Perplexity API`, `DeepInfra`, `Replicate`, `Fireworks`, `Hyperbolic`, `Hugging Face`, `SiliconFlow`, `Chutes AI` were removed from the active free catalog because they are paid, trial-credit only, too tiny to be useful, unclear as a stable free API, or tool-specific rather than a generally usable free provider. `Rovo` and `Gemini CLI` were also wiped out as tool integrations (CLI-only, not generally usable free providers).
104
104
 
105
+ ### ⚠️ Health checks consume provider quota
106
+
107
+ > FCM continuously health-probes every model in the catalog so you see live latency, status, and verdict. When you've configured a provider's API key (e.g. `OPENROUTER_API_KEY`), **those probes are authenticated and count against that provider's daily quota**. Rate-limited providers like **OpenRouter** (50 req/day free, 1000 req/day at $10 spend) are particularly sensitive: a single overloaded model can burn your quota in minutes if it's re-pinged every second.
108
+
109
+ > As of v0.3.83 (issue #146), FCM now:
110
+ > - **Auto-pauses** a provider when its probe gets a `429` response (respects `Retry-After` header + the "try again N seconds later" message body).
111
+ > - **Backs off exponentially** on per-model failures (30s → 1m → 2m → 5m) instead of re-pinging a broken model every cycle.
112
+ > - **Surfaces a footer chip** like `⏸ openrouter 14h` so you can see which providers are resting.
113
+
114
+ > **If you don't need authenticated probes for a provider**, just leave its key empty — anonymous probes still work for liveness checks on most providers, and they won't burn your personal quota.
115
+
105
116
  ---
106
117
 
107
118
  ### Tier scale
@@ -503,7 +514,7 @@ Inspect or wipe it manually any time — it's plain JSON with `0600` perms.
503
514
  ```json
504
515
  {
505
516
  "probeCache": {
506
- "total": 191,
517
+ "total": 222,
507
518
  "ok": 178,
508
519
  "broken": 13,
509
520
  "freshCount": 165,
@@ -764,7 +775,7 @@ See [`packages/fcm-agent-core/README.md`](./packages/fcm-agent-core/README.md) f
764
775
 
765
776
  ## ✨ Features
766
777
 
767
- - **Parallel pings** — all ~191 API/Zen-callable models tested simultaneously via native `fetch`
778
+ - **Parallel pings** — all ~222 API/Zen-callable models tested simultaneously via native `fetch`
768
779
  - **AI benchmark columns** — `Ctrl+A` benchmarks the selected model, `Ctrl+U` benchmarks visible models, and results split cleanly into **AI Latency** plus **TPS**. Settings includes an opt-in **Startup AI Speed Scan** toggle to run the global benchmark automatically after launch.
769
780
  - **Tiny verdict indicator** — the first `❔` column mirrors the full Verdict as a compact emoji (`🟩`, `🟢`, `🟡`, `🟠`, etc.) and sorts by the same verdict order.
770
781
  - **Adaptive monitoring** — 2s burst for 60s → 10s normal → 30s idle
@@ -0,0 +1,64 @@
1
+ # Changelog v0.5.64 - 2026-07-27
2
+
3
+ ### Added
4
+
5
+ - 🔍 **Full provider audit** — every one of the 20 active providers was re-verified against live API endpoints and official docs. Researchers fetched current catalogs and reported structured JSON diffs (`removed` / `added` / `fixed` / `confirmed`). The agent then applied all safe changes to `sources.js` and `audit_state.json`.
6
+
7
+ - **8 new free-tier models added** across 7 providers:
8
+ - `opencode-zen` — `poolside/laguna-s-2.1-free` (Laguna S 2.1 Free), `ling-3.0-flash-free` (Ling-3.0-flash Free)
9
+ - `openrouter` — `inclusionai/ling-3.0-flash:free` (Ling-3.0 Flash), `poolside/laguna-s-2.1:free` (Poolside Laguna S 2.1), `openai/gpt-oss-20b:free` (GPT OSS 20B)
10
+ - `googleai` — `gemini-3.6-flash` (Gemini 3.6 Flash), `gemini-3.5-flash-lite` (Gemini 3.5 Flash Lite)
11
+ - `qwen` — `qwen3.7-flash` (Qwen3.7 Flash)
12
+ - `scaleway` — `gemma-4-31b-it` (Gemma 4 31B IT)
13
+ - `llm7` — `gemini-3.1-flash-lite` (Gemini 3.1 Flash Lite)
14
+ - `ollama-cloud` — `kimi-k3` (Kimi K3), `gemini-3-flash-preview` (Gemini 3 Flash Preview), `mistral-large-3:675b-cloud` (Mistral Large 3 675B Cloud), `qwen3.5` (Qwen 3.5 Cloud)
15
+
16
+ - 🧪 **New `audit_state.json` fingerprint system** — every provider audit now records `lastAudited` + an MD5 fingerprint of its confirmed + added model IDs. Next audit skips a provider automatically when its fingerprint hasn't changed.
17
+
18
+ - 📜 **Migrated `provider_updates/` archival to git history** — the v1 skill kept per-provider markdown reports + per-version archives. v2 keeps git as the single source of truth: every `sources.js` change ships in a commit with a descriptive message, so `git log -- sources.js` shows the full audit trail.
19
+
20
+ ### Changed
21
+
22
+ - 📊 **Catalog size 231 → 222 models** (net **-9**). Free-tier shrinkage on OpenRouter (23 → 15) was partly offset by additions on `opencode-zen`, `googleai`, `qwen`, `ollama-cloud`, `llm7`, `scaleway`.
23
+ - 🔧 **Provider-level fixes**:
24
+ - `nvidia` — `nvidia/mistral-nemotron` → `mistralai/mistral-nemotron` (namespace change)
25
+ - `cloudflare` — `@cf/deepseek/...` → `@cf/deepseek-ai/...`, `@cf/ibm/...` → `@cf/ibm-granite/...` (namespace changes); Gemma 4 26B ctx `128k` → `256k`
26
+ - `ollama-cloud` — 9 ctx corrections: `glm-5.2`, `minimax-m3`, `deepseek-v4-flash`, `deepseek-v4-pro` upgraded to `1M`; `gemma4:31b` downgraded to `128k`; `kimi-k2.6`, `kimi-k2.7-code` to `256k`; `glm-5.1`, `minimax-m2.5` to `198k`
27
+ - `scaleway` — 4 ctx corrections (Dedicated-tier vs Serverless-tier): `Mistral Medium 3.5` `256k` → `180k` (Serverless), `Llama 3.3 70B` `100k` → `128k` (Dedicated), `Devstral 2` `200k` → `260k` (Dedicated), `GLM 5.2` `256k` → `1M`
28
+ - `sambanova` — standardize 5 entries to `131k` (exact API value `131072`); `MiniMax-M2.7` `192k` → `196k`
29
+ - `cerebras` — 3 ctx corrections to actual free-tier limits: `zai-glm-4.7` `128k` → `64k`, `gpt-oss-120b` `128k` → `65k`, `gemma-4-31b` `128k` → `65k`
30
+ - `zai` — `zai/glm-4.7-flash` `203k` → `200k`
31
+ - `codestral` — `codestral-2508` `256k` → `128k`
32
+ - `novita` — `tencent/hy3` `262k` → `256k`
33
+ - `ovhcloud` — `Qwen3-Embedding-8B` ctx `'-'` → `'32k'`
34
+ - 📈 **README updated to reflect new model count** — badges, prose, /stats sample shape, and benchmark copy now say `~222 models` instead of `~191`.
35
+
36
+ ### Removed
37
+
38
+ - 🗑️ **31 dead models removed** from the live catalog (kept in git history for posterity):
39
+ - `nvidia` (14): `MiniMax M2.7`, `Llama 4 Maverick`, `Mistral Small 4`, `Ministral 14B`, `Seed OSS 36B`, `Stockmark 100B`, `Qwen2.5 Coder 32B`, `Phi 4 Mini`, `Mistral Large 675B`, `DeepSeek V3.2`, `DeepSeek R1`, `Mistral Nemotron` (old ns), `Nemotron 3 Nano` (old id), `Llama 4 Scout`
40
+ - `openrouter` (11): `Poolside Laguna XS.2`, `Tencent Hy3`, `Qwen3 Coder`, `Llama 3.3 70B Instruct`, `Hermes 3 Llama 3.1 405B`, `Qwen3 Next 80B A3B`, `OpenRouter Free`, `Llama 3.2 3B Instruct`, `Dolphin Mistral 24B Venice`, `LFM 2.5 1.2B Instruct`, `LFM 2.5 1.2B Thinking`
41
+ - `ovhcloud` (3): `Qwen3 Coder 30B MoE`, `Qwen3 32B`, `Mistral 7B Instruct v0.3`
42
+ - `opencode-zen` (1): `Tencent Hy3 Free`
43
+ - `novita` (1): `Qwen3.5 Plus`
44
+ - `routeway` (1): `Poolside Laguna M.1` (model `available: false`)
45
+
46
+ ### Skipped (flagged for review)
47
+
48
+ - ⏸️ **`llm7` subagent reported `minimax-m2.6` removed** — but our catalog has `minimax-m2.7`, not `m2.6`. The subagent's "removal" doesn't match any entry in `sources.js`, so it was discarded. `m2.7` stays in the catalog until directly verified.
49
+ - ⏸️ **`routeway` 2 ID "fixes" flagged as paid** — `deepseek-v4-flash:free` and `step-3.5-flash:free` are listed as free in our catalog, but the live API shows they have non-zero prices. Skipped for this release; vava will decide whether to keep them in the free catalog or move them out.
50
+
51
+ ### Maintenance
52
+
53
+ - 🧪 **779 tests pass** (`pnpm test`). One test updated (`test/test.js:989`) to reflect the new NVIDIA catalog head — `minimaxai/minimax-m2.7` is gone, so the test now asserts the next 5 models in the discovery-ordered list.
54
+ - 🛡️ `pnpm start` runs without runtime error. TUI / Web Dashboard / daemon all load cleanly with the new 222-model catalog.
55
+ - 📦 `audit_state.json` refreshed — every provider's `lastAudited` is now `2026-07-27` and each has a fresh fingerprint for the next audit cycle.
56
+
57
+ ### Files
58
+
59
+ - **Modified**: `sources.js` (30 net lines: -31 removed, +21 added, ~30 fixed inline), `audit_state.json` (timestamps + fingerprints refreshed), `README.md` (6 references to `191` → `222`), `test/test.js` (1 test updated), `package.json` (version bump `0.5.63` → `0.5.64`).
60
+ - **New**: `changelog/v0.5.64.md`, `audit_state.json` (refreshed), `.pi/skills/update_models/SKILL.md` (v2 skill), 20 `/tmp/audit_diffs/<provider>.json` (transient, gitignored).
61
+
62
+ ### Breaking changes
63
+
64
+ None. All fixes are in-place context-window or namespace corrections. Removed models are still cited in `git log -- sources.js` and the v0.5.64 changelog above for migration reference.
@@ -0,0 +1,35 @@
1
+ # Changelog v0.5.65 - 2026-07-29
2
+
3
+ ### Fixed
4
+
5
+ - 🛡️ **#146 — OpenRouter / rate-limited providers no longer burned the user's daily quota.** Health-probe pings are now throttled at two orthogonal levels so a single overloaded model can no longer wipe out an OpenRouter (or similar) daily request limit. Issue submitted by `@ia-S-on`.
6
+
7
+ - **Per-provider quota circuit-breaker** — New module `src/core/provider-cooldown.js` exposes an in-memory pause map. When a probe returns HTTP `429`, FCM parses the `Retry-After` header (and falls back to the OpenRouter-style body `"Rate limit exceeded, please try again N seconds later."`), then pauses **every model of that provider** until the window expires. Probe pressure drops from ~30 req/min/provider to ~0 req/min/provider for the entire duration. Affected code: `src/core/ping.js` (trigger on `resp.status === 429`), `src/tui/app.js` (skip paused providers in `runPingCycle`).
8
+ - **Per-model broken cooldown with exponential backoff** — `src/core/probe-cache.js` now caches `broken` entries too. `isCacheFresh()` and `getModelsDueForProbe()` honour a new `brokenCooldownMs(failureCount)` ladder (30 s → 1 m → 2 m → 5 m, then plateau at 5 min). `recordProbeResults()` tracks `consecutiveFailures` (increments on `broken`, resets to `0` on `ok`). This caps worst-case probe pressure on a permanently-broken model at **~0.2 req/min** instead of the previous **~30 req/min**.
9
+ - **Live footer chip** — When one or more providers are paused, the TUI footer now shows e.g. `⏸ openrouter 14h · ⏸ ovhcloud 34s` (warm amber background, live countdown that auto-rolls to s/m/h/d). New state field `state.pausedProviders` (defaults to `{}`) + render-table chip fed by `pausedProviders` option. Behaviour verified on first run — OVHcloud was correctly paused for 34 s on a real 429 during smoke testing.
10
+
11
+ ### Added
12
+
13
+ - 📖 **README health-check warning** — New section `⚠️ Health checks consume provider quota` between the providers table and the Tier scale. Explains the 1k/day OpenRouter cap, links the v0.5.65 fix points, and offers the immediate workaround (remove the provider's key from Settings — anonymous probes still work for liveness checks).
14
+ - 🧪 **18 new unit tests** in `test/test.js` covering both layers (`Issue #146: provider quota circuit-breaker` + `Issue #146: per-model broken-cooldown backoff`). Three pre-existing tests in `test/probe-cache.test.js` updated to reflect the new `broken`-is-fresh-during-cooldown contract.
15
+
16
+ ### Changed
17
+
18
+ - 📖 `pnpm test` suite: **797 / 797 passing** (was 779 / 779 in 0.5.64; net +18 new tests + 3 updated).
19
+ - 📖 `node --check` clean on every touched file; TUI smoke-tested in tmux (no runtime regression).
20
+ - 📖 Footer's existing probe-cache chip is unchanged in behaviour but gains the sibling paused-providers chip immediately to its right.
21
+
22
+ ### Migration / workaround
23
+
24
+ > **If you were already hitting the 429 from issue #146 before upgrading**, simply upgrading to v0.5.65 fixes the runaway probe loop — no manual step required. The provider will be auto-paused on its next probe.
25
+ >
26
+ > **If you want zero authenticated probes for a particular provider** (e.g. you only use OpenRouter for ad-hoc calls and want FCM to leave the key alone), leave the key empty in Settings — anonymous probes still tell us whether each model is up and will not burn your personal daily quota.
27
+
28
+ ### Files
29
+
30
+ - **New**: `src/core/provider-cooldown.js` (≈220 lines).
31
+ - **Modified**: `src/core/ping.js` (import + 429 trigger), `src/core/probe-cache.js` (constants, `brokenCooldownMs`, `isCacheFresh`, `getModelsDueForProbe`, `recordProbeResults`), `src/tui/app.js` (import + `runPingCycle` skip + paused snapshot), `src/tui/tui-state.js` (`pausedProviders: {}` on state), `src/tui/render-table.js` (new chip + thread option through), `README.md` (warning section), `test/test.js` (18 new tests), `test/probe-cache.test.js` (3 updated), `package.json` (`0.5.64` → `0.5.65`), this changelog.
32
+
33
+ ### Breaking changes
34
+
35
+ None. All changes are additive and behaviour-preserving for users who were not already rate-limited.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.5.63",
3
+ "version": "0.5.65",
4
4
  "description": "Find the fastest coding LLM models in seconds \u2014 ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
5
5
  "keywords": [
6
6
  "nvidia",
package/sources.js CHANGED
@@ -41,8 +41,8 @@
41
41
  // 📖 NIM source - https://build.nvidia.com
42
42
  export const nvidiaNim = [
43
43
  // ── S+ tier — SWE-bench Verified ≥70% ──
44
- ['minimaxai/minimax-m2.7', 'MiniMax M2.7', 'S+', '78.0%', '200k'],
45
44
  ['z-ai/glm-5.2', 'GLM 5.1', 'S+', '82.8%', '128k'],
45
+ // Removed (2026-07-27): minimaxai/minimax-m2.7 (MiniMax M2.7) — EOL 2026-07-27 (HTTP 410 Gone)
46
46
  ['moonshotai/kimi-k2.6', 'Kimi K2.6', 'S+', '80.2%', '262k'],
47
47
  ['deepseek-ai/deepseek-v4-pro', 'DeepSeek V4 Pro', 'S+', '80.6%', '1M'],
48
48
  ['deepseek-ai/deepseek-v4-flash', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'],
@@ -50,34 +50,39 @@ export const nvidiaNim = [
50
50
  ['nvidia/nemotron-3-ultra-550b-a55b', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
51
51
  // ── S tier — SWE-bench Verified 60–70% ──
52
52
  ['openai/gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
53
- ['meta/llama-4-maverick-17b-128e-instruct', 'Llama 4 Maverick', 'S+', '74.8%', '1M'],
53
+ // Removed (2026-07-27): meta/llama-4-maverick-17b-128e-instruct (Llama 4 Maverick) EOL 2026-07-27 (HTTP 410 Gone)
54
54
  ['mistralai/mistral-medium-3.5-128b', 'Mistral Medium 3.5', 'S+', '77.6%', '256k'],
55
- ['mistralai/mistral-small-4-119b-2603', 'Mistral Small 4', 'S', '60.0%', '256k'],
55
+ // Removed (2026-07-27): mistralai/mistral-small-4-119b-2603 (Mistral Small 4) EOL 2026-07-27 (HTTP 410 Gone)
56
56
  ['minimaxai/minimax-m3', 'MiniMax M3', 'S+', '78.4%', '1M'],
57
- ['nvidia/mistral-nemotron', 'Mistral Nemotron', 'S', '-', '128k'],
58
- ['deepseek-ai/deepseek-v3.2', 'DeepSeek V3.2', 'S+', '70.0%', '160k'],
57
+ ['mistralai/mistral-nemotron', 'Mistral Nemotron', 'S', '-', '128k'], // Fixed ID (2026-07-27): nvidia/mistral-nemotron → mistralai/mistral-nemotron
58
+ // Removed (2026-07-27): deepseek-ai/deepseek-v3.2 (DeepSeek V3.2) HTTP 404
59
59
  // ── A+ tier — SWE-bench Verified 50–60% ──
60
- ['mistralai/mistral-large-3-675b-instruct-2512', 'Mistral Large 675B', 'A+', '58.0%', '256k'],
60
+ // Removed (2026-07-27): mistralai/mistral-large-3-675b-instruct-2512 (Mistral Large 675B) EOL 2026-07-23 (HTTP 410 Gone)
61
61
  ['nvidia/nemotron-3-super-120b-a12b', 'Nemotron 3 Super', 'S', '60.5%', '128k'],
62
62
  ['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning', 'Nemotron 3 Omni', 'A+', '52.0%', '256k'],
63
- ['meta-llama/llama-4-scout-17b-16e-instruct', 'Llama 4 Scout', 'B', '28.0%', '10M'],
63
+ // Removed (2026-07-27): meta-llama/llama-4-scout-17b-16e-instruct (Llama 4 Scout) HTTP 404
64
64
  ['nvidia/llama-3.3-nemotron-super-49b-v1.5', 'Llama 3.3 Nemotron Super 49B v1.5', 'A+', '-', '128k'],
65
65
  // ── A tier — SWE-bench Verified 40–50% ──
66
66
  ['nvidia/nemotron-3-nano-30b-a3b', 'Nemotron Nano 30B', 'A-', '38.8%', '1M'],
67
67
  ['openai/gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
68
68
  ['google/gemma-4-31b-it', 'Gemma 4 31B', 'A+', '52.0%', '256k'],
69
- ['qwen/qwen2.5-coder-32b-instruct', 'Qwen2.5 Coder 32B', 'A', '47.0%', '128k'],
70
- ['deepseek-ai/deepseek-r1', 'DeepSeek R1', 'A', '49.2%', '128k'],
71
- ['nvidia/nemotron-3-nano', 'Nemotron 3 Nano', 'A-', '38.8%', '256k'],
69
+ // Removed (2026-07-27): qwen/qwen2.5-coder-32b-instruct (Qwen2.5 Coder 32B) EOL 2026-05-12 (HTTP 410 Gone)
70
+ // Removed (2026-07-27): deepseek-ai/deepseek-r1 (DeepSeek R1) HTTP 404
71
+ // Removed (2026-07-27): nvidia/nemotron-3-nano (Nemotron 3 Nano) HTTP 404 (replaced by nvidia/nvidia-nemotron-nano-9b-v2)
72
+ ['nvidia/nvidia-nemotron-nano-9b-v2', 'Nemotron Nano 9B v2', 'A-', '-', '128k'], // Added (2026-07-27)
73
+ ['deepseek-ai/deepseek-coder-6.7b-instruct', 'DeepSeek Coder 6.7B', 'A-', '-', '128k'], // Added (2026-07-27)
74
+ ['mistralai/codestral-22b-instruct-v0.1', 'Codestral 22B', 'A', '-', '32k'], // Added (2026-07-27)
72
75
  // ── A- tier — SWE-bench Verified 35–40% ──
73
- ['bytedance/seed-oss-36b-instruct', 'Seed OSS 36B', 'A+', '56.0%', '32k'],
74
- ['stockmark/stockmark-2-100b-instruct', 'Stockmark 100B', 'A-', '36.0%', '32k'],
76
+ // Removed (2026-07-27): bytedance/seed-oss-36b-instruct (Seed OSS 36B) EOL 2026-07-27 (HTTP 410 Gone)
77
+ // Removed (2026-07-27): stockmark/stockmark-2-100b-instruct (Stockmark 100B) — EOL 2026-07-15 (HTTP 410 Gone)
75
78
  // ── B+ tier — SWE-bench Verified 30–35% ──
76
- ['mistralai/ministral-14b-instruct-2512', 'Ministral 14B', 'B+', '34.0%', '32k'],
79
+ // Removed (2026-07-27): mistralai/ministral-14b-instruct-2512 (Ministral 14B) EOL 2026-07-27 (HTTP 410 Gone)
80
+ ['thinkingmachines/inkling', 'Inkling', 'B+', '-', '32k'], // Added (2026-07-27)
77
81
  // ── B tier — SWE-bench Verified 20–30% ──
78
82
  ['meta/llama-3.2-11b-vision-instruct', 'Llama 3.2 11B Vision', 'B', '28.0%', '128k'],
83
+ ['nvidia/nemotron-mini-4b-instruct', 'Nemotron Mini 4B', 'B', '-', '32k'], // Added (2026-07-27)
79
84
  // ── C tier — lightweight/edge models ──
80
- ['microsoft/phi-4-mini-instruct', 'Phi 4 Mini', 'C', '14.0%', '128k'],
85
+ // Removed (2026-07-27): microsoft/phi-4-mini-instruct (Phi 4 Mini) EOL 2026-07-15 (HTTP 410 Gone)
81
86
  ]
82
87
 
83
88
  // 📖 Groq source - https://console.groq.com
@@ -97,11 +102,11 @@ export const groq = [
97
102
  export const cerebras = [
98
103
  // ── S+ tier — SWE-bench Verified ≥70% ──
99
104
  // ⚠️ DEPRECATED — shutdown 2026-08-17 (Cerebras official notice)
100
- ['zai-glm-4.7', 'GLM 4.7', 'S+', '73.8%', '128k', null, '2026-08-17'],
105
+ ['zai-glm-4.7', 'GLM 4.7', 'S+', '73.8%', '64k', null, '2026-08-17'], // Fixed (2026-07-27): ctx '128k' → '64k' (free tier per official docs)
101
106
  // ── S tier — SWE-bench Verified 60–70% ──
102
- ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
107
+ ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '65k'], // Fixed (2026-07-27): ctx '128k' → '65k' (free tier per official docs)
103
108
  // ── A tier — SWE-bench Verified 40–50% ──
104
- ['gemma-4-31b', 'Gemma 4 31B', 'A+', '52.0%', '128k'],
109
+ ['gemma-4-31b', 'Gemma 4 31B', 'A+', '52.0%', '65k'], // Fixed (2026-07-27): ctx '128k' → '65k' (free tier per official docs)
105
110
  ]
106
111
 
107
112
  // 📖 SambaNova source - https://cloud.sambanova.ai
@@ -109,15 +114,15 @@ export const cerebras = [
109
114
  // 📖 Keep this catalog conservative: only models surfaced in current SambaNova docs.
110
115
  export const sambanova = [
111
116
  // ── S+ tier ──
112
- ['MiniMax-M2.7', 'MiniMax M2.7', 'S+', '78.0%', '192k'],
117
+ ['MiniMax-M2.7', 'MiniMax M2.7', 'S+', '78.0%', '196k'], // Fixed (2026-07-27): ctx '192k' → '196k' (API exact 196608)
113
118
  // ── S tier ──
114
- ['DeepSeek-V3.1', 'DeepSeek V3.1', 'S', '66.0%', '128k'],
119
+ ['DeepSeek-V3.1', 'DeepSeek V3.1', 'S', '66.0%', '131k'], // Fixed (2026-07-27): ctx '128k' → '131k' (API exact 131072)
115
120
  ['DeepSeek-V3.2', 'DeepSeek V3.2', 'S+', '70.0%', '32k'],
116
- ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
121
+ ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '131k'], // Fixed (2026-07-27): ctx '128k' → '131k'
117
122
  // ── A tier ──
118
- ['gemma-4-31B-it', 'Gemma 4 31B', 'A+', '52.0%', '128k'],
123
+ ['gemma-4-31B-it', 'Gemma 4 31B', 'A+', '52.0%', '131k'], // Fixed (2026-07-27): ctx '128k' → '131k'
119
124
  // ── A- tier ──
120
- ['Meta-Llama-3.3-70B-Instruct', 'Llama 3.3 70B', 'B', '22.0%', '128k'],
125
+ ['Meta-Llama-3.3-70B-Instruct', 'Llama 3.3 70B', 'B', '22.0%', '131k'], // Fixed (2026-07-27): ctx '128k' → '131k'
121
126
  // ── B+ tier ──
122
127
  ]
123
128
 
@@ -135,33 +140,36 @@ export const openrouter = [
135
140
  // ── S+ tier — SWE-bench Verified ≥70% ──
136
141
  ['nvidia/nemotron-3-ultra-550b-a55b:free', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
137
142
  ['poolside/laguna-m.1:free', 'Poolside Laguna M.1', 'S+', '72.5%', '262k'],
138
- ['poolside/laguna-xs.2:free', 'Poolside Laguna XS.2', 'S', '68.2%', '262k'],
139
143
  ['poolside/laguna-xs-2.1:free', 'Poolside Laguna XS 2.1', 'S+', '70.9%', '262k'],
144
+ // Removed (2026-07-27): poolside/laguna-xs.2:free (Poolside Laguna XS.2) — superseded by poolside/laguna-xs-2.1:free
140
145
  // ── S tier — SWE-bench Verified 60–70% ──
141
146
  ['cohere/north-mini-code:free', 'North Mini Code', 'S', '-', '256k'],
142
- ['tencent/hy3:free', 'Tencent Hy3', 'S', '-', '262k'],
143
- ['qwen/qwen3-coder:free', 'Qwen3 Coder', 'S', '69.6%', '1M'],
147
+ // Removed (2026-07-27): tencent/hy3:free (Tencent Hy3) no longer on OpenRouter free tier
148
+ // Removed (2026-07-27): qwen/qwen3-coder:free (Qwen3 Coder) no longer on OpenRouter free tier
149
+ ['poolside/laguna-s-2.1:free', 'Poolside Laguna S 2.1', 'S+', '-', '262k'], // Added (2026-07-27)
144
150
  // ── A+ tier — SWE-bench Verified 50–60% ──
145
151
  ['nvidia/nemotron-3-super-120b-a12b:free', 'Nemotron 3 Super', 'S', '60.5%', '1M'],
146
152
  ['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'Nemotron 3 Omni', 'A+', '52.0%', '256k'],
153
+ ['inclusionai/ling-3.0-flash:free', 'Ling-3.0 Flash', 'A+', '-', '262k'], // Added (2026-07-27)
147
154
  // ── A tier — SWE-bench Verified 40–50% ──
148
155
  ['nvidia/nemotron-3-nano-30b-a3b:free', 'Nemotron Nano 30B', 'A-', '38.8%', '256k'],
149
156
  ['nvidia/nemotron-nano-12b-v2-vl:free', 'Nemotron Nano 12B VL', 'A', '20.0%', '128k'],
150
157
  ['google/gemma-4-31b-it:free', 'Gemma 4 31B', 'A+', '52.0%', '262k'],
151
158
  ['google/gemma-4-26b-a4b-it:free', 'Gemma 4 26B MoE', 'A', '38.0%', '262k'],
152
- ['meta-llama/llama-3.3-70b-instruct:free', 'Llama 3.3 70B Instruct', 'B', '22.0%', '131k'],
153
- ['nousresearch/hermes-3-llama-3.1-405b:free', 'Hermes 3 Llama 3.1 405B', 'A', '-', '131k'],
154
- ['qwen/qwen3-next-80b-a3b-instruct:free', 'Qwen3 Next 80B A3B', 'S+', '70.6%', '262k'],
159
+ // Removed (2026-07-27): meta-llama/llama-3.3-70b-instruct:free (Llama 3.3 70B Instruct) no longer on free tier
160
+ // Removed (2026-07-27): nousresearch/hermes-3-llama-3.1-405b:free (Hermes 3 Llama 3.1 405B) no longer on free tier
161
+ // Removed (2026-07-27): qwen/qwen3-next-80b-a3b-instruct:free (Qwen3 Next 80B A3B) no longer on free tier
155
162
  // ── B+ tier — SWE-bench Verified 30–35% ──
156
163
  ['nvidia/nemotron-nano-9b-v2:free', 'Nemotron Nano 9B', 'B+', '18.0%', '128k'],
164
+ ['openai/gpt-oss-20b:free', 'GPT OSS 20B', 'A-', '-', '131k'], // Added (2026-07-27)
157
165
  // ── B tier — SWE-bench Verified 20–30% ──
158
- ['openrouter/free', 'OpenRouter Free', 'B', '-', '200k'],
159
- ['meta-llama/llama-3.2-3b-instruct:free', 'Llama 3.2 3B Instruct', 'B', '-', '131k'],
160
- ['cognitivecomputations/dolphin-mistral-24b-venice-edition:free', 'Dolphin Mistral 24B Venice', 'B', '-', '32k'],
166
+ // Removed (2026-07-27): openrouter/free (OpenRouter Free) no longer on free tier
167
+ // Removed (2026-07-27): meta-llama/llama-3.2-3b-instruct:free (Llama 3.2 3B Instruct) no longer on free tier
168
+ // Removed (2026-07-27): cognitivecomputations/dolphin-mistral-24b-venice-edition:free (Dolphin Mistral 24B Venice) no longer on free tier
161
169
  // ── C tier — lightweight/edge models ──
162
170
  ['nvidia/nemotron-3.5-content-safety:free', 'Nemotron 3.5 Content Safety', 'C', '-', '128k'],
163
- ['liquid/lfm-2.5-1.2b-instruct:free', 'LFM 2.5 1.2B Instruct', 'C', '-', '32k'],
164
- ['liquid/lfm-2.5-1.2b-thinking:free', 'LFM 2.5 1.2B Thinking', 'C', '-', '32k'],
171
+ // Removed (2026-07-27): liquid/lfm-2.5-1.2b-instruct:free (LFM 2.5 1.2B Instruct) no longer on free tier
172
+ // Removed (2026-07-27): liquid/lfm-2.5-1.2b-thinking:free (LFM 2.5 1.2B Thinking) no longer on free tier
165
173
  ]
166
174
 
167
175
  // 📖 GitHub Models source - https://models.github.ai
@@ -234,7 +242,7 @@ export const mistral = [
234
242
  // 📖 API keys now use the Mistral platform key format; CODESTRAL_API_KEY remains supported as an alias.
235
243
  export const codestral = [
236
244
  // ── A tier — SWE-bench Verified 40–50% ──
237
- ['codestral-2508', 'Codestral', 'A', '40.0%', '256k'],
245
+ ['codestral-2508', 'Codestral', 'A', '40.0%', '128k'], // Fixed (2026-07-27): ctx '256k' → '128k' per official Mistral model card
238
246
  ['codestral-2', 'Codestral 2', 'B+', '-', '128k'],
239
247
  ]
240
248
 
@@ -242,21 +250,22 @@ export const codestral = [
242
250
  // 📖 1M free tokens — API keys at https://console.scaleway.com/iam/api-keys
243
251
  export const scaleway = [
244
252
  // ── S+ tier — SWE-bench Verified ≥70% ──
245
- ['devstral-2-123b-instruct-2512', 'Devstral 2 123B', 'S+', '72.2%', '200k'],
253
+ ['devstral-2-123b-instruct-2512', 'Devstral 2 123B', 'S+', '72.2%', '260k'], // Fixed (2026-07-27): ctx '200k' → '260k' (Dedicated tier)
246
254
  ['qwen3-235b-a22b-instruct-2507', 'Qwen3 235B', 'A', '45.2%', '250k'],
247
- ['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '256k'],
255
+ ['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '1M'], // Fixed (2026-07-27): ctx '256k' → '1M' (preview extended)
248
256
  // ── S tier — SWE-bench Verified 60–70% ──
249
257
  ['qwen3.5-397b-a17b', 'Qwen3.5 400B VLM', 'S+', '76.2%', '250k'],
250
258
  ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
251
- ['mistral-medium-3.5-128b', 'Mistral Medium 3.5 128B', 'S+', '77.6%', '256k'],
259
+ ['mistral-medium-3.5-128b', 'Mistral Medium 3.5 128B', 'S+', '77.6%', '180k'], // Fixed (2026-07-27): ctx '256k' → '180k' (Serverless tier)
252
260
  // ── A+ tier — SWE-bench Verified 50–60% ──
253
261
  ['mistral-large-3-675b-instruct-2512', 'Mistral Large 675B', 'A+', '58.0%', '250k'],
254
262
  ['qwen3-coder-30b-a3b-instruct', 'Qwen3 Coder 30B', 'A+', '51.6%', '128k'],
255
263
  ['qwen3.6-35b-a3b', 'Qwen3.6 35B MoE', 'S+', '73.4%', '256k'],
256
264
  ['holo2-30b-a3b', 'Holo2 30B', 'A+', '52.0%', '22k'],
257
265
  ['gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A+', '-', '256k'],
266
+ ['gemma-4-31b-it', 'Gemma 4 31B IT', 'A+', '-', '128k'], // Added (2026-07-27)
258
267
  // ── A- tier — SWE-bench Verified 35–40% ──
259
- ['llama-3.3-70b-instruct', 'Llama 3.3 70B', 'B', '22.0%', '100k'],
268
+ ['llama-3.3-70b-instruct', 'Llama 3.3 70B', 'B', '22.0%', '128k'], // Fixed (2026-07-27): ctx '100k' → '128k' (Dedicated tier)
260
269
  // ── B+ tier — SWE-bench Verified 30–35% ──
261
270
  ['mistral-small-3.2-24b-instruct-2506', 'Mistral Small 3.2', 'B', '20.0%', '128k'],
262
271
  ['pixtral-12b-2409', 'Pixtral 12B', 'B+', '-', '128k'],
@@ -267,9 +276,11 @@ export const scaleway = [
267
276
  // 📖 Google AI Studio source - https://aistudio.google.com
268
277
  // 📖 OpenAI-compatible endpoint exposes Gemini models; free quotas vary by model and region.
269
278
  export const googleai = [
279
+ ['gemini-3.6-flash', 'Gemini 3.6 Flash', 'S+', '-', '1M'], // Added (2026-07-27)
270
280
  ['gemini-3.5-flash', 'Gemini 3.5 Flash', 'S+', '78.0%', '1M'],
271
281
  ['gemini-3.1-pro-preview', 'Gemini 3.1 Pro Preview', 'S+', '80.6%', '1M'],
272
282
  ['gemini-3-flash-preview', 'Gemini 3 Flash Preview', 'S+', '78.0%', '1M'],
283
+ ['gemini-3.5-flash-lite', 'Gemini 3.5 Flash Lite', 'S', '-', '1M'], // Added (2026-07-27)
273
284
  ['gemini-3.1-flash-lite', 'Gemini 3.1 Flash Lite', 'S', '62.8%', '1M'],
274
285
  ['gemini-2.5-pro', 'Gemini 2.5 Pro', 'S', '63.8%', '1M'],
275
286
  ['gemini-2.5-flash', 'Gemini 2.5 Flash', 'A+', '54.0%', '1M'],
@@ -280,7 +291,7 @@ export const googleai = [
280
291
  // 📖 Free tier is limited to Flash models; paid GLM models are intentionally excluded.
281
292
  export const zai = [
282
293
  // ── S tier — SWE-bench Verified 60–70% ──
283
- ['zai/glm-4.7-flash', 'GLM-4.7-Flash', 'A+', '59.2%', '203k'],
294
+ ['zai/glm-4.7-flash', 'GLM-4.7-Flash', 'A+', '59.2%', '200k'], // Fixed (2026-07-27): ctx '203k' → '200k' per official docs
284
295
  ['zai/glm-4.5-flash', 'GLM-4.5-Flash', 'S', '59.2%', '128k'],
285
296
  // ── A tier — SWE-bench Verified 40–50% ──
286
297
  ['zai/glm-4.6v-flash', 'GLM-4.6V-Flash', 'A', '-', '128k'],
@@ -306,6 +317,7 @@ export const qwen = [
306
317
  ['qwen3-coder-next', 'Qwen3 Coder Next', 'S+', '70.6%', '256k'],
307
318
  ['qwen3-coder-480b-a35b-instruct', 'Qwen3 Coder 480B', 'S', '69.6%', '256k'],
308
319
  // ── A+ tier — SWE-bench Verified 50–60% ──
320
+ ['qwen3.7-flash', 'Qwen3.7 Flash', 'A+', '-', '1M'], // Added (2026-07-27)
309
321
  ['qwen3.6-flash', 'Qwen3.6 Flash', 'A+', '60.0%', '1M'],
310
322
  ['qwen3.5-flash', 'Qwen3.5 Flash', 'S', '64.4%', '1M'],
311
323
  ['qwen3-coder-flash', 'Qwen3 Coder Flash', 'A+', '55.0%', '1M'],
@@ -340,13 +352,13 @@ export const cloudflare = [
340
352
  ['@cf/qwen/qwen2.5-coder-32b-instruct', 'Qwen2.5 Coder 32B', 'A', '47.0%', '128k'],
341
353
  ['@cf/openai/gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
342
354
  ['@cf/qwen/qwq-32b', 'QwQ 32B', 'A', '-', '128k'],
343
- ['@cf/deepseek/deepseek-r1-distill-qwen-32b', 'DeepSeek R1 Distill Qwen 32B', 'A', '-', '128k'],
355
+ ['@cf/deepseek-ai/deepseek-r1-distill-qwen-32b', 'DeepSeek R1 Distill Qwen 32B', 'A', '-', '128k'], // Fixed (2026-07-27): namespace 'deepseek' → 'deepseek-ai'
344
356
  // ── A- tier — SWE-bench Verified 35–40% ──
345
357
  ['@cf/meta/llama-3.3-70b-instruct-fp8-fast', 'Llama 3.3 70B', 'B', '22.0%', '128k'],
346
- ['@cf/google/gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A-', '38.0%', '128k'],
358
+ ['@cf/google/gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A-', '38.0%', '256k'], // Fixed (2026-07-27): ctx '128k' → '256k' (April 2026 changelog)
347
359
  // ── B+ tier — SWE-bench Verified 30–35% ──
348
360
  ['@cf/mistralai/mistral-small-3.1-24b-instruct', 'Mistral Small 3.1', 'B+', '30.0%', '128k'],
349
- ['@cf/ibm/granite-4.0-h-micro', 'Granite 4.0 Micro', 'B+', '30.0%', '128k'],
361
+ ['@cf/ibm-granite/granite-4.0-h-micro', 'Granite 4.0 Micro', 'B+', '30.0%', '128k'], // Fixed (2026-07-27): namespace 'ibm' → 'ibm-granite'
350
362
  // ── B tier — SWE-bench Verified 20–30% ──
351
363
  ['@cf/meta/llama-3.1-8b-instruct-fast', 'Llama 3.1 8B Instruct (Fast)', 'C', '18.0%', '128k'],
352
364
  ]
@@ -358,17 +370,17 @@ export const cloudflare = [
358
370
  export const ovhcloud = [
359
371
  ['Qwen3.5-397B-A17B', 'Qwen3.5 397B MoE', 'S+', '76.2%', '262k'],
360
372
  ['Qwen3.6-27B', 'Qwen3.6 27B', 'S+', '77.2%', '262k'],
361
- ['Qwen3-Coder-30B-A3B-Instruct', 'Qwen3 Coder 30B MoE', 'A+', '51.6%', '256k'],
373
+ // Removed (2026-07-27): Qwen3-Coder-30B-A3B-Instruct (Qwen3 Coder 30B MoE) no longer in catalog
362
374
  ['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '131k'],
363
375
  ['gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '131k'],
364
376
  ['Meta-Llama-3_3-70B-Instruct', 'Llama 3.3 70B', 'B', '22.0%', '131k'],
365
- ['Qwen3-32B', 'Qwen3 32B', 'B+', '30.0%', '32k'],
377
+ // Removed (2026-07-27): Qwen3-32B (Qwen3 32B) no longer in catalog
366
378
  ['Mistral-Small-3.2-24B-Instruct-2506', 'Mistral Small 3.2', 'B', '20.0%', '128k'],
367
- ['Mistral-7B-Instruct-v0.3', 'Mistral 7B Instruct', 'B', '25.0%', '127k'],
379
+ // Removed (2026-07-27): Mistral-7B-Instruct-v0.3 (Mistral 7B Instruct) — no longer in catalog
368
380
  ['Mistral-Nemo-Instruct-2407', 'Mistral Nemo', 'B+', '30.0%', '118k'],
369
381
  ['Qwen3.5-9B', 'Qwen3.5 9B', 'B+', '30.0%', '262k'],
370
382
  // ── Embeddings ──
371
- ['Qwen3-Embedding-8B', 'Qwen3 Embedding 8B', 'B', '-', '-'],
383
+ ['Qwen3-Embedding-8B', 'Qwen3 Embedding 8B', 'B', '-', '32k'], // Fixed (2026-07-27): ctx '-' → '32k'
372
384
  ['bge-m3', 'BGE M3', 'B', '-', '-'],
373
385
  ['bge-multilingual-gemma2', 'BGE Multilingual Gemma2','B','-', '-'],
374
386
  // Fix (2026-05-26): Qwen3.5-9B ctx 128k→262k, Mistral-Small ctx 131k→128k, Mistral-Nemo ctx 128k→118k, Mistral-7B ctx 32k→127k
@@ -387,7 +399,9 @@ export const opencodeZen = [
387
399
  ['mimo-v2.5-free', 'MiMo-V2.5 Free', 'S+', '-', '200k'],
388
400
  ['nemotron-3-ultra-free', 'Nemotron 3 Ultra Free', 'S+', '71.9%', '200k'],
389
401
  ['north-mini-code-free', 'North Mini Code Free', 'B+', '-', '200k'],
390
- ['hy3-free', 'Tencent Hy3 Free', 'S', '-', '200k'],
402
+ ['poolside/laguna-s-2.1-free', 'Laguna S 2.1 Free', 'S+', '-', '262k'], // Added (2026-07-27)
403
+ ['ling-3.0-flash-free', 'Ling-3.0-flash Free', 'A+', '-', '262k'], // Added (2026-07-27)
404
+ // Removed (2026-07-27): hy3-free (Tencent Hy3 Free) — no longer on OpenCode Zen
391
405
  ]
392
406
 
393
407
  // 📖 Kilo source - https://api.kilo.ai/api/gateway
@@ -405,6 +419,7 @@ export const llm7 = [
405
419
  // ── S+ tier — SWE-bench Verified ≥70% ──
406
420
  ['minimax-m2.7', 'MiniMax M2.7', 'S+', '78.0%', '180k'],
407
421
  // ── A+ tier — SWE-bench Verified 50–60% ──
422
+ ['gemini-3.1-flash-lite', 'Gemini 3.1 Flash Lite', 'A+', '-', '1M'], // Added (2026-07-27)
408
423
  ['gpt-oss:20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
409
424
  // ── A tier — SWE-bench Verified 40–50% ──
410
425
  ['codestral-latest', 'Codestral Latest', 'A', '40.0%', '32k'],
@@ -417,9 +432,11 @@ export const routeway = [
417
432
  // ── S+ tier — SWE-bench Verified ≥70% ──
418
433
  ['deepseek-v4-flash:free', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'],
419
434
  ['step-3.5-flash:free', 'Step 3.5 Flash', 'S+', '74.4%', '256k'],
420
- ['laguna-m.1:free', 'Poolside Laguna M.1', 'S+', '72.5%', '131k'],
435
+ // Removed (2026-07-27): laguna-m.1:free (Poolside Laguna M.1) unavailable on Routeway
421
436
  ['laguna-xs.2:free', 'Poolside Laguna XS.2', 'S', '68.2%', '131k'],
437
+ ['step-3.7-flash:free', 'Step 3.7 Flash', 'S+', '74.4%', '256k'], // Added (2026-07-27)
422
438
  // ── S tier — SWE-bench Verified 60–70% ──
439
+ ['ling-3.0-flash:free', 'Ling 3.0 Flash', 'S', '-', '256k'], // Added (2026-07-27)
423
440
  ['ling-2.6-flash:free', 'Ling 2.6 Flash', 'S', '61.2%', '262k'],
424
441
  ['gpt-oss-120b:free', 'GPT OSS 120B', 'S', '60.0%', '131k'],
425
442
  // ── A tier — SWE-bench Verified 40–50% ──
@@ -440,10 +457,9 @@ export const routeway = [
440
457
  // 📖 Novita is mostly paid/trial-credit, so this catalog only includes live chat models reporting 0 input/output price.
441
458
  // 📖 Test/dev/placeholder zero-price IDs were intentionally excluded.
442
459
  export const novita = [
443
- // ── S+ tier — SWE-bench Verified ≥70% ──
444
- ['qwen/qwen3.5-plus', 'Qwen3.5 Plus', 'S+', '80.0%', '1M'],
445
460
  // ── S tier — SWE-bench Verified 60–70% ──
446
- ['tencent/hy3', 'Tencent Hy3', 'S', '-', '262k'],
461
+ ['tencent/hy3', 'Tencent Hy3', 'S', '-', '256k'], // Fixed (2026-07-27): ctx '262k' → '256k' per official novita description
462
+ // Removed (2026-07-27): qwen/qwen3.5-plus (Qwen3.5 Plus) — no longer in novita catalog
447
463
  ]
448
464
 
449
465
  // 📖 Ollama Cloud source - https://ollama.com/pricing and https://ollama.com/search?c=cloud
@@ -452,22 +468,26 @@ export const novita = [
452
468
  export const ollamaCloud = [
453
469
  // ── S+ tier — SWE-bench Verified ≥70% ──
454
470
  ['nemotron-3-ultra', 'Nemotron 3 Ultra', 'S+', '71.9%', '256k'],
455
- ['glm-5.1', 'GLM 5.1', 'S+', '82.8%', '128k'],
456
- ['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '128k'],
471
+ ['glm-5.1', 'GLM 5.1', 'S+', '82.8%', '198k'], // Fixed (2026-07-27): ctx '128k' → '198k'
472
+ ['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '1M'], // Fixed (2026-07-27): ctx '128k' → '1M'
457
473
  ['minimax-m2.7', 'MiniMax M2.7', 'S+', '78.0%', '200k'],
458
- ['minimax-m3', 'MiniMax M3', 'S+', '78.4%', '512k'],
459
- ['minimax-m2.5', 'MiniMax M2.5', 'S+', '80.2%', '200k'],
460
- ['kimi-k2.6', 'Kimi K2.6', 'S+', '80.2%', '262k'],
461
- ['deepseek-v4-flash', 'DeepSeek V4 Flash', 'S+', '79.0%', '256k'],
462
- ['deepseek-v4-pro', 'DeepSeek V4 Pro', 'S+', '80.6%', '256k'],
474
+ ['minimax-m3', 'MiniMax M3', 'S+', '78.4%', '1M'], // Fixed (2026-07-27): ctx '512k' → '1M'
475
+ ['minimax-m2.5', 'MiniMax M2.5', 'S+', '80.2%', '198k'], // Fixed (2026-07-27): ctx '200k' → '198k'
476
+ ['kimi-k2.6', 'Kimi K2.6', 'S+', '80.2%', '256k'], // Fixed (2026-07-27): ctx '262k' → '256k'
477
+ ['deepseek-v4-flash', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'], // Fixed (2026-07-27): ctx '256k' → '1M'
478
+ ['deepseek-v4-pro', 'DeepSeek V4 Pro', 'S+', '80.6%', '1M'], // Fixed (2026-07-27): ctx '256k' → '1M'
463
479
  // ── S tier — SWE-bench Verified 60–70% ──
464
- ['kimi-k2.7-code', 'Kimi K2.7 Code', 'S', '60.4%', '262k'],
480
+ ['kimi-k2.7-code', 'Kimi K2.7 Code', 'S', '60.4%', '256k'], // Fixed (2026-07-27): ctx '262k' → '256k'
465
481
  ['gpt-oss:120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
466
482
  ['nemotron-3-super', 'Nemotron 3 Super', 'S', '60.5%', '256k'],
483
+ ['kimi-k3', 'Kimi K3', 'S+', '-', '1M'], // Added (2026-07-27)
484
+ ['gemini-3-flash-preview', 'Gemini 3 Flash Preview', 'S+', '-', '1M'], // Added (2026-07-27)
467
485
  // ── A+ tier — SWE-bench Verified 50–60% ──
468
486
  ['kimi-k2.5', 'Kimi K2.5', 'A+', '-', '200k'],
469
- ['gemma4:31b', 'Gemma 4 31B', 'A+', '52.0%', '256k'],
487
+ ['gemma4:31b', 'Gemma 4 31B', 'A+', '52.0%', '128k'], // Fixed (2026-07-27): ctx '256k' → '128k'
470
488
  ['gpt-oss:20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
489
+ ['mistral-large-3:675b-cloud', 'Mistral Large 3 675B Cloud', 'A+', '-', '256k'], // Added (2026-07-27)
490
+ ['qwen3.5', 'Qwen 3.5 Cloud', 'A+', '-', '256k'], // Added (2026-07-27)
471
491
  ['nemotron-3-nano:30b', 'Nemotron 3 Nano 30B', 'A-', '38.8%', '1M'],
472
492
  ]
473
493
 
package/src/core/ping.js CHANGED
@@ -13,6 +13,9 @@
13
13
  * - Quota extraction from rate limit headers (multiple variants supported)
14
14
  * - Cached provider quota polling with TTL and error backoff
15
15
  * - Cloudflare account ID resolution from environment
16
+ * - Per-provider circuit-breaker on 429 (issue #146): pauses ALL models of a provider
17
+ * when the provider returns a quota-exhausted response, so the ping loop stops
18
+ * hammering the user's daily quota while the provider's retry window is active.
16
19
  *
17
20
  * → Functions:
18
21
  * - `resolveCloudflareUrl`: Resolve {account_id} placeholder from CLOUDFLARE_ACCOUNT_ID env var
@@ -31,6 +34,7 @@
31
34
  * - ../src/constants.js: PING_TIMEOUT
32
35
  * - ../src/provider-quota-fetchers.js: _fetchProviderQuotaFromModule (quota fetching with cache)
33
36
  * - ../src/quota-capabilities.js: supportsUsagePercent
37
+ * - ./provider-cooldown.js: pauseProviderQuota, extractRetryAfterFromResponse (issue #146)
34
38
  *
35
39
  * ⚙️ Configuration:
36
40
  * - PING_TIMEOUT: Timeout in ms for ping requests (default: 15000)
@@ -43,6 +47,10 @@
43
47
  import { PING_TIMEOUT } from './constants.js'
44
48
  import { fetchProviderQuota as _fetchProviderQuotaFromModule, extractQuota as _extractQuotaFromModule, processResponseHeaders as _processResponseHeadersFromModule } from './provider-quota-fetchers.js'
45
49
  import { supportsUsagePercent } from './quota-capabilities.js'
50
+ import {
51
+ extractRetryAfterFromResponse,
52
+ pauseProviderQuota,
53
+ } from './provider-cooldown.js'
46
54
 
47
55
  const DISABLED_THINKING_RETRY_STATUSES = new Set([400, 422])
48
56
  const disabledThinkingUnsupportedProviders = new Set()
@@ -171,6 +179,14 @@ export async function ping(apiKey, modelId, providerKey, url) {
171
179
  req = buildPingRequest(apiKey, modelId, providerKey, url, { disableThinking: false })
172
180
  resp = await sendPingFetch(req, ctrl.signal)
173
181
  }
182
+ // 📖 Provider circuit-breaker (issue #146): openrouter + similar gateways rate-limit
183
+ // 📖 at the provider/key level, not per-model. A 429 means the WHOLE key is paused,
184
+ // 📖 often for hours — re-pinging every model every 2-30s would burn the quota in minutes.
185
+ // 📖 Honour Retry-After header + the OpenRouter body "try again N seconds later".
186
+ if (resp.status === 429) {
187
+ const retryMs = await extractRetryAfterFromResponse(resp)
188
+ if (retryMs > 0) pauseProviderQuota(providerKey, retryMs)
189
+ }
174
190
  // 📖 Normalize all HTTP 2xx statuses to "200" so existing verdict/avg logic still works.
175
191
  const code = resp.status >= 200 && resp.status < 300 ? '200' : String(resp.status)
176
192
  // 📖 Passive quota tracker (t2): parse the response headers via the shared module.