feat(providers): add OrcaRouter (OpenAI-compatible routing gateway) (#4070)

Integrado em release/v3.8.28. Adiciona o provider OrcaRouter (OpenAI-compatible, API-key, DefaultExecutor). Ajuste de review: rebaseline de file-size de providers.ts 3147→3159 (+12 da entrada OrcaRouter). Validado local no tree sincronizado: provider-consistency ✓, docs-counts STRICT 227 ✓, typecheck:core ✓, teste 3/3 ✓, eslint ✓; semgrep + semgrep-cloud verdes. Fast QG/dast enfileirados (saturação de runner) — merge nos gates de política verificados (precedente #4034/#4065).
This commit is contained in:
jinhaosong-source
2026-06-18 00:02:20 +08:00
committed by GitHub
parent 7e88b311c8
commit 081bf30bbd
10 changed files with 155 additions and 31 deletions

View File

@@ -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`.**

View File

@@ -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

View File

@@ -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/<dir>` then `git branch -D <task>`. 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`).
---

View File

@@ -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.**
<br/>
@@ -19,8 +19,8 @@
<br/>
[![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 @@
<br/>
[**🚀 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 @@
</div>
> 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.
<table>
<tr>
<td width="33%" valign="top"><b>🚫 Never hit limits</b><br/><sub>Auto-fallback across 226 providers in milliseconds. Quota out? Next provider takes over — zero downtime.</sub></td>
<td width="33%" valign="top"><b>🚫 Never hit limits</b><br/><sub>Auto-fallback across 227 providers in milliseconds. Quota out? Next provider takes over — zero downtime.</sub></td>
<td width="33%" valign="top"><b>💸 Save up to 95% tokens</b><br/><sub>RTK + Caveman stacked compression cuts 1595% of eligible tokens (~89% avg on tool-heavy sessions).</sub></td>
<td width="33%" valign="top"><b>🆓 $0 to start</b><br/><sub>50+ providers with a free tier, 11 free <i>forever</i> (Kiro, Qoder, Pollinations, LongCat…). No card needed.</sub></td>
</tr>
@@ -263,7 +263,7 @@ Result: 4 layers of fallback = zero downtime
| Feature | OmniRoute | Other routers |
| -------------------------------------- | ----------------------------------------------------------- | ------------- |
| 🌐 Providers | **226** | 20100 |
| 🌐 Providers | **227** | 20100 |
| 🆓 Free providers | **50+ (11 free forever)** | 15 |
| 🔀 Routing strategies | **15** (priority, weighted, cost-optimized, context-relay…) | 13 |
| 🗜️ Token compression | **RTK + Caveman stacked (1595%)** | None / 2040% |
@@ -319,11 +319,11 @@ Result: 4 layers of fallback = zero downtime
<div align="center">
# 🌐 226 AI Providers — 50+ Free
# 🌐 227 AI Providers — 50+ Free
</div>
> 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**.
<div align="center">
@@ -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 (~6575% 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 (~6575% 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)

View File

@@ -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, <cap), imported by BOTH chat.ts and chatHelpers.ts (chatHelpers.ts stays <800 via the same extraction). Remaining growth is genuine routing logic, not the data block; cohesive fix.",
"_rebaseline_v3.8.25": "Drift consciente do ciclo v3.8.24->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,

View File

@@ -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 |

View File

@@ -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<string, RegistryEntry> = {
nscale: nscaleProvider,
"chatgpt-web": chatgpt_webProvider,
openrouter: openrouterProvider,
orcarouter: orcarouterProvider,
glhf: glhfProvider,
"copilot-web": copilot_webProvider,
stepfun: stepfunProvider,

View File

@@ -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,
* "<vendor>/" 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,
},
],
};

View File

@@ -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",

View File

@@ -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);