diff --git a/AGENTS.md b/AGENTS.md
index 9cfcf5aea6..3dbde5ae31 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -46,7 +46,7 @@ Repository map and Reference Documentation sections below.
## Project at a Glance
-**OmniRoute** β unified AI proxy/router. One endpoint, 341 LLM providers, auto-fallback.
+**OmniRoute** β unified AI proxy/router. One endpoint, 340 LLM providers, auto-fallback.
| Layer | Location | Purpose |
| ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
diff --git a/README.md b/README.md
index 6211c39ed5..fae2dce697 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
# π OmniRoute β The Free AI Gateway
-
+
@@ -63,7 +63,7 @@
| | v3.8.49 | **v3.8.50** | `v3.8.51+` |
| ------------------------- | :-----: | :---------: | :---------: |
-| π Providers | 290 | **341** | more queued |
+| π Providers | 290 | **340** | more queued |
| π§ Documented models | 1185 | **1202** | β |
| πΌοΈ Modality Bridge | β | π vision | video |
| π‘ Radar free catalog | β | π opt-in | β |
@@ -101,7 +101,7 @@
βοΈ Features
π― Combos
- π Providers
+ π Providers
π CLI & MCP
@@ -210,7 +210,7 @@ curl http://localhost:20128/v1/chat/completions \
-
+
@@ -461,7 +461,7 @@ All **19** strategies β mix & match per combo step:
-
+
π Full methodology & per-feature detail vs 9router, OpenRouter, CLIProxyAPI & LiteLLM β [`docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md`](docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md)
@@ -559,7 +559,7 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute
- **πΌοΈ New endpoints** β `/v1/ocr` (Mistral OCR) and `/v1/audio/translations` (Whisper-style) round out the media surface. β [API Reference](docs/reference/API_REFERENCE.md)
- **π¨ Image / video / audio generation** β one API for media: xAI Grok Imagine & Novita AI video, ComfyUI, Freepik, Adobe Firefly, Microsoft Designer, Google Imagen, Segmind, EdgeTTS. β [API Reference](docs/reference/API_REFERENCE.md)
- **π Deployment & ops** β reverse-proxy `basePath`, browser-language auto-detect, per-key device tracking, root-less MITM trust, zh-TW localization. β [Environment](docs/reference/ENVIRONMENT.md)
-- **π€ More providers & agents** β Cursor Cloud Agent, Grok Build (xAI) with browser + OAuth login, Ollama first-class card, Claude Opus 5 & Sonnet 5, Kimi official partnership (Code/Web/Moonshot), Zed, Requesty, SenseNova, Yuanbao, Agnes AIβ¦ and a refreshed **341-provider catalog**. β [Providers](docs/reference/PROVIDER_REFERENCE.md)
+- **π€ More providers & agents** β Cursor Cloud Agent, Grok Build (xAI) with browser + OAuth login, Ollama first-class card, Claude Opus 5 & Sonnet 5, Kimi official partnership (Code/Web/Moonshot), Zed, Requesty, SenseNova, Yuanbao, Agnes AIβ¦ and a refreshed **340-provider catalog**. β [Providers](docs/reference/PROVIDER_REFERENCE.md)
- **π‘ Routing transparency** β every response carries an `X-OmniRoute-Decision` header naming the strategy/provider/latency that served it, a new `cache-optimized` combo strategy + Auto-Combo `cacheAffinity` factor route repeat requests back to the connection holding the cached prefix, and a read-only `/v1/auto-combo/{channel}/candidates` endpoint exposes an `auto/*` channel's live candidate pool. β [Auto-Combo](docs/routing/AUTO-COMBO.md)
- **β‘ Local performance & infra** β one-click local Redis, Cloudflare Workers / Deno Deploy relay deployers, Bifrost & Mux as supervised embedded services. β [Embedded Services](docs/frameworks/EMBEDDED-SERVICES.md)
@@ -620,11 +620,11 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute
-## π 341 AI Providers β 90+ Free
+## π 340 AI Providers β 90+ Free
-> The most complete catalog of any open-source router: **341 providers**, **90+ with a free tier**, **56 free forever**.
+> The most complete catalog of any open-source router: **340 providers**, **90+ with a free tier**, **56 free forever**.
diff --git a/config/quality/eslint-suppressions.json b/config/quality/eslint-suppressions.json
index 25a55d63d0..66b9ef93ec 100644
--- a/config/quality/eslint-suppressions.json
+++ b/config/quality/eslint-suppressions.json
@@ -1491,11 +1491,6 @@
"count": 1
}
},
- "tests/integration/mimocode-proxy.integration.test.ts": {
- "@typescript-eslint/no-explicit-any": {
- "count": 13
- }
- },
"tests/integration/obsidian-plugin-e2e.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 12
@@ -2559,11 +2554,6 @@
"count": 2
}
},
- "tests/unit/mimocode-executor.test.ts": {
- "@typescript-eslint/no-explicit-any": {
- "count": 58
- }
- },
"tests/unit/minimax-tts-1043.test.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 6
diff --git a/docs/diagrams/cli-terminal.svg b/docs/diagrams/cli-terminal.svg
index 99bc29b327..7de5802465 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.
diff --git a/docs/diagrams/comparison-table.svg b/docs/diagrams/comparison-table.svg
index 80b3cbcdb2..053acf8e98 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.
diff --git a/docs/diagrams/promise-pillars.svg b/docs/diagrams/promise-pillars.svg
index a25437f78c..7330e4930b 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. 341 providers. Never stop building β OmniRoute picks the cheapest one that works .
+ One endpoint. 340 providers. Never stop building β OmniRoute picks the cheapest one that works .
@@ -38,7 +38,7 @@
Never hit limits
- Auto-fallback across 341 providers in
+ Auto-fallback across 340 providers in
milliseconds. Quota out? The next provider
takes over β zero downtime.
diff --git a/docs/diagrams/readme-hero.svg b/docs/diagrams/readme-hero.svg
index 0182df44a2..037a32c9ae 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 β 341 providers β 90+ free β through one endpoint.
+ Every AI tool β 340 providers β 90+ free β through one endpoint.
Claude Code Β· Codex Β· Cursor Β· Cline Β· Copilot Β· Antigravity β FREE Claude / GPT / Gemini Β· auto-fallback
diff --git a/docs/i18n/ar/llm.txt b/docs/i18n/ar/llm.txt
index 513109bd93..286d23b64a 100644
--- a/docs/i18n/ar/llm.txt
+++ b/docs/i18n/ar/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/az/llm.txt b/docs/i18n/az/llm.txt
index 132a2b95d3..61ca9231c6 100644
--- a/docs/i18n/az/llm.txt
+++ b/docs/i18n/az/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/bg/llm.txt b/docs/i18n/bg/llm.txt
index 132a2b95d3..61ca9231c6 100644
--- a/docs/i18n/bg/llm.txt
+++ b/docs/i18n/bg/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/bn/llm.txt b/docs/i18n/bn/llm.txt
index 32a28989d3..52e41ce7a0 100644
--- a/docs/i18n/bn/llm.txt
+++ b/docs/i18n/bn/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/cs/llm.txt b/docs/i18n/cs/llm.txt
index cfed4729a2..c778017118 100644
--- a/docs/i18n/cs/llm.txt
+++ b/docs/i18n/cs/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/da/llm.txt b/docs/i18n/da/llm.txt
index 96d4df3ba5..365ef5b569 100644
--- a/docs/i18n/da/llm.txt
+++ b/docs/i18n/da/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/de/llm.txt b/docs/i18n/de/llm.txt
index 5d6d5b4bda..7d8b3318af 100644
--- a/docs/i18n/de/llm.txt
+++ b/docs/i18n/de/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/es/llm.txt b/docs/i18n/es/llm.txt
index 5d62efc3c4..c6c71284c4 100644
--- a/docs/i18n/es/llm.txt
+++ b/docs/i18n/es/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/fa/llm.txt b/docs/i18n/fa/llm.txt
index ff28036917..ce4ae52b9b 100644
--- a/docs/i18n/fa/llm.txt
+++ b/docs/i18n/fa/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/fi/llm.txt b/docs/i18n/fi/llm.txt
index 4eff7ebfb1..51e034e14e 100644
--- a/docs/i18n/fi/llm.txt
+++ b/docs/i18n/fi/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/fr/llm.txt b/docs/i18n/fr/llm.txt
index 9e7aa6153a..35c464ae00 100644
--- a/docs/i18n/fr/llm.txt
+++ b/docs/i18n/fr/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/gu/llm.txt b/docs/i18n/gu/llm.txt
index 622ff00a3c..4e7d002ea9 100644
--- a/docs/i18n/gu/llm.txt
+++ b/docs/i18n/gu/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/he/llm.txt b/docs/i18n/he/llm.txt
index 742336415c..0d66d97a18 100644
--- a/docs/i18n/he/llm.txt
+++ b/docs/i18n/he/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/hi/llm.txt b/docs/i18n/hi/llm.txt
index 55089a6fe2..6b40b9ec19 100644
--- a/docs/i18n/hi/llm.txt
+++ b/docs/i18n/hi/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/hu/llm.txt b/docs/i18n/hu/llm.txt
index 564ab17955..a60382620f 100644
--- a/docs/i18n/hu/llm.txt
+++ b/docs/i18n/hu/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/id/llm.txt b/docs/i18n/id/llm.txt
index a831cb94c7..ce814c816a 100644
--- a/docs/i18n/id/llm.txt
+++ b/docs/i18n/id/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/in/llm.txt b/docs/i18n/in/llm.txt
index b1e99658c6..23d11b96e8 100644
--- a/docs/i18n/in/llm.txt
+++ b/docs/i18n/in/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/it/llm.txt b/docs/i18n/it/llm.txt
index 4c8c0fa488..a28c6138a9 100644
--- a/docs/i18n/it/llm.txt
+++ b/docs/i18n/it/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ja/llm.txt b/docs/i18n/ja/llm.txt
index 2957bb5d24..8972dca49c 100644
--- a/docs/i18n/ja/llm.txt
+++ b/docs/i18n/ja/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ko/llm.txt b/docs/i18n/ko/llm.txt
index 676027c459..c029933a1a 100644
--- a/docs/i18n/ko/llm.txt
+++ b/docs/i18n/ko/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/mr/llm.txt b/docs/i18n/mr/llm.txt
index 712ca57532..e9939aea5c 100644
--- a/docs/i18n/mr/llm.txt
+++ b/docs/i18n/mr/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ms/llm.txt b/docs/i18n/ms/llm.txt
index b8f8377d5d..1a4b1c9305 100644
--- a/docs/i18n/ms/llm.txt
+++ b/docs/i18n/ms/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/nl/llm.txt b/docs/i18n/nl/llm.txt
index 273b8f660a..d501c634fc 100644
--- a/docs/i18n/nl/llm.txt
+++ b/docs/i18n/nl/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/no/llm.txt b/docs/i18n/no/llm.txt
index f4088e4669..6493ece498 100644
--- a/docs/i18n/no/llm.txt
+++ b/docs/i18n/no/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/phi/llm.txt b/docs/i18n/phi/llm.txt
index 813576b497..bd94e20531 100644
--- a/docs/i18n/phi/llm.txt
+++ b/docs/i18n/phi/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/pl/llm.txt b/docs/i18n/pl/llm.txt
index 2857c53344..3b89cc943a 100644
--- a/docs/i18n/pl/llm.txt
+++ b/docs/i18n/pl/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/pt-BR/llm.txt b/docs/i18n/pt-BR/llm.txt
index a8a17c62c0..a9bc6922f7 100644
--- a/docs/i18n/pt-BR/llm.txt
+++ b/docs/i18n/pt-BR/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/pt/llm.txt b/docs/i18n/pt/llm.txt
index f20a66a34d..1672bcc004 100644
--- a/docs/i18n/pt/llm.txt
+++ b/docs/i18n/pt/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ro/llm.txt b/docs/i18n/ro/llm.txt
index 2687e58613..3a607cc7be 100644
--- a/docs/i18n/ro/llm.txt
+++ b/docs/i18n/ro/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ru/llm.txt b/docs/i18n/ru/llm.txt
index d73b026d0d..8a70dce5aa 100644
--- a/docs/i18n/ru/llm.txt
+++ b/docs/i18n/ru/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/sk/llm.txt b/docs/i18n/sk/llm.txt
index 93296c2dd9..05325980f2 100644
--- a/docs/i18n/sk/llm.txt
+++ b/docs/i18n/sk/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/sv/llm.txt b/docs/i18n/sv/llm.txt
index b595357f03..c6fbbdad6f 100644
--- a/docs/i18n/sv/llm.txt
+++ b/docs/i18n/sv/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/sw/llm.txt b/docs/i18n/sw/llm.txt
index f5611b670f..c8462b98f4 100644
--- a/docs/i18n/sw/llm.txt
+++ b/docs/i18n/sw/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ta/llm.txt b/docs/i18n/ta/llm.txt
index 57b50125ca..32834eb014 100644
--- a/docs/i18n/ta/llm.txt
+++ b/docs/i18n/ta/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/te/llm.txt b/docs/i18n/te/llm.txt
index 957a06d022..6748ed97ea 100644
--- a/docs/i18n/te/llm.txt
+++ b/docs/i18n/te/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/th/llm.txt b/docs/i18n/th/llm.txt
index c6d87ee285..7558d6b1a0 100644
--- a/docs/i18n/th/llm.txt
+++ b/docs/i18n/th/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/tr/llm.txt b/docs/i18n/tr/llm.txt
index dc9ba78355..f712207d83 100644
--- a/docs/i18n/tr/llm.txt
+++ b/docs/i18n/tr/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/uk-UA/llm.txt b/docs/i18n/uk-UA/llm.txt
index 72577e12ae..290527a619 100644
--- a/docs/i18n/uk-UA/llm.txt
+++ b/docs/i18n/uk-UA/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/ur/llm.txt b/docs/i18n/ur/llm.txt
index 7683907b24..31b55c781d 100644
--- a/docs/i18n/ur/llm.txt
+++ b/docs/i18n/ur/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/vi/llm.txt b/docs/i18n/vi/llm.txt
index fe9539ff36..d51ae2c3f5 100644
--- a/docs/i18n/vi/llm.txt
+++ b/docs/i18n/vi/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/zh-CN/llm.txt b/docs/i18n/zh-CN/llm.txt
index 3a172fef87..f5a7f9b1b4 100644
--- a/docs/i18n/zh-CN/llm.txt
+++ b/docs/i18n/zh-CN/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/i18n/zh-TW/llm.txt b/docs/i18n/zh-TW/llm.txt
index 4a8da77a2b..38a276cf70 100644
--- a/docs/i18n/zh-TW/llm.txt
+++ b/docs/i18n/zh-TW/llm.txt
@@ -4,7 +4,7 @@
---
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -479,7 +479,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md
index 4fc1c6bed3..35289e4d69 100644
--- a/docs/reference/PROVIDER_REFERENCE.md
+++ b/docs/reference/PROVIDER_REFERENCE.md
@@ -1,16 +1,16 @@
---
title: "Provider Reference"
version: 3.8.50
-lastUpdated: 2026-08-16
+lastUpdated: 2026-08-18
---
# 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-08-16
+> **Last generated:** 2026-08-18
-Total providers: **341**. See category breakdown below.
+Total providers: **340**. See category breakdown below.
## Categories
@@ -34,7 +34,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
---
-## No-auth Providers (no key required) (11)
+## No-auth Providers (no key required) (10)
| ID | Alias | Name | Tags | Website | Notes | Tool calling |
|----|-------|------|------|---------|-------|--------------|
@@ -44,7 +44,6 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | No-auth | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Authentication is owned by the official Devin CLI in its isolated bridge volume. | emulated |
| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | No-auth | [link](https://duckduckgo.com/duckchat) | No credentials required β DuckDuckGo AI Chat is anonymous and free. | emulated |
| `felo-web` | `felo` | Felo | No-auth | [link](https://felo.ai) | No credentials required β Felo is a free, no-signup chat/search aggregator. | β |
-| `mimocode` | `mcode` | MiMoCode (Free) | No-auth | [link](https://mimo.mi.com) | No API key required. The executor auto-generates JWT tokens via device fingerprint bootstrap. | β |
| `opencode` | `oc` | OpenCode Free | No-auth | [link](https://opencode.ai) | No API key required β uses OpenCode's public free endpoint. | β |
| `theoldllm` | `tllm` | The Old LLM (Free) | No-auth | [link](https://theoldllm.vercel.app) | No credentials required. The executor auto-generates access tokens via an embedded Playwright browser instance. | β |
| `veoaifree-web` | `veo-free` | Veo AI Free | No-auth, video | [link](https://veoaifree.com) | No auth required. Rate limited to 6 requests/hour per IP. | β |
@@ -429,7 +428,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
- Catalog: [`src/shared/constants/providers.ts`](../../src/shared/constants/providers.ts)
- Registry (per-model details): [`open-sse/config/providerRegistry.ts`](../../open-sse/config/providerRegistry.ts)
-- Executors: [`open-sse/executors/`](../../open-sse/executors/) (104 implementations)
+- Executors: [`open-sse/executors/`](../../open-sse/executors/) (103 implementations)
- Translators: [`open-sse/translator/`](../../open-sse/translator/)
## See Also
diff --git a/llm.txt b/llm.txt
index d7afd1f044..32e43bf16a 100644
--- a/llm.txt
+++ b/llm.txt
@@ -1,6 +1,6 @@
# OmniRoute
-> 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 341 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
+> 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 340 AI providers β all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (109 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app.
## Overview
@@ -165,7 +165,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
β β βββ manager.ts # MITM proxy manager
β βββ shared/ # Shared utilities, components, and constants
β β βββ components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.)
-β β βββ constants/ # Provider definitions (341), model lists, pricing, routing strategies, MCP scopes
+β β βββ constants/ # Provider definitions (340), model lists, pricing, routing strategies, MCP scopes
β β βββ contracts/ # Shared API contracts
β β βββ hooks/ # React hooks
β β βββ middleware/ # Shared middleware utilities
@@ -277,7 +277,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo
## Key Features (v3.8.50)
### Core Proxy
-- **341 AI providers** with automatic format translation
+- **340 AI providers** with automatic format translation
- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible)
- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline
- **4-tier fallback**: Subscription β API Key β Cheap β Free
@@ -475,7 +475,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool
## v3.8.x Highlights
-- **341-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
+- **340-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add
- **19 routing strategies** β including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay`
- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown
- **MCP server expanded to 109 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules)
diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts
index 91584babc9..d38c6e6de2 100644
--- a/open-sse/config/providers/index.ts
+++ b/open-sse/config/providers/index.ts
@@ -3,7 +3,6 @@ import { unorouterProvider } from "./registry/unorouter/index.ts";
import { aimlapiProvider } from "./registry/aimlapi/index.ts";
import { byteplusProvider } from "./registry/byteplus/index.ts";
-import { mimocodeProvider } from "./registry/mimocode/index.ts";
import { ollama_cloudProvider } from "./registry/ollama-cloud/index.ts";
import { syntheticProvider } from "./registry/synthetic/index.ts";
import { ideogramProvider } from "./registry/ideogram/index.ts";
@@ -470,7 +469,6 @@ export const REGISTRY: Record = {
venice: veniceProvider,
kiro: kiroProvider,
byteplus: byteplusProvider,
- mimocode: mimocodeProvider,
wafer: waferProvider,
openadapter: openadapterProvider,
dit: ditProvider,
diff --git a/open-sse/config/providers/registry/mimocode/index.ts b/open-sse/config/providers/registry/mimocode/index.ts
deleted file mode 100644
index 39023831c9..0000000000
--- a/open-sse/config/providers/registry/mimocode/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import type { RegistryEntry } from "../../shared.ts";
-import { CHAT_OPENAI_COMPAT_MODELS } from "../../shared.ts";
-
-// Mimocode (Xiaomi MiMo free OpenAI-compatible gateway) β no-auth, custom executor.
-// Re-added after the registry modularization (#3993) dropped it; restores #3837.
-export const mimocodeProvider: RegistryEntry = {
- id: "mimocode",
- alias: "mcode",
- format: "openai",
- executor: "mimocode",
- baseUrl: "https://api.xiaomimimo.com",
- chatPath: "/api/free-ai/openai/chat",
- authType: "none",
- authHeader: "none",
- models: CHAT_OPENAI_COMPAT_MODELS["mimocode"],
-};
diff --git a/open-sse/config/providers/shared.ts b/open-sse/config/providers/shared.ts
index 5696ecf08f..994b4830b0 100644
--- a/open-sse/config/providers/shared.ts
+++ b/open-sse/config/providers/shared.ts
@@ -663,12 +663,6 @@ export const CHAT_OPENAI_COMPAT_MODELS: Record = {
"mistralai/Mistral-7B-Instruct-v0.3",
"Qwen/Qwen2.5-72B-Instruct",
]),
- // Restored after the registry modularization (#3993) dropped the mimocode key
- // referenced by the mimocode provider plugin. Source of truth: pre-#3993
- // providerRegistry.ts (commit 1ed01dd90^).
- mimocode: [
- { id: "mimo-auto", name: "MiMo Auto", contextLength: 1000000, maxOutputTokens: 128000 },
- ],
};
export function mapStainlessOs() {
diff --git a/open-sse/executors/index.ts b/open-sse/executors/index.ts
index 39c5880780..faba4f2937 100644
--- a/open-sse/executors/index.ts
+++ b/open-sse/executors/index.ts
@@ -68,7 +68,6 @@ import { MoonshotExecutor } from "./moonshot.ts";
import { TheOldLlmExecutor } from "./theoldllm.ts";
import { ChipotleExecutor } from "./chipotle.ts";
import { LMArenaExecutor } from "./lmarena.ts";
-import { MimocodeExecutor } from "./mimocode.ts";
import { GrokCliExecutor } from "./grok-cli.ts";
import { CodeBuddyCnExecutor } from "./codebuddy-cn.ts";
import { ZenmuxFreeExecutor } from "./zenmux-free.ts";
@@ -200,8 +199,6 @@ const executors = {
pepper: new ChipotleExecutor(), // Alias
lmarena: new LMArenaExecutor(),
lma: new LMArenaExecutor(), // Alias
- mimocode: new MimocodeExecutor(),
- mcode: new MimocodeExecutor(), // Alias
"grok-cli": new GrokCliExecutor(),
gc: new GrokCliExecutor(), // Alias
"codebuddy-cn": new CodeBuddyCnExecutor(),
@@ -323,7 +320,6 @@ export { HailuoWebExecutor } from "./hailuo-web.ts";
export { TheOldLlmExecutor } from "./theoldllm.ts";
export { ChipotleExecutor } from "./chipotle.ts";
export { LMArenaExecutor } from "./lmarena.ts";
-export { MimocodeExecutor } from "./mimocode.ts";
export { GrokCliExecutor } from "./grok-cli.ts";
export { CodeBuddyCnExecutor } from "./codebuddy-cn.ts";
export { ZenmuxFreeExecutor } from "./zenmux-free.ts";
diff --git a/open-sse/executors/mimocode.ts b/open-sse/executors/mimocode.ts
deleted file mode 100644
index 9ee27e0afc..0000000000
--- a/open-sse/executors/mimocode.ts
+++ /dev/null
@@ -1,711 +0,0 @@
-/**
- * MiMoCode Executor β Free-tier Xiaomi MiMo models via bootstrap JWT auth.
- *
- * Implements the auth flow from the official MiMo-Code repository:
- * https://github.com/XiaomiMiMo/MiMo-Code/blob/main/packages/opencode/src/plugin/mimo-free.ts
- *
- * 1. Generate device fingerprint from hostname + OS + arch + CPU + username
- * 2. POST /api/free-ai/bootstrap with fingerprint β JWT
- * 3. Use JWT as Bearer token for chat requests
- * 4. Custom endpoint: /api/free-ai/openai/chat (not /v1/chat/completions)
- * 5. Custom header: X-Mimo-Source: mimocode-cli-free
- *
- * Only the "mimo-auto" model is supported (1M context, 128K output).
- * Supports multiple accounts: N fingerprints β N JWTs β round-robin with cooldown.
- * On 429 β or a 400 carrying MiMoCode's rate-limit text β account enters cooldown
- * (exponential backoff) and the next account is tried. On 401/403, JWT is
- * re-bootstrapped. Any other 400 is a genuinely malformed request (#2101): it fails
- * fast on the current account instead of being retried identically on every
- * account, which would waste N round-trips, cooldown every account, and hide the
- * real upstream diagnostic behind a generic "all accounts exhausted" error (#4976).
- */
-
-import * as crypto from "node:crypto";
-import * as os from "node:os";
-import { BaseExecutor, type ExecuteInput, type ProviderCredentials } from "./base.ts";
-import { createProxyDispatcher } from "../utils/proxyDispatcher.ts";
-import { RATE_LIMIT_TEXT_PATTERNS } from "../services/accountFallback.ts";
-import { buildErrorBody, sanitizeErrorMessage } from "../utils/error.ts";
-import { fetch as undiciFetch, type Dispatcher } from "undici";
-import {
- type AccountProxyConfig as SharedAccountProxyConfig,
- type RotatableAccount,
- pickAccount as pickRotatableAccount,
- markCooldown as markAccountCooldown,
- markSuccess as markAccountSuccess,
- maskAccountId,
- isNetworkErrorRotatable,
-} from "./accountRotation.ts";
-import { isNetworkRotationSharedEgressGuardEnabled } from "@/shared/utils/featureFlags";
-
-const BOOTSTRAP_PATH = "/api/free-ai/bootstrap";
-const CHAT_PATH = "/api/free-ai/openai/chat";
-const JWT_REFRESH_BUFFER_MS = 5 * 60 * 1000;
-const BOOTSTRAP_TIMEOUT_MS = 15_000;
-
-const MIMO_SOURCE = "mimocode-cli-free";
-
-/**
- * Anti-abuse gate marker required by the Xiaomi free endpoint.
- *
- * `/api/free-ai/openai/chat` returns `403 "Illegal access"` unless the request body
- * contains a recognized MiMoCode prompt signature as a substring inside a `system`-role
- * message (verified empirically β headers, fingerprint, and JWT are not what is checked).
- * This is the canonical MiMoCode agent opener the official CLI sends, and it is on the
- * upstream allowlist. We inject it as a leading system message so user requests pass the
- * gate. The string MUST stay byte-for-byte identical β the check is case-sensitive and
- * truncations are rejected.
- */
-export const MIMO_SYSTEM_MARKER =
- "You are MiMoCode, an interactive CLI tool that helps users with software engineering tasks.";
-
-/**
- * Ensure the outgoing body carries the MiMoCode anti-abuse marker in a system message.
- * Idempotent: if any system message already contains the marker, the body is returned
- * unchanged. Bodies without a `messages` array are left untouched.
- */
-function injectSystemMarker(body: Record): Record {
- const messages = body.messages;
- if (!Array.isArray(messages)) return body;
-
- const hasMarker = messages.some(
- (m) =>
- m != null &&
- typeof m === "object" &&
- (m as { role?: unknown }).role === "system" &&
- typeof (m as { content?: unknown }).content === "string" &&
- (m as { content: string }).content.includes(MIMO_SYSTEM_MARKER)
- );
- if (hasMarker) return body;
-
- return { ...body, messages: [{ role: "system", content: MIMO_SYSTEM_MARKER }, ...messages] };
-}
-
-const USER_AGENTS = [
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36",
-];
-
-// ββ Account State ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
-/** Per-account proxy configuration, passed through providerSpecificData.accountProxies. */
-export type AccountProxyConfig = SharedAccountProxyConfig;
-
-interface AccountState extends RotatableAccount {
- fingerprint: string;
- jwt: string;
- expiresAt: number;
- /**
- * #3837/#5521: the account's resolved proxy, or `null` when none is configured.
- * Always present (never `undefined`) so callers can read `acct.proxy` directly β
- * syncAccountsFromCredentials() writes it on every account on every sync.
- */
- proxy: AccountProxyConfig["proxy"];
-}
-
-function parseJwtExp(jwt: string): number {
- try {
- const parts = jwt.split(".");
- if (parts.length < 2) return Date.now() + 50 * 60 * 1000;
- const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString());
- return (payload.exp ?? Math.floor(Date.now() / 1000) + 3000) * 1000;
- } catch {
- return Date.now() + 50 * 60 * 1000;
- }
-}
-
-function isAccountReady(account: AccountState): boolean {
- if (account.cooldownUntil > Date.now()) return false;
- if (account.jwt && account.expiresAt - Date.now() > JWT_REFRESH_BUFFER_MS) return true;
- return false;
-}
-
-// ββ Fingerprint Generation βββββββββββββββββββββββββββββββββββββββββββββββββ
-
-function getCpuModel(): string {
- try {
- const cpus = os.cpus();
- if (cpus.length > 0 && cpus[0].model) return cpus[0].model.trim();
- } catch {
- /* ignore */
- }
- return "unknown-cpu";
-}
-
-export function generateFingerprint(seed?: string): string {
- if (seed) return crypto.createHash("sha256").update(seed).digest("hex");
- const hostname = os.hostname();
- const platform = os.platform();
- const arch = os.arch();
- const cpu = getCpuModel();
- let username = "unknown-user";
- try {
- username = os.userInfo().username;
- } catch {
- /* ignore */
- }
- return crypto
- .createHash("sha256")
- .update(`${hostname}|${platform}|${arch}|${cpu}|${username}`)
- .digest("hex");
-}
-
-// ββ Bootstrap ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
-const bootstrapInflight = new Map>();
-
-async function bootstrapJwt(
- baseUrl: string,
- fingerprint: string,
- signal?: AbortSignal | null,
- dispatcher?: Dispatcher
-): Promise<{ jwt: string; expiresAt: number }> {
- const existing = bootstrapInflight.get(fingerprint);
- if (existing) return existing;
-
- const url = `${baseUrl}${BOOTSTRAP_PATH}`;
- const controller = new AbortController();
- const timer = setTimeout(() => {
- const err = new Error(`mimocode bootstrap timeout after ${BOOTSTRAP_TIMEOUT_MS}ms`);
- err.name = "TimeoutError";
- controller.abort(err);
- }, BOOTSTRAP_TIMEOUT_MS);
- const onSignal = signal ? () => controller.abort(signal.reason) : null;
- if (signal && onSignal) signal.addEventListener("abort", onSignal, { once: true });
-
- const promise = (async () => {
- try {
- const resp = dispatcher
- ? await undiciFetch(url, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ client: fingerprint }),
- signal: controller.signal,
- dispatcher,
- })
- : await fetch(url, {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ client: fingerprint }),
- signal: controller.signal,
- });
- if (!resp.ok) {
- const body = await resp.text().catch(() => "");
- throw new Error(`Bootstrap failed: ${resp.status} ${body.slice(0, 200)}`);
- }
- const data = (await resp.json()) as { jwt?: string };
- if (!data.jwt) throw new Error("Bootstrap response missing jwt field");
- return { jwt: data.jwt, expiresAt: parseJwtExp(data.jwt) };
- } finally {
- clearTimeout(timer);
- if (signal && onSignal) signal.removeEventListener("abort", onSignal);
- bootstrapInflight.delete(fingerprint);
- }
- })();
-
- bootstrapInflight.set(fingerprint, promise);
- return promise;
-}
-
-// ββ Model Rewriting ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
-function rewriteModelName(model: string): string {
- const idx = model.lastIndexOf("/");
- return idx >= 0 ? model.slice(idx + 1) : model;
-}
-
-// ββ Executor βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
-
-export class MimocodeExecutor extends BaseExecutor {
- private accounts: AccountState[] = [];
- // Not `private`: passed as the mutable rotation cursor to the shared
- // pickAccount() helper, which needs a plain `{ nextAccountIdx }` shape β
- // TS's private-member nominal check rejects `this` there otherwise.
- nextAccountIdx = 0;
- private baseUrl: string;
- private proxyUrlMap = new Map();
- private static encoder = new TextEncoder();
-
- constructor() {
- super("mimocode", { format: "openai" });
- this.baseUrl = this.getBaseUrls()[0] || "https://api.xiaomimimo.com";
- this.accounts.push({
- fingerprint: generateFingerprint(),
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- // #3837/#5521 backward compat: default the per-account proxy to null (not undefined),
- // mirroring the syncAccountsFromCredentials() account builder, so an executor with no
- // accountProxies config still exposes `acct.proxy === null` on every account.
- proxy: null,
- });
- }
-
- private getProxyDispatcher(fingerprint: string): Dispatcher | undefined {
- const proxyUrl = this.proxyUrlMap.get(fingerprint);
- if (!proxyUrl) return undefined;
- return createProxyDispatcher(proxyUrl);
- }
-
- private fetchWithProxy(url: string, init: RequestInit, fingerprint: string): Promise {
- const dispatcher = this.getProxyDispatcher(fingerprint);
- if (dispatcher) {
- // undici fetch returns undici.Response which is structurally compatible with
- // the global Response but nominally different β same pattern as proxyFetch.ts
- const undiciFn = undiciFetch as unknown as (
- url: string,
- init: RequestInit & { dispatcher?: unknown }
- ) => Promise;
- return undiciFn(url, { ...init, dispatcher });
- }
- return fetch(url, init);
- }
-
- private syncAccountsFromCredentials(credentials: ProviderCredentials): void {
- const psd = credentials?.providerSpecificData;
- const fingerprints = psd?.fingerprints;
-
- const accountProxies = psd?.accountProxies as AccountProxyConfig[] | undefined;
-
- // #5521: build the per-fingerprint proxy URL map that getProxyDispatcher() consumes
- // to route each account's traffic through its own SOCKS5/HTTP dispatcher.
- if (Array.isArray(accountProxies)) {
- for (const entry of accountProxies) {
- if (entry?.fingerprint && entry?.proxy?.host) {
- const {
- type = "socks5",
- host,
- port,
- username,
- password,
- } = entry.proxy as {
- type?: string;
- host: string;
- port?: number;
- username?: string;
- password?: string;
- };
- const resolvedPort = port ?? (type === "socks5" ? 1080 : 8080);
- const auth = username
- ? `${encodeURIComponent(username)}:${password ? encodeURIComponent(password) : ""}@`
- : "";
- this.proxyUrlMap.set(entry.fingerprint, `${type}://${auth}${host}:${resolvedPort}`);
- }
- }
- }
-
- // #3837: register any newly-advertised fingerprints as accounts.
- if (Array.isArray(fingerprints)) {
- const existing = new Set(this.accounts.map((a) => a.fingerprint));
- for (const fp of fingerprints) {
- if (typeof fp === "string" && !existing.has(fp)) {
- this.accounts.push({
- fingerprint: fp,
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- proxy: null,
- });
- existing.add(fp);
- }
- }
- }
-
- // #3837: resolve each account's structured proxy config from accountProxies.
- const proxyMap = Array.isArray(accountProxies)
- ? new Map(accountProxies.map((ap) => [ap.fingerprint, ap.proxy] as const))
- : null;
- for (const acct of this.accounts) {
- if (proxyMap) {
- const entry = proxyMap.get(acct.fingerprint);
- acct.proxy = entry !== undefined ? (entry ?? null) : null;
- } else {
- acct.proxy = null;
- }
- }
- }
-
- private async getJwtForAccount(
- account: AccountState,
- signal?: AbortSignal | null
- ): Promise {
- if (isAccountReady(account)) return account.jwt;
- const dispatcher = this.getProxyDispatcher(account.fingerprint);
- const result = await bootstrapJwt(this.baseUrl, account.fingerprint, signal, dispatcher);
- account.jwt = result.jwt;
- account.expiresAt = result.expiresAt;
- return account.jwt;
- }
-
- private pickAccount(): AccountState {
- return pickRotatableAccount(this.accounts, this, isAccountReady);
- }
-
- private markCooldown(account: AccountState): void {
- markAccountCooldown(account);
- }
-
- private markSuccess(account: AccountState): void {
- markAccountSuccess(account);
- }
-
- /**
- * POST the request with the account's JWT; on auth failure (401/403), re-bootstrap
- * the account's JWT and retry once. Mutates `headers`' Authorization in place.
- */
- private async fetchWithAuthRetry(
- url: string,
- headers: Record,
- reqBody: unknown,
- signal: AbortSignal | null | undefined,
- account: AccountState,
- log: ExecuteInput["log"]
- ): Promise {
- const jwt = await this.getJwtForAccount(account, signal);
- headers["Authorization"] = `Bearer ${jwt}`;
-
- const resp = await this.fetchWithProxy(
- url,
- {
- method: "POST",
- headers,
- body: JSON.stringify(reqBody),
- signal: signal ?? undefined,
- },
- account.fingerprint
- );
- if (resp.status !== 401 && resp.status !== 403) return resp;
-
- // On auth failure, re-bootstrap this account and retry once
- log?.warn?.(
- "MIMOCODE",
- `Auth failed (${resp.status}) on account ${account.fingerprint.slice(0, 8)}β¦`
- );
- account.jwt = "";
- account.expiresAt = 0;
- account.consecutiveFails = 0;
- const freshJwt = await this.getJwtForAccount(account, signal);
- headers["Authorization"] = `Bearer ${freshJwt}`;
- return this.fetchWithProxy(
- url,
- {
- method: "POST",
- headers,
- body: JSON.stringify(reqBody),
- signal: signal ?? undefined,
- },
- account.fingerprint
- );
- }
-
- /**
- * Gate 429/400 statuses before the success path: a 429 β or a 400 carrying
- * MiMoCode's rate-limit text β puts the account on cooldown and rotates; any other
- * 400 fails fast with the sanitized upstream error (#2101/#4976, see
- * handleBadRequest). Returns "rotate", a fail-fast Response, or null to proceed.
- */
- private async gateRetryableStatus(
- resp: Response,
- account: AccountState,
- log: ExecuteInput["log"]
- ): Promise<"rotate" | Response | null> {
- if (resp.status === 429) {
- this.markCooldown(account);
- log?.warn?.(
- "MIMOCODE",
- `Rate limited on account ${account.fingerprint.slice(0, 8)}, trying nextβ¦`
- );
- return "rotate";
- }
- if (resp.status !== 400) return null;
- return (await this.handleBadRequest(resp, account, log)) ?? "rotate";
- }
-
- /**
- * Classify a 400 response body (#2101/#4976).
- *
- * #4976: MiMoCode signals throttling via a non-standard 400 whose body carries
- * rate-limit semantics (e.g. "Detected high-frequency non-compliant requests from
- * you.") instead of a 429 β same RATE_LIMIT_TEXT_PATTERNS as accountFallback.ts's
- * checkFallbackError(), so the two call sites never disagree on what counts as
- * throttling. That case puts the account on cooldown and returns `null` (rotate).
- *
- * #2101: any other 400 is a genuinely malformed request that fails identically on
- * every account β rotating would waste N round-trips, cooldown every account (a
- * provider-wide outage for parallel requests), and hide the real diagnostic behind
- * a generic exhaustion error. That case returns a fail-fast 400 Response carrying
- * the sanitized upstream message, without touching cooldown/success state.
- */
- private async handleBadRequest(
- resp: Response,
- account: AccountState,
- log: ExecuteInput["log"]
- ): Promise {
- const bodyText = await resp.text().catch(() => "");
-
- if (RATE_LIMIT_TEXT_PATTERNS.some((p) => p.test(bodyText))) {
- this.markCooldown(account);
- log?.warn?.(
- "MIMOCODE",
- `Rate-limit-style 400 on account ${account.fingerprint.slice(0, 8)}, trying nextβ¦`
- );
- return null;
- }
-
- log?.warn?.(
- "MIMOCODE",
- `Malformed request (400) on account ${account.fingerprint.slice(0, 8)}, not retrying`
- );
- let upstreamMessage = bodyText;
- try {
- const parsed = JSON.parse(bodyText) as { error?: { message?: string } };
- if (parsed?.error?.message) upstreamMessage = parsed.error.message;
- } catch {
- /* body wasn't JSON β use raw text */
- }
- const errorBody = buildErrorBody(400, sanitizeErrorMessage(upstreamMessage || "Bad request"));
- return new Response(MimocodeExecutor.encoder.encode(JSON.stringify(errorBody)), {
- status: 400,
- headers: { "Content-Type": "application/json" },
- });
- }
-
- buildUrl(
- _model: string,
- _stream: boolean,
- _urlIndex = 0,
- _credentials?: ProviderCredentials | null
- ): string {
- return `${this.baseUrl.replace(/\/$/, "")}${CHAT_PATH}`;
- }
-
- buildHeaders(
- _credentials: ProviderCredentials,
- stream = true,
- _clientHeaders?: Record | null,
- _model?: string
- ): Record {
- const headers: Record = {
- "Content-Type": "application/json",
- "X-Mimo-Source": MIMO_SOURCE,
- "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
- };
- if (stream) headers["Accept"] = "text/event-stream, application/json";
- return headers;
- }
-
- transformRequest(
- model: string,
- body: unknown,
- _stream: boolean,
- _credentials?: ProviderCredentials | null
- ): unknown {
- if (typeof body === "object" && body !== null) {
- const withModel = { ...(body as Record), model: rewriteModelName(model) };
- return injectSystemMarker(withModel);
- }
- return body;
- }
-
- async testConnection(
- _credentials: ProviderCredentials,
- _signal?: AbortSignal | null,
- log?: ExecuteInput["log"]
- ): Promise {
- try {
- this.syncAccountsFromCredentials(_credentials);
- const account = this.accounts[0];
- const jwt = await this.getJwtForAccount(account, _signal);
- const resp = await this.fetchWithProxy(
- this.buildUrl("mimo-auto", false),
- {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${jwt}`,
- "X-Mimo-Source": MIMO_SOURCE,
- },
- body: JSON.stringify(
- injectSystemMarker({
- model: "mimo-auto",
- messages: [{ role: "user", content: "ping" }],
- stream: false,
- })
- ),
- signal: _signal ?? undefined,
- },
- account.fingerprint
- );
- return resp.status === 200;
- } catch {
- log?.warn?.("MIMOCODE", "testConnection network error");
- return false;
- }
- }
-
- async execute(input: ExecuteInput): Promise<{
- response: Response;
- url: string;
- headers: Record;
- transformedBody: unknown;
- }> {
- const { model, stream, body, signal, log } = input;
- const encoder = MimocodeExecutor.encoder;
-
- if (signal?.aborted) {
- return {
- response: new Response(
- encoder.encode(
- JSON.stringify({
- error: { message: "Request aborted", type: "abort", code: "ABORTED" },
- })
- ),
- { status: 499, headers: { "Content-Type": "application/json" } }
- ),
- url: this.buildUrl(model, stream),
- headers: this.buildHeaders(input.credentials, stream),
- transformedBody: body,
- };
- }
-
- const url = this.buildUrl(model, stream);
- const reqBody = this.transformRequest(model, body, stream, input.credentials);
-
- this.syncAccountsFromCredentials(input.credentials);
-
- const sharedEgressGuardEnabled = isNetworkRotationSharedEgressGuardEnabled();
- // Set once a proxy-less account's network throw reveals the shared egress
- // is down β subsequent proxy-less accounts this request are skipped
- // without a network call, but proxied accounts (independent egress) are
- // still tried normally. See NETWORK_ROTATION_SHARED_EGRESS_GUARD.
- let sharedEgressDown = false;
-
- // Try each account, skip cooldown ones
- for (let attempt = 0; attempt < this.accounts.length; attempt++) {
- const account = this.pickAccount();
-
- if (sharedEgressGuardEnabled && sharedEgressDown && !account.proxy) {
- log?.warn?.(
- "MIMOCODE",
- `skipping account ${maskAccountId(account.fingerprint)} (no dedicated proxy, shared egress already down this request)`
- );
- continue;
- }
-
- try {
- const headers = this.buildHeaders(input.credentials, stream);
- const resp = await this.fetchWithAuthRetry(url, headers, reqBody, signal, account, log);
-
- // 429/400 gating (#2101/#4976): cooldown+rotate, fail fast, or proceed.
- const gate = await this.gateRetryableStatus(resp, account, log);
- if (gate === "rotate") continue;
- if (gate) {
- return {
- response: gate,
- url,
- headers: this.buildHeaders(input.credentials, stream),
- transformedBody: reqBody,
- };
- }
-
- this.markSuccess(account);
- const respHeaders: Record = {};
- resp.headers.forEach((v, k) => {
- respHeaders[k] = v;
- });
- return {
- response: resp as unknown as Response,
- url,
- headers: respHeaders,
- transformedBody: reqBody,
- };
- } catch (err) {
- const msg = err instanceof Error ? err.message : String(err);
- const masked = maskAccountId(account.fingerprint);
-
- // Mirrors OpencodeExecutor's rotation guard: a network exception is only account-scoped
- // when this account has its OWN egress (a configured proxy). Without
- // one, accounts share the default egress β the failure isn't
- // attributable to this account, and trying the next one would just
- // retry the same outage while poisoning its cooldown for a cause
- // that isn't theirs. Fail fast instead of exhausting every account.
- if (!isNetworkErrorRotatable(account)) {
- if (sharedEgressGuardEnabled) {
- this.markCooldown(account);
- sharedEgressDown = true;
- log?.warn?.(
- "MIMOCODE",
- `network error on account ${masked} (no dedicated proxy, shared egress), cooldown applied β trying next available accountβ¦ (${msg})`
- );
- continue;
- }
- log?.warn?.(
- "MIMOCODE",
- `network error on account ${masked} (no dedicated proxy, shared egress) β not rotating (${msg})`
- );
- return {
- response: new Response(
- encoder.encode(
- JSON.stringify(
- buildErrorBody(502, msg, undefined, {
- type: "upstream_error",
- code: "EXECUTOR_ERROR",
- })
- )
- ),
- { status: 502, headers: { "Content-Type": "application/json" } }
- ),
- url,
- headers: this.buildHeaders(input.credentials, stream),
- transformedBody: body,
- };
- }
-
- this.markCooldown(account);
- log?.warn?.("MIMOCODE", `network error on account ${masked}, rotating to next⦠(${msg})`);
- if (attempt === this.accounts.length - 1) {
- log?.error?.("MIMOCODE", `Executor error: ${msg}`);
- return {
- response: new Response(
- encoder.encode(
- JSON.stringify(
- buildErrorBody(502, msg, undefined, {
- type: "upstream_error",
- code: "EXECUTOR_ERROR",
- })
- )
- ),
- { status: 502, headers: { "Content-Type": "application/json" } }
- ),
- url,
- headers: this.buildHeaders(input.credentials, stream),
- transformedBody: body,
- };
- }
- }
- }
-
- return {
- response: new Response(
- encoder.encode(
- JSON.stringify({
- error: {
- message: "All accounts exhausted",
- type: "upstream_error",
- code: "NO_ACCOUNTS",
- },
- })
- ),
- { status: 502, headers: { "Content-Type": "application/json" } }
- ),
- url,
- headers: this.buildHeaders(input.credentials, stream),
- transformedBody: body,
- };
- }
-}
-
-export default MimocodeExecutor;
diff --git a/open-sse/services/__tests__/tierResolver.test.ts b/open-sse/services/__tests__/tierResolver.test.ts
index 62ad4f1867..fac0b24404 100644
--- a/open-sse/services/__tests__/tierResolver.test.ts
+++ b/open-sse/services/__tests__/tierResolver.test.ts
@@ -239,13 +239,10 @@ describe("TierResolver", () => {
it("deriveNoAuthFreeProviders includes all chat-tier noAuth providers", () => {
const derived = deriveNoAuthFreeProviders();
- // opencode + mimocode are the ones the bug report called out
+ // opencode is one of the no-auth providers the bug report called out
expect(derived.includes("opencode"), "opencode should be in derived noAuth-free list").toBe(
true
);
- expect(derived.includes("mimocode"), "mimocode should be in derived noAuth-free list").toBe(
- true
- );
expect(derived.includes("duckduckgo-web")).toBe(true);
});
@@ -271,12 +268,6 @@ describe("TierResolver", () => {
expect(result.hasFreeTier).toBe(true);
});
- it("classifyTier classifies mimocode/mimo-auto as free via noAuth derivation", () => {
- const result = classifyTier("mimocode", "mimo-auto");
- expect(result.tier).toBe(PROVIDER_TIER.FREE);
- expect(result.hasFreeTier).toBe(true);
- });
-
it("classifyTier still returns cheap for paid glm-5.1 (no regression)", () => {
// glm-5.1 is not in freeProviders, costs $0.50/M β cheap tier.
// Make sure the new noAuth derivation didn't accidentally pull it into free.
diff --git a/open-sse/services/combo/fingerprintExpansion.ts b/open-sse/services/combo/fingerprintExpansion.ts
index be3d511509..df4cf2b218 100644
--- a/open-sse/services/combo/fingerprintExpansion.ts
+++ b/open-sse/services/combo/fingerprintExpansion.ts
@@ -15,7 +15,7 @@
import type { ResolvedComboTarget } from "./types.ts";
/** Providers whose `providerSpecificData.fingerprints` array should be expanded. */
-const FINGERPRINT_PROVIDERS: ReadonlySet = new Set(["mimocode", "mcode", "opencode"]);
+const FINGERPRINT_PROVIDERS: ReadonlySet = new Set(["opencode"]);
/** Separator the combo builder UI uses to encode an account pin (#6087). */
const FP_PIN_SEPARATOR = "|fp|";
diff --git a/package.json b/package.json
index a4998e690f..f242150c02 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "omniroute",
"version": "3.8.50",
- "description": "Unified AI router with 341 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.",
+ "description": "Unified AI router with 340 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.",
"type": "module",
"bin": {
"omniroute": "bin/omniroute.mjs",
diff --git a/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx b/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx
index f2b33f73df..9b04b93e74 100644
--- a/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx
+++ b/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx
@@ -8,7 +8,6 @@ import { useNotificationStore } from "@/store/notificationStore";
import { providerText } from "../providerPageHelpers";
const ACCOUNT_PROVIDER_NAMES: Record = {
- mimocode: "MiMoCode",
opencode: "OpenCode",
dahl: "Dahl",
};
diff --git a/src/shared/components/lobeProviderIcons.ts b/src/shared/components/lobeProviderIcons.ts
index e0e2de437f..f9a75bfe16 100644
--- a/src/shared/components/lobeProviderIcons.ts
+++ b/src/shared/components/lobeProviderIcons.ts
@@ -402,7 +402,6 @@ const LOBE_PROVIDER_ALIASES = {
"meta-llama": "Meta",
minimax: "Minimax",
"minimax-cn": "Minimax",
- mimocode: "XiaomiMiMo",
mistral: "Mistral",
mistralai: "Mistral",
moonshot: "Moonshot",
diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts
index 526ec3ed9a..73aabdb2f6 100644
--- a/src/shared/constants/providers.ts
+++ b/src/shared/constants/providers.ts
@@ -30,7 +30,6 @@ export const FREE_PROVIDERS = {};
export const FREE_APIKEY_PROVIDER_IDS = new Set([
"qoder",
- "mimocode",
"opencode",
"dahl",
// auggie is a fully local, credential-less CLI passthrough (auth handled by
diff --git a/src/shared/constants/providers/noauth.ts b/src/shared/constants/providers/noauth.ts
index b572b68888..20cbb24c0f 100644
--- a/src/shared/constants/providers/noauth.ts
+++ b/src/shared/constants/providers/noauth.ts
@@ -118,25 +118,6 @@ export const NOAUTH_PROVIDERS = {
freeNote: "Free video generation β VEO 3.1, Seedance. 6 requests/hour.",
authHint: "No auth required. Rate limited to 6 requests/hour per IP.",
},
- mimocode: {
- id: "mimocode",
- alias: "mcode",
- name: "MiMoCode (Free)",
- icon: "devices",
- color: "#FF6B35",
- textIcon: "MC",
- website: "https://mimo.mi.com",
- noAuth: true,
- hasFree: true,
- serviceKinds: ["llm"],
- freeNote:
- "Free β Xiaomi MiMo models via bootstrap JWT auth. No API key required. Supports streaming.",
- authHint:
- "No API key required. The executor auto-generates JWT tokens via device fingerprint bootstrap.",
- notice: {
- text: "MiMoCode uses Xiaomi's public free AI endpoint with bootstrap-based JWT authentication. No signup needed. Rate limits apply.",
- },
- },
auggie: {
id: "auggie",
alias: "aug",
diff --git a/tests/integration/combo-matrix/auto.test.ts b/tests/integration/combo-matrix/auto.test.ts
index dd19a76599..ebc1362128 100644
--- a/tests/integration/combo-matrix/auto.test.ts
+++ b/tests/integration/combo-matrix/auto.test.ts
@@ -51,7 +51,6 @@ const NO_AUTH_PROVIDER_IDS = [
"theoldllm",
"chipotle",
"veoaifree-web",
- "mimocode",
"auggie",
];
diff --git a/tests/integration/mimocode-proxy.integration.test.ts b/tests/integration/mimocode-proxy.integration.test.ts
deleted file mode 100644
index 85e5934e49..0000000000
--- a/tests/integration/mimocode-proxy.integration.test.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-import { describe, it, before } from "node:test";
-import assert from "node:assert";
-import { MimocodeExecutor, generateFingerprint } from "../../open-sse/executors/mimocode.ts";
-
-const PROXY_URL = process.env.MIMOCODE_SOCKS5_PROXY;
-
-function parseProxyUrl(url: string): { type: string; host: string; port: number } | null {
- try {
- const parsed = new URL(url);
- return { type: parsed.protocol.replace(":", ""), host: parsed.hostname, port: parsed.port ? Number(parsed.port) : 1080 };
- } catch {
- return null;
- }
-}
-
-function requireProxy() {
- if (!PROXY_URL) {
- return false;
- }
- const parsed = parseProxyUrl(PROXY_URL);
- return parsed !== null;
-}
-
-const proxyConfig = PROXY_URL ? parseProxyUrl(PROXY_URL) : null;
-
-describe("mimocode per-account proxy β SOCKS5 integration", { timeout: 30_000 }, () => {
- before(() => {
- if (!PROXY_URL) {
- console.log("# MIMOCODE_SOCKS5_PROXY not set, skipping live proxy tests");
- }
- });
-
- it("bootstrap returns JWT through configured proxy", { skip: !requireProxy() ? "MIMOCODE_SOCKS5_PROXY not set" : false }, async () => {
- process.env.ENABLE_SOCKS5_PROXY = "true";
- const { Socks5ProxyAgent } = await import("undici");
- const agent = new Socks5ProxyAgent(PROXY_URL!);
-
- const fp = generateFingerprint("integration-bootstrap-" + Date.now());
- const resp = await fetch("https://api.xiaomimimo.com/api/free-ai/bootstrap", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ client: fp }),
- // @ts-expect-error β undici dispatcher
- dispatcher: agent,
- signal: AbortSignal.timeout(15_000),
- });
- assert.strictEqual(resp.status, 200, `Bootstrap through proxy: expected 200, got ${resp.status}`);
- const data = await resp.json();
- assert.ok(data.jwt, "Response should contain JWT");
- assert.ok(typeof data.jwt === "string" && data.jwt.length > 10, "JWT should be a non-trivial string");
- });
-
- it("chat request succeeds through configured proxy", { skip: !requireProxy() ? "MIMOCODE_SOCKS5_PROXY not set" : false }, async () => {
- process.env.ENABLE_SOCKS5_PROXY = "true";
- const { Socks5ProxyAgent } = await import("undici");
- const agent = new Socks5ProxyAgent(PROXY_URL!);
-
- const fp = generateFingerprint("integration-chat-" + Date.now());
- const bootstrapResp = await fetch("https://api.xiaomimimo.com/api/free-ai/bootstrap", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ client: fp }),
- // @ts-expect-error β undici dispatcher
- dispatcher: agent,
- signal: AbortSignal.timeout(15_000),
- });
- assert.strictEqual(bootstrapResp.status, 200);
- const { jwt } = await bootstrapResp.json();
-
- const chatResp = await fetch("https://api.xiaomimimo.com/api/free-ai/openai/chat", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "Authorization": `Bearer ${jwt}`,
- "X-Mimo-Source": "mimocode-cli-free",
- },
- body: JSON.stringify({
- model: "mimo-auto",
- messages: [
- { role: "system", content: "You are MiMoCode, an interactive CLI tool that helps users with software engineering tasks." },
- { role: "user", content: "Say exactly: proxy-integration-ok" },
- ],
- stream: false,
- }),
- // @ts-expect-error β undici dispatcher
- dispatcher: agent,
- signal: AbortSignal.timeout(20_000),
- });
- assert.ok(chatResp.status === 200 || chatResp.status === 429,
- `Chat through proxy: expected 200/429, got ${chatResp.status}`);
- });
-
- it("accounts carry proxy config after sync", () => {
- const exec = new MimocodeExecutor();
- const fp = "integration-fp-1";
- const cfg = proxyConfig || { type: "socks5", host: "127.0.0.1", port: 1080 };
- (exec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0, proxy: null },
- ];
- (exec as any).nextAccountIdx = 0;
-
- (exec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [{ fingerprint: fp, proxy: cfg }],
- },
- });
-
- const acct = (exec as any).accounts.find((a: any) => a.fingerprint === fp);
- assert.ok(acct, "Account should exist");
- assert.deepStrictEqual(acct.proxy, cfg);
- });
-
- it("two accounts with different proxies tracked independently", () => {
- const exec = new MimocodeExecutor();
- const fp1 = "integration-fp-a";
- const fp2 = "integration-fp-b";
- const proxy1 = { type: "http" as const, host: "proxy-a.example.com", port: 8080 };
- const proxy2 = { type: "socks5" as const, host: "proxy-b.example.com", port: 1080 };
-
- (exec as any).accounts = [
- { fingerprint: fp1, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0, proxy: null },
- { fingerprint: fp2, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0, proxy: null },
- ];
- (exec as any).nextAccountIdx = 0;
-
- (exec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp1, proxy: proxy1 },
- { fingerprint: fp2, proxy: proxy2 },
- ],
- },
- });
-
- const a1 = (exec as any).accounts.find((a: any) => a.fingerprint === fp1);
- const a2 = (exec as any).accounts.find((a: any) => a.fingerprint === fp2);
- assert.deepStrictEqual(a1.proxy, proxy1, "Account 1 should have proxy1");
- assert.deepStrictEqual(a2.proxy, proxy2, "Account 2 should have proxy2");
- assert.notDeepStrictEqual(a1.proxy, a2.proxy, "Proxies should differ");
- });
-
- it("no accountProxies keeps all proxies null (backward compat)", () => {
- const exec = new MimocodeExecutor();
- const accounts = (exec as any).accounts;
- assert.ok(accounts.length >= 1);
- for (const acct of accounts) {
- assert.strictEqual(acct.proxy, null, "Default account proxy should be null");
- }
- });
-});
diff --git a/tests/snapshots/provider/translate-path.json b/tests/snapshots/provider/translate-path.json
index 9d6a45573b..97e7b70709 100644
--- a/tests/snapshots/provider/translate-path.json
+++ b/tests/snapshots/provider/translate-path.json
@@ -3625,29 +3625,6 @@
"stream": "https://api.llama.com/compat/v1/chat/completions"
}
},
- "mimocode": {
- "format": "openai",
- "headers": {
- "apiKey": {
- "Accept": "text/event-stream",
- "Authorization": "Bearer ",
- "Content-Type": "application/json"
- },
- "nonStream": {
- "Authorization": "Bearer ",
- "Content-Type": "application/json"
- },
- "oauth": {
- "Accept": "text/event-stream",
- "Authorization": "Bearer ",
- "Content-Type": "application/json"
- }
- },
- "url": {
- "nonStream": "https://api.xiaomimimo.com",
- "stream": "https://api.xiaomimimo.com"
- }
- },
"minimax": {
"format": "openai",
"headers": {
diff --git a/tests/unit/accountfallback-ratelimit-400-4976.test.ts b/tests/unit/accountfallback-ratelimit-400-4976.test.ts
index e1de7b6f8c..d99854894e 100644
--- a/tests/unit/accountfallback-ratelimit-400-4976.test.ts
+++ b/tests/unit/accountfallback-ratelimit-400-4976.test.ts
@@ -18,14 +18,14 @@ test("#4976 400 with rate-limit text (MiMoCode) β fallback with RATE_LIMIT_EXC
"Detected high-frequency non-compliant requests from you.",
0,
null,
- "mimocode"
+ "theoldllm"
);
assert.equal(res.shouldFallback, true);
assert.equal(res.reason, RateLimitReason.RATE_LIMIT_EXCEEDED);
});
test("#4976 400 with Chinese rate-limit text β fallback with RATE_LIMIT_EXCEEDED", () => {
- const res = checkFallbackError(400, "ζ£ζ΅ε°ζ¨ηθ―·ζ±ι’ηθΏι«οΌθ―·η¨εεθ―", 0, null, "mimocode");
+ const res = checkFallbackError(400, "ζ£ζ΅ε°ζ¨ηθ―·ζ±ι’ηθΏι«οΌθ―·η¨εεθ―", 0, null, "theoldllm");
assert.equal(res.shouldFallback, true);
assert.equal(res.reason, RateLimitReason.RATE_LIMIT_EXCEEDED);
});
diff --git a/tests/unit/auth-noauth-fallback-loop-3061.test.ts b/tests/unit/auth-noauth-fallback-loop-3061.test.ts
index b9d23eb3ec..d640ffb1e2 100644
--- a/tests/unit/auth-noauth-fallback-loop-3061.test.ts
+++ b/tests/unit/auth-noauth-fallback-loop-3061.test.ts
@@ -49,13 +49,6 @@ test("#3061 opencode-zen no-auth: first selection returns synthetic noauth (happ
assert.equal((creds as { connectionId?: string }).connectionId, "noauth");
});
-test("#3061 mimocode no-auth: first selection returns synthetic noauth (happy path preserved)", async () => {
- const creds = await getProviderCredentials("mimocode", null, null, "mimo-auto");
- assert.ok(creds, "mimocode must resolve to synthetic no-auth credentials on first selection");
- assert.equal((creds as { connectionId?: string }).connectionId, "noauth");
- assert.equal((creds as { apiKey?: unknown }).apiKey, null);
-});
-
// ββ The fix: once "noauth" is excluded, selection MUST stop (return null) ββ
test("#3061 opencode no-auth: excluding 'noauth' returns null (breaks the fallback loop)", async () => {
@@ -81,13 +74,3 @@ test("#3061 opencode-zen no-auth: excluding 'noauth' returns null (breaks the fa
);
});
-test("#3061 mimocode no-auth: excluding 'noauth' returns null (breaks the fallback loop)", async () => {
- const creds = await getProviderCredentials("mimocode", null, null, "mimo-auto", {
- excludeConnectionIds: ["noauth"],
- });
- assert.equal(
- creds,
- null,
- "excluded synthetic noauth must not be re-selected for the mimocode keyless path"
- );
-});
diff --git a/tests/unit/autoCombo/suffixComposition-4517.test.ts b/tests/unit/autoCombo/suffixComposition-4517.test.ts
index 88a4adf333..2db7b079e9 100644
--- a/tests/unit/autoCombo/suffixComposition-4517.test.ts
+++ b/tests/unit/autoCombo/suffixComposition-4517.test.ts
@@ -47,15 +47,14 @@ describe("suffixComposition :free tier (#4517)", () => {
});
it("buildAutoCandidateFilter keeps noAuth free providers", () => {
- // Regression: opencode and mimocode are noAuth and free, but the
- // pre-fix `freeProviders` list omitted them, so the filter rejected
- // their candidates even though they ARE free upstream.
+ // Regression: opencode was noAuth and free, but the
+ // pre-fix `freeProviders` list omitted it, so the filter rejected
+ // its candidates even though it IS free upstream.
const filter = buildAutoCandidateFilter("coding", "free");
assert.notEqual(filter, null);
assert.equal(filter!({ provider: "opencode", model: "big-pickle" }), true);
assert.equal(filter!({ provider: "opencode", model: "minimax-m3-free" }), true);
- assert.equal(filter!({ provider: "mimocode", model: "mimo-auto" }), true);
assert.equal(filter!({ provider: "duckduckgo-web", model: "gpt-4o-mini" }), true);
});
diff --git a/tests/unit/combo-fingerprint-expansion.test.ts b/tests/unit/combo-fingerprint-expansion.test.ts
index dda557f948..4f258fe03c 100644
--- a/tests/unit/combo-fingerprint-expansion.test.ts
+++ b/tests/unit/combo-fingerprint-expansion.test.ts
@@ -1,7 +1,7 @@
import test from "node:test";
import assert from "node:assert/strict";
-// #5521 β A mimocode connection with multiple fingerprints in
+// #5521 β An opencode connection with multiple fingerprints in
// provider_specific_data.fingerprints was treated as a single combo target,
// so only one fingerprint (one IP) was used per request. The combo system
// must now expand each fingerprint into its own target so all of them
@@ -17,13 +17,6 @@ const {
// ββ isFingerprintProvider ββββββββββββββββββββββββββββββββββββββββββββββββββββ
-test("isFingerprintProvider: mimocode returns true", () => {
- assert.equal(isFingerprintProvider("mimocode"), true);
-});
-
-test("isFingerprintProvider: mcode returns true", () => {
- assert.equal(isFingerprintProvider("mcode"), true);
-});
test("isFingerprintProvider: opencode returns true", () => {
assert.equal(isFingerprintProvider("opencode"), true);
@@ -136,8 +129,8 @@ function makeTarget(overrides: Record = {}) {
kind: "model" as const,
stepId: "step-0",
executionKey: "step-0",
- modelStr: "mimocode/mimo-auto",
- provider: "mimocode",
+ modelStr: "opencode/kimi-k2",
+ provider: "opencode",
providerId: null,
connectionId: "conn-1",
weight: 0,
@@ -149,7 +142,7 @@ function makeTarget(overrides: Record = {}) {
function makeConnection(fps: string[]) {
return {
id: "conn-1",
- provider: "mimocode",
+ provider: "opencode",
providerSpecificData: { fingerprints: fps },
};
}
@@ -196,7 +189,7 @@ test("expandTargetsByFingerprints: preserves all target properties across copies
const fps = ["fp-aaa", "fp-bbb", "fp-ccc"];
const conn = makeConnection(fps);
const targets = [
- makeTarget({ connectionId: "conn-1", modelStr: "mimocode/mimo-auto", weight: 5 }),
+ makeTarget({ connectionId: "conn-1", modelStr: "opencode/kimi-k2", weight: 5 }),
];
const connById = new Map([["conn-1", conn]]);
const result = expandTargetsByFingerprints(targets, connById, (t) => t.provider);
@@ -204,8 +197,8 @@ test("expandTargetsByFingerprints: preserves all target properties across copies
for (const r of result) {
assert.equal(r.kind, "model");
assert.equal(r.connectionId, "conn-1");
- assert.equal(r.modelStr, "mimocode/mimo-auto");
- assert.equal(r.provider, "mimocode");
+ assert.equal(r.modelStr, "opencode/kimi-k2");
+ assert.equal(r.provider, "opencode");
assert.equal(r.weight, 5);
}
});
@@ -242,23 +235,6 @@ test("expandTargetsByFingerprints: empty input returns empty array", () => {
assert.equal(result.length, 0);
});
-test("expandTargetsByFingerprints: mcode provider expands correctly", () => {
- const fps = ["mfp-1", "mfp-2", "mfp-3"];
- const conn = {
- id: "conn-m",
- provider: "mcode",
- providerSpecificData: { fingerprints: fps },
- };
- const targets = [
- makeTarget({ provider: "mcode", modelStr: "mcode/auto", connectionId: "conn-m" }),
- ];
- const connById = new Map([["conn-m", conn]]);
- const result = expandTargetsByFingerprints(targets, connById, (t) => t.provider);
- assert.equal(result.length, 3);
- assert.equal(result[0].executionKey, "step-0");
- assert.equal(result[1].executionKey, "step-0@fp:mfp-2");
- assert.equal(result[2].executionKey, "step-0@fp:mfp-3");
-});
test("expandTargetsByFingerprints: multiple targets each expand independently", () => {
const conn1 = makeConnection(["fp-a1", "fp-a2"]);
diff --git a/tests/unit/combo-fingerprint-pin-6696.test.ts b/tests/unit/combo-fingerprint-pin-6696.test.ts
index 6a683f49e8..26d0c056eb 100644
--- a/tests/unit/combo-fingerprint-pin-6696.test.ts
+++ b/tests/unit/combo-fingerprint-pin-6696.test.ts
@@ -2,7 +2,7 @@ import test from "node:test";
import assert from "node:assert/strict";
// #6696 β the combo builder's "pin a specific account" feature for fingerprint
-// providers (mimocode/mcode/opencode) builds a composite connectionId of the
+// providers (opencode) builds a composite connectionId of the
// form `${rowId}|fp|${fingerprint}` (src/lib/combos/builderOptions.ts:251), but
// nothing in the combo execution path ever splits that composite id back into
// a real rowId + a selected fingerprint. This test proves the pin is inert:
@@ -27,8 +27,8 @@ function makeTarget(overrides: Record = {}) {
kind: "model" as const,
stepId: "step-0",
executionKey: "step-0",
- modelStr: "mimocode/mimo-auto",
- provider: "mimocode",
+ modelStr: "opencode/kimi-k2",
+ provider: "opencode",
providerId: null,
connectionId: "conn-1",
weight: 0,
@@ -41,7 +41,7 @@ test("#6696: fp-pinned composite connectionId is never resolved to the real conn
const realConnectionId = "conn-1";
const conn = {
id: realConnectionId,
- provider: "mimocode",
+ provider: "opencode",
providerSpecificData: { fingerprints: ["fp-aaa", "fp-bbb"] },
};
const connById = new Map([[realConnectionId, conn]]);
@@ -81,7 +81,7 @@ test("#6696: composite connectionId never matches connectionById (root cause of
const realConnectionId = "conn-1";
const conn = {
id: realConnectionId,
- provider: "mimocode",
+ provider: "opencode",
providerSpecificData: { fingerprints: ["fp-aaa", "fp-bbb"] },
};
const connById = new Map([[realConnectionId, conn]]);
diff --git a/tests/unit/combo-system-prompt-templates-5501.test.ts b/tests/unit/combo-system-prompt-templates-5501.test.ts
index 73c1aaa5cb..e31e14fde3 100644
--- a/tests/unit/combo-system-prompt-templates-5501.test.ts
+++ b/tests/unit/combo-system-prompt-templates-5501.test.ts
@@ -157,12 +157,11 @@ test("resolveTargetFingerprint: pinned fingerprint wins", () => {
});
test("resolveTargetFingerprint: parses @fp: suffix from executionKey", () => {
- assert.equal(resolveTargetFingerprint({ provider: "mcode", executionKey: "k@fp:abc" }), "abc");
+ assert.equal(resolveTargetFingerprint({ provider: "opencode", executionKey: "k@fp:abc" }), "abc");
});
test("resolveTargetFingerprint: null when no source", () => {
assert.equal(resolveTargetFingerprint({ provider: "opencode", executionKey: "k" }), null);
- assert.equal(resolveTargetFingerprint({ provider: "mimocode" }), null);
});
// ββ Integration: hook + gate through handleComboChat (#5501) ββββββββββββββββββ
diff --git a/tests/unit/errorClassifier-noauth-403-6315.test.ts b/tests/unit/errorClassifier-noauth-403-6315.test.ts
index 6d02d8c1a7..e51aa0b310 100644
--- a/tests/unit/errorClassifier-noauth-403-6315.test.ts
+++ b/tests/unit/errorClassifier-noauth-403-6315.test.ts
@@ -6,16 +6,12 @@ import {
} from "../../open-sse/services/errorClassifier.ts";
// #6315 / #6345 β a single generic upstream 403 on a no-credential ("authType:
-// none") provider like mimocode or theoldllm was permanently banning the whole
+// none") provider was permanently banning the whole
// connection (classified as FORBIDDEN, a terminal type). These providers are
// free/stateless β there is no real account/credential to revoke, so a bare
// 403 should be RECOVERABLE (null) and handled by the existing connection
// cooldown/retry layer, same as apikey providers already are.
-test("#6315: mimocode 'high-frequency non-compliant' 403 -> recoverable (null), not FORBIDDEN", () => {
- const body = { error: "Detected high-frequency non-compliant requests, please slow down." };
- assert.equal(classifyProviderError(403, body, "mimocode"), null);
-});
test("#6345: theoldllm 'Request blocked'/access_denied 403 -> recoverable (null), not FORBIDDEN", () => {
const body = { error: "Request blocked", type: "access_denied" };
@@ -53,7 +49,3 @@ test("#8813: chatgpt-web SENTINEL_BLOCKED 403 with raw 'Sentinel blocked' text
);
});
-test("control: recognized ban phrase on a no-credential provider still terminal (ACCOUNT_DEACTIVATED)", () => {
- const body = "This service has been disabled in this account for violation of policy.";
- assert.equal(classifyProviderError(403, body, "mimocode"), PROVIDER_ERROR_TYPES.ACCOUNT_DEACTIVATED);
-});
diff --git a/tests/unit/free-provider-onboarding-selector.test.ts b/tests/unit/free-provider-onboarding-selector.test.ts
index 3bd45bc50f..22bdcc72e3 100644
--- a/tests/unit/free-provider-onboarding-selector.test.ts
+++ b/tests/unit/free-provider-onboarding-selector.test.ts
@@ -19,7 +19,7 @@ test("free onboarding candidates come from the no-auth registry and exclude loca
assert.ok(ids.includes("felo-web"));
assert.ok(ids.includes("theoldllm"));
assert.ok(ids.includes("chipotle"));
- assert.ok(ids.includes("mimocode"));
+ assert.ok(ids.includes("theoldllm"));
assert.ok(ids.includes("aihorde"));
assert.ok(!ids.includes("devin-cli-agentic"));
assert.ok(!ids.includes("auggie"));
diff --git a/tests/unit/free-provider-onboarding-setup.test.ts b/tests/unit/free-provider-onboarding-setup.test.ts
index 3afdbe8fd7..6f71623fca 100644
--- a/tests/unit/free-provider-onboarding-setup.test.ts
+++ b/tests/unit/free-provider-onboarding-setup.test.ts
@@ -10,7 +10,7 @@ test("batch setup creates missing providers, skips existing ones, and is retry-s
const existing = [{ provider: "opencode", name: "My customized OpenCode" }];
const created: Array<{ provider: string; name: string }> = [];
const candidates = getEligibleFreeOnboardingProviders();
- const requestedIds = ["opencode", "mimocode"];
+ const requestedIds = ["opencode", "theoldllm"];
const first = await setupFreeProviderConnections({
requestedIds,
@@ -33,14 +33,14 @@ test("batch setup creates missing providers, skips existing ones, and is retry-s
assert.deepEqual(first.results, [
{ providerId: "opencode", status: "skipped", reason: "already-configured" },
- { providerId: "mimocode", status: "created", connectionId: "created-mimocode" },
+ { providerId: "theoldllm", status: "created", connectionId: "created-theoldllm" },
]);
assert.deepEqual(second.results, [
{ providerId: "opencode", status: "skipped", reason: "already-configured" },
- { providerId: "mimocode", status: "skipped", reason: "already-configured" },
+ { providerId: "theoldllm", status: "skipped", reason: "already-configured" },
]);
assert.deepEqual(existing, [{ provider: "opencode", name: "My customized OpenCode" }]);
- assert.deepEqual(created, [{ provider: "mimocode", name: "MiMoCode (Free)" }]);
+ assert.deepEqual(created, [{ provider: "theoldllm", name: "The Old LLM (Free)" }]);
});
test("batch setup rejects unknown or ineligible IDs before creating anything", async () => {
@@ -63,13 +63,13 @@ test("batch setup rejects unknown or ineligible IDs before creating anything", a
test("partial failures are reported per provider and can be retried", async () => {
const created = new Set();
- let mimocodeAttempts = 0;
+ let oldllmAttempts = 0;
const input = {
- requestedIds: ["opencode", "mimocode"],
+ requestedIds: ["opencode", "theoldllm"],
candidates: getEligibleFreeOnboardingProviders(),
listExisting: async () => [...created].map((provider) => ({ provider })),
create: async ({ provider }: { provider: string }) => {
- if (provider === "mimocode" && mimocodeAttempts++ === 0) throw new Error("upstream detail");
+ if (provider === "theoldllm" && oldllmAttempts++ === 0) throw new Error("upstream detail");
created.add(provider);
return { id: `created-${provider}` };
},
@@ -80,10 +80,10 @@ test("partial failures are reported per provider and can be retried", async () =
assert.deepEqual(first.results, [
{ providerId: "opencode", status: "created", connectionId: "created-opencode" },
- { providerId: "mimocode", status: "failed", reason: "Failed to create provider" },
+ { providerId: "theoldllm", status: "failed", reason: "Failed to create provider" },
]);
assert.deepEqual(retry.results, [
{ providerId: "opencode", status: "skipped", reason: "already-configured" },
- { providerId: "mimocode", status: "created", connectionId: "created-mimocode" },
+ { providerId: "theoldllm", status: "created", connectionId: "created-theoldllm" },
]);
});
diff --git a/tests/unit/mimocode-executor.test.ts b/tests/unit/mimocode-executor.test.ts
deleted file mode 100644
index 92e43ab13d..0000000000
--- a/tests/unit/mimocode-executor.test.ts
+++ /dev/null
@@ -1,873 +0,0 @@
-import { describe, it, beforeEach, afterEach } from "node:test";
-import assert from "node:assert";
-import {
- MimocodeExecutor,
- generateFingerprint,
- MIMO_SYSTEM_MARKER,
- type AccountProxyConfig,
-} from "../../open-sse/executors/mimocode.ts";
-
-const executor = new MimocodeExecutor();
-
-describe("MimocodeExecutor", () => {
- it("generateFingerprint returns a 64-char hex string", () => {
- const fp = generateFingerprint();
- assert.match(fp, /^[0-9a-f]{64}$/);
- });
-
- it("generateFingerprint is deterministic", () => {
- assert.strictEqual(generateFingerprint(), generateFingerprint());
- });
-
- it("generateFingerprint with seed is deterministic", () => {
- assert.strictEqual(generateFingerprint("seed-a"), generateFingerprint("seed-a"));
- });
-
- it("generateFingerprint with different seeds differs", () => {
- assert.notStrictEqual(generateFingerprint("seed-a"), generateFingerprint("seed-b"));
- });
-
- it("buildUrl returns the free-ai chat endpoint", () => {
- const url = executor.buildUrl("mimo-auto", false);
- assert.ok(url.includes("/api/free-ai/openai/chat"));
- assert.ok(url.startsWith("https://"));
- });
-
- it("buildHeaders includes X-Mimo-Source and Content-Type", () => {
- const headers = (executor as any).buildHeaders({}, true);
- assert.strictEqual(headers["Content-Type"], "application/json");
- assert.strictEqual(headers["X-Mimo-Source"], "mimocode-cli-free");
- });
-
- it("buildHeaders includes Accept for streaming", () => {
- const headers = (executor as any).buildHeaders({}, true);
- assert.ok(headers["Accept"]?.includes("text/event-stream"));
- });
-
- it("buildHeaders omits Accept for non-streaming", () => {
- const headers = (executor as any).buildHeaders({}, false);
- assert.ok(!headers["Accept"]?.includes("text/event-stream"));
- });
-
- it("transformRequest strips model prefix", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- { model: "mcode/mimo-auto", messages: [{ role: "user", content: "hi" }] },
- false
- );
- assert.strictEqual(result.model, "mimo-auto");
- });
-
- it("transformRequest passes model through when no prefix", () => {
- const result = (executor as any).transformRequest(
- "mimo-auto",
- { model: "mimo-auto", messages: [{ role: "user", content: "hi" }] },
- false
- );
- assert.strictEqual(result.model, "mimo-auto");
- });
-
- // The Xiaomi free endpoint rejects requests with `403 "Illegal access"` unless the
- // body contains a recognized MiMoCode prompt signature inside a `system`-role message.
- // The executor must inject that marker so user requests pass the upstream anti-abuse gate.
- it("transformRequest injects a MiMoCode system marker when none is present", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- { model: "mcode/mimo-auto", messages: [{ role: "user", content: "write a haiku" }] },
- true
- );
- assert.ok(Array.isArray(result.messages));
- const first = result.messages[0];
- assert.strictEqual(first.role, "system");
- assert.ok(
- typeof first.content === "string" && first.content.includes(MIMO_SYSTEM_MARKER),
- "first message must be a system message containing the MiMoCode marker"
- );
- });
-
- it("transformRequest preserves the original user message after injection", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- { model: "mcode/mimo-auto", messages: [{ role: "user", content: "write a haiku" }] },
- true
- );
- const userMsg = result.messages.find((m: any) => m.role === "user");
- assert.ok(userMsg);
- assert.strictEqual(userMsg.content, "write a haiku");
- });
-
- it("transformRequest preserves a caller-provided system prompt alongside the marker", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- {
- model: "mcode/mimo-auto",
- messages: [
- { role: "system", content: "You are a pirate." },
- { role: "user", content: "hi" },
- ],
- },
- true
- );
- const systemContents = result.messages
- .filter((m: any) => m.role === "system")
- .map((m: any) => m.content)
- .join("\n");
- assert.ok(systemContents.includes(MIMO_SYSTEM_MARKER), "marker present");
- assert.ok(systemContents.includes("You are a pirate."), "caller system prompt preserved");
- });
-
- it("transformRequest does not duplicate the marker when already present", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- {
- model: "mcode/mimo-auto",
- messages: [
- { role: "system", content: `${MIMO_SYSTEM_MARKER}\nExtra context.` },
- { role: "user", content: "hi" },
- ],
- },
- true
- );
- const count = result.messages.filter(
- (m: any) =>
- m.role === "system" &&
- typeof m.content === "string" &&
- m.content.includes(MIMO_SYSTEM_MARKER)
- ).length;
- assert.strictEqual(count, 1, "marker should not be duplicated");
- });
-
- it("transformRequest leaves a body without a messages array untouched", () => {
- const result = (executor as any).transformRequest(
- "mcode/mimo-auto",
- { model: "mcode/mimo-auto", prompt: "legacy" },
- true
- );
- assert.strictEqual((result as any).messages, undefined);
- assert.strictEqual((result as any).model, "mimo-auto");
- });
-
- it("returns 499 on pre-aborted signal", async () => {
- const controller = new AbortController();
- controller.abort(new Error("cancelled"));
-
- const result = await executor.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: controller.signal,
- credentials: {},
- log: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
- });
-
- assert.strictEqual((result as any).response.status, 499);
- });
-
- it("is registered in executor index", async () => {
- const { getExecutor } = await import("../../open-sse/executors/index.ts");
- const exec = getExecutor("mimocode");
- assert.ok(exec instanceof MimocodeExecutor);
- });
-
- it("mcode alias works", async () => {
- const { getExecutor } = await import("../../open-sse/executors/index.ts");
- const exec = getExecutor("mcode");
- assert.ok(exec instanceof MimocodeExecutor);
- });
-});
-
-describe("mimocode multi-account", () => {
- it("executor has at least one account", () => {
- const accounts = (executor as any).accounts;
- assert.ok(Array.isArray(accounts));
- assert.ok(accounts.length >= 1);
- });
-
- it("each account has required fields", () => {
- const accounts = (executor as any).accounts;
- for (const acct of accounts) {
- assert.ok(typeof acct.fingerprint === "string");
- assert.ok(typeof acct.jwt === "string");
- assert.ok(typeof acct.expiresAt === "number");
- assert.ok(typeof acct.cooldownUntil === "number");
- assert.ok(typeof acct.consecutiveFails === "number");
- }
- });
-
- it("pickAccount returns an account", () => {
- const acct = (executor as any).pickAccount();
- assert.ok(acct);
- assert.ok(typeof acct.fingerprint === "string");
- });
-
- it("markCooldown increases consecutiveFails and sets cooldownUntil", () => {
- const acct = (executor as any).accounts[0];
- const before = acct.consecutiveFails;
- (executor as any).markCooldown(acct);
- assert.strictEqual(acct.consecutiveFails, before + 1);
- assert.ok(acct.cooldownUntil > Date.now());
- });
-
- it("markSuccess resets consecutiveFails", () => {
- const acct = (executor as any).accounts[0];
- acct.consecutiveFails = 5;
- (executor as any).markSuccess(acct);
- assert.strictEqual(acct.consecutiveFails, 0);
- });
-});
-
-describe("mimocode provider registration", () => {
- it("provider is registered in NOAUTH_PROVIDERS", async () => {
- const { NOAUTH_PROVIDERS } = await import("../../src/shared/constants/providers.ts");
- const provider = (NOAUTH_PROVIDERS as Record)["mimocode"];
- assert.ok(provider);
- assert.strictEqual(provider.id, "mimocode");
- assert.strictEqual(provider.alias, "mcode");
- assert.strictEqual(provider.noAuth, true);
- assert.strictEqual(provider.hasFree, true);
- });
-
- it("provider has correct service kinds", async () => {
- const { NOAUTH_PROVIDERS } = await import("../../src/shared/constants/providers.ts");
- const provider = (NOAUTH_PROVIDERS as Record)["mimocode"];
- assert.ok(provider.serviceKinds?.includes("llm"));
- });
-});
-
-describe("mimocode providerRegistry entry", () => {
- it("registry entry exists with correct executor", async () => {
- const { getRegistryEntry } = await import("../../open-sse/config/providerRegistry.ts");
- const entry = getRegistryEntry("mimocode");
- assert.ok(entry);
- assert.strictEqual(entry.executor, "mimocode");
- assert.strictEqual(entry.format, "openai");
- assert.strictEqual(entry.authType, "none");
- });
-
- it("registry entry has mimo-auto model", async () => {
- const { getRegistryEntry } = await import("../../open-sse/config/providerRegistry.ts");
- const entry = getRegistryEntry("mimocode");
- const models = entry.models as Array<{ id: string }>;
- const mimoAuto = models.find((m) => m.id === "mimo-auto");
- assert.ok(mimoAuto);
- });
-});
-
-describe("mimocode per-account proxy", () => {
- it("AccountProxyConfig type has required fields", () => {
- const config: AccountProxyConfig = {
- fingerprint: "abc123",
- proxy: { type: "http", host: "proxy.example.com", port: 8080 },
- };
- assert.strictEqual(config.fingerprint, "abc123");
- assert.strictEqual(config.proxy?.host, "proxy.example.com");
- });
-
- it("default proxyUrlMap is empty", () => {
- const testExec = new MimocodeExecutor();
- const map = (testExec as any).proxyUrlMap;
- assert.ok(map instanceof Map);
- assert.strictEqual(map.size, 0);
- });
-
- it("syncAccountsFromCredentials populates proxyUrlMap with correct URLs", () => {
- const testExec = new MimocodeExecutor();
- const fp1 = "fingerprint-1";
- const fp2 = "fingerprint-2";
- (testExec as any).accounts = [
- { fingerprint: fp1, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- { fingerprint: fp2, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
-
- const credentials = {
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp1, proxy: { type: "http", host: "p1.example.com", port: 1080 } },
- { fingerprint: fp2, proxy: null },
- ],
- },
- };
- (testExec as any).syncAccountsFromCredentials(credentials);
-
- const map: Map = (testExec as any).proxyUrlMap;
- assert.strictEqual(map.get(fp1), "http://p1.example.com:1080");
- assert.strictEqual(map.has(fp2), false);
- });
-
- it("syncAccountsFromCredentials skips when accountProxies absent", () => {
- const testExec = new MimocodeExecutor();
- const mapBefore = (testExec as any).proxyUrlMap.size;
- (testExec as any).syncAccountsFromCredentials({ providerSpecificData: {} });
- assert.strictEqual((testExec as any).proxyUrlMap.size, mapBefore);
- });
-
- it("syncAccountsFromCredentials adds proxyUrlMap entries for all valid proxy configs", () => {
- const testExec = new MimocodeExecutor();
- const existingFp = (testExec as any).accounts[0].fingerprint;
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- {
- fingerprint: "nonexistent-fingerprint",
- proxy: { type: "socks5", host: "s5.example.com", port: 1080 },
- },
- ],
- },
- });
- const map: Map = (testExec as any).proxyUrlMap;
- assert.strictEqual(
- map.has("nonexistent-fingerprint"),
- true,
- "proxyUrlMap stores all valid proxy configs"
- );
- assert.strictEqual(map.get("nonexistent-fingerprint"), "socks5://s5.example.com:1080");
- assert.strictEqual(
- map.has(existingFp),
- false,
- "existing fingerprint without proxy is not in map"
- );
- });
-
- it("accounts with different proxies produce distinct URLs", () => {
- const testExec = new MimocodeExecutor();
- const fp1 = "fp-a";
- const fp2 = "fp-b";
- (testExec as any).accounts = [
- { fingerprint: fp1, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- { fingerprint: fp2, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp1, proxy: { type: "http", host: "a.com", port: 8080 } },
- { fingerprint: fp2, proxy: { type: "socks5", host: "b.com", port: 1080 } },
- ],
- },
- });
-
- const map: Map = (testExec as any).proxyUrlMap;
- assert.strictEqual(map.get(fp1), "http://a.com:8080");
- assert.strictEqual(map.get(fp2), "socks5://b.com:1080");
- });
-
- it("getProxyDispatcher returns a dispatcher for known fingerprint", () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-dispatcher-test";
- (testExec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp, proxy: { type: "socks5", host: "s5.test", port: 1080 } },
- ],
- },
- });
-
- const dispatcher = (testExec as any).getProxyDispatcher(fp);
- assert.ok(dispatcher, "dispatcher should exist for registered fingerprint");
- });
-
- it("getProxyDispatcher returns undefined for unknown fingerprint", () => {
- const testExec = new MimocodeExecutor();
- const dispatcher = (testExec as any).getProxyDispatcher("unknown-fp");
- assert.strictEqual(dispatcher, undefined);
- });
-
- it("fetchWithProxy falls back to plain fetch when no proxy configured", async () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-no-proxy";
- const originalFetch = globalThis.fetch;
- let fetchCalled = false;
- globalThis.fetch = async () => {
- fetchCalled = true;
- return new Response("ok");
- };
- try {
- const resp = await (testExec as any).fetchWithProxy("https://example.com", {}, fp);
- assert.ok(fetchCalled, "plain fetch should have been called");
- assert.strictEqual(resp.status, 200);
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-
- it("authenticated proxy includes credentials in URL", () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-auth";
- (testExec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- {
- fingerprint: fp,
- proxy: {
- type: "socks5",
- host: "s5.auth.com",
- port: 1080,
- username: "user",
- password: "pass",
- },
- },
- ],
- },
- });
-
- const map: Map = (testExec as any).proxyUrlMap;
- const url = map.get(fp);
- assert.ok(url);
- assert.ok(url.includes("user:pass@"), "URL should include encoded credentials");
- });
-
- it("default port is 1080 for socks5 when not specified", () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-default-port";
- (testExec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp, proxy: { type: "socks5", host: "s5.test", port: undefined } },
- ],
- },
- });
-
- const map: Map = (testExec as any).proxyUrlMap;
- assert.strictEqual(map.get(fp), "socks5://s5.test:1080");
- });
-
- it("default port is 8080 for http when not specified", () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-http-default";
- (testExec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp, proxy: { type: "http", host: "h.test", port: undefined } },
- ],
- },
- });
-
- const map: Map = (testExec as any).proxyUrlMap;
- assert.strictEqual(map.get(fp), "http://h.test:8080");
- });
-
- it("proxy URL map updates correctly on re-sync", () => {
- const testExec = new MimocodeExecutor();
- const fp = "fp-re-sync";
- (testExec as any).accounts = [
- { fingerprint: fp, jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
-
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp, proxy: { type: "http", host: "first.proxy", port: 8080 } },
- ],
- },
- });
- assert.strictEqual((testExec as any).proxyUrlMap.get(fp), "http://first.proxy:8080");
-
- (testExec as any).syncAccountsFromCredentials({
- providerSpecificData: {
- accountProxies: [
- { fingerprint: fp, proxy: { type: "socks5", host: "second.proxy", port: 1080 } },
- ],
- },
- });
- assert.strictEqual((testExec as any).proxyUrlMap.get(fp), "socks5://second.proxy:1080");
- });
-});
-
-// #2101/#4976 regression guard: a 400 from MiMoCode must be classified by body text
-// before deciding whether to rotate accounts. A rate-limit-style 400 (throttling
-// disguised as a 400, #4976) is rotation-worthy; a genuinely malformed 400 (#2101)
-// must fail fast on the FIRST account instead of being retried identically on every
-// account (which would waste N round-trips, cooldown every account, and hide the
-// real upstream diagnostic behind a generic "all accounts exhausted" error).
-interface TestAccountState {
- fingerprint: string;
- jwt: string;
- expiresAt: number;
- cooldownUntil: number;
- consecutiveFails: number;
- proxy?: unknown;
-}
-
-interface ExecutorAccountAccess {
- accounts: TestAccountState[];
- nextAccountIdx: number;
-}
-
-function accountAccess(exec: MimocodeExecutor): ExecutorAccountAccess {
- return exec as unknown as ExecutorAccountAccess;
-}
-
-describe("mimocode 400 classification (#2101/#4976)", () => {
- function makeJwt(): string {
- const header = Buffer.from(JSON.stringify({ alg: "none" })).toString("base64url");
- const payload = Buffer.from(
- JSON.stringify({ exp: Math.floor(Date.now() / 1000) + 3600 })
- ).toString("base64url");
- return `${header}.${payload}.sig`;
- }
-
- function twoAccountExecutor(): MimocodeExecutor {
- const exec = new MimocodeExecutor();
- const access = accountAccess(exec);
- access.accounts = [
- { fingerprint: "acct-a", jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- { fingerprint: "acct-b", jwt: "", expiresAt: 0, cooldownUntil: 0, consecutiveFails: 0 },
- ];
- access.nextAccountIdx = 0;
- return exec;
- }
-
- it("rotates to the next account on a rate-limit-text 400 (#4976)", async () => {
- const testExec = twoAccountExecutor();
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- if (chatCalls === 1) {
- // MiMoCode's non-standard rate-limit signal on a 400 status (#4976).
- return new Response(
- JSON.stringify({
- error: { message: "Detected high-frequency non-compliant requests from you." },
- }),
- { status: 400 }
- );
- }
- return new Response(JSON.stringify({ id: "ok", choices: [] }), { status: 200 });
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {},
- log: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
- });
-
- assert.strictEqual(chatCalls, 2, "should retry on the next account after the 400");
- assert.strictEqual(result.response.status, 200);
- const acctA = accountAccess(testExec).accounts[0];
- assert.ok(acctA.cooldownUntil > Date.now(), "first account should be in cooldown");
- assert.strictEqual(acctA.consecutiveFails, 1);
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-
- it("fails fast without rotating on a malformed/generic 400 (#2101)", async () => {
- const testExec = twoAccountExecutor();
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- return new Response(
- JSON.stringify({ error: { message: "Invalid field: foo is not a recognized field" } }),
- { status: 400 }
- );
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {},
- log: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
- });
-
- assert.strictEqual(chatCalls, 1, "must NOT rotate to another account on a malformed 400");
- const acctA = accountAccess(testExec).accounts[0];
- assert.strictEqual(acctA.cooldownUntil, 0, "malformed 400 must not trigger cooldown");
- assert.strictEqual(acctA.consecutiveFails, 0);
-
- const response = result.response;
- assert.strictEqual(response.status, 400);
- const parsed = (await response.json()) as { error: { message: string; code?: string } };
- assert.notStrictEqual(
- parsed.error.code,
- "NO_ACCOUNTS",
- "must surface the real upstream 400, not a generic exhaustion error"
- );
- assert.ok(
- parsed.error.message.toLowerCase().includes("invalid field"),
- `expected the real upstream diagnostic in the error message, got: ${parsed.error.message}`
- );
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-});
-
-describe("mimocode network-error rotation (parity with OpencodeExecutor)", () => {
- function makeJwt(): string {
- const header = Buffer.from(JSON.stringify({ alg: "none" })).toString("base64url");
- const payload = Buffer.from(
- JSON.stringify({ exp: Math.floor(Date.now() / 1000) + 3600 })
- ).toString("base64url");
- return `${header}.${payload}.sig`;
- }
-
- function twoAccountExecutor(proxies: [unknown, unknown]): MimocodeExecutor {
- const exec = new MimocodeExecutor();
- const access = accountAccess(exec);
- access.accounts = [
- {
- fingerprint: "acct-a",
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- proxy: proxies[0],
- },
- {
- fingerprint: "acct-b",
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- proxy: proxies[1],
- },
- ] as TestAccountState[];
- access.nextAccountIdx = 0;
- return exec;
- }
-
- const A_PROXY = { type: "http", host: "127.0.0.1", port: 8080 };
- const B_PROXY = { type: "http", host: "127.0.0.1", port: 8081 };
-
- it("rotates to the next account on a network throw when the failed account has a dedicated proxy", async () => {
- const testExec = twoAccountExecutor([A_PROXY, B_PROXY]);
- // Force both dispatch legs (bootstrap + chat) through the plain `fetch()`
- // fallback instead of a real undici proxy dispatcher β this test exercises
- // the rotation DECISION (account.proxy is configured β rotate), not actual
- // proxy network I/O, which has its own dedicated dispatcher tests below.
- (testExec as unknown as { getProxyDispatcher: () => undefined }).getProxyDispatcher = () =>
- undefined;
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- if (chatCalls === 1) throw new Error("ECONNRESET");
- return new Response(JSON.stringify({ id: "ok", choices: [] }), { status: 200 });
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- const warnCalls: string[] = [];
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {
- providerSpecificData: {
- fingerprints: ["acct-a", "acct-b"],
- accountProxies: [
- { fingerprint: "acct-a", proxy: A_PROXY },
- { fingerprint: "acct-b", proxy: B_PROXY },
- ],
- },
- },
- log: {
- debug: () => {},
- info: () => {},
- warn: (_tag: unknown, msg: string) => warnCalls.push(msg),
- error: () => {},
- },
- });
-
- assert.strictEqual(chatCalls, 2, "should retry on the next account after the throw");
- assert.strictEqual(result.response.status, 200);
- const acctA = accountAccess(testExec).accounts[0];
- assert.ok(acctA.cooldownUntil > Date.now(), "account with a dedicated proxy must cool down");
- assert.ok(
- warnCalls.some((m) => /network error/i.test(m)),
- `expected a "network error" warn log; got=${JSON.stringify(warnCalls)}`
- );
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-
- describe("NETWORK_ROTATION_SHARED_EGRESS_GUARD", () => {
- const FLAG = "NETWORK_ROTATION_SHARED_EGRESS_GUARD";
- let originalEnvValue: string | undefined;
-
- beforeEach(() => {
- originalEnvValue = process.env[FLAG];
- });
-
- afterEach(() => {
- if (originalEnvValue === undefined) delete process.env[FLAG];
- else process.env[FLAG] = originalEnvValue;
- });
-
- it("rotates to a proxied account after a proxy-less account throws (mixed fleet, guard on by default)", async () => {
- const testExec = twoAccountExecutor([null, B_PROXY]);
- // Force both dispatch legs through the plain `fetch()` fallback instead
- // of a real undici proxy dispatcher β this test exercises the rotation
- // DECISION, not actual proxy network I/O.
- (testExec as unknown as { getProxyDispatcher: () => undefined }).getProxyDispatcher = () =>
- undefined;
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- if (chatCalls === 1) throw new Error("ETIMEDOUT");
- return new Response(JSON.stringify({ id: "ok", choices: [] }), { status: 200 });
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {
- providerSpecificData: {
- fingerprints: ["acct-a", "acct-b"],
- accountProxies: [{ fingerprint: "acct-b", proxy: B_PROXY }],
- },
- },
- log: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
- });
-
- assert.strictEqual(chatCalls, 2, "the proxied account (B) must still be tried");
- assert.strictEqual(result.response.status, 200);
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-
- it("makes a single real network call when no account has a configured proxy (guard on by default)", async () => {
- const testExec = twoAccountExecutor([null, null]);
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- throw new Error("ETIMEDOUT");
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {},
- log: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },
- });
-
- assert.strictEqual(
- chatCalls,
- 1,
- "remaining proxy-less accounts must be skipped without a network call once the shared egress is known down"
- );
- assert.strictEqual(result.response.status, 502);
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
-
- it("fails fast without rotating when the guard is disabled (legacy behavior)", async () => {
- process.env[FLAG] = "false";
- const testExec = twoAccountExecutor([null, null]);
- let chatCalls = 0;
- const originalFetch = globalThis.fetch;
- globalThis.fetch = (async (url: unknown) => {
- const urlStr = String(url);
- if (urlStr.includes("/api/free-ai/bootstrap")) {
- return new Response(JSON.stringify({ jwt: makeJwt() }), { status: 200 });
- }
- if (urlStr.includes("/api/free-ai/openai/chat")) {
- chatCalls++;
- throw new Error("ETIMEDOUT");
- }
- throw new Error(`unexpected fetch: ${urlStr}`);
- }) as typeof fetch;
-
- const warnCalls: string[] = [];
- try {
- const result = await testExec.execute({
- model: "mimo-auto",
- body: { messages: [{ role: "user", content: "hi" }], stream: false },
- stream: false,
- signal: null,
- credentials: {},
- log: {
- debug: () => {},
- info: () => {},
- warn: (_tag: unknown, msg: string) => warnCalls.push(msg),
- error: () => {},
- },
- });
-
- assert.strictEqual(
- chatCalls,
- 1,
- "must NOT retry against another account sharing the same egress"
- );
- const acctA = accountAccess(testExec).accounts[0];
- assert.strictEqual(
- acctA.cooldownUntil,
- 0,
- "an account without a dedicated proxy must not be cooled down for a shared-egress failure"
- );
- assert.strictEqual(result.response.status, 502);
- assert.ok(
- warnCalls.some((m) => /network error/i.test(m) && /not rotating/i.test(m)),
- `expected a "network error β¦ not rotating" warn log; got=${JSON.stringify(warnCalls)}`
- );
- } finally {
- globalThis.fetch = originalFetch;
- }
- });
- });
-});
diff --git a/tests/unit/model-capabilities-mimo-vision-override.test.ts b/tests/unit/model-capabilities-mimo-vision-override.test.ts
deleted file mode 100644
index 26dc52c6e5..0000000000
--- a/tests/unit/model-capabilities-mimo-vision-override.test.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * Xiaomi MiMo vision capability β robust override against a wrong synced `attachment`.
- *
- * Per Xiaomi's official docs (mimo.mi.com .../multimodal-understanding/image-understanding)
- * ONLY `mimo-v2.5` and `mimo-v2-omni` accept image input. The `*-pro` chat models
- * (`mimo-v2.5-pro`, `mimo-v2-pro`) and `mimo-v2-flash` are TEXT-ONLY.
- *
- * models.dev mislabels `mimo-v2.5-pro` as attachment-capable (hermes-agent#18884),
- * and `resolveVisionCapability` lets a synced `attachment:true` win first β which would
- * route an image request to a blind model (the #4071 failure mode). A hard override
- * keyed on the documented text-only ids must beat the synced verdict.
- *
- * The discriminator is `attachment`: a synced row sets `attachment` from the seeded
- * value, while the override forces `supportsVision:false` regardless. So a row seeded
- * with `attachment:true` whose `supportsVision` still resolves `false` proves the
- * override β not the synced path β produced the verdict.
- */
-import test from "node:test";
-import assert from "node:assert/strict";
-import fs from "node:fs";
-import os from "node:os";
-import path from "node:path";
-
-const TEST_DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-mimo-vision-"));
-process.env.DATA_DIR = TEST_DATA_DIR;
-
-const core = await import("../../src/lib/db/core.ts");
-const modelsDevSync = await import("../../src/lib/modelsDevSync.ts");
-const modelCapabilities = await import("../../src/lib/modelCapabilities.ts");
-
-function buildCapability(overrides = {}) {
- return {
- tool_call: null,
- reasoning: null,
- attachment: null,
- structured_output: null,
- temperature: null,
- modalities_input: "[]",
- modalities_output: "[]",
- knowledge_cutoff: null,
- release_date: null,
- last_updated: null,
- status: null,
- family: null,
- open_weights: null,
- limit_context: null,
- limit_input: null,
- limit_output: null,
- interleaved_field: null,
- ...overrides,
- };
-}
-
-function resetStorage() {
- core.resetDbInstance();
- fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true });
- fs.mkdirSync(TEST_DATA_DIR, { recursive: true });
-}
-
-// Mirror the WRONG models.dev `xiaomi-mimo` keying: the text-only `*-pro` chat models
-// carry attachment:true (the upstream mislabel), while the genuinely multimodal
-// `mimo-v2.5` / `mimo-v2-omni` correctly carry attachment:true too.
-function seedMimoCapabilities() {
- modelsDevSync.saveModelsDevCapabilities({
- "xiaomi-mimo": {
- "mimo-v2.5-pro": buildCapability({
- attachment: true, // upstream mislabel β must be overridden to text-only
- modalities_input: JSON.stringify(["text", "image"]),
- modalities_output: JSON.stringify(["text"]),
- status: "stable",
- }),
- "mimo-v2-pro": buildCapability({
- attachment: true, // upstream mislabel β must be overridden to text-only
- modalities_input: JSON.stringify(["text", "image"]),
- modalities_output: JSON.stringify(["text"]),
- status: "stable",
- }),
- "mimo-v2.5": buildCapability({
- attachment: true, // genuinely multimodal β must stay vision-capable
- modalities_input: JSON.stringify(["text", "image", "audio", "video"]),
- modalities_output: JSON.stringify(["text"]),
- status: "stable",
- }),
- "mimo-v2-omni": buildCapability({
- attachment: true, // genuinely multimodal β must stay vision-capable
- modalities_input: JSON.stringify(["text", "image", "audio", "video"]),
- modalities_output: JSON.stringify(["text"]),
- status: "stable",
- }),
- },
- });
-}
-
-test.beforeEach(() => {
- resetStorage();
-});
-
-test.after(() => {
- core.resetDbInstance();
- fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true });
-});
-
-test("mimo-v2.5-pro stays text-only even when models.dev says attachment:true", () => {
- seedMimoCapabilities();
- const pro = modelCapabilities.getResolvedModelCapabilities("xiaomi-mimo/mimo-v2.5-pro");
- // attachment is the seeded synced value, but the override forces vision false.
- assert.equal(pro.attachment, true, "synced attachment row is present (proves override, not absence)");
- assert.equal(pro.supportsVision, false, "text-only override must beat the wrong synced attachment");
-});
-
-test("mimo-v2-pro stays text-only even when models.dev says attachment:true", () => {
- seedMimoCapabilities();
- const pro = modelCapabilities.getResolvedModelCapabilities("xiaomi-mimo/mimo-v2-pro");
- assert.equal(pro.supportsVision, false, "text-only override must beat the wrong synced attachment");
-});
-
-test("genuinely multimodal mimo models keep vision (override is precise, not broad)", () => {
- seedMimoCapabilities();
- const v25 = modelCapabilities.getResolvedModelCapabilities("xiaomi-mimo/mimo-v2.5");
- const omni = modelCapabilities.getResolvedModelCapabilities("xiaomi-mimo/mimo-v2-omni");
- assert.equal(v25.supportsVision, true, "mimo-v2.5 is multimodal β must NOT be caught by the override");
- assert.equal(omni.supportsVision, true, "mimo-v2-omni is multimodal β must NOT be caught by the override");
-});
-
-test("the bare (unqualified) text-only id is also overridden", () => {
- seedMimoCapabilities();
- // No provider prefix β exercises the `^...$` branch of the override regex.
- const bare = modelCapabilities.getResolvedModelCapabilities("mimo-v2.5-pro");
- assert.equal(bare.supportsVision, false, "bare text-only id must also be overridden");
-});
diff --git a/tests/unit/noauth-provider-validation.test.ts b/tests/unit/noauth-provider-validation.test.ts
index 8c053aef0e..446dec8ded 100644
--- a/tests/unit/noauth-provider-validation.test.ts
+++ b/tests/unit/noauth-provider-validation.test.ts
@@ -17,7 +17,6 @@ import { hasSpecializedExecutor } from "../../open-sse/executors/index.ts";
for (const provider of [
"theoldllm",
"chipotle",
- "mimocode",
"opencode",
"duckduckgo-web",
"veoaifree-web",
diff --git a/tests/unit/provider-registry-models-guard.test.ts b/tests/unit/provider-registry-models-guard.test.ts
index fccef44235..7b220ffc7b 100644
--- a/tests/unit/provider-registry-models-guard.test.ts
+++ b/tests/unit/provider-registry-models-guard.test.ts
@@ -4,20 +4,16 @@ import { getUnsupportedParams } from "../../open-sse/config/providerRegistry.ts"
// Regression guard for `TypeError: entry.models is not iterable`.
//
-// A registry entry can legitimately have no static model catalogue β e.g. the
-// `mimocode` proxy provider, whose `models` is `undefined`. The byModelId map
-// builder already tolerates this (`if (entry.models && entry.models.length > 0)`),
+// A registry entry can legitimately have no static model catalogue β e.g. a
+// proxy provider whose `models` is `undefined`. The byModelId map builder
+// already tolerates this (`if (entry.models && entry.models.length > 0)`),
// but `getUnsupportedParams` had two unguarded accesses:
// - `ensureUnsupportedParamsPopulated()` iterated `entry.models` for EVERY entry,
// - the per-provider lookup did `entry?.models.find(...)`.
// Either one threw on the first call once a model-less entry existed, which made
// `handleChatCore` report "All models failed" for unrelated requests.
-test("getUnsupportedParams does not throw when a registry entry has no models (mimocode regression)", () => {
+test("getUnsupportedParams does not throw when a registry entry has no models", () => {
// This call triggers ensureUnsupportedParamsPopulated() which walks ALL entries.
assert.doesNotThrow(() => getUnsupportedParams("openai", "gpt-4o"));
});
-
-test("getUnsupportedParams returns [] for a model-less proxy provider", () => {
- assert.deepEqual(getUnsupportedParams("mimocode", "anything"), []);
-});
diff --git a/tests/unit/proxy-assigned-unavailable-6246.test.ts b/tests/unit/proxy-assigned-unavailable-6246.test.ts
index a3ca79e3e4..396949108e 100644
--- a/tests/unit/proxy-assigned-unavailable-6246.test.ts
+++ b/tests/unit/proxy-assigned-unavailable-6246.test.ts
@@ -149,10 +149,10 @@ test("BLOCKS: a dead no-auth provider proxy assignment", async () => {
port: 9005,
});
await proxiesDb.updateProxy(proxy!.id, { status: "inactive" });
- await proxiesDb.assignProxyToScope("provider", "mimocode", proxy!.id);
+ await proxiesDb.assignProxyToScope("provider", "opencode", proxy!.id);
assert.equal(
- proxiesDb.hasBlockingProxyAssignment("noauth", "mimocode"),
+ proxiesDb.hasBlockingProxyAssignment("noauth", "opencode"),
true,
"a dead no-auth provider proxy must block instead of allowing direct egress"
);
diff --git a/tests/unit/proxy-noauth-provider-6272.test.ts b/tests/unit/proxy-noauth-provider-6272.test.ts
index 314928443f..610caa4214 100644
--- a/tests/unit/proxy-noauth-provider-6272.test.ts
+++ b/tests/unit/proxy-noauth-provider-6272.test.ts
@@ -20,29 +20,29 @@ test.after(async () => {
else process.env.INITIAL_PASSWORD = ORIGINAL_INITIAL_PASSWORD;
});
-test("#6272: resolveProxyForConnection('noauth', ...) honors a provider-level proxy assigned to 'mimocode'", async () => {
+test("#6272: resolveProxyForConnection('noauth', ...) honors a provider-level proxy assigned to 'opencode'", async () => {
core.getDbInstance();
const proxy = { type: "http", host: "127.0.0.1", port: 8888 };
// Reporter's second symptom: "same thing happen when i set the proxy directly
- // in the provider menu" -> assign a provider-scoped proxy to the mimocode
- // provider id, the way Settings -> Providers -> mimocode would persist it.
- await settingsDb.setProxyForLevel("provider", "mimocode", proxy);
+ // in the provider menu" -> assign a provider-scoped proxy to the opencode
+ // provider id, the way Settings -> Providers -> opencode would persist it.
+ await settingsDb.setProxyForLevel("provider", "opencode", proxy);
const resolved = await settingsDb.resolveProxyForConnection("noauth", undefined);
assert.equal(
resolved?.proxy?.host,
"127.0.0.1",
- `expected the mimocode provider-level proxy to be honored, got level=${resolved?.level} proxy=${JSON.stringify(resolved?.proxy)}`
+ `expected the opencode provider-level proxy to be honored, got level=${resolved?.level} proxy=${JSON.stringify(resolved?.proxy)}`
);
assert.equal(resolved?.level, "provider");
- assert.equal(resolved?.levelId, "mimocode");
+ assert.equal(resolved?.levelId, "opencode");
});
test("control: resolveProxyForConnection('noauth', ...) still honors the GLOBAL proxy when no no-auth provider proxy is set", async () => {
core.getDbInstance();
- await settingsDb.deleteProxyForLevel("provider", "mimocode");
+ await settingsDb.deleteProxyForLevel("provider", "opencode");
const proxy = { type: "http", host: "10.0.0.1", port: 9999 };
await settingsDb.setProxyForLevel("global", null, proxy);
@@ -54,7 +54,7 @@ test("control: resolveProxyForConnection('noauth', ...) still honors the GLOBAL
test("resolveProxyForConnection keeps provider-level no-auth proxies isolated", async () => {
core.getDbInstance();
await settingsDb.deleteProxyForLevel("global", null);
- await settingsDb.setProxyForLevel("provider", "mimocode", {
+ await settingsDb.setProxyForLevel("provider", "opencode", {
type: "http",
host: "127.0.0.2",
port: 8889,
@@ -65,16 +65,16 @@ test("resolveProxyForConnection keeps provider-level no-auth proxies isolated",
port: 8890,
});
- const mimocode = await settingsDb.resolveProxyForConnection("noauth", undefined, "mimocode");
+ const opencode = await settingsDb.resolveProxyForConnection("noauth", undefined, "opencode");
const theOldLlm = await settingsDb.resolveProxyForConnection("noauth", undefined, "theoldllm");
- assert.equal(mimocode?.proxy?.host, "127.0.0.2");
+ assert.equal(opencode?.proxy?.host, "127.0.0.2");
assert.equal(theOldLlm?.proxy?.host, "127.0.0.3");
});
test("safeResolveProxy keeps the synthetic no-auth connection provider-specific", async () => {
core.getDbInstance();
- await settingsDb.setProxyForLevel("provider", "mimocode", {
+ await settingsDb.setProxyForLevel("provider", "opencode", {
type: "http",
host: "127.0.0.4",
port: 8891,
@@ -85,9 +85,9 @@ test("safeResolveProxy keeps the synthetic no-auth connection provider-specific"
port: 8892,
});
- const mimocode = await safeResolveProxy("noauth", undefined, "mimocode");
+ const opencode = await safeResolveProxy("noauth", undefined, "opencode");
const theOldLlm = await safeResolveProxy("noauth", undefined, "theoldllm");
- assert.equal(mimocode?.proxy?.host, "127.0.0.4");
+ assert.equal(opencode?.proxy?.host, "127.0.0.4");
assert.equal(theOldLlm?.proxy?.host, "127.0.0.5");
});
diff --git a/tests/unit/rotation-config-omniroute.test.ts b/tests/unit/rotation-config-omniroute.test.ts
index 0c172b758d..8177eb7d5c 100644
--- a/tests/unit/rotation-config-omniroute.test.ts
+++ b/tests/unit/rotation-config-omniroute.test.ts
@@ -165,7 +165,7 @@ test("integration: 400 with rate-limit text still falls over under default confi
"Detected high-frequency non-compliant requests from you.",
0,
null,
- "mimocode"
+ "opencode"
);
assert.equal(res.shouldFallback, true);
clearEnv();
diff --git a/tests/unit/ts7-executor-shared-shapes.test.ts b/tests/unit/ts7-executor-shared-shapes.test.ts
index 98a2fdd077..75591cb9d0 100644
--- a/tests/unit/ts7-executor-shared-shapes.test.ts
+++ b/tests/unit/ts7-executor-shared-shapes.test.ts
@@ -2,7 +2,6 @@ import { describe, it } from "node:test";
import assert from "node:assert/strict";
const { OpencodeExecutor } = await import("../../open-sse/executors/opencode.ts");
-const { MimocodeExecutor } = await import("../../open-sse/executors/mimocode.ts");
/**
* Behavioral guards for the three type-only fixes in the TS 7 executor slice
@@ -78,68 +77,3 @@ describe("OpencodeExecutor β tools truncation survives the narrowing fix", ()
});
});
-describe("MimocodeExecutor β AccountState.proxy is always present (#3837/#5521)", () => {
- const FP = "fingerprint-1";
-
- function accountsOf(exec: unknown): Array> {
- return (exec as { accounts: Array> }).accounts;
- }
-
- function sync(exec: unknown, credentials: unknown): void {
- (exec as { syncAccountsFromCredentials(c: unknown): void }).syncAccountsFromCredentials(
- credentials
- );
- }
-
- it("defaults proxy to null β not undefined β when no accountProxies are configured", () => {
- const exec = new MimocodeExecutor();
- accountsOf(exec).length = 0;
- accountsOf(exec).push({
- fingerprint: FP,
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- });
-
- sync(exec, { providerSpecificData: {} });
-
- const account = accountsOf(exec)[0];
- assert.ok("proxy" in account, "every account must expose a proxy key");
- assert.equal(account.proxy, null, "unconfigured proxy is null, never undefined");
- });
-
- it("resolves a configured proxy onto the matching account", () => {
- const exec = new MimocodeExecutor();
- accountsOf(exec).length = 0;
- accountsOf(exec).push({
- fingerprint: FP,
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- });
-
- const proxy = { type: "http", host: "p1.example.com", port: 1080 };
- sync(exec, { providerSpecificData: { accountProxies: [{ fingerprint: FP, proxy }] } });
-
- assert.deepEqual(accountsOf(exec)[0].proxy, proxy);
- });
-
- it("clears a previously-resolved proxy back to null when config drops it", () => {
- const exec = new MimocodeExecutor();
- accountsOf(exec).length = 0;
- accountsOf(exec).push({
- fingerprint: FP,
- jwt: "",
- expiresAt: 0,
- cooldownUntil: 0,
- consecutiveFails: 0,
- proxy: { type: "http", host: "stale.example.com", port: 8080 },
- });
-
- sync(exec, { providerSpecificData: { accountProxies: [] } });
-
- assert.equal(accountsOf(exec)[0].proxy, null, "a removed proxy must not linger on the account");
- });
-});