diff --git a/AGENTS.md b/AGENTS.md index 04e716ed76..662066d6ad 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,12 +3,12 @@ ## Project Unified AI proxy/router — route any LLM through one endpoint. Multi-provider support -with **226 provider entries** (OpenAI, Anthropic, Gemini, DeepSeek, Groq, xAI, Mistral, Fireworks, +with **227 provider entries** (OpenAI, Anthropic, Gemini, DeepSeek, Groq, xAI, Mistral, Fireworks, Cohere, NVIDIA, Cerebras, Pollinations, Puter, Cloudflare AI, HuggingFace, DeepInfra, SambaNova, Meta Llama API, Moonshot AI, AI21 Labs, Databricks, Snowflake, and many more) with **MCP Server** (87 tools), **A2A v0.3 Protocol**, and **Electron desktop app**. -> **Live counts (v3.8.24)**: providers 226 · MCP tools 87 · MCP scopes 30 · A2A skills 6 · +> **Live counts (v3.8.24)**: providers 227 · MCP tools 87 · MCP scopes 30 · A2A skills 6 · > open-sse services 115 · routing strategies 15 · auto-combo scoring factors 9 · > DB modules 83 · DB migrations 97 · base tables 17 · search providers 11 · > i18n locales 42. **Refresh with `npm run check:docs-all`.** diff --git a/CHANGELOG.md b/CHANGELOG.md index 707e827efe..7b0dfddadf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### ✨ New Features + +- **feat(providers): add OrcaRouter (OpenAI-compatible routing gateway)** — OrcaRouter is now registered as an API-key provider. Its adaptive router is exposed as `orcarouter/auto` (smart routing across 150+ upstream models), alongside a curated flagship set (GPT-5.5, Gemini 3.5 Flash, Claude Opus 4.8, Grok 4.3, DeepSeek V4 Pro, MiniMax M2.7, Qwen3.7 Max). `passthroughModels` is enabled so any OrcaRouter model id works. OpenAI-compatible endpoint (`https://api.orcarouter.ai/v1`), Bearer (`sk-orca-…`) auth — no custom executor or translator required. + --- ## [3.8.28] — TBD diff --git a/CLAUDE.md b/CLAUDE.md index 353a925c4d..2050d1d159 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -35,7 +35,7 @@ For full test matrix, see `CONTRIBUTING.md` → "Running Tests". For deep archit ## Project at a Glance -**OmniRoute** — unified AI proxy/router. One endpoint, 226 LLM providers, auto-fallback. +**OmniRoute** — unified AI proxy/router. One endpoint, 227 LLM providers, auto-fallback. | Layer | Location | Purpose | | ------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | @@ -433,13 +433,14 @@ own dedicated branch, and you MUST confirm the base branch with the operator bef In Claude Code prefer the native `EnterWorktree` tool (create the worktree with the command above, then call `EnterWorktree` with its `path`). + 3. **Work, commit, push, open the PR — all from inside the worktree.** Never `git checkout` a different branch inside a worktree another session might share. 4. **Tear down only your own** worktree + branch when done, from the main checkout: `git worktree remove .worktrees/` then `git branch -D `. Never blanket-delete `fix/*`/`feat/*` — other sessions keep their own; delete only the branches you created, by name. 5. **Never touch another session's worktree, branch, or uncommitted changes.** If `git worktree - list` shows worktrees you didn't create, leave them alone. End every session with the main +list` shows worktrees you didn't create, leave them alone. End every session with the main checkout back on the branch it started on (the active `release/vX.Y.Z`, never `main`). --- diff --git a/README.md b/README.md index 41b4c12bd9..1e200ea0c1 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # 🚀 OmniRoute — The Free AI Gateway -### Never stop coding. Connect every AI tool to **226 providers** — **50+ free** — through one endpoint. +### Never stop coding. Connect every AI tool to **227 providers** — **50+ free** — through one endpoint. **Plug Claude Code, Codex, Cursor, Cline, Copilot & Antigravity into FREE Claude / GPT / Gemini. Auto-fallback.**
@@ -19,8 +19,8 @@
-[![226 AI Providers](https://img.shields.io/badge/226-AI_Providers-6C5CE7?style=for-the-badge)](#-226-ai-providers--50-free) -[![50+ Free](https://img.shields.io/badge/50%2B-Free_Tiers-00B894?style=for-the-badge)](#-226-ai-providers--50-free) +[![227 AI Providers](https://img.shields.io/badge/227-AI_Providers-6C5CE7?style=for-the-badge)](#-227-ai-providers--50-free) +[![50+ Free](https://img.shields.io/badge/50%2B-Free_Tiers-00B894?style=for-the-badge)](#-227-ai-providers--50-free) [![1.9B+ Free Tokens/mo](https://img.shields.io/badge/1.9B%2B-Free_Tokens%2Fmo-00B894?style=for-the-badge)](docs/reference/FREE_TIERS.md) [![Token Savings](https://img.shields.io/badge/up_to_95%25-Token_Savings-E17055?style=for-the-badge)](#%EF%B8%8F-save-1595-tokens--automatically) [![15 Strategies](https://img.shields.io/badge/15-Routing_Strategies-0984E3?style=for-the-badge)](#-combos--the-flagship) @@ -59,7 +59,7 @@
-[**🚀 Quick Start**](#-quick-start) • [**🎯 Combos**](#-combos--the-flagship) • [**🌐 Providers**](#-226-ai-providers--50-free) • [**🔌 CLI & MCP**](#-full-cli--a2a--mcp) • [**🗜️ Compression**](#%EF%B8%8F-save-1595-tokens--automatically) • [**🌍 Website**](https://omniroute.online) +[**🚀 Quick Start**](#-quick-start) • [**🎯 Combos**](#-combos--the-flagship) • [**🌐 Providers**](#-227-ai-providers--50-free) • [**🔌 CLI & MCP**](#-full-cli--a2a--mcp) • [**🗜️ Compression**](#%EF%B8%8F-save-1595-tokens--automatically) • [**🌍 Website**](https://omniroute.online) [💥 The Promise](#-the-promise) • [🤔 Why](#-why-omniroute) • [🏆 What Sets Apart](#-what-sets-omniroute-apart) • [🤖 Compatible CLIs](#-compatible-clis--coding-agents) • [🖥️ Where It Runs](#%EF%B8%8F-where-omniroute-runs--anywhere) • [🔒 Private](#-private--local-first) • [🎬 In Action](#-omniroute-in-action) • [📚 Explore More](#-explore-more) • [📧 Support](#-support--community) @@ -136,11 +136,11 @@ -> One endpoint. **226 providers.** Never stop building — and let OmniRoute pick the cheapest one that works. +> One endpoint. **227 providers.** Never stop building — and let OmniRoute pick the cheapest one that works. - + @@ -263,7 +263,7 @@ Result: 4 layers of fallback = zero downtime | Feature | OmniRoute | Other routers | | -------------------------------------- | ----------------------------------------------------------- | ------------- | -| 🌐 Providers | **226** | 20–100 | +| 🌐 Providers | **227** | 20–100 | | 🆓 Free providers | **50+ (11 free forever)** | 1–5 | | 🔀 Routing strategies | **15** (priority, weighted, cost-optimized, context-relay…) | 1–3 | | 🗜️ Token compression | **RTK + Caveman stacked (15–95%)** | None / 20–40% | @@ -319,11 +319,11 @@ Result: 4 layers of fallback = zero downtime
-# 🌐 226 AI Providers — 50+ Free +# 🌐 227 AI Providers — 50+ Free
-> The most complete catalog of any open-source router: **226 providers**, **50+ with a free tier**, **11 free forever**. +> The most complete catalog of any open-source router: **227 providers**, **50+ with a free tier**, **11 free forever**.
@@ -445,17 +445,17 @@ claude mcp add-server omniroute --type http --url http://localhost:20128/api/mcp Engines run in pipeline order; each is independently toggleable and configurable per combo: -| # | Engine | What it does | -| --- | ----------------- | ------------------------------------------------------------------------ | -| 1 | **Session-Dedup** | Drops content repeated across turns (content-addressed, cross-turn) | -| 2 | **CCR** | Archives large blocks behind retrieve markers, fetched on demand | -| 3 | **RTK** | Smart tool-result filtering, dedup & truncation (command-aware) | -| 4 | **Headroom** | Lossless tabular compaction of homogeneous JSON arrays (~30%+) | -| 5 | **Caveman** | Rule-based prose compression (~65–75% on output) | -| 6 | **LLMLingua-2** | ML semantic pruning via MobileBERT ONNX — code-safe, async | -| 7 | **Lite** | Whitespace + image-URL trimming (latency-light baseline) | -| 8 | **Aggressive** | Summarization + progressive aging of old turns | -| 9 | **Ultra** | Heuristic token pruning with an optional small-model (SLM) tier | +| # | Engine | What it does | +| --- | ----------------- | ------------------------------------------------------------------- | +| 1 | **Session-Dedup** | Drops content repeated across turns (content-addressed, cross-turn) | +| 2 | **CCR** | Archives large blocks behind retrieve markers, fetched on demand | +| 3 | **RTK** | Smart tool-result filtering, dedup & truncation (command-aware) | +| 4 | **Headroom** | Lossless tabular compaction of homogeneous JSON arrays (~30%+) | +| 5 | **Caveman** | Rule-based prose compression (~65–75% on output) | +| 6 | **LLMLingua-2** | ML semantic pruning via MobileBERT ONNX — code-safe, async | +| 7 | **Lite** | Whitespace + image-URL trimming (latency-light baseline) | +| 8 | **Aggressive** | Summarization + progressive aging of old turns | +| 9 | **Ultra** | Heuristic token pruning with an optional small-model (SLM) tier | Code blocks, URLs and structured data are **always preserved** byte-perfect. **One-click presets** combine the engines: @@ -751,7 +751,7 @@ Compression: aggressive (~50%) → double your free quota · Cost: $0/mo **Will I be charged by OmniRoute?** No — it's free, open-source software on your machine. You only pay paid providers directly. OmniRoute has no billing system. **Are FREE providers really unlimited?** Yes — Kiro, Qoder, Pollinations, LongCat, Cloudflare. No catch. **Will compression hurt quality?** No — it only compresses the **input**; code, URLs, JSON are always protected. -**Does it work where AI is blocked?** Yes — 3-level proxy + 1proxy marketplace reach all 226 providers. +**Does it work where AI is blocked?** Yes — 3-level proxy + 1proxy marketplace reach all 227 providers. 📖 [User Guide](docs/guides/USER_GUIDE.md) · [API Reference](docs/reference/API_REFERENCE.md) · [Environment Config](docs/reference/ENVIRONMENT.md) diff --git a/config/quality/file-size-baseline.json b/config/quality/file-size-baseline.json index 02ab6b58df..6939cb831d 100644 --- a/config/quality/file-size-baseline.json +++ b/config/quality/file-size-baseline.json @@ -1,5 +1,6 @@ { "_comment": "Catraca de tamanho (check-file-size.mjs). frozen so pode encolher; arquivos novos <= cap. --update ratcheta.", + "_rebaseline_2026_06_17_4070_orcarouter": "PR #4070 own growth: providers.ts 3147->3159 (+12 = the OrcaRouter catalog entry, a single Zod-validated provider record { id/alias/name/icon/color/textIcon/passthroughModels/website/apiHint } in the providers map — pure data, the standard per-provider addition; bumps the catalog 226->227). Cohesive catalog growth, not extractable.", "_rebaseline_2026_06_17_4058_auto_catalog": "PR #4058 own growth: chat.ts 1432->1458 (+26 = built-in auto/* catalog recognition gating in handleChat: recognizedBuiltInAuto + per-id variant resolution + the 'unknown built-in auto combo' 400 short-circuit). The duplicated AUTO_TEMPLATE_VARIANTS/VALID_AUTO_VARIANTS maps were extracted on review to open-sse/services/autoCombo/builtinCatalog.ts (60 LOC, v3.8.25 (features #3799-#3806: free-provider-rankings, plugins menu, proxy IP-family selector). 3 arquivos cresceram por feature legitima, nao por regressao de qualidade: ProxyRegistryManager.tsx 1072->1089, sidebarVisibility.ts 990->1006, schemas.ts 2519->2522. Encolher fica como debt para um refactor dedicado.", "_rebaseline_2026_06_15_3860_compression_ui": "PR #3860 own growth: sidebarVisibility.ts 1006->1100 (+94 = Compression Hub menu entries: Hub + per-engine Lite/Aggressive/Ultra pages + combos editor) and chatCore.ts 5812->5815 (+3 = compression UI config wiring). Cohesive feature growth, not a quality regression.", @@ -126,7 +127,7 @@ "src/shared/components/analytics/charts.tsx": 1558, "src/shared/constants/cliTools.ts": 875, "src/shared/constants/pricing.ts": 1581, - "src/shared/constants/providers.ts": 3147, + "src/shared/constants/providers.ts": 3159, "src/shared/constants/sidebarVisibility.ts": 1100, "src/shared/services/cliRuntime.ts": 1090, "src/shared/validation/schemas.ts": 2523, diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md index 0929accccf..e0ba3563d1 100644 --- a/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/reference/PROVIDER_REFERENCE.md @@ -1,16 +1,16 @@ --- title: "Provider Reference" -version: 3.8.25 -lastUpdated: 2026-06-15 +version: 3.8.27 +lastUpdated: 2026-06-17 --- # Provider Reference > **Auto-generated** from `src/shared/constants/providers.ts` — do not edit by hand. > Regenerate with: `npm run gen:provider-reference` -> **Last generated:** 2026-06-15 +> **Last generated:** 2026-06-17 -Total providers: **226**. See category breakdown below. +Total providers: **227**. See category breakdown below. ## Categories @@ -82,7 +82,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `v0-vercel-web` | `v0` | v0 Vercel Web (Code Gen) | Web cookie | [link](https://v0.dev) | Paste your session cookie from v0.dev (DevTools → Application → Cookies) | | `venice-web` | `ven` | Venice Web (Privacy) | Web cookie | [link](https://venice.ai) | Paste your session cookie from venice.ai (DevTools → Application → Cookies) | -## API Key Providers (paid / paid-with-free-credits) (152) +## API Key Providers (paid / paid-with-free-credits) (153) | ID | Alias | Name | Tags | Website | Notes | | --------------------- | -------------- | ------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -193,6 +193,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `opencode-go` | `opencode-go` | OpenCode Go | API key | [link](https://opencode.ai/go) | — | | `opencode-zen` | `opencode-zen` | OpenCode Zen | API key | [link](https://opencode.ai/zen) | — | | `openrouter` | `openrouter` | OpenRouter | API key, aggregator | [link](https://openrouter.ai) | Free models at $0/token with :free suffix - 20 RPM / 200 RPD | +| `orcarouter` | `orcarouter` | OrcaRouter | API key | [link](https://www.orcarouter.ai) | — | | `ovhcloud` | `ovh` | OVHcloud AI | API key | [link](https://www.ovhcloud.com) | — | | `perplexity` | `pplx` | Perplexity | API key | [link](https://www.perplexity.ai) | — | | `phind` | `phind` | Phind | API key | [link](https://phind.com) | Get API key at phind.com | diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts index 662dd552fc..123f4d057d 100644 --- a/open-sse/config/providers/index.ts +++ b/open-sse/config/providers/index.ts @@ -99,6 +99,7 @@ import { uncloseaiProvider } from "./registry/uncloseai/index.ts"; import { nscaleProvider } from "./registry/nscale/index.ts"; import { chatgpt_webProvider } from "./registry/chatgpt-web/index.ts"; import { openrouterProvider } from "./registry/openrouter/index.ts"; +import { orcarouterProvider } from "./registry/orcarouter/index.ts"; import { glhfProvider } from "./registry/glhf/index.ts"; import { copilot_webProvider } from "./registry/copilot-web/index.ts"; import { stepfunProvider } from "./registry/stepfun/index.ts"; @@ -260,6 +261,7 @@ export const REGISTRY: Record = { nscale: nscaleProvider, "chatgpt-web": chatgpt_webProvider, openrouter: openrouterProvider, + orcarouter: orcarouterProvider, glhf: glhfProvider, "copilot-web": copilot_webProvider, stepfun: stepfunProvider, diff --git a/open-sse/config/providers/registry/orcarouter/index.ts b/open-sse/config/providers/registry/orcarouter/index.ts new file mode 100644 index 0000000000..c68a7104b5 --- /dev/null +++ b/open-sse/config/providers/registry/orcarouter/index.ts @@ -0,0 +1,87 @@ +import type { RegistryEntry } from "../../shared.ts"; + +/** + * OrcaRouter — OpenAI-compatible routing gateway (https://www.orcarouter.ai). + * + * Model IDs keep the OrcaRouter namespace prefix ("orcarouter/" for the router, + * "/" for pinned models): the distributor matches channels by the namespaced + * id, so a bare id (e.g. "auto") returns 503 "No available channel". Capabilities and + * limits verified live (/api/pricing + chat/completions) 2026-06-17. + */ +export const orcarouterProvider: RegistryEntry = { + id: "orcarouter", + alias: "orcarouter", + format: "openai", + executor: "default", + baseUrl: "https://api.orcarouter.ai/v1", + authType: "apikey", + authHeader: "bearer", + defaultContextLength: 128000, + headers: { + "HTTP-Referer": "https://endpoint-proxy.local", + "X-Title": "Endpoint Proxy", + }, + models: [ + // Adaptive router (headline feature). Per-turn tool/reasoning support depends on + // the workspace AUTO pool (https://www.orcarouter.ai/console/routing). + { id: "orcarouter/auto", name: "Auto (smart routing)", toolCalling: true }, + { + id: "openai/gpt-5.5", + name: "GPT-5.5", + toolCalling: true, + supportsReasoning: true, + supportsVision: true, + contextLength: 1050000, + maxOutputTokens: 128000, + }, + { + id: "google/gemini-3.5-flash", + name: "Gemini 3.5 Flash", + toolCalling: true, + supportsReasoning: true, + supportsVision: true, + contextLength: 1048576, + maxOutputTokens: 65536, + }, + { + id: "anthropic/claude-opus-4.8", + name: "Claude Opus 4.8", + toolCalling: true, + supportsReasoning: true, + supportsVision: true, + contextLength: 1000000, + maxOutputTokens: 128000, + }, + { + id: "grok/grok-4.3", + name: "Grok 4.3", + toolCalling: true, + supportsReasoning: true, + supportsVision: true, + contextLength: 1000000, + }, + { + id: "deepseek/deepseek-v4-pro", + name: "DeepSeek V4 Pro", + toolCalling: true, + supportsReasoning: true, + contextLength: 1048576, + maxOutputTokens: 384000, + }, + { + id: "minimax/minimax-m2.7", + name: "MiniMax M2.7", + toolCalling: true, + supportsReasoning: true, + contextLength: 204800, + maxOutputTokens: 2048, + }, + { + id: "qwen/qwen3.7-max", + name: "Qwen3.7 Max", + toolCalling: true, + contextLength: 1000000, + maxOutputTokens: 64000, + }, + ], +}; diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index 28d8c63740..cc670757f5 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -662,6 +662,18 @@ export const APIKEY_PROVIDERS = { hasFree: true, freeNote: "Free models at $0/token with :free suffix - 20 RPM / 200 RPD", }, + orcarouter: { + id: "orcarouter", + alias: "orcarouter", + name: "OrcaRouter", + icon: "router", + color: "#0891B2", + textIcon: "ORC", + passthroughModels: true, + website: "https://www.orcarouter.ai", + apiHint: + "Create an API key (starts with sk-orca-) at https://www.orcarouter.ai, then paste it as a Bearer token. OpenAI-compatible endpoint at https://api.orcarouter.ai/v1.", + }, "api-airforce": { id: "api-airforce", alias: "af", diff --git a/tests/unit/chat-openai-compat-providers.test.ts b/tests/unit/chat-openai-compat-providers.test.ts index 0e31b5183a..5229ce4584 100644 --- a/tests/unit/chat-openai-compat-providers.test.ts +++ b/tests/unit/chat-openai-compat-providers.test.ts @@ -41,6 +41,7 @@ const CHAT_OPENAI_COMPAT_PROVIDER_IDS = [ "bytez", "reka", "byteplus", + "orcarouter", ]; test("chat-openai-compat providers are registered across provider metadata, registry and local catalog", () => { @@ -54,6 +55,21 @@ test("chat-openai-compat providers are registered across provider metadata, regi } }); +test("orcarouter models keep the orcarouter/ namespace prefix and enable passthrough", () => { + const modelIds = REGISTRY.orcarouter.models.map((model) => model.id); + + // OrcaRouter's distributor matches channels by the namespaced id, so a bare + // "auto" returns 503 "No available channel" — the router id must stay prefixed. + assert.ok(modelIds.includes("orcarouter/auto"), "expected namespaced orcarouter/auto"); + assert.equal(modelIds.includes("auto"), false, "bare 'auto' would 503 upstream"); + + // Pinned vendor models also carry their upstream namespace. + assert.ok(modelIds.includes("anthropic/claude-opus-4.8")); + + // The 150+ catalog beyond the curated flagship list is reachable via passthrough. + assert.equal(APIKEY_PROVIDERS.orcarouter.passthroughModels, true); +}); + test("upstage chat catalog does not include non-chat specialty models", () => { const modelIds = REGISTRY.upstage.models.map((model) => model.id);
🚫 Never hit limits
Auto-fallback across 226 providers in milliseconds. Quota out? Next provider takes over — zero downtime.
🚫 Never hit limits
Auto-fallback across 227 providers in milliseconds. Quota out? Next provider takes over — zero downtime.
💸 Save up to 95% tokens
RTK + Caveman stacked compression cuts 15–95% of eligible tokens (~89% avg on tool-heavy sessions).
🆓 $0 to start
50+ providers with a free tier, 11 free forever (Kiro, Qoder, Pollinations, LongCat…). No card needed.