diff --git a/AGENTS.md b/AGENTS.md index 9125c81bde..9aa55711f9 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, 353 LLM providers, auto-fallback. +**OmniRoute** — unified AI proxy/router. One endpoint, 354 LLM providers, auto-fallback. | Layer | Location | Purpose | | ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/changelog.d/features/nimble-search-and-fetch.md b/changelog.d/features/nimble-search-and-fetch.md new file mode 100644 index 0000000000..19e00236c5 --- /dev/null +++ b/changelog.d/features/nimble-search-and-fetch.md @@ -0,0 +1 @@ +- **feat(providers):** add **Nimble** as a web-search and web-fetch provider (`nimble-search`) — `/v1/search` routes to Nimble's search API at `lite` depth (locale, freshness and include/exclude domain filters mapped onto the shared request contract), and `/v1/web/fetch` routes to Nimble Extract, which covers all four fetch formats (`markdown`, `html`, `links`, `screenshot`) from a single call. One API key serves both surfaces. diff --git a/docs/diagrams/cli-terminal.svg b/docs/diagrams/cli-terminal.svg index de14a77a83..6afc0d5f55 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 5b47c72b02..424063e3da 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 5961498152..0ef496bee6 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. 353 providers. Never stop building — OmniRoute picks the cheapest one that works. + One endpoint. 354 providers. Never stop building — OmniRoute picks the cheapest one that works. @@ -38,7 +38,7 @@ Never hit limits - Auto-fallback across 353 providers in + Auto-fallback across 354 providers in milliseconds. Quota out? The next provider takes over while a healthy target remains. diff --git a/docs/diagrams/readme-hero.svg b/docs/diagrams/readme-hero.svg index 314c402c6c..876ec8ab24 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 → 353 providers90+ free — through one endpoint. + Every AI tool → 354 providers90+ free — through one endpoint. Claude Code · Codex · Cursor · Cline · Copilot · Antigravity  →  FREE Claude / GPT / Gemini · auto-fallback diff --git a/docs/frameworks/SEARCH_TOOLS_STUDIO.md b/docs/frameworks/SEARCH_TOOLS_STUDIO.md index 3b4148894a..ce38c75b5c 100644 --- a/docs/frameworks/SEARCH_TOOLS_STUDIO.md +++ b/docs/frameworks/SEARCH_TOOLS_STUDIO.md @@ -57,7 +57,7 @@ New tab for extracting content from a URL via `POST /v1/web/fetch` (created in p - Submit → fetch → render `ScrapeResult.tsx`. - `ScrapeResult` renders markdown preview + raw toggle. - Cap: if response body > **256 KB**, UI shows `(truncated, view raw)` and opens raw in a Monaco modal (D21). -- Metadata panel: provider (firecrawl/jina-reader/tavily-search/tinyfish), latency, cost, response size, links count. +- Metadata panel: provider (firecrawl/jina-reader/tavily-search/tinyfish/nimble-search), latency, cost, response size, links count. - Uses `useScrapeFetch.ts` hook. ### Compare Tab @@ -108,7 +108,7 @@ Runs the same query/URL across up to **4 providers in parallel** (D22): | Field | Source | | ------------------------------ | ------------------------------------------------------------------------------------------ | | `id`, `name` | `searchRegistry.ts` | -| `kind` | `"search"` (12 providers) or `"fetch"` (firecrawl, jina-reader, tavily-search, tinyfish) | +| `kind` | `"search"` or `"fetch"` (firecrawl, jina-reader, tavily-search, tinyfish, nimble-search) | | `costPerQuery` | Registry data | | `freeMonthlyQuota` | Registry data | | `searchTypes` / `fetchFormats` | Registry data | @@ -136,7 +136,7 @@ Only one backend change was needed for this feature: `src/app/api/search/providers/route.ts` was extended to: -- Include all 4 fetch providers (`firecrawl`, `jina-reader`, `tavily-search`, `tinyfish`) in the array. +- Include every fetch provider (`firecrawl`, `jina-reader`, `tavily-search`, `tinyfish`, `nimble-search`) in the array. - Add `kind: "search" | "fetch"` to every item. - Add `status: "configured" | "missing" | "rate_limited"` derived from live credential state. - Maintain backward compatibility — existing fields (`id`, `name`, etc.) unchanged. diff --git a/docs/i18n/ar/llm.txt b/docs/i18n/ar/llm.txt index faaaa06f52..2dbe71864e 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 ae921291b8..054020c43b 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 ae921291b8..054020c43b 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 da1776cf11..18a76151e2 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 1943316a16..feb4e8796b 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 36956ae143..f288791fcc 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 374e921282..816742a918 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 6e221d5ab9..903429413c 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 7b93e8c2cd..e0167311e9 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 79ee3db823..ddc34b735d 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 d5e18b623c..1d6f25ac12 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 d5bde1182d..cf41c615e7 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 e36d452f8d..cd6ad49786 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 2a93f243d8..358d26c58e 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 0361420820..bbd909352a 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 7a13e12fc0..081499553e 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 26462e236f..621f7a2481 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 9befb245ce..e01119cb0a 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 baa11fb0bc..1f8fe1fad2 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 52973b36b3..9bd70455ce 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 def12270db..45a20b43f0 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 b48309d622..0665eedd15 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 c8e452841d..48bcd69723 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 392171abb8..322933416a 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 3a37a20c9b..7044cfee8c 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 47813f6b03..ee625426f5 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 ff066cc5b3..30c5d484a9 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 4b6696ecb7..585a4026a2 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 9b39159818..b1a367ee62 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 4fb0d9fdf9..306180a394 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 dda1364913..ba6a51efe4 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 523f857f38..b2a1708c2d 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 1f087222ea..aba4faf418 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 85c8f5410b..4a4bd9b9cb 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 0b1a26ae0c..6f17925e35 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 9c1344d863..6dff129e8c 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 6531b36c1d..d5d206100f 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 161ba2e6d9..45eab3e4b7 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 6470aa5146..a6cb231b0d 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 7ddc94f42e..85fa36e1c2 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 d54dc09001..24a6255f0e 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 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 f1cd7d39f7..c3f0fac0b6 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -281,7 +281,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) diff --git a/docs/reference/API_REFERENCE.md b/docs/reference/API_REFERENCE.md index 1b71551e37..7a924cf9b1 100644 --- a/docs/reference/API_REFERENCE.md +++ b/docs/reference/API_REFERENCE.md @@ -529,7 +529,7 @@ Web/search provider abstraction (Tavily, Brave, Exa, Serper, etc.). ## Web Fetch API Extract content from a URL via a configured web-fetch provider (Firecrawl, Jina -Reader, Tavily Extract, TinyFish Fetch). +Reader, Tavily Extract, TinyFish Fetch, Nimble Extract). | Method | Path | Description | | ------ | --------------- | --------------------------------------------------------- | @@ -538,7 +538,8 @@ Reader, Tavily Extract, TinyFish Fetch). **Auth:** Bearer API key (`extractApiKey` + `isValidApiKey`). Policy enforced via `enforceApiKeyPolicy`. **Quota-aware fallback (#8297):** when no explicit `provider` is given, the pool -(`firecrawl` → `jina-reader` → `tavily-search` → `tinyfish`) is walked in fixed +(`firecrawl` → `jina-reader` → `tavily-search` → `tinyfish` → `nimble-search`) is +walked in fixed priority order (fill-first) — a rate-limited-but-configured provider is skipped instead of short-circuiting the request, and a retryable/quota upstream failure (HTTP 429 always; 402/403 for Firecrawl/Tavily/TinyFish quota-style free tiers — @@ -661,11 +662,21 @@ refusal. On success: { "allowed": true, // present only when the key opted into per-key usage limits (daily/weekly USD): - "personal": { "dailySpentUsd": 1.25, "dailyLimitUsd": 5, "dailyResetAtIso": "…", "weeklySpentUsd": 8, "weeklyLimitUsd": 20, "weeklyResetAtIso": "…" /* … */ }, + "personal": { + "dailySpentUsd": 1.25, + "dailyLimitUsd": 5, + "dailyResetAtIso": "…", + "weeklySpentUsd": 8, + "weeklyLimitUsd": 20, + "weeklyResetAtIso": "…" /* … */, + }, // the selected provider quota snapshot, or null when nothing is cached yet: - "provider": { "connectionId": "…", "provider": "claude", "plan": "…", "quotas": { /* … */ } }, + "provider": { "connectionId": "…", "provider": "claude", "plan": "…", "quotas": {/* … */} }, // every connection's snapshot, so a UI can render several providers side by side: - "providers": [ { "connectionId": "…", "provider": "claude", /* … */ }, { "provider": "codex", /* … */ } ] + "providers": [ + { "connectionId": "…", "provider": "claude" /* … */ }, + { "provider": "codex" /* … */ }, + ], } ``` @@ -674,7 +685,7 @@ On refusal (`401` bad key / `403` not allowed) the same route returns (key allowed, nothing learned yet) is a different state from a refusal, and only the JSON form distinguishes them. -**Auth:** the caller's own Bearer API key, validated with `isValidApiKey` — this is *not* the +**Auth:** the caller's own Bearer API key, validated with `isValidApiKey` — this is _not_ the management surface (`/api/keys/…`), which stays behind `requireManagementAuth`. --- diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md index a7b75ae1e5..13e1d9ae3e 100644 --- a/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/reference/PROVIDER_REFERENCE.md @@ -380,7 +380,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `vllm` | `vllm` | vLLM | Local, self-hosted | [link](https://github.com/vllm-project/vllm) | API key optional. Configure the local vLLM OpenAI-compatible base URL (default: http://localhost:8000/v1). | | `xinference` | `xinference` | XInference | Local, self-hosted | [link](https://inference.readthedocs.io) | API key optional. Configure the local XInference OpenAI-compatible base URL (default: http://localhost:9997/v1). | -## Search Providers (15) +## Search Providers (16) | ID | Alias | Name | Tags | Website | Notes | |----|-------|------|------|---------|-------| @@ -390,6 +390,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `firecrawl` | `fc` | Firecrawl | Search | [link](https://firecrawl.dev) | API key from firecrawl.dev/app/api-keys (or set your self-hosted Firecrawl base URL) | | `google-pse-search` | `google-pse` | Google Programmable Search | Search | [link](https://developers.google.com/custom-search/v1/overview) | Requires a Google API key and your Programmable Search Engine ID (cx) | | `linkup-search` | `linkup` | Linkup Search | Search | [link](https://docs.linkup.so) | Bearer API key from the Linkup dashboard | +| `nimble-search` | `nimble` | Nimble Search | Search | [link](https://docs.nimbleway.com/nimble-sdk/web-tools/search) | Bearer API key from the Nimble dashboard | | `ollama-search` | `ollama-search` | Ollama Search | Search | [link](https://ollama.com/settings/keys) | Same API key as Ollama Cloud (from ollama.com/settings/keys) | | `perplexity-search` | `pplx-search` | Perplexity Search | Search | [link](https://docs.perplexity.ai/guides/search-quickstart) | Same API key as Perplexity (pplx-...) | | `searchapi-search` | `searchapi` | SearchAPI | Search | [link](https://www.searchapi.io/docs/google) | API key from SearchAPI (query param or Bearer auth) | @@ -442,7 +443,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/) (109 implementations) +- Executors: [`open-sse/executors/`](../../open-sse/executors/) (110 implementations) - Translators: [`open-sse/translator/`](../../open-sse/translator/) ## See Also diff --git a/llm.txt b/llm.txt index 3300a73ed1..accc240e9f 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 353 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> 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 354 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -277,7 +277,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **353 AI providers** with automatic format translation +- **354 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 -- **353-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **354-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 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) diff --git a/open-sse/config/nimble.ts b/open-sse/config/nimble.ts new file mode 100644 index 0000000000..52e5ae7c30 --- /dev/null +++ b/open-sse/config/nimble.ts @@ -0,0 +1,17 @@ +/** + * Nimble shared client constants. + * + * Nimble asks every integration to identify itself with a stable client-source + * header so calls can be attributed to the host product. Both Nimble surfaces + * in OmniRoute — search (`POST /v1/search`, wired in open-sse/handlers/search.ts) + * and fetch (`POST /v1/extract`, open-sse/executors/nimble-fetch.ts) — send it, + * and both read the value from here so the two can never drift apart. + * + * Docs: https://docs.nimbleway.com/api-reference/introduction + */ + +/** Header Nimble uses to attribute a request to the calling product. */ +export const NIMBLE_CLIENT_SOURCE_HEADER = "X-Client-Source"; + +/** The value OmniRoute sends. Do not vary it per surface or per request. */ +export const NIMBLE_CLIENT_SOURCE = "omniroute"; diff --git a/open-sse/config/searchRegistry.ts b/open-sse/config/searchRegistry.ts index 6776874ef9..9a13179204 100644 --- a/open-sse/config/searchRegistry.ts +++ b/open-sse/config/searchRegistry.ts @@ -116,6 +116,27 @@ export const SEARCH_PROVIDERS: Record = { cacheTTLMs: 5 * 60 * 1000, }, + // Nimble also serves POST /v1/web/fetch through the same credential — see + // open-sse/executors/nimble-fetch.ts. + "nimble-search": { + id: "nimble-search", + name: "Nimble Search", + baseUrl: "https://sdk.nimbleway.com/v1/search", + method: "POST", + authType: "apikey", + authHeader: "bearer", + costPerQuery: 0.005, + freeMonthlyQuota: 0, + searchTypes: ["web", "news"], + defaultMaxResults: 5, + maxMaxResults: 100, + // Kept below GLOBAL_TIMEOUT_MS (handlers/search.ts) so a stalled Nimble call + // still leaves budget for the failover provider instead of burning the whole + // request window. + timeoutMs: 10_000, + cacheTTLMs: 5 * 60 * 1000, + }, + firecrawl: { id: "firecrawl", name: "Firecrawl", diff --git a/open-sse/executors/nimble-fetch.ts b/open-sse/executors/nimble-fetch.ts new file mode 100644 index 0000000000..949c5f1aab --- /dev/null +++ b/open-sse/executors/nimble-fetch.ts @@ -0,0 +1,222 @@ +/** + * Nimble Web Fetch Executor + * + * Fetches content from a URL using the Nimble Extract API. + * POST https://sdk.nimbleway.com/v1/extract + * + * Extract returns the requested formats side by side under `data`, so one call + * covers every OmniRoute fetch format: `markdown`, `html`, `links` and + * `screenshot` (base64 PNG, surfaced as a data URL). + * + * Docs: https://docs.nimbleway.com/nimble-sdk/web-tools/extract/quickstart + */ + +import { sanitizeErrorMessage, buildErrorBody } from "../utils/error.ts"; +import { NIMBLE_CLIENT_SOURCE, NIMBLE_CLIENT_SOURCE_HEADER } from "../config/nimble.ts"; +import type { WebFetchResult, WebFetchFormat, WebFetchCredentials } from "../handlers/webFetch.ts"; + +const NIMBLE_EXTRACT_URL = "https://sdk.nimbleway.com/v1/extract"; +const NIMBLE_TIMEOUT_MS = 30_000; + +/** Max characters kept from an HTML / meta description. */ +const META_MAX_CHARS = 500; + +// These run over untrusted upstream HTML, so every quantifier is over a character +// class that cannot cross its own terminator — no backtracking (see AGENTS.md → +// "Regex Security"). Length is capped by META_MAX_CHARS after the match, not by the +// quantifier: bounding the capture instead would make an over-long title fail to +// match at all rather than truncate. +const TITLE_RE = /]{0,200}>([^<]*)<\/title>/i; +// One pattern per quote style. A shared ["'] class for the closing delimiter would +// cut a double-quoted description at its first apostrophe ("Don't miss…" → "Don"). +const META_DESCRIPTION_DOUBLE_RE = + /]{0,200}name=["']description["'][^>]{0,200}content="([^"]*)"/i; +const META_DESCRIPTION_SINGLE_RE = + /]{0,200}name=["']description["'][^>]{0,200}content='([^']*)'/i; + +/** Map an OmniRoute fetch format onto the Nimble Extract format name. */ +function mapFormat(format: WebFetchFormat): string { + switch (format) { + case "html": + return "html"; + case "links": + return "links"; + case "screenshot": + return "screenshot"; + case "markdown": + default: + return "markdown"; + } +} + +function readString(source: Record, key: string): string { + const value = source[key]; + return value != null ? String(value) : ""; +} + +/** + * Pull a title / description out of raw HTML. + * Extract has no dedicated metadata format, so metadata is only available when + * the caller asked for it and we requested `html` alongside their format. + */ +function parseHtmlMetadata(html: string): { title: string | null; description: string | null } { + if (!html) return { title: null, description: null }; + + const title = TITLE_RE.exec(html)?.[1]?.trim().slice(0, META_MAX_CHARS); + const rawDescription = + META_DESCRIPTION_DOUBLE_RE.exec(html)?.[1] ?? META_DESCRIPTION_SINGLE_RE.exec(html)?.[1]; + const description = rawDescription?.trim().slice(0, META_MAX_CHARS); + + return { + title: title ? title : null, + description: description ? description : null, + }; +} + +interface NimbleFetchOptions { + url: string; + format: WebFetchFormat; + includeMetadata: boolean; + credentials: WebFetchCredentials; +} + +/** + * Execute a Nimble Extract request. + */ +export async function nimbleFetch(opts: NimbleFetchOptions): Promise { + const { url, format, includeMetadata, credentials } = opts; + + if (!credentials.apiKey) { + const body = buildErrorBody(401, "Nimble API key required"); + return { success: false, status: 401, error: body.error.message }; + } + + const requested = mapFormat(format); + + // `links` always comes back so WebFetchResponse.links is populated; `html` is + // added only when the caller asked for metadata, since it is the sole source + // of a page title/description. + const formats = [...new Set([requested, "links", ...(includeMetadata ? ["html"] : [])])]; + + const requestBody: Record = { + url, + formats, + // Extract types `render` as `boolean | "auto"`; "auto" lets Nimble select the + // driver per target domain rather than forcing a browser on every static page. + render: "auto", + }; + + const controller = new AbortController(); + const timeoutId = setTimeout(() => { + const err = new Error(`nimble-fetch timeout after ${NIMBLE_TIMEOUT_MS}ms`); + err.name = "TimeoutError"; + controller.abort(err); + }, NIMBLE_TIMEOUT_MS); + + try { + const response = await fetch(NIMBLE_EXTRACT_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${credentials.apiKey}`, + [NIMBLE_CLIENT_SOURCE_HEADER]: NIMBLE_CLIENT_SOURCE, + }, + body: JSON.stringify(requestBody), + signal: controller.signal, + }); + + if (!response.ok) { + // Nimble returns a plain-text body on auth failures, so this must be + // sanitized before it can reach a response. + const rawError = await response.text().catch(() => `HTTP ${response.status}`); + const msg = sanitizeErrorMessage(`Nimble error ${response.status}: ${rawError}`); + const body = buildErrorBody(response.status, msg); + return { success: false, status: response.status, error: body.error.message }; + } + + const payload = (await response.json()) as Record; + + // A 200 can still carry a failed extraction — Extract reports the target's own + // outcome in the envelope. Without this the caller would get an empty document + // marked successful, and the pool in /v1/web/fetch would never fall through to + // the next provider. + const taskStatus = typeof payload.status === "string" ? payload.status : ""; + const taskStatusCode = typeof payload.status_code === "number" ? payload.status_code : null; + if ( + (taskStatus && taskStatus !== "success") || + (taskStatusCode !== null && taskStatusCode >= 400) + ) { + const detail = taskStatus || `status ${taskStatusCode}`; + const msg = sanitizeErrorMessage(`Nimble extraction did not succeed: ${detail}`); + const body = buildErrorBody(502, msg); + return { success: false, status: 502, error: body.error.message }; + } + + const data = (payload.data as Record | null) ?? {}; + + const rawLinks = data.links; + const links: string[] = Array.isArray(rawLinks) ? rawLinks.map((l) => String(l)) : []; + + const screenshot = readString(data, "screenshot"); + const screenshotUrl = + format === "screenshot" && screenshot + ? screenshot.startsWith("data:") + ? screenshot + : `data:image/png;base64,${screenshot}` + : null; + + // The requested format must actually be present. An absent key means Extract + // succeeded but produced nothing for what the caller asked for; returning an + // empty document as a success would stop /v1/web/fetch from trying the next + // provider. An empty *value* is legitimate (a genuinely blank page) and passes. + if (!(requested in data)) { + const msg = sanitizeErrorMessage(`Nimble returned no ${requested} content for the request`); + const body = buildErrorBody(502, msg); + return { success: false, status: 502, error: body.error.message }; + } + + let content: string; + switch (format) { + case "html": + content = readString(data, "html"); + break; + case "links": + content = JSON.stringify(links); + break; + case "screenshot": + content = ""; + break; + case "markdown": + default: + content = readString(data, "markdown"); + break; + } + + const metadata = includeMetadata ? parseHtmlMetadata(readString(data, "html")) : null; + + return { + success: true, + data: { + provider: "nimble-search", + url, + content, + links, + metadata, + screenshot_url: screenshotUrl, + }, + }; + } catch (err: unknown) { + // The abort reason above is named "TimeoutError"; an external abort surfaces as + // "AbortError". Both must reach the 504 branch. + if (err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError")) { + const body = buildErrorBody(504, "Nimble request timed out"); + return { success: false, status: 504, error: body.error.message }; + } + const msg = + err instanceof Error ? sanitizeErrorMessage(err.message) : sanitizeErrorMessage(String(err)); + const body = buildErrorBody(502, msg); + return { success: false, status: 502, error: body.error.message }; + } finally { + clearTimeout(timeoutId); + } +} diff --git a/open-sse/handlers/search.ts b/open-sse/handlers/search.ts index 3e571a53fa..62d76ac35c 100644 --- a/open-sse/handlers/search.ts +++ b/open-sse/handlers/search.ts @@ -24,6 +24,7 @@ import { isUnconfiguredLoopbackSearchProvider, type SearchProviderConfig, } from "../config/searchRegistry.ts"; +import { NIMBLE_CLIENT_SOURCE, NIMBLE_CLIENT_SOURCE_HEADER } from "../config/nimble.ts"; import { buildPerplexityRequest, parsePerplexitySearchOptions } from "./search/perplexitySearch.ts"; import * as fcSearch from "./search/firecrawlSearch.ts"; import { type FirecrawlSearchEnvelope } from "./search/firecrawlSearch.ts"; @@ -475,6 +476,38 @@ function buildTavilyRequest( }; } +function buildNimbleRequest( + config: SearchProviderConfig, + params: SearchRequestParams +): { url: string; init: RequestInit } { + if (!params.token) throw new Error("Nimble Search requires an API key"); + const { includes, excludes } = parseDomainFilter(params.domainFilter); + const body: Record = { + query: params.query, + max_results: Math.min(params.maxResults, config.maxMaxResults), + search_depth: "lite", + output_format: "plain_text", + focus: params.searchType === "news" ? "news" : "general", + }; + if (params.country) body.country = params.country.toUpperCase(); + if (params.language) body.locale = params.language; + if (params.timeRange && params.timeRange !== "any") body.time_range = params.timeRange; + if (includes.length) body.include_domains = includes.slice(0, 50); + if (excludes.length) body.exclude_domains = excludes.slice(0, 50); + return { + url: resolveSearchBaseUrl(config, params), + init: { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${params.token}`, + [NIMBLE_CLIENT_SOURCE_HEADER]: NIMBLE_CLIENT_SOURCE, + }, + body: JSON.stringify(body), + }, + }; +} + function buildGooglePseRequest( config: SearchProviderConfig, params: SearchRequestParams @@ -707,6 +740,7 @@ const requestBuilders: Record = { "perplexity-search": buildPerplexityRequest, "exa-search": buildExaRequest, "tavily-search": buildTavilyRequest, + "nimble-search": buildNimbleRequest, firecrawl: fcSearch.buildFirecrawlSearchRequest, "google-pse-search": buildGooglePseRequest, "linkup-search": buildLinkupRequest, @@ -828,6 +862,47 @@ function normalizeTavilyResponse( return { results, totalResults: results.length }; } +interface NimbleSearchItem { + title?: string; + url?: string; + description?: string; + content?: string; +} + +interface NimbleSearchEnvelope { + results?: NimbleSearchItem[]; + total_results?: number; +} + +function normalizeNimbleResponse( + data: unknown, + _query: string, + _searchType: string +): { results: SearchResult[]; totalResults: number | null } { + const now = new Date().toISOString(); + const envelope = (data ?? {}) as NimbleSearchEnvelope; + if (!Array.isArray(envelope.results)) return { results: [], totalResults: null }; + const results = envelope.results.map((item, idx) => + makeResult( + "nimble-search", + { + title: item.title, + url: item.url, + snippet: item.description || item.content?.slice(0, 300) || "", + full_text: item.content || undefined, + text_format: "text", + }, + idx, + now + ) + ); + return { + results, + totalResults: + typeof envelope.total_results === "number" ? envelope.total_results : results.length, + }; +} + function normalizeGooglePseResponse( data: any, _query: string, @@ -1283,6 +1358,7 @@ const responseNormalizers: Record = { "perplexity-search": normalizePerplexityResponse, "exa-search": normalizeExaResponse, "tavily-search": normalizeTavilyResponse, + "nimble-search": normalizeNimbleResponse, firecrawl: (data: FirecrawlSearchEnvelope, _query: string, searchType: string) => fcSearch.normalizeFirecrawlSearchResponse(data, searchType, makeResult), "google-pse-search": normalizeGooglePseResponse, diff --git a/open-sse/handlers/webFetch.ts b/open-sse/handlers/webFetch.ts index 19d97ce32d..1e431cb6be 100644 --- a/open-sse/handlers/webFetch.ts +++ b/open-sse/handlers/webFetch.ts @@ -21,12 +21,14 @@ import { firecrawlFetch } from "../executors/firecrawl-fetch.ts"; import { jinaReaderFetch } from "../executors/jina-reader-fetch.ts"; import { tavilyFetch } from "../executors/tavily-fetch.ts"; import { tinyfishFetch } from "../executors/tinyfish-fetch.ts"; +import { nimbleFetch } from "../executors/nimble-fetch.ts"; export type WebFetchFormat = "markdown" | "html" | "links" | "screenshot"; export interface WebFetchRequest { url: string; - provider?: "firecrawl" | "jina-reader" | "tavily-search" | "tinyfish" | "context7"; + provider?: + "firecrawl" | "jina-reader" | "tavily-search" | "tinyfish" | "context7" | "nimble-search"; format?: WebFetchFormat; depth?: 0 | 1 | 2; wait_for_selector?: string; @@ -61,6 +63,7 @@ export const WEB_FETCH_PROVIDERS = Object.freeze([ "tavily-search", "tinyfish", "context7", + "nimble-search", ] as const); // Derived from the array — adding a provider to WEB_FETCH_PROVIDERS // automatically widens the union; they cannot drift apart. @@ -139,6 +142,14 @@ export async function handleWebFetch( credentials, }); + case "nimble-search": + return await nimbleFetch({ + url: req.url, + format, + includeMetadata, + credentials, + }); + case "context7": // Context7 returns llms.txt text only: html/links/screenshot formats are // unsupported, and the format field is validated/ignored below. diff --git a/open-sse/mcp-server/schemas/tools.ts b/open-sse/mcp-server/schemas/tools.ts index 442120fdce..994441f196 100644 --- a/open-sse/mcp-server/schemas/tools.ts +++ b/open-sse/mcp-server/schemas/tools.ts @@ -557,7 +557,7 @@ export const webFetchInput = z.object({ .min(1, "URL is required") .describe("The URL to fetch content from"), provider: z - .enum(["firecrawl", "jina-reader", "tavily-search", "tinyfish", "context7"]) + .enum(["firecrawl", "jina-reader", "tavily-search", "tinyfish", "context7", "nimble-search"]) .optional() .describe( "Specific fetch provider to use (default: first available). " + diff --git a/open-sse/mcp-server/server.ts b/open-sse/mcp-server/server.ts index 3f8480cc82..5cf56fbda3 100644 --- a/open-sse/mcp-server/server.ts +++ b/open-sse/mcp-server/server.ts @@ -694,7 +694,8 @@ async function handleXSearch(args: { async function handleWebFetch(args: { url: string; - provider?: "firecrawl" | "jina-reader" | "tavily-search" | "tinyfish" | "context7"; + provider?: + "firecrawl" | "jina-reader" | "tavily-search" | "tinyfish" | "context7" | "nimble-search"; format?: "markdown" | "html" | "links" | "screenshot"; include_metadata?: boolean; depth?: number; diff --git a/package.json b/package.json index 3fb7352a0c..1e013942cc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "omniroute", "version": "3.8.51", - "description": "Unified AI router with 353 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.", + "description": "Unified AI router with 354 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.", "type": "module", "bin": { "omniroute": "bin/omniroute.mjs", diff --git a/public/providers/nimble-search.svg b/public/providers/nimble-search.svg new file mode 100644 index 0000000000..aa53f2fe5e --- /dev/null +++ b/public/providers/nimble-search.svg @@ -0,0 +1,7 @@ + + + + diff --git a/src/app/api/search/providers/route.ts b/src/app/api/search/providers/route.ts index 31bada96fa..b278eadf95 100644 --- a/src/app/api/search/providers/route.ts +++ b/src/app/api/search/providers/route.ts @@ -54,6 +54,13 @@ const FETCH_PROVIDERS: FetchProviderDef[] = [ freeMonthlyQuota: 0, fetchFormats: ["markdown", "html"], }, + { + id: "nimble-search", + name: "Nimble Extract", + costPerQuery: 0.005, + freeMonthlyQuota: 0, + fetchFormats: ["markdown", "html", "links", "screenshot"], + }, ]; // --------------------------------------------------------------------------- diff --git a/src/lib/providers/validation/searchProviders.ts b/src/lib/providers/validation/searchProviders.ts index cabaed7b15..41a2f3f451 100644 --- a/src/lib/providers/validation/searchProviders.ts +++ b/src/lib/providers/validation/searchProviders.ts @@ -5,6 +5,10 @@ import { SAFE_OUTBOUND_FETCH_PRESETS, safeOutboundFetch } from "@/shared/network import { getProviderOutboundGuard } from "@/shared/network/outboundUrlGuardPolicy"; import { withCustomUserAgent } from "./headers"; import { toValidationErrorResult, validationWrite } from "./transport"; +import { + NIMBLE_CLIENT_SOURCE, + NIMBLE_CLIENT_SOURCE_HEADER, +} from "@omniroute/open-sse/config/nimble.ts"; export async function validateSearchProvider( url: string, @@ -99,6 +103,22 @@ export const SEARCH_VALIDATOR_CONFIGS: Record< }, }; }, + "nimble-search": (apiKey) => ({ + url: "https://sdk.nimbleway.com/v1/search", + init: { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + [NIMBLE_CLIENT_SOURCE_HEADER]: NIMBLE_CLIENT_SOURCE, + }, + body: JSON.stringify({ + query: "test", + max_results: 1, + search_depth: "lite", + }), + }, + }), "linkup-search": (apiKey) => ({ url: "https://api.linkup.so/v1/search", init: { diff --git a/src/shared/components/ProviderIcon.tsx b/src/shared/components/ProviderIcon.tsx index 8cb101ad4e..582a20ac28 100644 --- a/src/shared/components/ProviderIcon.tsx +++ b/src/shared/components/ProviderIcon.tsx @@ -160,6 +160,7 @@ const KNOWN_SVGS = new Set([ "moonshot", "morph", "nebius", + "nimble-search", "nlpcloud", "nomic", "novita", diff --git a/src/shared/constants/providers/search.ts b/src/shared/constants/providers/search.ts index 5a94f73d61..0a98cbc656 100644 --- a/src/shared/constants/providers/search.ts +++ b/src/shared/constants/providers/search.ts @@ -87,6 +87,17 @@ export const SEARCH_PROVIDERS = { website: "https://developers.google.com/custom-search/v1/overview", authHint: "Requires a Google API key and your Programmable Search Engine ID (cx)", }, + "nimble-search": { + id: "nimble-search", + alias: "nimble", + name: "Nimble Search", + icon: "travel_explore", + color: "#6D28D9", + textIcon: "NB", + website: "https://docs.nimbleway.com/nimble-sdk/web-tools/search", + authHint: "Bearer API key from the Nimble dashboard", + serviceKinds: ["webSearch", "webFetch"], + }, "linkup-search": { id: "linkup-search", alias: "linkup", diff --git a/src/shared/validation/schemas/apiV1.ts b/src/shared/validation/schemas/apiV1.ts index 96a7ea8426..a42dd32d10 100644 --- a/src/shared/validation/schemas/apiV1.ts +++ b/src/shared/validation/schemas/apiV1.ts @@ -694,7 +694,9 @@ export const v1BatchCreateSchema = z.object({ export const v1WebFetchSchema = z.object({ url: z.string().url("url must be a valid URL (http/https)"), - provider: z.enum(["firecrawl", "jina-reader", "tavily-search", "tinyfish"]).optional(), + provider: z + .enum(["firecrawl", "jina-reader", "tavily-search", "tinyfish", "context7", "nimble-search"]) + .optional(), format: z.enum(["markdown", "html", "links", "screenshot"]).default("markdown"), depth: z.union([z.literal(0), z.literal(1), z.literal(2)]).default(0), wait_for_selector: z.string().max(256).optional(), diff --git a/tests/integration/search-providers-catalog.test.ts b/tests/integration/search-providers-catalog.test.ts index 893ae682b3..4340cabe93 100644 --- a/tests/integration/search-providers-catalog.test.ts +++ b/tests/integration/search-providers-catalog.test.ts @@ -48,11 +48,11 @@ const route = await import("../../src/app/api/search/providers/route.ts"); // Constants // --------------------------------------------------------------------------- -// 18 search-kind providers: serper, brave, perplexity, exa, tavily, firecrawl, +// 19 search-kind providers: serper, brave, perplexity, exa, tavily, nimble-search, firecrawl, // google-pse, linkup, searchapi, youcom, searxng, ollama, zai, jina-search, // context7 (#11140), duckduckgo-free, x-search, xquik-search. -const EXPECTED_SEARCH_COUNT = 18; -const EXPECTED_FETCH_COUNT = 4; +const EXPECTED_SEARCH_COUNT = 19; +const EXPECTED_FETCH_COUNT = 5; const EXPECTED_TOTAL = EXPECTED_SEARCH_COUNT + EXPECTED_FETCH_COUNT; // --------------------------------------------------------------------------- @@ -291,6 +291,7 @@ test("search-providers-catalog: fetch providers have correct metadata", async () assert.ok(ids.includes("jina-reader"), "jina-reader must be present"); assert.ok(ids.includes("tavily-search"), "tavily-search must be present"); assert.ok(ids.includes("tinyfish"), "tinyfish must be present"); + assert.ok(ids.includes("nimble-search"), "nimble-search must be present"); const firecrawl = fetchProviders.find((p: { id: string }) => p.id === "firecrawl"); assert.equal(firecrawl.name, "Firecrawl"); diff --git a/tests/snapshots/executors/dispatch-rules.json b/tests/snapshots/executors/dispatch-rules.json index a06d955196..dccd60b32a 100644 --- a/tests/snapshots/executors/dispatch-rules.json +++ b/tests/snapshots/executors/dispatch-rules.json @@ -52,6 +52,11 @@ "status": 400, "throws": true }, + "nimble-search": { + "message": "Provider \"nimble-search\" is a search provider and does not support chat completions; use the /v1/search endpoint instead.", + "status": 400, + "throws": true + }, "ollama-search": { "message": "Provider \"ollama-search\" is a search provider and does not support chat completions; use the /v1/search endpoint instead.", "status": 400, diff --git a/tests/unit/executor-nimble-fetch.test.ts b/tests/unit/executor-nimble-fetch.test.ts new file mode 100644 index 0000000000..201e3196ba --- /dev/null +++ b/tests/unit/executor-nimble-fetch.test.ts @@ -0,0 +1,519 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +const { nimbleFetch } = await import("../../open-sse/executors/nimble-fetch.ts"); +const { NIMBLE_CLIENT_SOURCE, NIMBLE_CLIENT_SOURCE_HEADER } = + await import("../../open-sse/config/nimble.ts"); + +const PAGE_HTML = + "Example Domain" + + 'hi'; + +function extractResponse(data: Record) { + return new Response( + JSON.stringify({ + url: "https://example.com/", + task_id: "00000000-0000-0000-0000-000000000000", + status: "success", + status_code: 200, + data, + metadata: { driver: "vx6", query_duration: 533 }, + }), + { status: 200, headers: { "content-type": "application/json" } } + ); +} + +test("nimbleFetch posts to /v1/extract with bearer auth and the omniroute client-source header", async () => { + const originalFetch = globalThis.fetch; + let captured: { url: string; init: RequestInit } = { url: "", init: {} }; + + globalThis.fetch = async (url, init = {}) => { + captured = { url: String(url), init: init as RequestInit }; + return extractResponse({ markdown: "# Example Domain", links: [] }); + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, true); + assert.equal(captured.url, "https://sdk.nimbleway.com/v1/extract"); + assert.equal(captured.init.method, "POST"); + + const headers = captured.init.headers as Record; + assert.equal(headers.Authorization, "Bearer nimble-key"); + assert.equal(headers[NIMBLE_CLIENT_SOURCE_HEADER], NIMBLE_CLIENT_SOURCE); + assert.equal(headers[NIMBLE_CLIENT_SOURCE_HEADER], "omniroute"); + + const body = JSON.parse(String(captured.init.body)); + assert.equal(body.url, "https://example.com"); + assert.deepEqual(body.formats, ["markdown", "links"]); + assert.equal(body.render, "auto"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch requests each OmniRoute format from Extract and returns the matching field", async () => { + const cases: Array<{ + format: "markdown" | "html" | "links" | "screenshot"; + data: Record; + expectFormats: string[]; + expectContent: string; + }> = [ + { + format: "markdown", + data: { markdown: "# Title", links: ["https://a.example"] }, + expectFormats: ["markdown", "links"], + expectContent: "# Title", + }, + { + format: "html", + data: { html: "

hi

", links: [] }, + expectFormats: ["html", "links"], + expectContent: "

hi

", + }, + { + format: "links", + data: { links: ["https://a.example", "https://b.example"] }, + expectFormats: ["links"], + expectContent: '["https://a.example","https://b.example"]', + }, + { + format: "screenshot", + data: { screenshot: "iVBORw0KGgo=", links: [] }, + expectFormats: ["screenshot", "links"], + expectContent: "", + }, + ]; + + for (const testCase of cases) { + const originalFetch = globalThis.fetch; + let formats: string[] = []; + + globalThis.fetch = async (_url, init = {}) => { + formats = JSON.parse(String((init as RequestInit).body)).formats; + return extractResponse(testCase.data); + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: testCase.format, + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, true, `${testCase.format} should succeed`); + assert.deepEqual(formats, testCase.expectFormats, `${testCase.format} request formats`); + assert.equal(result.data?.content, testCase.expectContent, `${testCase.format} content`); + } finally { + globalThis.fetch = originalFetch; + } + } +}); + +test("nimbleFetch surfaces a base64 screenshot as a data URL", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => extractResponse({ screenshot: "iVBORw0KGgo=", links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "screenshot", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.data?.screenshot_url, "data:image/png;base64,iVBORw0KGgo="); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch always returns links and only requests html for metadata", async () => { + const originalFetch = globalThis.fetch; + let formats: string[] = []; + + globalThis.fetch = async (_url, init = {}) => { + formats = JSON.parse(String((init as RequestInit).body)).formats; + return extractResponse({ + markdown: "# Example Domain", + html: PAGE_HTML, + links: ["https://iana.org/domains/example"], + }); + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: true, + credentials: { apiKey: "nimble-key" }, + }); + + assert.deepEqual(formats, ["markdown", "links", "html"]); + assert.equal(result.data?.provider, "nimble-search"); + assert.deepEqual(result.data?.links, ["https://iana.org/domains/example"]); + assert.equal(result.data?.metadata?.title, "Example Domain"); + assert.equal(result.data?.metadata?.description, "An example page"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch keeps an apostrophe inside a double-quoted meta description", async () => { + const originalFetch = globalThis.fetch; + const html = + "Sale" + + ''; + + globalThis.fetch = async () => extractResponse({ markdown: "body", html, links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: true, + credentials: { apiKey: "nimble-key" }, + }); + + // A shared ["'] closing class would cut this at "Don". + assert.equal(result.data?.metadata?.description, "Don't miss our sale — it's on now"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch reads a single-quoted meta description", async () => { + const originalFetch = globalThis.fetch; + const html = ""; + + globalThis.fetch = async () => extractResponse({ markdown: "body", html, links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: true, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.data?.metadata?.description, "Plain single quoted"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch truncates an over-long title instead of dropping it", async () => { + const originalFetch = globalThis.fetch; + const longTitle = "T".repeat(600); + const html = `${longTitle}`; + + globalThis.fetch = async () => extractResponse({ markdown: "body", html, links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: true, + credentials: { apiKey: "nimble-key" }, + }); + + // A capture bounded at 500 would fail to reach and yield null. + assert.equal(result.data?.metadata?.title, "T".repeat(500)); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch fails a 200 whose envelope reports an unsuccessful extraction", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response( + JSON.stringify({ + url: "https://example.com/", + task_id: "00000000-0000-0000-0000-000000000000", + status: "failed", + status_code: 404, + data: {}, + metadata: {}, + }), + { status: 200, headers: { "content-type": "application/json" } } + ); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + // Must not be reported as an empty-but-successful document: the fetch pool only + // falls through to the next provider when the result is a failure. + assert.equal(result.success, false); + assert.equal(result.status, 502); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch fails a 200 whose envelope carries only an error status_code", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response(JSON.stringify({ url: "https://example.com/", status_code: 403, data: {} }), { + status: 200, + headers: { "content-type": "application/json" }, + }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 502); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch omits metadata when includeMetadata is false", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => extractResponse({ markdown: "body", html: PAGE_HTML, links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.data?.metadata, null); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch returns null metadata fields when the page has no title or description", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + extractResponse({ markdown: "body", html: "hi", links: [] }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: true, + credentials: { apiKey: "nimble-key" }, + }); + + assert.deepEqual(result.data?.metadata, { title: null, description: null }); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch accepts a genuinely blank page (format present, value empty)", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => extractResponse({ markdown: "" }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, true); + assert.equal(result.data?.content, ""); + assert.deepEqual(result.data?.links, []); + assert.equal(result.data?.screenshot_url, null); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch fails when the requested format is absent from the response", async () => { + for (const format of ["markdown", "html", "links", "screenshot"] as const) { + const originalFetch = globalThis.fetch; + + // Envelope says success, but nothing backing the requested format came back. + globalThis.fetch = async () => extractResponse({}); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format, + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + // Must be a failure so the /v1/web/fetch pool falls through to the next + // provider instead of returning an empty document as a success. + assert.equal(result.success, false, `${format} should fail`); + assert.equal(result.status, 502, `${format} status`); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } + } +}); + +test("nimbleFetch returns 401 when no API key is configured", async () => { + const originalFetch = globalThis.fetch; + let called = false; + + globalThis.fetch = async () => { + called = true; + return extractResponse({}); + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: {}, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 401); + assert.equal(called, false, "must not call Nimble without a key"); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch sanitizes an invalid-credential response", async () => { + const originalFetch = globalThis.fetch; + + // Nimble answers auth failures with a plain-text body, not JSON. + globalThis.fetch = async () => + new Response("unauthorized: bearer token validation failed", { + status: 401, + headers: { "content-type": "text/plain" }, + }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "bad-key" }, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 401); + assert.ok(result.error, "should carry an error message"); + assert.ok(!result.error!.includes("at /"), "error must not contain a stack trace"); + assert.ok(!result.error!.includes("bad-key"), "error must not echo the API key"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("nimbleFetch propagates a rate-limit response as 429", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response(JSON.stringify({ message: "Too Many Requests" }), { + status: 429, + headers: { "content-type": "application/json" }, + }); + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 429); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +// The executor aborts with a reason named "TimeoutError"; an external abort surfaces +// as "AbortError". Both must produce a 504, not the generic 502 transport branch. +for (const name of ["TimeoutError", "AbortError"]) { + test(`nimbleFetch maps ${name} to a 504 timeout`, async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => { + const err = new Error("aborted"); + err.name = name; + throw err; + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 504); + } finally { + globalThis.fetch = originalFetch; + } + }); +} + +test("nimbleFetch rejects with its own abort reason, which is a TimeoutError", async () => { + // Pins the contract the two tests above rely on: the reason the executor passes to + // controller.abort() is what fetch rejects with, so the 504 branch must match its name. + const controller = new AbortController(); + const reason = new Error("nimble-fetch timeout after 30000ms"); + reason.name = "TimeoutError"; + controller.abort(reason); + + assert.equal((controller.signal.reason as Error).name, "TimeoutError"); +}); + +test("nimbleFetch maps an unexpected transport failure to a sanitized 502", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => { + throw new Error("socket hang up"); + }; + + try { + const result = await nimbleFetch({ + url: "https://example.com", + format: "markdown", + includeMetadata: false, + credentials: { apiKey: "nimble-key" }, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 502); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } +}); diff --git a/tests/unit/search-nimble-provider.test.ts b/tests/unit/search-nimble-provider.test.ts new file mode 100644 index 0000000000..82538c717f --- /dev/null +++ b/tests/unit/search-nimble-provider.test.ts @@ -0,0 +1,320 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { mkdtempSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; + +process.env.DATA_DIR = mkdtempSync(join(tmpdir(), "omniroute-search-nimble-")); + +const { handleSearch } = await import("../../open-sse/handlers/search.ts"); +const { SEARCH_PROVIDERS } = await import("../../open-sse/config/searchRegistry.ts"); +const { NIMBLE_CLIENT_SOURCE, NIMBLE_CLIENT_SOURCE_HEADER } = + await import("../../open-sse/config/nimble.ts"); + +/** A `lite`-depth /v1/search payload: `description` carries the snippet, `content` is empty. */ +function nimbleSearchPayload() { + return { + total_results: 2, + request_id: "00000000-0000-0000-0000-000000000000", + results: [ + { + title: "Nimble — real-time web data", + url: "https://www.nimbleway.com/product?ref=1", + description: "Structured web data for AI applications.", + content: "", + metadata: { position: 1, entity_type: "SearchResult", country: "US", locale: "en" }, + }, + { + title: "Nimble docs", + url: "https://docs.nimbleway.com/", + description: "", + content: "Full page body captured at a deeper search depth.", + metadata: { position: 2, entity_type: "SearchResult", country: "US", locale: "en" }, + }, + ], + }; +} + +test("nimble-search is registered with the /v1/search endpoint and bearer auth", () => { + const provider = SEARCH_PROVIDERS["nimble-search"]; + assert.ok(provider, "nimble-search must be in the search registry"); + assert.equal(provider.baseUrl, "https://sdk.nimbleway.com/v1/search"); + assert.equal(provider.method, "POST"); + assert.equal(provider.authType, "apikey"); + assert.equal(provider.authHeader, "bearer"); + assert.deepEqual(provider.searchTypes, ["web", "news"]); +}); + +test("handleSearch builds a Nimble request with the omniroute client-source header", async () => { + const originalFetch = globalThis.fetch; + let captured: { url: string; headers: Record; body: Record } = { + url: "", + headers: {}, + body: {}, + }; + + globalThis.fetch = async (url, init = {}) => { + const request = init as RequestInit; + captured = { + url: String(url), + headers: request.headers as Record, + body: JSON.parse(String(request.body || "{}")), + }; + return new Response(JSON.stringify(nimbleSearchPayload()), { + status: 200, + headers: { "content-type": "application/json" }, + }); + }; + + try { + const result = await handleSearch({ + query: " nimble web data ", + provider: "nimble-search", + maxResults: 2, + searchType: "web", + country: "us", + language: "en", + timeRange: "month", + domainFilter: ["nimbleway.com", "-spam.example"], + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(result.success, true); + assert.equal(captured.url, "https://sdk.nimbleway.com/v1/search"); + assert.equal(captured.headers.Authorization, "Bearer nimble-key"); + assert.equal(captured.headers[NIMBLE_CLIENT_SOURCE_HEADER], NIMBLE_CLIENT_SOURCE); + assert.equal(captured.headers[NIMBLE_CLIENT_SOURCE_HEADER], "omniroute"); + + assert.deepEqual(captured.body, { + query: "nimble web data", + max_results: 2, + search_depth: "lite", + output_format: "plain_text", + focus: "general", + country: "US", + locale: "en", + time_range: "month", + include_domains: ["nimbleway.com"], + exclude_domains: ["spam.example"], + }); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch maps search_type=news onto the Nimble news focus", async () => { + const originalFetch = globalThis.fetch; + let body: Record = {}; + + globalThis.fetch = async (_url, init = {}) => { + body = JSON.parse(String((init as RequestInit).body || "{}")); + return new Response(JSON.stringify(nimbleSearchPayload()), { status: 200 }); + }; + + try { + await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "news", + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(body.focus, "news"); + // Regression guard: `focus` must stay a scalar. Sending an array makes Nimble + // read it as a list of Web Search Agent subagents and reject the call with 422. + assert.equal(Array.isArray(body.focus), false, "focus must not be an array"); + // Optional locale/date filters stay off the wire when the caller omits them. + assert.equal("country" in body, false); + assert.equal("time_range" in body, false); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch normalizes Nimble results into the shared SearchResult shape", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response(JSON.stringify(nimbleSearchPayload()), { + status: 200, + headers: { "content-type": "application/json" }, + }); + + try { + const result = await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(result.success, true); + const data = result.data!; + assert.equal(data.provider, "nimble-search"); + assert.equal(data.metrics.total_results_available, 2); + + const [first, second] = data.results; + assert.equal(first.title, "Nimble — real-time web data"); + assert.equal(first.url, "https://www.nimbleway.com/product?ref=1"); + assert.equal(first.display_url, "nimbleway.com/product"); + assert.equal(first.position, 1); + assert.equal(first.citation.provider, "nimble-search"); + assert.equal(first.citation.rank, 1); + // `lite` depth: the snippet comes from `description`, and there is no full text. + assert.equal(first.snippet, "Structured web data for AI applications."); + assert.equal(first.content, null); + + // Deeper depths populate `content`; it becomes both the snippet fallback and full text. + assert.equal(second.snippet, "Full page body captured at a deeper search depth."); + assert.equal(second.content?.format, "text"); + assert.equal(second.content?.text, "Full page body captured at a deeper search depth."); + assert.equal( + second.content?.length, + "Full page body captured at a deeper search depth.".length + ); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch returns an empty result set when Nimble finds nothing", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response(JSON.stringify({ total_results: 0, results: [], request_id: "x" }), { + status: 200, + headers: { "content-type": "application/json" }, + }); + + try { + const result = await handleSearch({ + query: "a query with no hits", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(result.success, true); + assert.deepEqual(result.data?.results, []); + assert.equal(result.data?.metrics.total_results_available, 0); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch rejects a Nimble request with no credentials before calling out", async () => { + const originalFetch = globalThis.fetch; + let called = false; + + globalThis.fetch = async () => { + called = true; + return new Response("{}", { status: 200 }); + }; + + try { + const result = await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: {}, + log: null, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 401); + assert.equal(called, false, "must not call Nimble without a key"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch surfaces an invalid Nimble key without leaking a stack trace", async () => { + const originalFetch = globalThis.fetch; + + // Nimble answers an auth failure with a plain-text body, not JSON. + globalThis.fetch = async () => + new Response("unauthorized: bearer token validation failed", { + status: 401, + headers: { "content-type": "text/plain" }, + }); + + try { + const result = await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: { apiKey: "bad-key" }, + log: null, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 401); + assert.ok(result.error, "should carry an error message"); + assert.ok(!result.error!.includes("at /"), "error must not contain a stack trace"); + assert.ok(!result.error!.includes("bad-key"), "error must not echo the API key"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch propagates a Nimble rate-limit response as 429", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => + new Response(JSON.stringify({ message: "Too Many Requests" }), { + status: 429, + headers: { "content-type": "application/json", "retry-after": "30" }, + }); + + try { + const result = await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 429); + assert.ok(!result.error?.includes("at /"), "error must not contain a stack trace"); + } finally { + globalThis.fetch = originalFetch; + } +}); + +test("handleSearch maps a Nimble timeout to 504", async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async () => { + const err = new Error("aborted"); + err.name = "AbortError"; + throw err; + }; + + try { + const result = await handleSearch({ + query: "nimble", + provider: "nimble-search", + maxResults: 5, + searchType: "web", + credentials: { apiKey: "nimble-key" }, + log: null, + }); + + assert.equal(result.success, false); + assert.equal(result.status, 504); + } finally { + globalThis.fetch = originalFetch; + } +}); diff --git a/tests/unit/search-registry.test.ts b/tests/unit/search-registry.test.ts index 7d668cdbc3..c2a0c5b28d 100644 --- a/tests/unit/search-registry.test.ts +++ b/tests/unit/search-registry.test.ts @@ -25,6 +25,7 @@ test("SEARCH_PROVIDERS has all registered providers", () => { assert.ok(SEARCH_PROVIDERS["perplexity-search"], "perplexity-search should exist"); assert.ok(SEARCH_PROVIDERS["exa-search"], "exa should exist"); assert.ok(SEARCH_PROVIDERS["tavily-search"], "tavily should exist"); + assert.ok(SEARCH_PROVIDERS["nimble-search"], "nimble should exist"); assert.ok(SEARCH_PROVIDERS["firecrawl"], "firecrawl should exist"); assert.ok(SEARCH_PROVIDERS["google-pse-search"], "google-pse should exist"); assert.ok(SEARCH_PROVIDERS["linkup-search"], "linkup should exist"); @@ -39,7 +40,7 @@ test("SEARCH_PROVIDERS has all registered providers", () => { assert.ok(SEARCH_PROVIDERS["xquik-search"], "xquik-search should exist"); // #11140: context7 provides library-docs search assert.ok(SEARCH_PROVIDERS["context7"], "context7 should exist"); - assert.equal(Object.keys(SEARCH_PROVIDERS).length, 18); + assert.equal(Object.keys(SEARCH_PROVIDERS).length, 19); }); test("duckduckgo-free config is a no-key, fallback-only provider", () => { @@ -173,7 +174,7 @@ test("zai-search config is correct", () => { test("getAllSearchProviders returns flat list", () => { const all = getAllSearchProviders(); - assert.equal(all.length, 18); + assert.equal(all.length, 19); assert.ok(all.some((p) => p.id === "duckduckgo-free")); assert.ok(all.some((p) => p.id === "jina-search")); assert.ok(all.some((p) => p.id === "x-search")); @@ -183,6 +184,7 @@ test("getAllSearchProviders returns flat list", () => { assert.ok(all.some((p) => p.id === "perplexity-search")); assert.ok(all.some((p) => p.id === "exa-search")); assert.ok(all.some((p) => p.id === "tavily-search")); + assert.ok(all.some((p) => p.id === "nimble-search")); assert.ok(all.some((p) => p.id === "google-pse-search")); assert.ok(all.some((p) => p.id === "linkup-search")); assert.ok(all.some((p) => p.id === "searchapi-search")); diff --git a/tests/unit/search-route.test.ts b/tests/unit/search-route.test.ts index d219d6f7dc..9df1f0fd3b 100644 --- a/tests/unit/search-route.test.ts +++ b/tests/unit/search-route.test.ts @@ -52,13 +52,14 @@ test("v1 search GET lists all search providers", async () => { assert.equal(response.status, 200); assert.equal(body.object, "list"); - assert.equal(body.data.length, 18); + assert.equal(body.data.length, 19); assert.deepEqual(ids, [ "serper-search", "brave-search", "perplexity-search", "exa-search", "tavily-search", + "nimble-search", "firecrawl", "google-pse-search", "linkup-search",