-## π 352 AI Providers β 152 Catalog-Marked Free
+## π 357 AI Providers β 152 Catalog-Marked Free
-> **352 registered providers** across the canonical chat, media, search, local, cloud-agent and system collections, including **152 carrying `hasFree: true` discovery metadata**. The chat model registry covers **229 providers / 2,554 distinct provider-model pairs / 1,283 raw model IDs**; the separate free-budget catalog has **443 per-model rows**, **34 recurring pools** and **53 recurring/keyless free-forever providers**. These are different denominators by design; definitions and pool-deduped calculations live in the [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) and [Free Tiers](docs/reference/FREE_TIERS.md).
+> **357 registered providers** across the canonical chat, media, search, local, cloud-agent and system collections, including **152 carrying `hasFree: true` discovery metadata**. The chat model registry covers **229 providers / 2,554 distinct provider-model pairs / 1,283 raw model IDs**; the separate free-budget catalog has **491 per-model rows**, **35 recurring pools** and **54 recurring/keyless free-forever providers**. These are different denominators by design; definitions and pool-deduped calculations live in the [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) and [Free Tiers](docs/reference/FREE_TIERS.md).
@@ -1331,7 +1331,7 @@ MΓ©tricas canΓ΄nicas em 2026-08-24: **1.029 vΓdeos ΓΊnicos** Β· **11.132.922 vi
Resilience Guide Circuit breakers, cooldowns, queue, anti-thundering herd, TLS spoofing
Auto-Combo Engine 16-factor scoring, mode packs, self-healing
Proxy Guide 3-level proxy system, 1proxy marketplace, registry CRUD
-
Free Tiers Consolidated directory: 34 documented recurring pools / 452 cataloged free-tier entries
+
Free Tiers Consolidated directory: 35 documented recurring pools / 491 cataloged free-tier entries
Features Gallery Visual dashboard tour with screenshots
Codebase Documentation Beginner-friendly codebase walkthrough
diff --git a/config/quality/file-size-baseline.json b/config/quality/file-size-baseline.json
index ee72d15446..5e01e87b80 100644
--- a/config/quality/file-size-baseline.json
+++ b/config/quality/file-size-baseline.json
@@ -1,4 +1,5 @@
{
+ "_rebaseline_2026_09_03_12648_xkiro_provider": "PR #12648 (feat/provider-xkiro) own growth: src/shared/constants/providers/apikey/gateways.ts +18 lines on top of #12649 (the xkiro APIKEY_PROVIDERS_GATEWAYS catalog entry with hasFree/freeNote/authHint/apiHint documenting the 5M tokens/day free plan, plus the Prettier reflow of two pre-existing >100-col authHint lines (oneminai, freebuff) that lint-staged enforces on any touch of the file; additive data at the existing registry chokepoint, same god-file no-split rationale as prior gateways.ts rebaselines: #11786 seekai, #10987 logfare, #10531 freebuff). Covered by tests/unit/free-provider-xkiro.test.ts (4/4).",
"_rebaseline_2026_09_15_12643_messages_entry_guard": "#12643 own growth: src/sse/handlers/chat.ts +10 (2490->2500 after syncing the 09-16 base, which itself moved the frozen value). A `messages` array containing a null/non-object entry (e.g. `[null]`) passed every existing entry guard (#5110/#6402/#6407/#6412) and crashed downstream translators/session helpers (openai-to-claude.ts, sessionManager.ts, contextManager.ts's fixToolPairs) reading `.role`/`.content` off the raw entry, surfacing as an HTTP 500 instead of a clean 400. Adds one more entry-shape guard clause to the same chokepoint, extending the existing guard family β same pattern, irreducible call-site wiring (the check itself is a one-line `.some()` predicate, not extractable into its own leaf without hiding the chokepoint). Covered by tests/unit/chat-messages-entry-objects-12643.test.ts (3/3) plus the sibling guard suites (chat-messages-validation-6402.test.ts, chat-non-string-model-6407.test.ts, 22/22, no regression). ATUALIZADO 2026-09-17: o teto foi refixado em 2519 ao mergear o tip atual. O tip sozinho ja esta em 2509 (acima do teto 2500 que esta PR havia fixado contra um tip anterior); o +10 desta PR e o proprio guard de entrada. O excedente do tip (2509>2500) e base-red herdado, nao introduzido aqui.",
"_rebaseline_2026_09_17_13185_claude_oauth_sticky_refresh": "PR #13185 (@RaviTharuma): soft-fail do refresh do Claude para CredentialHealth nao ficar sticky-dead. src/lib/tokenHealthCheck.ts 1214 (tip) -> 1220 na branch e 1221 na arvore combinada com #13426; teto fixado em 1221. O teto anterior (1218) tinha apenas 4 linhas de folga. O crescimento e o proprio fix: preservar o refresh_token e distinguir falha transitoria de credencial morta exige estado extra no caminho de sweep, que nao pode sair do modulo sem quebrar a API interna. Coberto por tests/unit/tokenHealthCheck-claude-refresh-token-preserved.test.ts; os 14 arquivos irmaos de tokenHealthCheck/credentialHealth foram rodados juntos (72/72).",
"_rebaseline_2026_09_16_jxnlexn_wave_growth": "Combined growth of the 2026-09-15 maxmad64bis uplift batch (each PR rebaselined its own growth; the merged sum is larger): src/sse/handlers/chat.ts->2498; open-sse/handlers/chatCore.ts->6181. Every hunk is flag-gated or a verified fix covered by that PR's tests; see the batch report.",
@@ -503,7 +504,7 @@
"src/lib/tailscaleTunnel.ts": 1208,
"src/lib/tokenHealthCheck.ts": 1221,
"src/shared/components/RequestLoggerV2.tsx": 1718,
- "src/shared/constants/providers/apikey/gateways.ts": 1502,
+ "src/shared/constants/providers/apikey/gateways.ts": 1520,
"src/shared/services/cliRuntime.ts": 1296,
"src/sse/handlers/chat.ts": 2520,
"src/sse/services/auth.ts": 3557,
diff --git a/docs/diagrams/README.md b/docs/diagrams/README.md
index 610e2a4dba..0153844a7c 100644
--- a/docs/diagrams/README.md
+++ b/docs/diagrams/README.md
@@ -34,7 +34,7 @@ inside GitHub's `
` sandbox:
| [combo-always-on.svg](./combo-always-on.svg) | style reference | Animated priority-combo fallback (4 layers, 16s loop). Edit the SVG directly β there is no `.mmd` source. |
| [cli-terminal.svg](./cli-terminal.svg) | README.md (root) | Compact half-height animated terminal (1200Γ350): 3 real CLI commands cycling with typewriter + scrolling subcommand ticker; first frame = completed providers screen. Edit the SVG directly β there is no `.mmd` source. |
| [compression-pipeline.svg](./compression-pipeline.svg) | README.md (root) | Animated 12-engine compression funnel (8s loop). Edit the SVG directly β there is no `.mmd` source. |
-| [free-tier-budget.svg](./free-tier-budget.svg) | README.md (root) | Animated free-tier budget card (~1.47B/mo quantified headline, 16-pool + Groq-caps budget bar, per-pool grid, signup credits, 10s loop). Edit the SVG directly β there is no `.mmd` source. |
+| [free-tier-budget.svg](./free-tier-budget.svg) | README.md (root) | Animated free-tier budget card (~1.62B/mo quantified headline, 17-pool + Groq-caps budget bar, per-pool grid, signup credits, 10s loop). Edit the SVG directly β there is no `.mmd` source. |
| [readme-hero.svg](./readme-hero.svg) | README.md (root) | Animated hero card (tagline, live provider/free-access headline, full-width compression bar demo, 6 stat chips). Edit the SVG directly β there is no `.mmd` source. |
| [promise-pillars.svg](./promise-pillars.svg) | README.md (root) | Animated "The Promise" 6-pillar card (12s border-highlight sweep). Edit the SVG directly β there is no `.mmd` source. |
| [why-pain-fix.svg](./why-pain-fix.svg) | README.md (root) | Animated "Why OmniRoute" 10-row pain-vs-fix ledger (15s green row sweep). Edit the SVG directly β there is no `.mmd` source. |
diff --git a/docs/diagrams/cli-terminal.svg b/docs/diagrams/cli-terminal.svg
index 17f1c784e3..44f34575b5 100644
--- a/docs/diagrams/cli-terminal.svg
+++ b/docs/diagrams/cli-terminal.svg
@@ -1,4 +1,4 @@
-
+
Compact animated terminal cycling three real OmniRoute CLI commands with a typewriter effect and a scrolling subcommand ticker; the first frame shows the completed providers-list screen.
@@ -6,7 +6,7 @@
omniroute — 86 top-level commands
-omniroute providers list OmniRoute Providers 1f3a9c2e anthropic Claude Max 20x active 8c2d5b1a codex Codex Pro (team) active f4e0a97b glm GLM Coding Plan active 03bd6e5f kimi Kimi K2 free active … 348 more providers
+omniroute providers list OmniRoute Providers 1f3a9c2e anthropic Claude Max 20x active 8c2d5b1a codex Codex Pro (team) active f4e0a97b glm GLM Coding Plan active 03bd6e5f kimi Kimi K2 free active … 353 more providers
$
omniroute providers list
@@ -14,7 +14,7 @@
- OmniRoute Providers 1f3a9c2e anthropic Claude Max 20x active 8c2d5b1a codex Codex Pro (team) active f4e0a97b glm GLM Coding Plan active 03bd6e5f kimi Kimi K2 free active … 348 more providers
+ OmniRoute Providers 1f3a9c2e anthropic Claude Max 20x active 8c2d5b1a codex Codex Pro (team) active f4e0a97b glm GLM Coding Plan active 03bd6e5f kimi Kimi K2 free active … 353 more providers
$
@@ -32,7 +32,7 @@
- OmniRoute Health Status: healthy Uptime: 4d 12h 33m Requests (24h): 18,412 p95: 412ms Breakers: ● 24 closed ◒ 1 half-open ○ 0 open Providers: 350 registered 90+ free tiers … live: /dashboard · omniroute status
+ OmniRoute Health Status: healthy Uptime: 4d 12h 33m Requests (24h): 18,412 p95: 412ms Breakers: ● 24 closed ◒ 1 half-open ○ 0 open Providers: 357 registered 150+ free tiers … live: /dashboard · omniroute status
diff --git a/docs/diagrams/comparison-table.svg b/docs/diagrams/comparison-table.svg
index 02c0f45c32..5f64829434 100644
--- a/docs/diagrams/comparison-table.svg
+++ b/docs/diagrams/comparison-table.svg
@@ -1,4 +1,4 @@
-
+
Static-header comparison table where each capability row fades in top to bottom; the OmniRoute column is highlighted and shows a check or a leading value in every row, while competitors show a mix of checks, partials and crosses.
@@ -23,7 +23,7 @@
Providers
- 352
+ 357
40+
400+*
~5
@@ -32,7 +32,7 @@
Free providers built-in
- 90+
+ 150+
@@ -117,7 +117,7 @@
i18n UI locales
- 42
+ 43
6
diff --git a/docs/diagrams/free-tier-budget.svg b/docs/diagrams/free-tier-budget.svg
index 6618799b94..02a64add2d 100644
--- a/docs/diagrams/free-tier-budget.svg
+++ b/docs/diagrams/free-tier-budget.svg
@@ -1,5 +1,5 @@
-
- Pool-deduplicated chart of the 16 recurring free-token pools with positive published budgets (plus Groq's five per-model caps as one segment), plus signup credits and uncapped providers shown separately.
+
+ Pool-deduplicated chart of the 17 recurring free-token pools with positive published budgets (plus Groq's five per-model caps as one segment), plus signup credits and uncapped providers shown separately.
@@ -61,10 +61,10 @@
- ~1.47B
+ ~1.62B
FREE TOKENS / MONTH · STEADY
- up to ~2.07B in your first month — signup credits
- documented free tiers · 34 recurring pools · 452 catalog entries · one endpoint
+ up to ~2.22B in your first month — signup credits
+ documented free tiers · 35 recurring pools · 491 catalog entries · one endpoint
@@ -75,7 +75,7 @@
every rate limit · 24/7
we don't publish that
- ~1.47B
+ ~1.62B
each shared free pool
counted once ✓
13 providers ToS-flagged — we flag it · you decide
@@ -85,22 +85,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,20 +116,21 @@
Mistral 1.00B
Nara 210M
LLM7 150M
- Groq 30M · 5 caps
- Cloudflare AI 30M
- API Airforce 24M
- Bluesminds 7.2M
- SambaNova 6M
- Arcee 4.8M
- Navy 4.5M
- BazaarLink 3.6M
- OpenRouter 1.2M
- Cohere 800K
- HuggingChat 500K
- Morph 400K
- Hugging Face 200K
- Kiro 25K
+ xKiro 150M
+ Groq 30M · 5 caps
+ Cloudflare AI 30M
+ API Airforce 24M
+ Bluesminds 7.2M
+ SambaNova 6M
+ Arcee 4.8M
+ Navy 4.5M
+ BazaarLink 3.6M
+ OpenRouter 1.2M
+ Cohere 800K
+ HuggingChat 500K
+ Morph 400K
+ Hugging Face 200K
+ Kiro 25K
diff --git a/docs/diagrams/promise-pillars.svg b/docs/diagrams/promise-pillars.svg
index 0fc137974f..ca60d088dd 100644
--- a/docs/diagrams/promise-pillars.svg
+++ b/docs/diagrams/promise-pillars.svg
@@ -1,4 +1,4 @@
-
+
Animated promise card: six pillar tiles fade in in reading order, then a soft colored border highlight sweeps from tile to tile in a continuous cycle.
@@ -21,7 +21,7 @@
- One endpoint. 358 providers. Never stop building β OmniRoute picks the cheapest one that works .
+ One endpoint. 359 providers. Never stop building β OmniRoute picks the cheapest one that works .
@@ -38,7 +38,7 @@
Never hit limits
- Auto-fallback across 358 providers in
+ Auto-fallback across 359 providers in
milliseconds. Quota out? The next provider
takes over while a healthy target remains.
@@ -73,7 +73,7 @@
$0 to start
- 150+ providers with a free tier, 52 free
+ 150+ providers with a free tier, 53 free
forever β Qoder, Pollinations, Cloudflare,
SiliconFlow⦠No card needed.
diff --git a/docs/diagrams/readme-hero.svg b/docs/diagrams/readme-hero.svg
index 69cd5a65e0..c536c8d832 100644
--- a/docs/diagrams/readme-hero.svg
+++ b/docs/diagrams/readme-hero.svg
@@ -1,4 +1,4 @@
-
+
Animated hero card: a pulse travels the divider line and a compression bar demo repeatedly shrinks a prompt by up to 95 percent; all headline content is static and readable on the first frame.
@@ -28,7 +28,7 @@
Never stop coding.
- Every AI tool β 358 providers β 150+ free β through one endpoint.
+ Every AI tool β 359 providers β 150+ free β through one endpoint.
Claude Code Β· Codex Β· Cursor Β· Cline Β· Copilot Β· Antigravity β FREE Claude / GPT / Gemini Β· auto-fallback
@@ -66,13 +66,13 @@
- 352
+ 357
AI PROVIDERS
- 90+
+ 150+
FREE TIERS
- ~1.47B
+ ~1.62B
FREE TOKENS / MO
15β95%
diff --git a/docs/frameworks/OPEN_SSE_ARCHITECTURE.md b/docs/frameworks/OPEN_SSE_ARCHITECTURE.md
index 75e6a67b29..ac68c62144 100644
--- a/docs/frameworks/OPEN_SSE_ARCHITECTURE.md
+++ b/docs/frameworks/OPEN_SSE_ARCHITECTURE.md
@@ -252,7 +252,7 @@ Supports **19 routing strategies** (see `src/shared/constants/routingStrategies.
### base.ts (1170 LOC)
-The **abstract executor** that all 101 executors extend. It contains:
+The **abstract executor** that all 107 executors extend. It contains:
- `buildUrl()` β default URL construction (subclasses override for custom)
- `buildHeaders()` β default headers (auth, content-type)
diff --git a/docs/getting-started/FREE-TIERS-GUIDE.md b/docs/getting-started/FREE-TIERS-GUIDE.md
index 87e52f908d..607d0ab97b 100644
--- a/docs/getting-started/FREE-TIERS-GUIDE.md
+++ b/docs/getting-started/FREE-TIERS-GUIDE.md
@@ -1,6 +1,6 @@
# Free Tiers Guide: Understand and Combine Free AI Access
-> **TL;DR**: OmniRoute registers 352 provider IDs, with **152 provider-catalog entries marked `hasFree`**. The stricter audited free-model catalog covers **34 recurring pool keys / 443 entries** (436 active + 7 discontinued). Connect several suitable providers for broader fallback capacity; every quota, approval rule, privacy policy, and paid-overage condition still applies.
+> **TL;DR**: OmniRoute registers 357 provider IDs, with **152 provider-catalog entries marked `hasFree`**. The stricter audited free-model catalog covers **35 recurring pool keys / 482 entries** (475 active + 7 discontinued). Connect several suitable providers for broader fallback capacity; every quota, approval rule, privacy policy, and paid-overage condition still applies.
---
@@ -160,11 +160,11 @@ The live, pool-deduplicated catalog currently reports:
| Metric | Current audited value | Interpretation |
| ---------------------------------------------------- | -----------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------- |
-| Recurring quantified grant | **~1.47B tokens/month** | Shared pools counted once; excludes uncapped providers from the sum |
-| First month with signup grants | **~2.07B tokens** | Recurring total plus one-time and recurring credits |
-| Audited free-model inventory | **34 recurring pool keys / 443 catalog entries** | 436 active + 7 discontinued; distinct from the 352-provider catalog |
-| Recurring/keyless free-forever providers represented | **52** | Unique providers across recurring daily/monthly/credit/uncapped and keyless catalog types, eligibility-gated rows excluded |
-| Provider catalog entries marked `hasFree` | **152 / 352** | Broader provider metadata; not all have a quantifiable recurring quota |
+| Recurring quantified grant | **~1.62B tokens/month** | Shared pools counted once; excludes uncapped providers from the sum |
+| First month with signup grants | **~2.22B tokens** | Recurring total plus one-time and recurring credits |
+| Audited free-model inventory | **35 recurring pool keys / 482 catalog entries** | 475 active + 7 discontinued; distinct from the 357-provider catalog |
+| Recurring/keyless free-forever providers represented | **53** | Unique providers across recurring daily/monthly/credit/uncapped and keyless catalog types, eligibility-gated rows excluded |
+| Provider catalog entries marked `hasFree` | **152 / 357** | Broader provider metadata; not all have a quantifiable recurring quota |
These values are computed from `open-sse/config/freeModelCatalog.ts`; see the
[Free Tiers Reference](../reference/FREE_TIERS.md) for pool deduplication, ToS flags,
diff --git a/docs/i18n/am/llm.txt b/docs/i18n/am/llm.txt
index 112fb6bc09..3dd573fe29 100644
--- a/docs/i18n/am/llm.txt
+++ b/docs/i18n/am/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/ha/llm.txt b/docs/i18n/ha/llm.txt
index 697041f2cc..189a3f06da 100644
--- a/docs/i18n/ha/llm.txt
+++ b/docs/i18n/ha/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/hy/llm.txt b/docs/i18n/hy/llm.txt
index d4e773c23f..708ab71050 100644
--- a/docs/i18n/hy/llm.txt
+++ b/docs/i18n/hy/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/ig/llm.txt b/docs/i18n/ig/llm.txt
index 35b1197328..bdd2395be5 100644
--- a/docs/i18n/ig/llm.txt
+++ b/docs/i18n/ig/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/ka/llm.txt b/docs/i18n/ka/llm.txt
index a39109a852..1e4bf5fbb7 100644
--- a/docs/i18n/ka/llm.txt
+++ b/docs/i18n/ka/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/uz/llm.txt b/docs/i18n/uz/llm.txt
index e1974986ec..5fa011daf5 100644
--- a/docs/i18n/uz/llm.txt
+++ b/docs/i18n/uz/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/i18n/yo/llm.txt b/docs/i18n/yo/llm.txt
index b119d3d91c..e676daa916 100644
--- a/docs/i18n/yo/llm.txt
+++ b/docs/i18n/yo/llm.txt
@@ -7,7 +7,6 @@
-
> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 359 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
diff --git a/docs/reference/FREE_TIERS.md b/docs/reference/FREE_TIERS.md
index db0edbeb7a..929d192f76 100644
--- a/docs/reference/FREE_TIERS.md
+++ b/docs/reference/FREE_TIERS.md
@@ -15,14 +15,14 @@ lastUpdated: 2026-09-03
| Metric | Tokens / month | Meaning |
| ------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **Documented recurring grant (steady)** | **~1.47B** | Free-tier **pools** (per-model catalog), each shared pool counted **once**. The live source behind `/api/free-tier/summary` and the dashboard's Free-Tier Budget page. **Use this number.** |
-| **+ first month with signup credits** | **~2.07B** | Steady + one-time signup credits (Z.AI 20M, DeepSeek 5M, β¦), deduped per account. **First month only** β does not recur. |
+| **Documented recurring grant (steady)** | **~1.62B** | Free-tier **pools** (per-model catalog), each shared pool counted **once**. The live source behind `/api/free-tier/summary` and the dashboard's Free-Tier Budget page. **Use this number.** |
+| **+ first month with signup credits** | **~2.22B** | Steady + one-time signup credits (Z.AI 20M, DeepSeek 5M, β¦), deduped per account. **First month only** β does not recur. |
| **+ permanently free, no published cap** | _un-quantifiable_ | `siliconflow`, `glm-cn` (GLM-4-Flash), `tencent`, `baidu`, `kilo-gateway`, `opencode-zen`, `gemini`, `ollama-cloud` β real recurring access, rate/concurrency-limited, **no token cap to count**. Listed, never summed (counting them at `RPMΓ24/7` is the inflation we reject). |
| **+ deposit-unlock boost** | **+~24M** | A one-time **$10** OpenRouter top-up raises its free pool from 50 β 1000 req/day. Reported separately so it never inflates the steady number. |
| **+ behind a regional identity check** | **+~6M** | `modelscope` (Alibaba Cloud binding + mainland-China real-name verification). Real recurring quota, exposed as `gatedRecurringTokens` / `gatedProviders` and on the dashboard. Never summed into the headline: +~6M behind regional identity verification. |
| Theoretical ceiling (all rate limits, 24/7) | ~10B | Sum of every provider rate limit extrapolated to non-stop use. **Not a guarantee** β do not headline this. |
-**Honest headline:** _OmniRoute aggregates **~1.47B documented free tokens per month** (up to ~2.07B in your first month with signup credits) across 34 free-tier pools β plus a long tail of permanently-free, no-cap providers β and RTK + Caveman compression (15β95% token savings) stretches that further._
+**Honest headline:** _OmniRoute aggregates **~1.62B documented free tokens per month** (up to ~2.22B in your first month with signup credits) across 35 free-tier pools β plus a long tail of permanently-free, no-cap providers β and RTK + Caveman compression (15β95% token savings) stretches that further._
> **Why this dropped from the previous ~1.94B.** The 2026-06-17 refresh is an honesty correction, not a loss: `gemini` is now pool-deduped (was inflated by counting each Flash variant separately, 462M β 60M), `cloudflare-ai` corrected to its real 10k-Neurons/day (122M β 30M), `doubao` reclassified as a one-time signup credit (not recurring), and shut-down tiers removed (`chutes`/`phind`/`kluster` discontinued). Partly offset by `llm7` (correct 5M/day β 150M) and new free providers (Kilo, OpenCode Zen, Z.AI GLM-Flash).
>
@@ -30,11 +30,13 @@ lastUpdated: 2026-09-03
>
> **Updated on 2026-08-26 after retiring Felo Web:** Felo Web is excluded while its GPL-derived provenance/licensing remains on HOLD; the source reported 38 pool keys at the time. The pool count is live and CI-gated (`check:docs-counts` fails the build if the numbers above drift from `computeFreeModelTotals()`).
>
-> **Re-audited on 2026-09-02 against the providers' own pages** (sources: the `// evidence:` comments next to each re-audited entry in `open-sse/config/freeModelCatalog.data.ts`): `gemini` and `ollama-cloud` no longer publish a token figure (Google removed the per-model free table on 2025-12-23; Ollama's Free plan is "starter usage credits") and are now listed as **uncapped**, never summed (β80M); `groq` is five **per-model** 200K-TPD caps (6M each, +15M) with three retired IDs dropped; `nara` is one 7M/day bucket (+60M, 210M). `mistral`'s 1B is visible only in the account console β see _Evidence classes_ under Methodology. The source reported 35 such keys at that point (β3: `gemini` and `ollama-cloud` moved to the uncapped list, and Groq's per-model caps are not a shared pool).
+> **Re-audited on 2026-09-02 against the providers' own pages** (sources: the `// evidence:` comments next to each re-audited entry in `open-sse/config/freeModelCatalog.data.ts`): `gemini` and `ollama-cloud` no longer publish a token figure (Google removed the per-model free table on 2025-12-23; Ollama's Free plan is "starter usage credits") and are now listed as **uncapped**, never summed (β80M); `groq` is five **per-model** 200K-TPD caps (6M each, +15M) with three retired IDs dropped; `nara` is one 7M/day bucket (+60M, 210M). `mistral`'s 1B is visible only in the account console β see _Evidence classes_ under Methodology.
>
-> **Corrected to ~1.47B on 2026-09-03 (#11773):** `cerebras` was reclassified from a 30M/mo recurring grant (old no-card 1M tokens/day trial) to a one-time $5 signup credit that requires a payment method. Same honesty rule as LongCat. The source now reports 34 recurring pool keys and ~1.47B steady.
+> **Corrected on 2026-09-03 (#11773):** `cerebras` was reclassified from a 30M/mo recurring grant (old no-card 1M tokens/day trial) to a one-time $5 signup credit that requires a payment method. Same honesty rule as LongCat.
+>
+> **Plus xKiro (2026-09-03):** the new `xkiro-free` pool (150M/mo) adds a 35th recurring pool key. Felo Web stays excluded while its GPL-derived provenance/licensing remains on HOLD. The source now reports **35 recurring pool keys** and **~1.62B steady** β the live, CI-gated number (`check:docs-counts` fails the build if this drifts from `computeFreeModelTotals()`).
-Biggest **documented** contributors: `mistral` 1.00B, `nara` 210M, `llm7` 150M, `groq` 30M (five per-model caps), `cloudflare-ai` 30M, `api-airforce` 24M. (`longcat` is excluded β its 10M LongCat-2.0 grant is a one-time, KYC-gated signup credit, not a recurring monthly budget.)
+Biggest **documented** contributors: `mistral` 1.00B, `nara` 210M, `llm7` 150M, `xkiro` 150M, `groq` 30M (five per-model caps), `cloudflare-ai` 30M, `api-airforce` 24M. (`longcat` is excluded β its 10M LongCat-2.0 grant is a one-time, KYC-gated signup credit, not a recurring monthly budget.)
> β οΈ The theoretical ceiling (~10B) is inflated by rate-limit-only providers with **no published token cap** (`tencent`, `siliconflow`, `nvidia`, `baidu`, `glm-cn`, `sparkdesk`) whose figures would be `RPM/TPM Γ 24/7 Γ 30d` β a theoretical maximum no single account will sustain. They are **excluded** from the defensible number (shown in the "permanently free, no cap" row instead). This is the same inflation that makes competitors' multi-billion claims unreliable.
@@ -74,7 +76,7 @@ purpose.
## Methodology & caveats
- Numbers are **upper-bound estimates** from each provider's documented free-tier limits as of **2026-06-17**, gathered by web research. Free tiers change constantly β re-verify before relying on a figure.
-- **What an entry actually vouches for.** No entry carries a per-row confidence rating, and the API serves none β treat every figure above as an estimate of the same, unstated quality. Two facts are different, because they are curated by hand rather than inferred: 5 entries carry an independently documented hard stop, and 13 entries carry a prompt-training disclosure. `hardStopGuaranteed` is set only when the provider's own terms say that exceeding the free allowance refuses the request rather than silently starting to bill you, with the source in a comment next to the entry; it is never defaulted to `true`, and an entry nobody has verified stays unset. So a missing hard-stop flag means "not established", not "known to bill you". **STRICT mode** (the opt-in `freeAccessPolicy=strict` routing guard) only trusts entries that carry the flag; every other free tier is excluded as `no-hard-stop` (see `open-sse/services/autoCombo/strictZeroCostFilter.ts`).
+- **What an entry actually vouches for.** No entry carries a per-row confidence rating, and the API serves none β treat every figure above as an estimate of the same, unstated quality. Two facts are different, because they are curated by hand rather than inferred: 44 entries carry an independently documented hard stop (39 of them the xKiro rows, which all share one daily allowance), and 13 entries carry a prompt-training disclosure. `hardStopGuaranteed` is set only when the provider's own terms say that exceeding the free allowance refuses the request rather than silently starting to bill you, with the source in a comment next to the entry; it is never defaulted to `true`, and an entry nobody has verified stays unset. So a missing hard-stop flag means "not established", not "known to bill you". **STRICT mode** (the opt-in `freeAccessPolicy=strict` routing guard) only trusts entries that carry the flag; every other free tier is excluded as `no-hard-stop` (see `open-sse/services/autoCombo/strictZeroCostFilter.ts`).
- `estMonthlyFreeTokens` = recurring monthly tokens only. **One-time signup credits do not recur** and count as 0. Discontinued tiers are also 0.
- Daily token cap β `monthly = daily Γ 30`. Only RPD documented β `RPD Γ ~800 output tokens Γ 30`. Only RPM/TPM (no daily cap) β **uncapped** (see below).
- **Permanently free, but no published token cap** (`siliconflow`, `glm-cn`, `tencent`, `baidu`, `kilo-gateway`, `opencode-zen`, `gemini`, `ollama-cloud`): these are real recurring free access, rate/concurrency-limited. We classify them `recurring-uncapped` and **never sum them** β multiplying `RPM Γ 24/7 Γ 30d` would produce a fantasy ceiling (the inflation we reject). They are listed so you know they exist.
@@ -189,6 +191,7 @@ Most "free tokens per month" figures in this space are sums of per-model labels.
| `veoaifree-web` | caution | ToS explicitly bans automated bots or scripts running at "inhuman speeds" and prohibits copying the platform to create β¦ |
| `vertex` | caution | Google Cloud Service Terms restrict resale to authorized resellers only (Section 14 requires a Reseller Agreement); a s⦠|
| `voyage-ai` | caution | ToS grants "personal, non-commercial use" for site content and prohibits credential/account sharing with third parties;β¦ |
+| `xkiro` | caution | ToS (2026-07-30) forbids reselling/redistributing the service and violating the upstream providers' terms; personal pro⦠|
| `360ai` | unknown | ToS for developer API not publicly accessible without registration; access requires application approval which implies β¦ |
| `chutes` | unknown | ToS page exists at chutes.ai/terms but content was not accessible via fetch; no explicit proxy/resale clauses found in β¦ |
| `freemodel-dev` | unknown | The Terms of Service page (freemodel.dev/terms) returned only a header with no readable content via WebFetch; no clause⦠|
@@ -211,6 +214,7 @@ Most "free tokens per month" figures in this space are sums of per-model labels.
| `mistral` | recurring | ~1.00B | β | caution | 5 |
| `nara` | recurring | ~210M | β | caution | 8 |
| `llm7` | recurring | ~150M | β | caution | 4 |
+| `xkiro` | recurring | ~150M | β | caution | 39 |
| `longcat` | one-time | β | 10M | caution | 1 |
| `cerebras` | one-time | β | $5 credit | caution | 2 |
| `cloudflare-ai` | recurring | ~30M | β | caution | 9 |
diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md
index 7fd3ee9a83..54b4524915 100644
--- a/docs/reference/PROVIDER_REFERENCE.md
+++ b/docs/reference/PROVIDER_REFERENCE.md
@@ -1,16 +1,16 @@
---
title: "Provider Reference"
version: 3.8.51
-lastUpdated: 2026-09-16
+lastUpdated: 2026-09-17
---
# Provider Reference
> **Auto-generated** from `src/shared/constants/providers.ts` β do not edit by hand.
> Regenerate with: `npm run gen:provider-reference`
-> **Last generated:** 2026-09-16
+> **Last generated:** 2026-09-17
-Total providers: **358**. See category breakdown below.
+Total providers: **359**. See category breakdown below.
## Categories
@@ -117,7 +117,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `zai-web` | `zw` | Z.ai Web | Web cookie | [link](https://chat.z.ai) | Copy the "token" value from chat.z.ai β DevTools β Application β Local Storage. Do not copy cookies; OmniRoute handles the per-request CAPTCHA through its browser transport. | β |
| `zenmux-free` | `zmf` | ZenMux Free (Web) | Web cookie | [link](https://zenmux.ai) | Login at zenmux.ai, then export all cookies using EditThisCookie or Cookie-Editor and paste the full Cookie header string here. Refresh every ~30 days. | β |
-## API Key Providers (paid / paid-with-free-credits) (241)
+## API Key Providers (paid / paid-with-free-credits) (242)
| ID | Alias | Name | Tags | Website | Notes |
|----|-------|------|------|---------|-------|
@@ -341,8 +341,8 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `v0-vercel` | `v0` | v0 (Vercel) | API key | [link](https://v0.dev) | β |
| `venice` | `venice` | Venice.ai | API key | [link](https://venice.ai) | β |
| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API key, aggregator | [link](https://vercel.com/docs/ai-gateway) | β |
-| `vertex` | `vertex` | Vertex AI | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide Service Account JSON or OAuth access_token |
-| `vertex-partner` | `vp` | Vertex AI Partners | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide the same Service Account JSON used for Vertex AI partner models. |
+| `vertex` | `vertex` | Vertex AI | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide Service Account JSON, an OAuth access token, a Vertex Express API key, or a service-account-bound authorization key. Express mode supports Gemini only; partner models require project-scoped credentials. |
+| `vertex-partner` | `vp` | Vertex AI Partners | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide Service Account JSON or OAuth credentials. A service-account-bound authorization key also supports discovery, but partner inference additionally requires its Google Cloud project ID. Standard Express keys support Gemini only. |
| `void-ai` | `void-ai` | Void AI | API key, aggregator | [link](https://voidai.app) | The public model catalog marks some models with a free plan requirement, but access is conditional and no numeric quota is confirmed. |
| `volcengine` | `volcengine` | Volcengine | API key | [link](https://www.volcengine.com) | β |
| `volcengine-agent-plan` | `veap` | Volcengine Ark Agent Plan | API key | [link](https://console.volcengine.com/ark/region:cn-beijing/subscription/agent-plan) | Connect your Volcano Engine account or use an Ark Agent Plan subscription API key. |
@@ -356,6 +356,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `xai` | `xai` | xAI (Grok) | API key | [link](https://x.ai) | Use an official xAI API key, or sign in with xAI OAuth. Grok Build JWT sessions remain a separate provider. |
| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API key | [link](https://mimo.mi.com) | β |
| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API key | [link](https://mimo.mi.com) | β |
+| `xkiro` | `xkiro` | xKiro | API key, aggregator | [link](https://xkiro.com) | Create a free account at xkiro.com and paste the key here (Bearer; x-api-key also accepted). |
| `yi` | `yi` | Yi (01.AI) | API key | [link](https://01.ai) | Get API key at platform.lingyiwanwu.com |
| `yolo-auto` | `yolo-auto` | Yolo-Auto | API key, aggregator | [link](https://yolo-auto.com) | Free API access is request-limited and intended for testing; no numeric daily quota is published and free access is not promised indefinitely. |
| `zai` | `zai` | Z.AI | API key | [link](https://open.bigmodel.cn) | β |
diff --git a/docs/screenshots/free-tier-budget-card.svg b/docs/screenshots/free-tier-budget-card.svg
index 5c47cdf7ac..b1613abef0 100644
--- a/docs/screenshots/free-tier-budget-card.svg
+++ b/docs/screenshots/free-tier-budget-card.svg
@@ -3,36 +3,37 @@
OmniRoute Β· /dashboard/free-tiers Β· preview mockup
Monthly free-token budget
-21 free pools Β· 452 models Β· one endpoint
+22 free pools Β· 482 models Β· one endpoint
Steady / month
-~1.47B
+~1.62B
First month (+ signup credits)
-~2.07B
+~2.22B
ToS-flagged (you decide)
13 providers
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Each segment = one free pool Β· widths floored so every provider shows Β· honest numbers in the grid.
@@ -42,41 +43,43 @@
GPT-4o mini 150M
-Llama 3.3 70B 30M
+Qwen3 VL Plus 150M
-Grok-3 24M
+Llama 3.3 70B 30M
-GPT-4o 7M
+Grok-3 24M
-GPT-OSS 120B 6M
+GPT-4o 7M
-GPT-OSS 20B 6M
+GPT-OSS 120B 6M
-GPT-OSS Safeguard 20B 6M
+GPT-OSS 20B 6M
-Qwen3.6 27B 6M
+GPT-OSS Safeguard 20B 6M
-Qwen3.8 27B 6M
+Qwen3.6 27B 6M
-MiniMax-M2.7 6M
+Qwen3.8 27B 6M
-Arcee Trinity Large Prev 5M
+MiniMax-M2.7 6M
-NavyAI free pool 5M
+Arcee Trinity Large Prev 5M
-Auto Free 4M
+NavyAI free pool 5M
-Auto 1M
+Auto Free 4M
-Command A Reasoning 800K
+Auto 1M
-ERNIE 4.5 VL 424B A47B B 500K
+Command A Reasoning 800K
-morph-v3-large 400K
+ERNIE 4.5 VL 424B A47B B 500K
-Llama 3.1 8B 200K
+morph-v3-large 400K
-Claude Sonnet 4.5 25K
+Llama 3.1 8B 200K
+
+Claude Sonnet 4.5 25K
+ First month: one-time signup credits (~601M)
@@ -99,6 +102,6 @@
hyperbolic 5M
Pool-deduped, honest counting β no inflated rate-limit ceilings. Some terms suggest personal-use only; we flag them so you decide.
-+ 16 permanently-free, no-cap providers (e.g. agnes, agnes-cn, ainative) Β· OpenRouter $10 β +24M/mo.
++ 15 permanently-free, no-cap providers (e.g. agnes, ainative, aion) Β· OpenRouter $10 β +24M/mo.
+ ~6M behind regional identity verification (modelscope) β real quota, never in the headline.
diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts
index 4ef102a79b..11b797484c 100644
--- a/open-sse/config/freeModelCatalog.data.ts
+++ b/open-sse/config/freeModelCatalog.data.ts
@@ -516,4 +516,52 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [
{ provider: "nara", modelId: "mistral-medium-3-5", displayName: "Mistral Medium 3.5", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" },
{ provider: "nara", modelId: "qwen3.8-27b", displayName: "Qwen3.8 27B", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" },
{ provider: "nara", modelId: "stepfun-3.7-flash", displayName: "StepFun 3.7 Flash", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" },
+ // evidence: public-page https://xkiro.com/ (2026-09-02) β Free plan: "$0 / month Β· Free forever Β· Free tokens
+ // 5M / day Β· Access to 40+ free models Β· No credit card"; https://docs.xkiro.com/models/tiers/ β "free β any
+ // account β Callable on every plan, including the free one, within a daily token allowance". One allowance per
+ // account β single pool: 5M Γ 30 = 150M. Rows = the 40 `access_tier: "free"` models on the public
+ // GET https://api.xkiro.com/v1/models minus openai/gpt-5.3-codex-spark (undeclared provenance).
+ // hardStopGuaranteed: https://docs.xkiro.com/api/rate-limits/ β "Past it, free-model requests are blocked with a
+ // 429 until the daily reset" + "No credit card" (page header) / "no card required" (Free plan card).
+ // tos: caution β ToS (2026-07-30) forbids reselling the service and violating the upstream providers' terms;
+ // personal proxy use is not addressed.
+ { provider: "xkiro", modelId: "qwen/qwen3-vl-plus:free", displayName: "Qwen3 VL Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "sensenova/sensenova-6.8-flash-lite", displayName: "SenseNova 6.8 Flash-Lite (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.7:free", displayName: "MiniMax M2.7 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.7-highspeed:free", displayName: "MiniMax M2.7 Highspeed (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.5:free", displayName: "MiniMax M2.5 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m3:free", displayName: "MiniMax M3 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.1-highspeed:free", displayName: "MiniMax M2.1 Highspeed (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.5-highspeed:free", displayName: "MiniMax M2.5 Highspeed (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2.1:free", displayName: "MiniMax M2.1 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "minimax/minimax-m2:free", displayName: "MiniMax M2 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.5-flash:free", displayName: "Qwen3.5 Flash (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.6-plus:free", displayName: "Qwen3.6 Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.5-397b-a17b:free", displayName: "Qwen3.5 397B A17B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.5-omni-flash:free", displayName: "Qwen3.5 Omni Flash (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/mistral-large-2512", displayName: "Mistral Large 3 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/mistral-medium-3.5", displayName: "Mistral Medium 3.5 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/mistral-small-2603", displayName: "Mistral Small 4 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/codestral-2508", displayName: "Codestral (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/devstral-medium", displayName: "Devstral 2 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/ministral-8b", displayName: "Ministral 3 8B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/ministral-3b", displayName: "Ministral 3 3B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "deepseek/deepseek-v4-pro", displayName: "DeepSeek V4 Pro (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "deepseek/deepseek-v3.2", displayName: "DeepSeek V3.2 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "deepseek/deepseek-chat-v3.1", displayName: "DeepSeek V3.1 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.7-plus:free", displayName: "Qwen3.7 Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "mistralai/ministral-14b", displayName: "Ministral 3 14B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.6-max-preview:free", displayName: "Qwen3.6 Max Preview (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.5-plus:free", displayName: "Qwen3.5 Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.5-omni-plus:free", displayName: "Qwen3.5 Omni Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "deepseek/deepseek-v4-flash", displayName: "DeepSeek V4 Flash (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "sensenova/sensenova-6.7-flash-lite", displayName: "SenseNova 6.7 Flash-Lite (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.8-max:free", displayName: "Qwen3.8 Max (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.7-max:free", displayName: "Qwen3.7 Max (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.6-27b:free", displayName: "Qwen3.6 27B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3.6-35b-a3b:free", displayName: "Qwen3.6 35B A3B (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3-max:free", displayName: "Qwen3 Max (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3-coder-plus:free", displayName: "Qwen3 Coder Plus (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen-plus-2025-07-28:free", displayName: "Qwen Plus 0728 (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
+ { provider: "xkiro", modelId: "qwen/qwen3-omni-flash:free", displayName: "Qwen3 Omni Flash (xKiro)", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "xkiro-free", tos: "caution", hardStopGuaranteed: true },
];
diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts
index 83e6554cae..91df75b5c5 100644
--- a/open-sse/config/providers/index.ts
+++ b/open-sse/config/providers/index.ts
@@ -231,6 +231,7 @@ import { x5labProvider } from "./registry/x5lab/index.ts";
import { kenariProvider } from "./registry/kenari/index.ts";
import { navyProvider } from "./registry/navy/index.ts";
import { naraProvider } from "./registry/nara/index.ts";
+import { xkiroProvider } from "./registry/xkiro/index.ts";
import { opperProvider } from "./registry/opper/index.ts";
import { requestyProvider } from "./registry/requesty/index.ts";
import { sealionProvider } from "./registry/sealion/index.ts";
@@ -508,6 +509,7 @@ export const REGISTRY: Record = {
kenari: kenariProvider,
navy: navyProvider,
nara: naraProvider,
+ xkiro: xkiroProvider,
opper: opperProvider,
requesty: requestyProvider,
sealion: sealionProvider,
diff --git a/open-sse/config/providers/registry/xkiro/index.ts b/open-sse/config/providers/registry/xkiro/index.ts
new file mode 100644
index 0000000000..4e76ae2ba9
--- /dev/null
+++ b/open-sse/config/providers/registry/xkiro/index.ts
@@ -0,0 +1,271 @@
+import type { RegistryEntry } from "../../shared.ts";
+import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts";
+
+/**
+ * xKiro β OpenAI-compatible gateway (xkiro.com). Free plan: 5M tokens/day per
+ * account across the models tagged `access_tier: "free"` on the public
+ * `GET https://api.xkiro.com/v1/models` (2026-09-02: 40 rows; context lengths and
+ * capabilities below come from that endpoint). `openai/gpt-5.3-codex-spark` is
+ * listed free upstream but its provenance is undeclared, so it is not pinned.
+ * Bearer auth; `GET /v1/usage` answers 401 without a valid key.
+ */
+export const xkiroProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({
+ id: "xkiro",
+ baseUrl: "https://api.xkiro.com/v1/chat/completions",
+ models: [
+ {
+ id: "qwen/qwen3-vl-plus:free",
+ name: "Qwen3 VL Plus",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "sensenova/sensenova-6.8-flash-lite",
+ name: "SenseNova 6.8 Flash-Lite",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "minimax/minimax-m2.7:free",
+ name: "MiniMax M2.7",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ {
+ id: "minimax/minimax-m2.7-highspeed:free",
+ name: "MiniMax M2.7 Highspeed",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ {
+ id: "minimax/minimax-m2.5:free",
+ name: "MiniMax M2.5",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ {
+ id: "minimax/minimax-m3:free",
+ name: "MiniMax M3",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "minimax/minimax-m2.1-highspeed:free",
+ name: "MiniMax M2.1 Highspeed",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ {
+ id: "minimax/minimax-m2.5-highspeed:free",
+ name: "MiniMax M2.5 Highspeed",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ {
+ id: "minimax/minimax-m2.1:free",
+ name: "MiniMax M2.1",
+ contextLength: 204800,
+ toolCalling: true,
+ },
+ { id: "minimax/minimax-m2:free", name: "MiniMax M2", contextLength: 204800, toolCalling: true },
+ {
+ id: "qwen/qwen3.5-flash:free",
+ name: "Qwen3.5 Flash",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.6-plus:free",
+ name: "Qwen3.6 Plus",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.5-397b-a17b:free",
+ name: "Qwen3.5 397B A17B",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.5-omni-flash:free",
+ name: "Qwen3.5 Omni Flash",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "mistralai/mistral-large-2512",
+ name: "Mistral Large 3",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsVision: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "mistralai/mistral-medium-3.5",
+ name: "Mistral Medium 3.5",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "mistralai/mistral-small-2603",
+ name: "Mistral Small 4",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "mistralai/codestral-2508",
+ name: "Codestral",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "mistralai/devstral-medium",
+ name: "Devstral 2",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "mistralai/ministral-8b",
+ name: "Ministral 3 8B",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsVision: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "mistralai/ministral-3b",
+ name: "Ministral 3 3B",
+ contextLength: 128000,
+ toolCalling: true,
+ supportsVision: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "deepseek/deepseek-v4-pro",
+ name: "DeepSeek V4 Pro",
+ contextLength: 1048576,
+ toolCalling: true,
+ },
+ {
+ id: "deepseek/deepseek-v3.2",
+ name: "DeepSeek V3.2",
+ contextLength: 131072,
+ toolCalling: true,
+ },
+ {
+ id: "deepseek/deepseek-chat-v3.1",
+ name: "DeepSeek V3.1",
+ contextLength: 163840,
+ toolCalling: true,
+ },
+ {
+ id: "qwen/qwen3.7-plus:free",
+ name: "Qwen3.7 Plus",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "mistralai/ministral-14b",
+ name: "Ministral 3 14B",
+ contextLength: 256000,
+ toolCalling: true,
+ supportsVision: true,
+ supportsReasoning: false,
+ },
+ {
+ id: "qwen/qwen3.6-max-preview:free",
+ name: "Qwen3.6 Max Preview",
+ contextLength: 262144,
+ toolCalling: true,
+ },
+ {
+ id: "qwen/qwen3.5-plus:free",
+ name: "Qwen3.5 Plus",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.5-omni-plus:free",
+ name: "Qwen3.5 Omni Plus",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "deepseek/deepseek-v4-flash",
+ name: "DeepSeek V4 Flash",
+ contextLength: 1048576,
+ toolCalling: true,
+ },
+ {
+ id: "sensenova/sensenova-6.7-flash-lite",
+ name: "SenseNova 6.7 Flash-Lite",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.8-max:free",
+ name: "Qwen3.8 Max",
+ contextLength: 1000000,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ { id: "qwen/qwen3.7-max:free", name: "Qwen3.7 Max", contextLength: 1000000, toolCalling: true },
+ {
+ id: "qwen/qwen3.6-27b:free",
+ name: "Qwen3.6 27B",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3.6-35b-a3b:free",
+ name: "Qwen3.6 35B A3B",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3-max:free",
+ name: "Qwen3 Max",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3-coder-plus:free",
+ name: "Qwen3 Coder Plus",
+ contextLength: 1048576,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen-plus-2025-07-28:free",
+ name: "Qwen Plus 0728",
+ contextLength: 131072,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ {
+ id: "qwen/qwen3-omni-flash:free",
+ name: "Qwen3 Omni Flash",
+ contextLength: 262144,
+ toolCalling: true,
+ supportsVision: true,
+ },
+ ],
+});
diff --git a/package.json b/package.json
index 171510f990..8ac5cef97c 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "omniroute",
"version": "3.8.51",
- "description": "Unified AI router with 358 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.",
+ "description": "Unified AI router with 359 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.",
"type": "module",
"bin": {
"omniroute": "bin/omniroute.mjs",
diff --git a/public/images/tier-flow-dark.svg b/public/images/tier-flow-dark.svg
index b8016c15c5..1aede4f7a8 100644
--- a/public/images/tier-flow-dark.svg
+++ b/public/images/tier-flow-dark.svg
@@ -1,6 +1,6 @@
-
+
OmniRoute 4-tier fallback
- OmniRoute 4-tier fallback: your IDE or CLI calls one local endpoint and the OmniRoute Smart Router fails over across 358 providers in 4 tiers β Tier 1 Subscription, Tier 2 API, Tier 3 Cheap, Tier 4 Free.
+ OmniRoute 4-tier fallback: your IDE or CLI calls one local endpoint and the OmniRoute Smart Router fails over across 359 providers in 4 tiers β Tier 1 Subscription, Tier 2 API, Tier 3 Cheap, Tier 4 Free.
@@ -15,7 +15,7 @@
OmniRoute 4-tier fallback
- Never stop building β automatic zero-config failover across 358 providers
+ Never stop building β automatic zero-config failover across 359 providers
diff --git a/public/images/tier-flow-light.svg b/public/images/tier-flow-light.svg
index 2cff72d93d..6425db4f56 100644
--- a/public/images/tier-flow-light.svg
+++ b/public/images/tier-flow-light.svg
@@ -1,6 +1,6 @@
-
+
OmniRoute 4-tier fallback
- OmniRoute 4-tier fallback: your IDE or CLI calls one local endpoint and the OmniRoute Smart Router fails over across 358 providers in 4 tiers β Tier 1 Subscription, Tier 2 API, Tier 3 Cheap, Tier 4 Free.
+ OmniRoute 4-tier fallback: your IDE or CLI calls one local endpoint and the OmniRoute Smart Router fails over across 359 providers in 4 tiers β Tier 1 Subscription, Tier 2 API, Tier 3 Cheap, Tier 4 Free.
@@ -15,7 +15,7 @@
OmniRoute 4-tier fallback
- Never stop building β automatic zero-config failover across 358 providers
+ Never stop building β automatic zero-config failover across 359 providers
diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts
index 390675ec10..654b2baac9 100644
--- a/src/shared/constants/providers.ts
+++ b/src/shared/constants/providers.ts
@@ -102,6 +102,7 @@ export const AGGREGATOR_PROVIDER_IDS = new Set([
"laozhang",
"vercel-ai-gateway",
"unorouter",
+ "xkiro",
"agentrouter",
"thebai",
"fenayai",
diff --git a/src/shared/constants/providers/apikey/gateways.ts b/src/shared/constants/providers/apikey/gateways.ts
index c35390a37d..5dbaf9c9d2 100644
--- a/src/shared/constants/providers/apikey/gateways.ts
+++ b/src/shared/constants/providers/apikey/gateways.ts
@@ -1376,6 +1376,24 @@ export const APIKEY_PROVIDERS_GATEWAYS = {
apiHint:
"OpenAI-compatible endpoint at https://router.bynara.id/v1. Free-tier models are pinned; others need credit.",
},
+ xkiro: {
+ id: "xkiro",
+ serviceKinds: ["llm"],
+ alias: "xkiro",
+ name: "xKiro",
+ icon: "hub",
+ color: "#0EA5E9",
+ textIcon: "XK",
+ passthroughModels: true,
+ website: "https://xkiro.com",
+ hasFree: true,
+ freeNote:
+ "Free plan: 5M tokens/day per account across 40 upstream free models β 39 pinned here (Qwen, MiniMax, DeepSeek, Mistral, SenseNova) β no card; past the daily allowance free requests get a 429 until the reset. RPM not published.",
+ authHint:
+ "Create a free account at xkiro.com and paste the key here (Bearer; x-api-key also accepted).",
+ apiHint:
+ "OpenAI-compatible endpoint at https://api.xkiro.com/v1. Public /v1/models tags free rows with access_tier=free; paid models are rejected on the free plan.",
+ },
regolo: {
id: "regolo",
serviceKinds: ["llm"],
diff --git a/tests/unit/check-docs-counts-sync.test.ts b/tests/unit/check-docs-counts-sync.test.ts
index a01ff43d4f..a2c4f10b69 100644
--- a/tests/unit/check-docs-counts-sync.test.ts
+++ b/tests/unit/check-docs-counts-sync.test.ts
@@ -557,9 +557,23 @@ test("a reworded or deleted sentence fails, instead of passing as absent", () =>
test("the live page actually satisfies both required gates", () => {
// A unit test on synthetic strings proves the validator; this one proves the
// document. Without it, the two could drift apart and both stay green.
+ // The expected counts come from the catalog itself rather than a literal: the
+ // page tracks the live flags, so a hard-coded number goes stale the moment a
+ // batch of rows lands (it did, at 5, when the 39 xKiro rows were added).
+ const catalog = readFileSync(
+ path.resolve(here, "../../open-sse/config/freeModelCatalog.data.ts"),
+ "utf8"
+ );
+ const countFlag = (flag: string): number =>
+ catalog.split("\n").filter((l) => l.includes(`${flag}: true`)).length;
+ const hardStop = countFlag("hardStopGuaranteed");
+ const training = countFlag("trainsOnPrompts");
+ assert.ok(hardStop > 0, "catalog should carry at least one hardStopGuaranteed row");
+ assert.ok(training > 0, "catalog should carry at least one trainsOnPrompts row");
+
const page = readFileSync(path.resolve(here, "../../docs/reference/FREE_TIERS.md"), "utf8");
- assert.equal(makeValidator(5, { ...HARD_STOP_CLAIM, requireClaim: true })(page).ok, true);
- assert.equal(makeValidator(13, { ...TRAINING_CLAIM, requireClaim: true })(page).ok, true);
+ assert.equal(makeValidator(hardStop, { ...HARD_STOP_CLAIM, requireClaim: true })(page).ok, true);
+ assert.equal(makeValidator(training, { ...TRAINING_CLAIM, requireClaim: true })(page).ok, true);
});
test("neither claim fires on the other numbers the page is full of", () => {
diff --git a/tests/unit/free-provider-xkiro.test.ts b/tests/unit/free-provider-xkiro.test.ts
new file mode 100644
index 0000000000..4a327991e7
--- /dev/null
+++ b/tests/unit/free-provider-xkiro.test.ts
@@ -0,0 +1,54 @@
+import assert from "node:assert/strict";
+import test from "node:test";
+
+import {
+ FREE_MODEL_BUDGETS,
+ computeFreeModelTotals,
+} from "@omniroute/open-sse/config/freeModelCatalog.ts";
+import { REGISTRY } from "@omniroute/open-sse/config/providerRegistry.ts";
+import { AI_PROVIDERS, AGGREGATOR_PROVIDER_IDS } from "@/shared/constants/providers.ts";
+
+/**
+ * xKiro (xkiro.com) β OpenAI-compatible gateway. Free plan, verified 2026-09-02 on
+ * xkiro.com and docs.xkiro.com: "$0 / month Β· Free forever Β· Free tokens 5M / day Β·
+ * No credit card"; past the daily allowance free-model requests get a 429 until the
+ * reset. One bucket per account β one pool of 5M Γ 30 = 150M.
+ */
+const rows = FREE_MODEL_BUDGETS.filter((m) => m.provider === "xkiro");
+
+test("xkiro is routable, canonical and classified as an aggregator", () => {
+ assert.ok(REGISTRY.xkiro, "REGISTRY entry");
+ assert.equal(REGISTRY.xkiro.format, "openai");
+ assert.equal(REGISTRY.xkiro.baseUrl, "https://api.xkiro.com/v1/chat/completions");
+ assert.ok(AI_PROVIDERS.xkiro, "canonical provider");
+ assert.equal(AI_PROVIDERS.xkiro.hasFree, true);
+ assert.ok(AGGREGATOR_PROVIDER_IDS.has("xkiro"));
+});
+
+test("xkiro free plan is one 5M/day account-wide pool = 150M/month, counted once", () => {
+ assert.equal(rows.length, 39);
+ for (const m of rows) {
+ assert.equal(m.poolKey, "xkiro-free", m.modelId);
+ assert.equal(m.monthlyTokens, 150_000_000, m.modelId);
+ assert.equal(m.freeType, "recurring-daily", m.modelId);
+ assert.equal(m.tos, "caution", m.modelId);
+ assert.equal(m.hardStopGuaranteed, true, m.modelId);
+ assert.equal((m as { eligibilityGate?: unknown }).eligibilityGate, undefined, m.modelId);
+ }
+ const withXkiro = computeFreeModelTotals().steadyRecurringTokens;
+ const without = computeFreeModelTotals({
+ entries: FREE_MODEL_BUDGETS.filter((m) => m.provider !== "xkiro"),
+ }).steadyRecurringTokens;
+ assert.equal(withXkiro - without, 150_000_000);
+});
+
+test("xkiro never lists the undeclared-provenance codex-spark route", () => {
+ assert.ok(!rows.some((m) => /codex-spark/i.test(m.modelId)));
+ assert.ok(!REGISTRY.xkiro.models.some((m) => /codex-spark/i.test(m.id)));
+});
+
+test("every xkiro catalog row is a pinned registry model", () => {
+ assert.equal(REGISTRY.xkiro.models.length, rows.length);
+ const pinned = new Set(REGISTRY.xkiro.models.map((m) => m.id));
+ for (const r of rows) assert.ok(pinned.has(r.modelId), r.modelId);
+});
diff --git a/tests/unit/provider-node-reserved-prefix.test.ts b/tests/unit/provider-node-reserved-prefix.test.ts
index e6f3f63225..8d46bb60aa 100644
--- a/tests/unit/provider-node-reserved-prefix.test.ts
+++ b/tests/unit/provider-node-reserved-prefix.test.ts
@@ -187,7 +187,9 @@ test("shared set size includes live REGISTRY and retired Designer + Felo + Qwen
// model ids. Same entry that moved the apikey/regional count to 241 in #13905.
// #13131 then retires `chipotle`/`pepper` (dead upstream), removing its id "chipotle" and
// alias "pepper" from the REGISTRY walk (414 -> 412) β the two land back on the same total.
- assert.equal(RESERVED_PREFIX_COUNT, 412);
+ // #12648 registers xKiro: id "xkiro" with no separate alias β a single REGISTRY
+ // member (412 -> 413).
+ assert.equal(RESERVED_PREFIX_COUNT, 413);
});
test("isReservedProviderPrefix rejects non-string input", () => {