docs(readme): unified animated card system — audited v3.8.49 numbers, style contract across all cards, 5 new cards + rebuilt terminal (#7769)
* docs(readme): width + content overhaul — uniform tables, full CLI grid, condensed What's New - All remaining spacer-calibrated tables re-targeted +100px so every table clamps to the same full column width as the Why OmniRoute table. - Free-tier section: the 4 text bullets are gone — the animated budget card already carries all of it. - What's New: every highlight condensed to a 1-2 line bullet (links kept). - Compatible CLIs: the grid now lists all 25 tools from the dashboard registries (19 CLI Code's + 6 CLI Agents — Cline, Roo Code, Aider, ForgeCode, jcode, DeepSeek TUI, CodeWhale, Smelt, Pi, Grok Build, Hermes Agent, Goose, Open Interpreter, Warp AI, Agent Deck…) in 2 full-width rows; tools without a brand asset use a neutral terminal glyph (public/providers/cli-generic.svg) — no invented logos. - Major-labs providers grid: 3x6 -> 2x9 full-width rows. - Free Forever: 2 rows -> a single 7-card full-width row. - Explore More section removed; Dashboard screenshots promoted to their own top-level section. * docs(readme): force full-width card grids via in-cell spacers (GitHub strips td width) * docs(readme): CLI grid 3 balanced rows, dark-safe Cline/Roo icons, fix 251->259 heading * docs(readme): replace img spacers with NBSP runs — img max-width:100% collapses all-or-nothing past the container; text min-content never does * docs(readme): calibrate card-grid NBSP runs to measured 3.14px (match Why table width); Roo icon via gh-dark-mode-only * docs(readme): fine-tune markdown-table NBSP runs to measured widths (all ~1000px) * docs(readme): sync stale counts to v3.8.49 reality — 268 providers (regen reference), 104 MCP tools, 25k+ tests, 26 CLIs, 40+ free-forever, 43 locales, 84 executors; fix 251-era anchors + nav * docs(readme): animated hero card + The Promise six-pillar card — embed replaces hero text block, six static badges and the promise HTML table; all numbers from the v3.8.49 audit * docs(diagrams): make hero/promise card reveals resilient — resting state is the final composition, entrance animates via 0s-begin hold pattern (GitHub camo drops offset-begin one-shots) * docs(diagrams): pause-safe animation cycles — first frame is the finished composition (Chrome pause-animated-images freezes SVG imgs at t=0, where animation values override static attrs); hero/promise drop entrance reveals, budget bar/strike/dot cycles start at rest state * docs(readme): unify all animated cards on the flat family style (no outer border/rounded frame/top strip) + fuse hero with the budget card at the top — star CTA back to text, money section moved under the hero, cli-terminal flattened with a t0 poster of the completed screen * docs(readme): Why OmniRoute as an animated 10-row pain-vs-fix ledger card — extends the 6 original rows with resilience, key pools, local-first privacy and live analytics * docs(readme): animated 18-strategy flow grid under the strategies table — one micro-stage per routing strategy, static tracks readable on the first frame * docs(readme): blank line between strategies-grid img and the auto-combo sub note — the img HTML block was swallowing the note, rendering its markdown raw * docs(readme): Private & Local-First as an 11-row guarantee ledger card — the 5 original bullets plus no-signup, loopback-only routes, header scrubbing, opt-in PII, sanitized errors and local audit trail, each with a receipt chip * docs(readme): rebuild the resilience card — 3 self-healing layers with real mechanics (breaker states + thresholds, key cooldown with x2 backoff, model lockout) replacing the always-on combo card and the 3-row table * docs(diagrams): rebuild cli-terminal as a compact half-height real terminal (1200x350) — pure terminal theme, real CLI commands and data tied to live counts, scrolling ticker of real subcommands * docs(changelog): maintenance fragment for the README animated-card overhaul (#7769)
@@ -3,12 +3,12 @@
|
||||
## Project
|
||||
|
||||
Unified AI proxy/router — route any LLM through one endpoint. Multi-provider support
|
||||
with **265 provider entries** (OpenAI, Anthropic, Gemini, DeepSeek, Groq, xAI, Mistral, Fireworks,
|
||||
with **268 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** (94 tools), **A2A v0.3 Protocol**, and **Electron desktop app**.
|
||||
|
||||
> **Live counts (v3.8.49)**: providers 265 · MCP tools 94 · MCP scopes 30 · A2A skills 6 ·
|
||||
> **Live counts (v3.8.49)**: providers 268 · MCP tools 104 · MCP scopes 30 · A2A skills 6 ·
|
||||
> open-sse services 134 · routing strategies 17 · auto-combo scoring factors 12 ·
|
||||
> DB modules 95 · DB migrations 110 · base tables 17 · search providers 11 ·
|
||||
> i18n locales 42. **Refresh with `npm run check:docs-all`.**
|
||||
|
||||
@@ -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, 265 LLM providers, auto-fallback.
|
||||
**OmniRoute** — unified AI proxy/router. One endpoint, 268 LLM providers, auto-fallback.
|
||||
|
||||
| Layer | Location | Purpose |
|
||||
| ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
|
||||
566
README.md
@@ -6,18 +6,23 @@
|
||||
|
||||
# 🚀 OmniRoute — The Free AI Gateway
|
||||
|
||||
### Never stop coding. Connect every AI tool to **265 providers** — **90+ free** — through one endpoint.
|
||||
<img src="./docs/diagrams/readme-hero.svg" width="100%" alt="OmniRoute — Never stop coding. Every AI tool → 268 providers — 90+ free — through one endpoint. Claude Code, Codex, Cursor, Cline, Copilot & Antigravity into FREE Claude / GPT / Gemini with auto-fallback. RTK + Caveman stacked compression saves 15–95% tokens (~89% avg) — never hit limits. 268 AI providers · 90+ free tiers · ~1.6B free tokens/mo · 18 routing strategies · $0 to start."/>
|
||||
|
||||
**Plug Claude Code, Codex, Cursor, Cline, Copilot & Antigravity into FREE Claude / GPT / Gemini. Auto-fallback.**
|
||||
<br/>
|
||||
</div>
|
||||
|
||||
**RTK + Caveman compression saves 15–95% tokens. Never hit limits.**
|
||||
<div align="center">
|
||||
|
||||
<br/>
|
||||
# 💰 ~1.6B Free Tokens / Month
|
||||
|
||||
**~1.6B documented free tokens/month** — up to **~2.1B in your first month** with signup credits — aggregated across the free tiers, plus a long tail of permanently-free, no-cap providers, and the compression above stretches every one further. ([how we count →](docs/reference/FREE_TIERS.md#tldr--how-much-free-inference-does-omniroute-actually-aggregate))
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
> Stacking free tiers by hand is painful — dozens of SDKs, dozens of rate limits, and no idea how much you actually have. OmniRoute aggregates the **documented** free tiers of **40+ provider pools / 500+ models** into one honest number and shows it live on the dashboard (`/dashboard/free-tiers`).
|
||||
|
||||
<img src="./docs/diagrams/free-tier-budget.svg" width="100%" alt="OmniRoute free-tier budget card: ~1.6B free tokens per month steady, up to ~2.1B in the first month with signup credits, from the documented free tiers of 40+ provider pools / 500+ models behind one endpoint. Honest pool-deduped math — each shared pool counted once (counting every rate limit 24/7 would read ~10B; not published), 15 providers ToS-flagged so you decide. Budget bar of the 21 countable free pools with per-model grid (Mistral Large 3 1B, GPT-4o mini 150M, LongCat 150M, Gemini 2.5 Flash 60M … Auto 25K), ~616M one-time first-month signup credits (vertex 300M, agentrouter 200M, predibase 25M, together 25M, glm-cn 20M, doubao 15M, ai21 10M, deepseek 5M, hyperbolic 5M), plus permanently-free no-token-cap providers (SiliconFlow, Z.AI GLM-Flash, Kilo, OpenCode Zen, baidu …) and a $10 OpenRouter top-up unlocking +24M/mo — surfaced separately so they never inflate the headline. Live used/remaining on /dashboard/free-tiers."/>
|
||||
|
||||
> Animated summary of the live `/dashboard/free-tiers` page. Full methodology (pool dedupe, credit tiers, provider terms): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**.
|
||||
|
||||
<div align="center">
|
||||
|
||||
<h3>
|
||||
|
||||
@@ -29,15 +34,6 @@
|
||||
<a href="https://trendshift.io/repositories/23589" target="_blank"><img src="https://trendshift.io/api/badge/repositories/23589" alt="diegosouzapw%2FOmniRoute | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||
[](https://www.star-history.com/diegosouzapw/omniroute)
|
||||
|
||||
</br>
|
||||
|
||||
[](#-251-ai-providers--90-free)
|
||||
[](#-251-ai-providers--90-free)
|
||||
[](docs/reference/FREE_TIERS.md)
|
||||
[](#%EF%B8%8F-save-1595-tokens--automatically)
|
||||
[](#-combos--the-flagship)
|
||||
[](#-quick-start)
|
||||
|
||||
<br/>
|
||||
|
||||
### 💬 Join the community
|
||||
@@ -61,14 +57,14 @@
|
||||

|
||||

|
||||
|
||||
[**🚀 Quick Start**](#-quick-start) • [**🎯 Combos**](#-combos--the-flagship) • [**🌐 Providers**](#-251-ai-providers--90-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**](#-268-ai-providers--90-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)
|
||||
[💥 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) • [📸 Screenshots](#-dashboard-screenshots) • [📧 Support](#-support--community)
|
||||
|
||||
</div>
|
||||
|
||||
<div align="center">
|
||||
<b>🌐 In 42+ languages</b>
|
||||
<b>🌐 In 43 languages</b>
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="README.md">🇺🇸</a></td>
|
||||
@@ -122,47 +118,13 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
|
||||
<div align="center">
|
||||
|
||||
# 💰 ~1.6B Free Tokens / Month
|
||||
|
||||
</div>
|
||||
|
||||
> Stacking free tiers by hand is painful — dozens of SDKs, dozens of rate limits, and no idea how much you actually have. OmniRoute aggregates the **documented** free tiers of **40+ provider pools / 500+ models** into one honest number and shows it live on the dashboard (`/dashboard/free-tiers`).
|
||||
|
||||
- **~1.6B free tokens / month** (steady) — and **up to ~2.1B in your first month** with signup credits.
|
||||
- **Pool-deduped, honest** — we count each shared free pool **once**, so the headline isn't inflated by rate-limit ceilings the way multi-billion competitor claims are. (Counting every rate limit 24/7 would read ~10B; we don't publish that.)
|
||||
- **Plus the un-countable** — permanently-free, no-token-cap providers (SiliconFlow, Z.AI GLM-Flash, Kilo, OpenCode Zen…) and a **$10 OpenRouter top-up** that unlocks **+24M/mo**, both surfaced separately so they never inflate the headline.
|
||||
- **Per-model breakdown**, **live used / remaining** for the current month, and a transparent **terms flag** per provider.
|
||||
|
||||
<img src="./docs/diagrams/free-tier-budget.svg" width="100%" alt="OmniRoute free-tier budget card: ~1.6B free tokens per month steady, up to ~2.1B in the first month with signup credits, from the documented free tiers of 40+ provider pools / 500+ models behind one endpoint. Honest pool-deduped math — each shared pool counted once (counting every rate limit 24/7 would read ~10B; not published), 15 providers ToS-flagged so you decide. Budget bar of the 21 countable free pools with per-model grid (Mistral Large 3 1B, GPT-4o mini 150M, LongCat 150M, Gemini 2.5 Flash 60M … Auto 25K), ~616M one-time first-month signup credits (vertex 300M, agentrouter 200M, predibase 25M, together 25M, glm-cn 20M, doubao 15M, ai21 10M, deepseek 5M, hyperbolic 5M), plus permanently-free no-token-cap providers (SiliconFlow, Z.AI GLM-Flash, Kilo, OpenCode Zen, baidu …) and a $10 OpenRouter top-up unlocking +24M/mo — surfaced separately so they never inflate the headline. Live used/remaining on /dashboard/free-tiers."/>
|
||||
|
||||
> Animated summary of the live `/dashboard/free-tiers` page. Full methodology (pool dedupe, credit tiers, provider terms): **[docs/reference/FREE_TIERS.md](docs/reference/FREE_TIERS.md)**.
|
||||
|
||||
<br/>
|
||||
|
||||
<div align="center">
|
||||
|
||||
# 💥 The Promise
|
||||
|
||||
</div>
|
||||
|
||||
> One endpoint. **265 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 265 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 15–95% of eligible tokens (~89% avg on tool-heavy sessions).</sub></td>
|
||||
<td width="33%" valign="top"><b>🆓 $0 to start</b><br/><sub>90+ providers with a free tier, 11 free <i>forever</i> (Kiro, Qoder, Pollinations, LongCat…). No card needed.</sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%" valign="top"><b>🔌 Every tool works</b><br/><sub>24+ coding agents — Claude Code, Codex, Cursor, Cline, Copilot, Antigravity — through one config.</sub></td>
|
||||
<td width="33%" valign="top"><b>🧩 One endpoint</b><br/><sub>OpenAI ↔ Claude ↔ Gemini ↔ Responses API translation. Point any tool at <code>/v1</code> and it just works.</sub></td>
|
||||
<td width="33%" valign="top"><b>🛡️ Production-grade</b><br/><sub>Circuit breakers, TLS stealth, MCP (94 tools), A2A, memory, guardrails, evals. 21,000+ tests.</sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
<img src="./docs/diagrams/promise-pillars.svg" width="100%" alt="The Promise — One endpoint. 268 providers. Never stop building — OmniRoute picks the cheapest one that works. Six pillars: Never hit limits (auto-fallback across 268 providers in milliseconds, zero downtime) · Save up to 95% tokens (RTK + Caveman stacked compression cuts 15–95%, ~89% avg on tool-heavy sessions) · $0 to start (90+ free tiers, 40+ free forever — no card needed) · Every tool works (26 coding agents through one config) · One endpoint (OpenAI ↔ Claude ↔ Gemini ↔ Responses API at /v1) · Production-grade (circuit breakers, TLS stealth, MCP 104 tools, A2A, memory, guardrails, evals — 25,000+ tests)."/>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
@@ -173,16 +135,7 @@
|
||||
|
||||
</div>
|
||||
|
||||
> Stop juggling 10 dashboards, dead API keys, and surprise bills.
|
||||
|
||||
| ❌ The daily pain | ✅ How OmniRoute fixes it |
|
||||
| ------------------------------------------------------ | ----------------------------------------------------------------------------- |
|
||||
| 📉 Subscription quota expires unused every month | **Maximize subscriptions** — track quota, use every token before reset |
|
||||
| 🛑 Rate limits stop you mid-coding | **4-tier auto-fallback** — Subscription → API → Cheap → Free, in milliseconds |
|
||||
| 🔥 Tool outputs (`git diff`, `grep`, logs) burn tokens | **RTK + Caveman compression** — save 15–95% eligible tokens per request |
|
||||
| 💸 Expensive APIs ($20–50/mo per provider) | **Cost-optimized routing** — auto-route to the cheapest viable model |
|
||||
| 🧰 Each AI tool wants its own setup | **One endpoint, every tool, one dashboard** |
|
||||
| 🌍 AI blocked in your country | **3-level proxy** + TLS fingerprint stealth — use AI from anywhere |
|
||||
<img src="./docs/diagrams/why-pain-fix.svg" width="100%" alt="Why OmniRoute — stop juggling 10 dashboards, dead API keys and surprise bills. Ten daily pains vs fixes: quota expiring unused → maximize subscriptions; rate limits mid-coding → 4-tier auto-fallback (Subscription → API → Cheap → Free); tool outputs burning tokens → RTK + Caveman compression (15–95%); expensive APIs → cost-optimized routing; every tool its own setup → one endpoint, one dashboard; AI blocked → 3-level proxy + TLS stealth; dead keys → 3-layer resilience (circuit breakers, key cooldown, model lockout); team sharing one subscription → key pools with fair-share quotas; prompts through someone's cloud → local-first with AES-256-GCM encrypted keys; no spend visibility → live analytics (usage, quota, savings, p95 latency)."/>
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -204,14 +157,14 @@
|
||||
|
||||
No combo to create. Set your model to `auto` (or a variant) and OmniRoute builds a virtual combo from your connected providers, scored live:
|
||||
|
||||
| Model ID | What it optimizes for<br><img src="docs/screenshots/spacer.svg" width="720" height="1" alt=""> |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------- |
|
||||
| `auto` | 🎯 Balanced default (LKGP — sticks to your last good provider) |
|
||||
| `auto/coding` | 🧑💻 Quality-first weights for code generation |
|
||||
| `auto/fast` | ⚡ Lowest latency first |
|
||||
| `auto/cheap` | 💰 Cheapest per token first |
|
||||
| `auto/offline` | 🔋 Most quota / rate-limit headroom first |
|
||||
| `auto/smart` | 🔭 Quality-first + 10% exploration to discover better models |
|
||||
| Model ID | What it optimizes for |
|
||||
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `auto` | 🎯 Balanced default (LKGP — sticks to your last good provider) |
|
||||
| `auto/coding` | 🧑💻 Quality-first weights for code generation |
|
||||
| `auto/fast` | ⚡ Lowest latency first |
|
||||
| `auto/cheap` | 💰 Cheapest per token first |
|
||||
| `auto/offline` | 🔋 Most quota / rate-limit headroom first |
|
||||
| `auto/smart` | 🔭 Quality-first + 10% exploration to discover better models |
|
||||
|
||||
##
|
||||
|
||||
@@ -219,26 +172,28 @@ No combo to create. Set your model to `auto` (or a variant) and OmniRoute builds
|
||||
|
||||
All **18** strategies — mix & match per combo step:
|
||||
|
||||
| # | Strategy | What it does<br><img src="docs/screenshots/spacer.svg" width="630" height="1" alt=""> |
|
||||
| --- | ------------------- | ------------------------------------------------------------------------------------- |
|
||||
| 1 | `priority` | First-target ordered list — drain each before the next 🥇 |
|
||||
| 2 | `fill-first` | Fill each target's quota fully before moving on |
|
||||
| 3 | `weighted` | Weighted random by per-target weight |
|
||||
| 4 | `round-robin` | Cycle through targets in order |
|
||||
| 5 | `p2c` | Power-of-two-choices random load balancing |
|
||||
| 6 | `least-used` | Pick the target with the lowest current load |
|
||||
| 7 | `random` | Uniform random pick (deduplicated) |
|
||||
| 8 | `strict-random` | Random without de-duplicating repeats 🎲 |
|
||||
| 9 | `cost-optimized` | Minimize $ per request from live catalog pricing 💸 |
|
||||
| 10 | `headroom` | Pick the target with the most remaining quota |
|
||||
| 11 | `reset-window` | Prefer the target whose quota window resets soonest |
|
||||
| 12 | `reset-aware` | Rank by quota reset time — short windows first 📊 |
|
||||
| 13 | `context-relay` | Hand off context across targets for long conversations 🧠 |
|
||||
| 14 | `context-optimized` | Pick the best fit for the current context size |
|
||||
| 15 | `lkgp` | Last-Known-Good Path — sticky to the last successful target |
|
||||
| 16 | `auto` | 12-factor live scoring across every connection 🤖 |
|
||||
| 17 | `fusion` | Fan out to a panel of models + a judge synthesizes one answer 🧬 |
|
||||
| 18 | `pipeline` | Chain steps — each target's output feeds the next one 🔗 |
|
||||
| # | Strategy | What it does |
|
||||
| --- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 1 | `priority` | First-target ordered list — drain each before the next 🥇 |
|
||||
| 2 | `fill-first` | Fill each target's quota fully before moving on |
|
||||
| 3 | `weighted` | Weighted random by per-target weight |
|
||||
| 4 | `round-robin` | Cycle through targets in order |
|
||||
| 5 | `p2c` | Power-of-two-choices random load balancing |
|
||||
| 6 | `least-used` | Pick the target with the lowest current load |
|
||||
| 7 | `random` | Uniform random pick (deduplicated) |
|
||||
| 8 | `strict-random` | Random without de-duplicating repeats 🎲 |
|
||||
| 9 | `cost-optimized` | Minimize $ per request from live catalog pricing 💸 |
|
||||
| 10 | `headroom` | Pick the target with the most remaining quota |
|
||||
| 11 | `reset-window` | Prefer the target whose quota window resets soonest |
|
||||
| 12 | `reset-aware` | Rank by quota reset time — short windows first 📊 |
|
||||
| 13 | `context-relay` | Hand off context across targets for long conversations 🧠 |
|
||||
| 14 | `context-optimized` | Pick the best fit for the current context size |
|
||||
| 15 | `lkgp` | Last-Known-Good Path — sticky to the last successful target |
|
||||
| 16 | `auto` | 12-factor live scoring across every connection 🤖 |
|
||||
| 17 | `fusion` | Fan out to a panel of models + a judge synthesizes one answer 🧬 |
|
||||
| 18 | `pipeline` | Chain steps — each target's output feeds the next one 🔗 |
|
||||
|
||||
<img src="./docs/diagrams/strategies-grid.svg" width="100%" alt="All 18 combo routing strategies animated, one tile per strategy showing the flow it executes: priority (drain the 1st, then the next), fill-first (fill a target's quota, then move on), weighted (weighted random), round-robin (cycle in order), p2c (pick 2, take the lighter), least-used (lowest load wins), random (uniform, deduped), strict-random (repeats allowed), cost-optimized (cheapest $ per request), headroom (most remaining quota), reset-window (resets soonest → use it), reset-aware (rank by reset, short first), context-relay (hand off long context), context-optimized (fit the context size), lkgp (sticky to last success), auto (live 12-factor scoring), fusion (panel + judge → one answer), pipeline (each output feeds the next)."/>
|
||||
|
||||
<sub>The Auto-Combo engine scores every candidate on **12 factors** (health, quota, cost, latency, success rate, freshness…) — see [`docs/routing/AUTO-COMBO.md`](docs/routing/AUTO-COMBO.md).</sub>
|
||||
|
||||
@@ -248,12 +203,12 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
> Running several keys against the **same upstream account** (one Codex Pro plan, one Kimi key, one GLM Coding seat)? A burst on one key can burn the whole 5-hour / hourly quota and lock everyone else out. **Quota-Share** distributes a provider's time-based quota **fairly** across the keys in a pool — and it's _work-conserving_, so an idle member's slice is lent out instead of wasted.
|
||||
|
||||
| Knob | What it controls<br><img src="docs/screenshots/spacer.svg" width="670" height="1" alt=""> |
|
||||
| ------------------------ | ----------------------------------------------------------------------------------------- |
|
||||
| ⚖️ **Allocation weight** | each key's slice of the pool — e.g. `50 / 30 / 20` |
|
||||
| 📐 **Dimensions** | track `%` · requests · tokens · `$`, per **5h / 7d / per-model** window |
|
||||
| 🚦 **Policy** | `hard` (block over share) · `soft` (deprioritize) · `burst` (use idle headroom) |
|
||||
| 🧱 **Cap** | absolute ceiling per key, independent of mode |
|
||||
| Knob | What it controls |
|
||||
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| ⚖️ **Allocation weight** | each key's slice of the pool — e.g. `50 / 30 / 20` |
|
||||
| 📐 **Dimensions** | track `%` · requests · tokens · `$`, per **5h / 7d / per-model** window |
|
||||
| 🚦 **Policy** | `hard` (block over share) · `soft` (deprioritize) · `burst` (use idle headroom) |
|
||||
| 🧱 **Cap** | absolute ceiling per key, independent of mode |
|
||||
|
||||
<img src="./docs/diagrams/pool-fair-share.svg" width="100%" alt="OmniRoute key pool 'team-codex': one Codex Pro account shared by 3 keys over a 5-hour window. alice weight 50 (up to 50% of the shared 5h quota), bob weight 30, ci-bot weight 20. In generous mode (under 50% pool used) idle shares are lent out; once the pool crosses 50% strict mode holds each key to its fair share."/>
|
||||
|
||||
@@ -263,13 +218,7 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
### 🧱 Resilience is built in (3 independent layers)
|
||||
|
||||
| Layer | Scope | What it does |
|
||||
| -------------------------- | ----------------- | -------------------------------------------------------------------------- |
|
||||
| 🔌 **Circuit breaker** | whole provider | Stops hammering a provider that's failing upstream; auto-probes to recover |
|
||||
| 💤 **Connection cooldown** | one account / key | Skips a rate-limited key while other keys keep serving |
|
||||
| 🎯 **Model lockout** | provider + model | Quarantines just one quota-limited model, not the whole connection |
|
||||
|
||||
<img src="./docs/diagrams/combo-always-on.svg" width="100%" alt="OmniRoute combo 'always-on' with priority strategy: requests go to 1. cc/claude-opus-4-7 (subscription, use it fully); on failure fall through to 2. cx/gpt-5.5 (second subscription), then 3. glm/glm-5.1 (cheap backup at $0.5/1M), then 4. kr/claude-sonnet-4.5 (free, unlimited, never fails). Result: 4 layers of fallback = zero downtime."/>
|
||||
<img src="./docs/diagrams/resilience-layers.svg" width="100%" alt="OmniRoute resilience — 3 independent self-healing layers, the right layer for the right failure. Layer 1 provider circuit breaker (whole provider): trips only on 408/5xx, thresholds OAuth 3× / API-key 5× / local 2×, resets 60s/30s/15s into a HALF-OPEN probe, lazy recovery; while OPEN the combo reroutes to the next provider. Layer 2 connection cooldown (one key/account): base 5s OAuth / 3s API-key, exponential ×2 backoff with anti-thundering-herd guard, 429 honors Retry-After, success clears all error state; one cooling key is skipped while sibling keys keep serving. Layer 3 model lockout (one model): per-model 429, local 404 or mode denials lock just that model — never the whole connection. Terminal states (banned, expired, credits exhausted) are for the operator, not cooldowns."/>
|
||||
|
||||
<sub>📖 [Auto-Combo Engine](docs/routing/AUTO-COMBO.md) · [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md)</sub>
|
||||
|
||||
@@ -283,18 +232,18 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
| Feature | OmniRoute | Other routers |
|
||||
| -------------------------------------- | ------------------------------------------------------------------- | ------------- |
|
||||
| 🌐 Providers | **251** | 20–100 |
|
||||
| 🆓 Free providers | **90+ (11 free forever)** | 1–5 |
|
||||
| 🌐 Providers | **268** | 20–100 |
|
||||
| 🆓 Free providers | **90+ (40+ free forever)** | 1–5 |
|
||||
| 🔀 Routing strategies | **18** (priority, weighted, cost-optimized, context-relay, fusion…) | 1–3 |
|
||||
| 🗜️ Token compression | **RTK + Caveman stacked (15–95%)** | None / 20–40% |
|
||||
| 🧰 Built-in MCP server | **94 tools, 3 transports, 30 scopes** | Rare |
|
||||
| 🧰 Built-in MCP server | **104 tools, 3 transports, 30 scopes** | Rare |
|
||||
| 🤝 A2A agent protocol | **6 skills, JSON-RPC 2.0** | None |
|
||||
| 🧠 Memory (FTS5 + vector) | **Yes** | Rare |
|
||||
| 🛡️ Guardrails (PII, injection, vision) | **Yes** | Rare |
|
||||
| ☁️ Cloud agents | **Codex, Cursor, Devin, Jules** | None |
|
||||
| 🥷 TLS fingerprint stealth | **JA3/JA4 via wreq-js** | None |
|
||||
| 🖥️ Multi-platform | **Web · Desktop · Termux · PWA** | Web only |
|
||||
| 🌍 i18n | **42 locales** | 0–4 |
|
||||
| 🌍 i18n | **43 locales** | 0–4 |
|
||||
|
||||
<sub>📊 Detailed comparison vs LiteLLM, OpenRouter & Portkey → [`docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md`](docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md)</sub>
|
||||
|
||||
@@ -306,23 +255,23 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
</div>
|
||||
|
||||
> Recent highlights from **v3.8.20 → v3.8.47**. Full history in [`CHANGELOG.md`](CHANGELOG.md).
|
||||
> Recent highlights from **v3.8.20 → v3.8.49**. Full history in [`CHANGELOG.md`](CHANGELOG.md).
|
||||
|
||||
- **🗜️ Compression hardening** — a default-on **inflation guard** (discard the stacked result and send the verbatim original whenever compression would _grow_ the prompt), completed **Caveman rule packs** for German / French / Japanese (dedup + ultra) plus a new **Chinese (文言 / wényán) input pack** with zh-vs-ja auto-detection, and **RTK filters for Gradle & .NET (`dotnet`)** build output. → [Compression](docs/compression/COMPRESSION_ENGINES.md)
|
||||
- **💸 Honest flat-rate cost** — subscription / coding-plan providers (ChatGPT Web, grok-web, the Minimax / Kimi / GLM / Alibaba Coding plans, Xiaomi MiMo…) now read **$0** in cost analytics instead of an inflated per-token estimate, while budget / quota / routing keep estimating unchanged. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **⚖️ Quota-Share routing** — a dedicated combo strategy that spreads load across accounts by _available quota_: Deficit-Round-Robin scheduling, per-connection `max_concurrent` with cooldown-wait queueing, multi-window usage buckets (5h / 7d / per-model), per-(key, model) caps, session stickiness for prompt-cache integrity (now with a per-combo / global disable toggle), and proactive saturation from upstream token-usage headers. → [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md)
|
||||
- **🤖 One-command CLI/agent setup** — a dedicated `setup-*` command configures each coding tool to route through OmniRoute (Claude Code, Codex, Cline, Continue, Cursor, Roo Code, Kilo Code, Crush, Goose, Qwen Code, Aider, OpenCode); `omniroute launch` / `omniroute launch-codex` are zero-config launchers. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md)
|
||||
- **🛰️ Remote mode** — drive a remote OmniRoute from any machine with scoped access tokens (`omniroute connect` / `omniroute contexts` / `omniroute tokens`), plus an `omniroute login antigravity` helper that runs Google "native/desktop" OAuth on your own machine and pastes a credential blob into a remote/VPS install (where the loopback redirect is unreachable). → [Remote Mode](docs/guides/REMOTE-MODE.md)
|
||||
- **🧭 Smarter auto-routing** — OpenRouter-style `auto/<category>:<tier>` combos (e.g. `auto/coding:fast`, `auto/reasoning:pro`), a **Fusion** strategy (fan out to a panel of models in parallel, then synthesize via a judge), **task-aware routing** (best-fit connection per task type), per-request `X-Route-Model` override, live Arena-ELO + models.dev model intelligence, per-step account allowlists, provider-wildcard combo steps, nested combo-ref execution, sticky weighted selection, `web_search`-aware routing (now with **per-model web-search/web-fetch interception rules**), native **xAI Grok `/v1/responses`** routing, and **per-request Auto-Combo controls** (`X-OmniRoute-Mode` mode-preset override + `X-OmniRoute-Budget` hard USD cost ceiling, scoped to a single request). Embeddings-only and rerank-only models (JinaAI, OpenRouter custom, reranker models…) no longer disappear from the combo builder's model picker. → [Auto-Combo](docs/routing/AUTO-COMBO.md)
|
||||
- **🗜️ Pluggable compression** — an async pipeline of **10 composable engines** with Compression Studios, an LLMLingua-2 ONNX engine and a heuristic/SLM two-tier **Ultra**, RTK, delegated Anthropic Context Editing, **Output Styles** (output-axis steering: terse-prose / less-code / terse-CJK), an **adaptive context-budget dial** (escalate only as far as needed to fit the context window), per-request `x-omniroute-compression` control, an opt-in offline eval harness, one-click **Headroom** proxy lifecycle management from the dashboard (Docker sidecar supported), a synthetic **compression playground** (Play lanes + A/B Compare with USD-capped fidelity verdicts), an opt-in **per-step fidelity gate** that rejects a lossy engine before it degrades the prompt, a **best-of-N candidate encoder** (GCF vs TOON — keep whichever is shorter, with an A/B bytes/token table in the studio), the vendored **GCF codec updated to spec v3.2** (nested flattening — deeply-nested payloads go from ~3% to ~32% compression vs JSON), a new **omniglyph** engine (context-as-image, ~10× fewer tokens on the converted block), **CCR ranged/grep/stats retrieval** (pull an exact byte/line slice or summary of a stored block instead of re-expanding it), a unified panel with named profiles + an active-profile selector, an opt-in **per-engine pipeline circuit-breaker**, an opt-in **LLM-tier engine** (a model pass for higher-ratio semantic compression), a **read-lifecycle engine** that collapses superseded file reads, **usage-observed prefix freeze**, a graduated **CCR retrieval-feedback ramp**, a `preserveSystemPrompt` mode enum, and a **drag-reorder pipeline editor** in the studio. → [Compression](docs/compression/COMPRESSION_ENGINES.md)
|
||||
- **🕵️ Transparent MITM decrypt (TPROXY)** — capture & translate traffic from CLIs that ignore proxy env vars, with a per-SNI certificate authority and a trust-store installer. → [MITM/TPROXY](docs/security/MITM-TPROXY-DECRYPT.md)
|
||||
- **💸 Cost telemetry everywhere** — `X-OmniRoute-*` cost/usage headers on every endpoint (including media), a non-token cost engine, a cache-HIT `X-OmniRoute-Cost-Saved` header, and per-key USD spend quotas. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **🧠 Memory you control** — opt-in int8 vector quantization (Qdrant + sqlite-vec), opt-in **typed memory decay** (aged low-value memories fade on a per-type schedule), memory off by default, and a per-request `x-omniroute-no-memory` header. → [Memory](docs/frameworks/MEMORY.md)
|
||||
- **🛡️ Security** — a prompt-injection guard across every LLM route (backed by a red-team suite), plus a free DuckDuckGo last-resort web search. → [Guardrails](docs/security/GUARDRAILS.md)
|
||||
- **🖼️ New endpoints** — `/v1/ocr` (Mistral OCR) and `/v1/audio/translations` (Whisper-style audio translation) round out the media API surface. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **🌍 Deployment & ops** — reverse-proxy `basePath` deployment (`OMNIROUTE_BASE_PATH`, e.g. serving OmniRoute under `/omniroute/`), browser-language auto-detect on first visit, per-API-key device/connection tracking (IP+UA fingerprint, masked, in-memory only), root-less MITM cert trust for user-namespaced containers (`OMNIROUTE_NO_SUDO`), server-side configured-only / available-only filters on the Free Provider Rankings page, and **Traditional Chinese (zh-TW)** localization for the frontend + CLI. → [Environment](docs/reference/ENVIRONMENT.md)
|
||||
- **🤝 More providers & agents** — Cursor Cloud Agent (a 4th cloud agent), CodeBuddy CN (`copilot.tencent.com`), a Google Flow video-generation provider, new gateways **DGrid** and **Pioneer AI** (Fastino Labs), inbound **xAI Grok** translators plus **Grok Build (xAI)** with an OAuth import-token flow, GPT-4 / GPT-4o-mini on the GitHub Copilot provider, multi-model **Factory Droid**, **ZenMux Free** (session-cookie free tier), **Alibaba DashScope** text-to-video (`wan2.7-t2v`), a refreshed 250-provider catalog (OrcaRouter, Wafer AI, OpenAdapter, dit.ai, TokenRouter, …), Vertex AI media generation (speech/transcription/music/video), a first-class **Ollama** local-provider card, the **SenseNova** free Token Plan (chat + text-to-image), one-click account import from CLIProxyAPI (`~/.cli-proxy-api/`), **Claude Sonnet 5** wired end-to-end, a new provider wave (**Kenari**, **SumoPod**, **X5Lab**, **Charm Hyper**, **Nube.sh**, **b.ai**, **Qiniu**, **ModelScope**, **Augment/Auggie CLI**, **ClinePass**, NVIDIA NIM image generation), Codex account import from a raw ChatGPT access token, the **Requesty** gateway (BYOK, ~200 free req/day), **Yuanbao (web)** as a cookie-session provider (DeepSeek V3/R1 + Hunyuan), the **Zed** hosted LLM aggregator (OAuth), **Claude 5 Sonnet** on the Claude Web provider, Kiro **adaptive-thinking reasoning** surfaced as `reasoning_content`, **bulk API-key add for Cloudflare Workers AI**, and **OpenVecta** (AI inference gateway). → [Providers](docs/reference/PROVIDER_REFERENCE.md)
|
||||
- **⚡ Local performance & infra** — a one-click local Redis launcher (`omniroute redis up`, plus a dashboard Redis panel), one-click **Cloudflare Workers** and **Deno Deploy** relay deployers wired into the proxy pool, a relay-backend selector (`OMNIROUTE_RELAY_BACKEND=ts|bifrost|auto`) so `/v1/relay` stays the stable surface while choosing the fastest backend internally, **Bifrost** (Go AI-gateway) and **Mux** (agent-orchestration daemon) promoted to first-class embedded/supervised services alongside 9Router/CLIProxyAPI, **Webshare** added as a paid fourth source in the free-proxy provider framework, and **shorthand proxy formats + protocol header mode** for bulk proxy import. → [Embedded Services](docs/frameworks/EMBEDDED-SERVICES.md)
|
||||
- **🗜️ Compression hardening** — default-on inflation guard, Caveman packs for DE / FR / JA + Chinese (wényán), RTK filters for Gradle & .NET. → [Compression](docs/compression/COMPRESSION_ENGINES.md)
|
||||
- **💸 Honest flat-rate cost** — subscription / coding-plan providers read **$0** in cost analytics; budget, quota & routing keep estimating. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **⚖️ Quota-Share routing** — split load across accounts by _available quota_: DRR scheduling, per-connection concurrency, multi-window buckets, session stickiness. → [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md)
|
||||
- **🤖 One-command CLI/agent setup** — `setup-*` configures 12+ coding tools; `omniroute launch` / `launch-codex` are zero-config. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md)
|
||||
- **🛰️ Remote mode** — drive a remote OmniRoute with scoped tokens (`connect` / `contexts` / `tokens`) + an `antigravity` OAuth helper for VPS installs. → [Remote Mode](docs/guides/REMOTE-MODE.md)
|
||||
- **🧭 Smarter auto-routing** — `auto/<category>:<tier>` combos, **Fusion** (model panel + judge), task-aware routing, per-request model / mode / USD-budget overrides. → [Auto-Combo](docs/routing/AUTO-COMBO.md)
|
||||
- **🗜️ Pluggable compression** — 10 composable engines + Compression Studios: LLMLingua-2, two-tier Ultra, omniglyph, per-step fidelity gate, GCF v3.2, drag-reorder editor. → [Compression](docs/compression/COMPRESSION_ENGINES.md)
|
||||
- **🕵️ Transparent MITM decrypt (TPROXY)** — capture CLIs that ignore proxy env vars, with a per-SNI CA + trust-store installer. → [MITM/TPROXY](docs/security/MITM-TPROXY-DECRYPT.md)
|
||||
- **💸 Cost telemetry everywhere** — `X-OmniRoute-*` cost/usage headers on every endpoint, cache-HIT savings header, per-key USD spend quotas. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **🧠 Memory you control** — off by default, opt-in int8 vector quantization + typed decay, per-request `x-omniroute-no-memory`. → [Memory](docs/frameworks/MEMORY.md)
|
||||
- **🛡️ Security** — prompt-injection guard on every LLM route (red-team suite) + free DuckDuckGo last-resort web search. → [Guardrails](docs/security/GUARDRAILS.md)
|
||||
- **🖼️ New endpoints** — `/v1/ocr` (Mistral OCR) and `/v1/audio/translations` (Whisper-style) round out the media surface. → [API Reference](docs/reference/API_REFERENCE.md)
|
||||
- **🌍 Deployment & ops** — reverse-proxy `basePath`, browser-language auto-detect, per-key device tracking, root-less MITM trust, zh-TW localization. → [Environment](docs/reference/ENVIRONMENT.md)
|
||||
- **🤝 More providers & agents** — Cursor Cloud Agent, Grok Build (xAI), Ollama first-class card, Claude Sonnet 5, Zed, Requesty, SenseNova, Yuanbao… and a refreshed 250-provider catalog. → [Providers](docs/reference/PROVIDER_REFERENCE.md)
|
||||
- **⚡ Local performance & infra** — one-click local Redis, Cloudflare Workers / Deno Deploy relay deployers, Bifrost & Mux as supervised embedded services. → [Embedded Services](docs/frameworks/EMBEDDED-SERVICES.md)
|
||||
|
||||
<br/>
|
||||
|
||||
@@ -335,28 +284,44 @@ All **18** strategies — mix & match per combo step:
|
||||
<div align="center">
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" width="120"><a href="https://github.com/anthropics/claude-code"><img src="./public/providers/claude.svg" width="52" alt="Claude Code"/><br/><b>Claude Code</b></a></td>
|
||||
<td align="center" width="120"><a href="https://github.com/openai/codex"><img src="./public/providers/codex.svg" width="52" alt="Codex CLI"/><br/><b>Codex CLI</b></a></td>
|
||||
<td align="center" width="120"><img src="./public/providers/cursor.png" width="52" alt="Cursor"/><br/><b>Cursor</b></td>
|
||||
<td align="center" width="120"><img src="./public/providers/copilot.png" width="52" alt="Copilot"/><br/><b>Copilot</b></td>
|
||||
<td align="center" width="120"><img src="./public/providers/continue.png" width="52" alt="Continue"/><br/><b>Continue</b></td>
|
||||
<td align="center" width="76"><a href="https://github.com/anthropics/claude-code"><img src="./public/providers/claude.svg" width="40" alt="Claude Code"/><br/><sub><b>Claude Code</b></sub><br/><sub> </sub></a></td>
|
||||
<td align="center" width="76"><a href="https://github.com/openai/codex"><img src="./public/providers/codex.svg" width="40" alt="Codex CLI"/><br/><sub><b>Codex CLI</b></sub><br/><sub> </sub></a></td>
|
||||
<td align="center" width="76"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/cline.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cline.svg" width="40" alt="Cline"/></picture><br/><sub><b>Cline</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><a href="https://github.com/Kilo-Org/kilocode"><img src="./public/providers/kilocode.svg" width="40" alt="Kilo Code"/><br/><sub><b>Kilo Code</b></sub><br/><sub> </sub></a></td>
|
||||
<td align="center" width="76"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/roocode.png#gh-dark-mode-only" width="40" alt="Roo Code"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/roocode.svg#gh-light-mode-only" width="40" alt="Roo Code"/><br/><sub><b>Roo Code</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/continue.svg" width="40" alt="Continue"/><br/><sub><b>Continue</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/qwen.svg" width="40" alt="Qwen Code"/><br/><sub><b>Qwen Code</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Aider"/><br/><sub><b>Aider</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="ForgeCode"/><br/><sub><b>ForgeCode</b></sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="120"><a href="https://github.com/anomalyco/opencode"><img src="./public/providers/opencode.svg" width="52" alt="OpenCode"/><br/><b>OpenCode</b></a></td>
|
||||
<td align="center" width="120"><a href="https://github.com/Kilo-Org/kilocode"><img src="./public/providers/kilocode.svg" width="52" alt="Kilo Code"/><br/><b>Kilo Code</b></a></td>
|
||||
<td align="center" width="120"><img src="./public/providers/droid.svg" width="52" alt="Droid"/><br/><b>Droid</b></td>
|
||||
<td align="center" width="120"><img src="./public/providers/openclaw.png" width="52" alt="OpenClaw"/><br/><b>OpenClaw</b></td>
|
||||
<td align="center" width="120"><img src="./public/providers/kiro.svg" width="52" alt="Kiro"/><br/><b>Kiro</b></td>
|
||||
<td align="center" width="120"><img src="./public/providers/command-code.svg" width="52" alt="Command Code"/><br/><b>Command</b></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="jcode"/><br/><sub><b>jcode</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/deepseek.svg" width="40" alt="DeepSeek TUI"/><br/><sub><b>DeepSeek TUI</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="CodeWhale"/><br/><sub><b>CodeWhale</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><a href="https://github.com/anomalyco/opencode"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/opencode.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/opencode.svg" width="40" alt="OpenCode"/></picture><br/><sub><b>OpenCode</b></sub><br/><sub> </sub></a></td>
|
||||
<td align="center" width="76"><img src="./public/providers/droid.svg" width="40" alt="Factory Droid"/><br/><sub><b>Factory Droid</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/copilot.svg" width="40" alt="GitHub Copilot CLI"/><br/><sub><b>Copilot CLI</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cursor.svg" width="40" alt="Cursor CLI"/><br/><sub><b>Cursor CLI</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Smelt"/><br/><sub><b>Smelt</b></sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Pi (pi-coding-agent)"/><br/><sub><b>Pi</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/grok.svg" width="40" alt="Grok Build (xAI)"/><br/><sub><b>Grok Build</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/nousresearch.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/nousresearch.svg" width="40" alt="Hermes Agent (Nous Research)"/></picture><br/><sub><b>Hermes Agent</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/openclaw.svg" width="40" alt="OpenClaw"/><br/><sub><b>OpenClaw</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/goose.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/goose.svg" width="40" alt="Goose"/></picture><br/><sub><b>Goose</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Open Interpreter"/><br/><sub><b>Open Interpreter</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Warp AI"/><br/><sub><b>Warp AI</b></sub><br/><sub> </sub></td>
|
||||
<td align="center" width="76"><img src="./public/providers/cli-generic.svg" width="40" alt="Agent Deck"/><br/><sub><b>Agent Deck</b></sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div align="center">
|
||||
<b>+ also works with</b> · Cline · Antigravity · Windsurf · AMP · Hermes · Qwen CLI · Roo · Continue · <b>any OpenAI-compatible tool</b>
|
||||
<b>+ also works with</b> · Kiro · Command Code · Antigravity · Windsurf · AMP · <b>any OpenAI-compatible tool</b>
|
||||
</div>
|
||||
|
||||
<sub>📖 Per-tool setup for all 24+ tools → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)</sub>
|
||||
<sub>📖 Per-tool setup for all 26 tools (20 CLI Code's + 6 CLI Agents) → [`docs/reference/CLI-TOOLS.md`](docs/reference/CLI-TOOLS.md) · 🧩 OpenCode plugin → [`@omniroute/opencode-provider`](https://www.npmjs.com/package/@omniroute/opencode-provider)</sub>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -364,11 +329,11 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
<div align="center">
|
||||
|
||||
# 🌐 251 AI Providers — 90+ Free
|
||||
# 🌐 268 AI Providers — 90+ Free
|
||||
|
||||
</div>
|
||||
|
||||
> The most complete catalog of any open-source router: **265 providers**, **90+ with a free tier**, **11 free forever**.
|
||||
> The most complete catalog of any open-source router: **268 providers**, **90+ with a free tier**, **40+ free forever**.
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -376,28 +341,26 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" width="92"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/openai.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/openai.svg" width="40" alt="OpenAI"/></picture><br/><sub>OpenAI</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/claude-color.svg" width="40" alt="Anthropic"/><br/><sub>Anthropic</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/gemini-color.svg" width="40" alt="Gemini"/><br/><sub>Gemini</sub></td>
|
||||
<td align="center" width="92"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/grok.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/grok.svg" width="40" alt="xAI Grok"/></picture><br/><sub>xAI Grok</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/deepseek-color.svg" width="40" alt="DeepSeek"/><br/><sub>DeepSeek</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/mistral-color.svg" width="40" alt="Mistral"/><br/><sub>Mistral</sub></td>
|
||||
<td align="center" width="98"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/openai.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/openai.svg" width="40" alt="OpenAI"/></picture><br/><sub>OpenAI</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/claude-color.svg" width="40" alt="Anthropic"/><br/><sub>Anthropic</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/gemini-color.svg" width="40" alt="Gemini"/><br/><sub>Gemini</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/grok.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/grok.svg" width="40" alt="xAI Grok"/></picture><br/><sub>xAI Grok</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/deepseek-color.svg" width="40" alt="DeepSeek"/><br/><sub>DeepSeek</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/mistral-color.svg" width="40" alt="Mistral"/><br/><sub>Mistral</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/qwen-color.svg" width="40" alt="Qwen"/><br/><sub>Qwen</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/meta-color.svg" width="40" alt="Meta Llama"/><br/><sub>Meta Llama</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/groq.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/groq.svg" width="40" alt="Groq"/></picture><br/><sub>Groq</sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/qwen-color.svg" width="40" alt="Qwen"/><br/><sub>Qwen</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/meta-color.svg" width="40" alt="Meta Llama"/><br/><sub>Meta Llama</sub></td>
|
||||
<td align="center" width="92"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/groq.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/groq.svg" width="40" alt="Groq"/></picture><br/><sub>Groq</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/nvidia-color.svg" width="40" alt="NVIDIA"/><br/><sub>NVIDIA</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/minimax-color.svg" width="40" alt="MiniMax"/><br/><sub>MiniMax</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cohere-color.svg" width="40" alt="Cohere"/><br/><sub>Cohere</sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/perplexity-color.svg" width="40" alt="Perplexity"/><br/><sub>Perplexity</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/huggingface-color.svg" width="40" alt="Hugging Face"/><br/><sub>HuggingFace</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/together-color.svg" width="40" alt="Together"/><br/><sub>Together</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/fireworks-color.svg" width="40" alt="Fireworks"/><br/><sub>Fireworks</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cloudflare-color.svg" width="40" alt="Cloudflare"/><br/><sub>Cloudflare</sub></td>
|
||||
<td align="center" width="92"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/baidu-color.svg" width="40" alt="Baidu"/><br/><sub>Baidu</sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/nvidia-color.svg" width="40" alt="NVIDIA"/><br/><sub>NVIDIA</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/minimax-color.svg" width="40" alt="MiniMax"/><br/><sub>MiniMax</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cohere-color.svg" width="40" alt="Cohere"/><br/><sub>Cohere</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/perplexity-color.svg" width="40" alt="Perplexity"/><br/><sub>Perplexity</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/huggingface-color.svg" width="40" alt="Hugging Face"/><br/><sub>HuggingFace</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/together-color.svg" width="40" alt="Together"/><br/><sub>Together</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/fireworks-color.svg" width="40" alt="Fireworks"/><br/><sub>Fireworks</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cloudflare-color.svg" width="40" alt="Cloudflare"/><br/><sub>Cloudflare</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="98"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/baidu-color.svg" width="40" alt="Baidu"/><br/><sub>Baidu</sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -409,15 +372,13 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center" width="150"><img src="./public/providers/agentrouter.png" width="44" alt="AgentRouter"/><br/><b>AgentRouter</b><br/><sub>GPT-5, Claude, Gemini<br/>$100 free credits</sub></td>
|
||||
<td align="center" width="150"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/qoder-color.svg" width="44" alt="Qoder AI"/><br/><b>Qoder AI</b><br/><sub>Kimi-K2, DeepSeek-R1<br/>Unlimited FREE</sub></td>
|
||||
<td align="center" width="150"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/pollinations.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/pollinations.svg" width="44" alt="Pollinations"/></picture><br/><b>Pollinations</b><br/><sub>GPT-5, Claude, Llama 4<br/>No key needed</sub></td>
|
||||
<td align="center" width="150"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/longcat-color.svg" width="44" alt="LongCat"/><br/><b>LongCat</b><br/><sub>LongCat-2.0<br/>10M tokens one-time (KYC) 🔑</sub></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" width="150"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cloudflare-color.svg" width="44" alt="Cloudflare AI"/><br/><b>Cloudflare AI</b><br/><sub>50+ models<br/>10K neurons/day</sub></td>
|
||||
<td align="center" width="150"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/nvidia-color.svg" width="44" alt="NVIDIA NIM"/><br/><b>NVIDIA NIM</b><br/><sub>129 models<br/>~40 RPM free</sub></td>
|
||||
<td align="center" width="150"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cerebras-color.svg" width="44" alt="Cerebras"/><br/><b>Cerebras</b><br/><sub>Qwen3 235B<br/>1M tokens/day</sub></td>
|
||||
<td align="center" width="127"><img src="./public/providers/agentrouter.png" width="44" alt="AgentRouter"/><br/><b>AgentRouter</b><br/><sub>GPT-5, Claude, Gemini<br/>$100 free credits</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/qoder-color.svg" width="44" alt="Qoder AI"/><br/><b>Qoder AI</b><br/><sub>Kimi-K2, DeepSeek-R1<br/>Unlimited FREE</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><picture><source media="(prefers-color-scheme:dark)" srcset="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-png@1.91.0/dark/pollinations.png"/><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/pollinations.svg" width="44" alt="Pollinations"/></picture><br/><b>Pollinations</b><br/><sub>GPT-5, Claude, Llama 4<br/>No key needed</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/longcat-color.svg" width="44" alt="LongCat"/><br/><b>LongCat</b><br/><sub>LongCat-2.0<br/>10M tokens one-time (KYC) 🔑</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cloudflare-color.svg" width="44" alt="Cloudflare AI"/><br/><b>Cloudflare AI</b><br/><sub>50+ models<br/>10K neurons/day</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/nvidia-color.svg" width="44" alt="NVIDIA NIM"/><br/><b>NVIDIA NIM</b><br/><sub>129 models<br/>~40 RPM free</sub><br/><sub> </sub></td>
|
||||
<td align="center" width="127"><img src="https://cdn.jsdelivr.net/npm/@lobehub/icons-static-svg@1.91.0/icons/cerebras-color.svg" width="44" alt="Cerebras"/><br/><b>Cerebras</b><br/><sub>Qwen3 235B<br/>1M tokens/day</sub><br/><sub> </sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -455,13 +416,7 @@ All **18** strategies — mix & match per combo step:
|
||||
|
||||
</div>
|
||||
|
||||
> Your keys, your machine, your data. OmniRoute is a **local proxy** — it never phones home.
|
||||
|
||||
- 🏠 **Runs 100% on your hardware** — npm, Docker, desktop, or your phone. No OmniRoute cloud sits in the request path.
|
||||
- 🔐 **Credentials encrypted at rest** — API keys & OAuth tokens sealed with **AES-256-GCM**.
|
||||
- 🚫 **Zero telemetry by default** — your prompts go only to the providers _you_ choose, nowhere else.
|
||||
- 🛡️ **Hardened gateway** — API-key scoping, IP filtering, rate limits, prompt-injection guard, loopback-only process routes.
|
||||
- 📜 **MIT licensed & fully open-source** — audit every line, self-host forever.
|
||||
<img src="./docs/diagrams/privacy-local.svg" width="100%" alt="Private and local-first — your keys, your machine, your data; OmniRoute is a local proxy that never phones home. Eleven guarantees: runs 100% on your hardware (0 cloud hops), zero telemetry by default, credentials encrypted at rest (AES-256-GCM), no account or sign-up, hardened gateway (API-key scoping, IP filtering, rate limits, prompt-injection guard), loopback-only process routes, upstream header scrubbing, strictly opt-in PII redaction, sanitized errors that never leak internals, a local audit trail in your own SQLite, and MIT-licensed fully open-source code."/>
|
||||
|
||||
<sub>📖 [Authorization](docs/architecture/AUTHZ_GUIDE.md) · [Guardrails](docs/security/GUARDRAILS.md) · [Compliance](docs/security/COMPLIANCE.md)</sub>
|
||||
|
||||
@@ -510,12 +465,12 @@ Tokens are scoped `read` / `write` / `admin`; process-spawning routes stay loopb
|
||||
|
||||
Expose OmniRoute over **MCP** or **A2A** and any capable agent gets the keys to the whole gateway — routing, providers, combos, cache, compression, memory — autonomously.
|
||||
|
||||
| Protocol | Endpoint | Use it for |
|
||||
| ------------------ | ----------------------------------------------- | ------------------------------------------------------ |
|
||||
| 🧰 **MCP (stdio)** | `omniroute --mcp` | Plug into Claude Desktop, Cursor, any MCP client |
|
||||
| 🌊 **MCP (HTTP)** | `http://localhost:20128/api/mcp/stream` | Remote MCP — **94 tools**, 30 scopes, full audit trail |
|
||||
| 📡 **MCP (SSE)** | `http://localhost:20128/api/mcp/sse` | Streaming MCP transport |
|
||||
| 🤝 **A2A** | `http://localhost:20128/.well-known/agent.json` | Agent-to-agent, **JSON-RPC 2.0** + SSE, 6 skills |
|
||||
| Protocol | Endpoint | Use it for |
|
||||
| ------------------ | ----------------------------------------------- | ------------------------------------------------------- |
|
||||
| 🧰 **MCP (stdio)** | `omniroute --mcp` | Plug into Claude Desktop, Cursor, any MCP client |
|
||||
| 🌊 **MCP (HTTP)** | `http://localhost:20128/api/mcp/stream` | Remote MCP — **104 tools**, 30 scopes, full audit trail |
|
||||
| 📡 **MCP (SSE)** | `http://localhost:20128/api/mcp/sse` | Streaming MCP transport |
|
||||
| 🤝 **A2A** | `http://localhost:20128/.well-known/agent.json` | Agent-to-agent, **JSON-RPC 2.0** + SSE, 6 skills |
|
||||
|
||||
```bash
|
||||
# Give Claude Code the full OmniRoute toolset over MCP:
|
||||
@@ -553,14 +508,14 @@ Engines run in pipeline order; each is independently toggleable and configurable
|
||||
|
||||
Code blocks, URLs and structured data are **always preserved** byte-perfect. **One-click presets** combine the engines:
|
||||
|
||||
| Mode | Savings | Best for<br><img src="docs/screenshots/spacer.svg" width="540" height="1" alt=""> |
|
||||
| ------------------------------ | ---------- | --------------------------------------------------------------------------------- |
|
||||
| 🪶 **Lite** | ~15% | Always-on safe default |
|
||||
| 🪨 **Standard (Caveman)** | ~30% | Daily coding |
|
||||
| ⚡ **Aggressive** | ~50% | Long tool-heavy sessions |
|
||||
| 🔥 **Ultra** | ~75% | Maximum savings |
|
||||
| 🧰 **RTK** | 60–90% | Shell/test/build/git output |
|
||||
| 🔗 **Stacked (RTK → Caveman)** | **78–95%** | Mixed prompts + tool logs |
|
||||
| Mode | Savings | Best for |
|
||||
| ------------------------------ | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 🪶 **Lite** | ~15% | Always-on safe default |
|
||||
| 🪨 **Standard (Caveman)** | ~30% | Daily coding |
|
||||
| ⚡ **Aggressive** | ~50% | Long tool-heavy sessions |
|
||||
| 🔥 **Ultra** | ~75% | Maximum savings |
|
||||
| 🧰 **RTK** | 60–90% | Shell/test/build/git output |
|
||||
| 🔗 **Stacked (RTK → Caveman)** | **78–95%** | Mixed prompts + tool logs |
|
||||
|
||||
**Real example — Standard mode:**
|
||||
|
||||
@@ -772,137 +727,10 @@ same process on one port, so there is no separate CLI-only package today.
|
||||
|
||||
<div align="center">
|
||||
|
||||
# 📚 Explore More
|
||||
# 📸 Dashboard Screenshots
|
||||
|
||||
</div>
|
||||
|
||||
<details>
|
||||
<summary><b>💰 Pricing at a glance & the $0 Free Stack (11 providers)</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
| Tier | Example<br><img src="docs/screenshots/spacer.svg" width="540" height="1" alt=""> | Cost |
|
||||
| --------------------------- | -------------------------------------------------------------------------------- | ---------- |
|
||||
| 💳 **Subscription** | Claude Code Pro / Codex / Copilot | $10–200/mo |
|
||||
| 🔑 **API Key (free tiers)** | NVIDIA NIM, Cerebras, Groq | **FREE** |
|
||||
| 💰 **Cheap** | GLM-5 $0.5/1M · MiniMax M2.5 $0.3/1M | pennies |
|
||||
| 🆓 **Free Forever** | Kiro, Qoder, Qwen, Pollinations, LongCat | **$0** |
|
||||
|
||||
**The $0 Free Stack — combine into one unbreakable combo:**
|
||||
|
||||
| Provider | Prefix | Free models<br><img src="docs/screenshots/spacer.svg" width="440" height="1" alt=""> | Quota |
|
||||
| ----------------- | ----------- | ------------------------------------------------------------------------------------ | ------------------ |
|
||||
| **Kiro** | `kr/` | Claude Sonnet 4.5, Haiku 4.5, Opus 4.6 | 50 credits/mo |
|
||||
| **Qoder** | `if/` | kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 | ♾️ Unlimited |
|
||||
| **Qwen** | `qw/` | qwen3-coder-plus/flash/next | ♾️ Unlimited |
|
||||
| **Pollinations** | `pol/` | GPT-5, Claude, Gemini, DeepSeek, Llama 4 | No key needed |
|
||||
| **LongCat** | `lc/` | LongCat-2.0 | 10M one-time (KYC) |
|
||||
| **Cloudflare AI** | `cf/` | 50+ models | 10K neurons/day |
|
||||
| **NVIDIA NIM** | `nvidia/` | 129 models | ~40 RPM |
|
||||
| **Cerebras** | `cerebras/` | Qwen3 235B, GPT-OSS 120B | 1M tok/day |
|
||||
|
||||
> 💡 The dashboard "cost" is a **savings tracker**, not a bill — OmniRoute never charges you. A "$290 total cost" using free models means **$290 saved**.
|
||||
|
||||
📖 Complete free directory → [`docs/reference/FREE_TIERS.md`](docs/reference/FREE_TIERS.md) — 25+ providers, quotas, base URLs.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>🎯 Use Cases — ready-made combo playbooks</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
**$0 forever:**
|
||||
|
||||
```
|
||||
1. kr/claude-sonnet-4.5 (Kiro — ~50 credits/mo per acct)
|
||||
2. if/kimi-k2-thinking (Qoder — unlimited)
|
||||
3. pol/gpt-5 (Pollinations — no key)
|
||||
4. lc/LongCat-2.0 (10M one-time backup, KYC)
|
||||
Compression: aggressive (~50%) → double your free quota · Cost: $0/mo
|
||||
```
|
||||
|
||||
**24/7 no interruptions:** chain 2 subscriptions → cheap → free for 5 layers of fallback.
|
||||
**Blocked region:** free providers + global/per-provider proxy → access AI from any country.
|
||||
**Max savings:** subscription + cheap backup + `ultra` compression (~75%) → ~$150–300/mo saved for heavy users.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>🌍 Bypass geo-blocks — 3-level proxy + stealth</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
🇷🇺 🇨🇳 🇮🇷 🇨🇺 🇹🇷 In a blocked region? OmniRoute's **3-level proxy** (Global / Per-Provider / Per-Connection) proxies API requests, OAuth flows, connection tests, token refresh & model sync.
|
||||
|
||||
- **Protocols:** HTTP/HTTPS, SOCKS5, authenticated proxies
|
||||
- **🆓 1proxy marketplace** — hundreds of free validated proxies, quality scores, auto-rotation
|
||||
- **Anti-detection** — TLS fingerprint spoofing (`wreq-js`), CLI fingerprint matching, proxy IP preservation
|
||||
|
||||
📖 [`docs/ops/PROXY_GUIDE.md`](docs/ops/PROXY_GUIDE.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>✨ Full feature list — 30+ capabilities (memory, evals, observability)</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
**Routing:** 18 strategies · task-aware smart routing · thinking budget controls · wildcard routing · system prompt injection.
|
||||
**Compatibility:** OpenAI ↔ Claude ↔ Gemini ↔ Responses API · auto OAuth refresh (PKCE, 8 providers) · multi-account round-robin · Batch + Files API · live OpenAPI 3.0.
|
||||
**Protocols:** MCP (94 tools, 3 transports, 30 scopes) · A2A (JSON-RPC 2.0, SSE, 6 skills) · ACP · cloud agents (Codex, Cursor, Devin, Jules).
|
||||
**Plugins:** custom plugin marketplace (system-configured registry URL with SSRF-guarded fetch) · install / enable / disable · Notion + Obsidian knowledge-base integrations (WebDAV file server, vault search, note CRUD).
|
||||
**Embedded services:** one-click install & lifecycle management of local sidecar services (CLIProxy, NineRouter).
|
||||
**Quality & Ops:** built-in **Evals** (golden-set: exact/contains/regex/custom) · guardrails (PII, injection, vision) · health dashboard · p50/p95/p99 telemetry · webhooks · compliance audit.
|
||||
**AI Agent Skills:** drop-in markdown manifests — point any agent at a `skills/*/SKILL.md` manifest. 43 skills available.
|
||||
|
||||
📖 [MCP Server](open-sse/mcp-server/README.md) · [A2A Server](src/lib/a2a/README.md) · [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md) · [Features Gallery](docs/guides/FEATURES.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>📖 Setup, env vars & FAQ</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
| Env var | Default | Purpose<br><img src="docs/screenshots/spacer.svg" width="570" height="1" alt=""> |
|
||||
| ----------------- | -------------- | -------------------------------------------------------------------------------- |
|
||||
| `PORT` | `20128` | API + dashboard port |
|
||||
| `REQUIRE_API_KEY` | `false` | Require API key for all requests |
|
||||
| `DATA_DIR` | `~/.omniroute` | Database & config storage |
|
||||
|
||||
**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?** Mostly — Qoder, Pollinations, LongCat, and Cloudflare are free with no per-account credit cap. Kiro is free too but capped at ~50 credits/month per account. Stack multiple free providers in a combo and auto-fallback keeps you serving for $0.
|
||||
**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 265 providers.
|
||||
|
||||
📖 [User Guide](docs/guides/USER_GUIDE.md) · [API Reference](docs/reference/API_REFERENCE.md) · [Environment Config](docs/reference/ENVIRONMENT.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>🐛 Troubleshooting</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
| Problem | Quick fix<br><img src="docs/screenshots/spacer.svg" width="510" height="1" alt=""> |
|
||||
| ----------------------------------------- | ---------------------------------------------------------------------------------- |
|
||||
| "Language model did not provide messages" | Provider quota exhausted → use a combo fallback |
|
||||
| Rate limiting (429) | Add fallback: `cc/claude → glm/glm-4.7 → if/kimi-k2-thinking` |
|
||||
| OAuth token expired | Auto-refreshed; if stuck, delete + re-auth in Providers |
|
||||
| `unsupported_country_region_territory` | Configure proxy in Settings → Proxy |
|
||||
| Docker SQLite locks | Use `--stop-timeout 40` for clean WAL checkpoint |
|
||||
| Node runtime errors | Use Node `>=22.22.2 <23` or `>=24.0.0 <27` |
|
||||
|
||||
🐛 **Reporting a bug?** Run `npm run system-info` and attach `system-info.txt`. 📖 [`docs/guides/TROUBLESHOOTING.md`](docs/guides/TROUBLESHOOTING.md)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>📸 Dashboard screenshots</b></summary>
|
||||
|
||||
<br/>
|
||||
|
||||
| Page | Screenshot | Page | Screenshot |
|
||||
| ---------- | ------------------------------------------------- | ---------- | --------------------------------------------- |
|
||||
| Providers |  | Combos |  |
|
||||
@@ -910,8 +738,6 @@ Compression: aggressive (~50%) → double your free quota · Cost: $0/mo
|
||||
| Translator |  | Settings |  |
|
||||
| CLI Tools |  | Usage Logs |  |
|
||||
|
||||
</details>
|
||||
|
||||
<br/>
|
||||
|
||||
<div align="center">
|
||||
@@ -944,7 +770,7 @@ Compression: aggressive (~50%) → double your free quota · Cost: $0/mo
|
||||
- **Protocols**: MCP (stdio/HTTP) + A2A v0.3 (JSON-RPC 2.0 + SSE)
|
||||
- **Streaming**: Server-Sent Events (SSE) + WebSocket bridge (`/v1/ws`)
|
||||
- **Auth**: OAuth 2.0 (PKCE) + JWT + API Keys + MCP Scoped Authorization
|
||||
- **Testing**: Node.js test runner + Vitest (**21,000+ test cases** across 2,586 files — unit, integration, E2E, security, ecosystem)
|
||||
- **Testing**: Node.js test runner + Vitest (**25,000+ test cases** across 3,300+ files — unit, integration, E2E, security, ecosystem)
|
||||
- **Platforms**: Desktop (Electron), Android (Termux), PWA (any browser)
|
||||
- **CI/CD**: GitHub Actions (auto npm publish + Docker Hub on release)
|
||||
- **Website**: [omniroute.online](https://omniroute.online)
|
||||
@@ -962,66 +788,66 @@ Compression: aggressive (~50%) → double your free quota · Cost: $0/mo
|
||||
|
||||
### 📘 Getting Started
|
||||
|
||||
| Document | Description<br><img src="docs/screenshots/spacer.svg" width="680" height="1" alt=""> |
|
||||
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| [User Guide](docs/guides/USER_GUIDE.md) | Providers, combos, CLI integration, deployment |
|
||||
| [Setup Guide](docs/guides/SETUP_GUIDE.md) | Full install methods, CLI tool configs, protocol setup, timeout tuning |
|
||||
| [CLI Tools Guide](docs/reference/CLI-TOOLS.md) | Per-tool setup for Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot |
|
||||
| [Remote Mode](docs/guides/REMOTE-MODE.md) | Drive a remote OmniRoute (VPS) from your laptop CLI via scoped access tokens |
|
||||
| [Claude Code Config](docs/guides/CLAUDE-CODE-CONFIGURATION.md) | Point Claude Code at OmniRoute (local/remote) with `launch` + per-model profiles |
|
||||
| [Quick Start](README.md#-quick-start) | 3-step install → connect → configure |
|
||||
| Document | Description |
|
||||
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [User Guide](docs/guides/USER_GUIDE.md) | Providers, combos, CLI integration, deployment |
|
||||
| [Setup Guide](docs/guides/SETUP_GUIDE.md) | Full install methods, CLI tool configs, protocol setup, timeout tuning |
|
||||
| [CLI Tools Guide](docs/reference/CLI-TOOLS.md) | Per-tool setup for Claude Code, Codex, Cursor, Cline, OpenClaw, Kilo, Copilot |
|
||||
| [Remote Mode](docs/guides/REMOTE-MODE.md) | Drive a remote OmniRoute (VPS) from your laptop CLI via scoped access tokens |
|
||||
| [Claude Code Config](docs/guides/CLAUDE-CODE-CONFIGURATION.md) | Point Claude Code at OmniRoute (local/remote) with `launch` + per-model profiles |
|
||||
| [Quick Start](README.md#-quick-start) | 3-step install → connect → configure |
|
||||
|
||||
### 🔧 Operations & Deployment
|
||||
|
||||
| Document | Description<br><img src="docs/screenshots/spacer.svg" width="680" height="1" alt=""> |
|
||||
| -------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| [Docker Guide](docs/guides/DOCKER_GUIDE.md) | Docker run, Compose profiles, Caddy HTTPS, tunnels, image tags |
|
||||
| [Podman Guide](contrib/podman/README.md) | Quadlet systemd integration, podman-compose, SELinux |
|
||||
| [VM Deployment](docs/ops/VM_DEPLOYMENT_GUIDE.md) | Complete guide: VM + nginx + Cloudflare setup |
|
||||
| [Fly.io Deployment](docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) | Deploy to Fly.io with persistent storage |
|
||||
| [Termux Guide](docs/guides/TERMUX_GUIDE.md) | Run OmniRoute on Android via Termux |
|
||||
| [PWA Guide](docs/guides/PWA_GUIDE.md) | Progressive Web App install, caching, architecture |
|
||||
| [Uninstall Guide](docs/guides/UNINSTALL.md) | Clean removal for all install methods |
|
||||
| [Environment Config](docs/reference/ENVIRONMENT.md) | Complete `.env` variables and references |
|
||||
| Document | Description |
|
||||
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Docker Guide](docs/guides/DOCKER_GUIDE.md) | Docker run, Compose profiles, Caddy HTTPS, tunnels, image tags |
|
||||
| [Podman Guide](contrib/podman/README.md) | Quadlet systemd integration, podman-compose, SELinux |
|
||||
| [VM Deployment](docs/ops/VM_DEPLOYMENT_GUIDE.md) | Complete guide: VM + nginx + Cloudflare setup |
|
||||
| [Fly.io Deployment](docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md) | Deploy to Fly.io with persistent storage |
|
||||
| [Termux Guide](docs/guides/TERMUX_GUIDE.md) | Run OmniRoute on Android via Termux |
|
||||
| [PWA Guide](docs/guides/PWA_GUIDE.md) | Progressive Web App install, caching, architecture |
|
||||
| [Uninstall Guide](docs/guides/UNINSTALL.md) | Clean removal for all install methods |
|
||||
| [Environment Config](docs/reference/ENVIRONMENT.md) | Complete `.env` variables and references |
|
||||
|
||||
### 🧠 Features & Architecture
|
||||
|
||||
| Document | Description<br><img src="docs/screenshots/spacer.svg" width="620" height="1" alt=""> |
|
||||
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| [Architecture](docs/architecture/ARCHITECTURE.md) | System architecture, data flow, and internals |
|
||||
| [Compression Guide](docs/compression/COMPRESSION_GUIDE.md) | 7-option pipeline: off / lite / standard / aggressive / ultra / RTK / stacked |
|
||||
| [RTK Compression](docs/compression/RTK_COMPRESSION.md) | Command-output compression, filters, trust, verify, raw-output recovery |
|
||||
| [Compression Engines](docs/compression/COMPRESSION_ENGINES.md) | Caveman, RTK, stacked pipelines, dashboard/API/MCP surfaces |
|
||||
| [Compression Rules Format](docs/compression/COMPRESSION_RULES_FORMAT.md) | JSON rule-pack schemas for Caveman and RTK filters |
|
||||
| [Compression Language Packs](docs/compression/COMPRESSION_LANGUAGE_PACKS.md) | Language detection and Caveman rule-pack authoring |
|
||||
| [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md) | Circuit breakers, cooldowns, queue, anti-thundering herd, TLS spoofing |
|
||||
| [Auto-Combo Engine](docs/routing/AUTO-COMBO.md) | 12-factor scoring, mode packs, self-healing |
|
||||
| [Proxy Guide](docs/ops/PROXY_GUIDE.md) | 3-level proxy system, 1proxy marketplace, registry CRUD |
|
||||
| [Free Tiers](docs/reference/FREE_TIERS.md) | 25+ free API providers consolidated directory |
|
||||
| [Features Gallery](docs/guides/FEATURES.md) | Visual dashboard tour with screenshots |
|
||||
| [Codebase Documentation](docs/architecture/CODEBASE_DOCUMENTATION.md) | Beginner-friendly codebase walkthrough |
|
||||
| Document | Description |
|
||||
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [Architecture](docs/architecture/ARCHITECTURE.md) | System architecture, data flow, and internals |
|
||||
| [Compression Guide](docs/compression/COMPRESSION_GUIDE.md) | 7-option pipeline: off / lite / standard / aggressive / ultra / RTK / stacked |
|
||||
| [RTK Compression](docs/compression/RTK_COMPRESSION.md) | Command-output compression, filters, trust, verify, raw-output recovery |
|
||||
| [Compression Engines](docs/compression/COMPRESSION_ENGINES.md) | Caveman, RTK, stacked pipelines, dashboard/API/MCP surfaces |
|
||||
| [Compression Rules Format](docs/compression/COMPRESSION_RULES_FORMAT.md) | JSON rule-pack schemas for Caveman and RTK filters |
|
||||
| [Compression Language Packs](docs/compression/COMPRESSION_LANGUAGE_PACKS.md) | Language detection and Caveman rule-pack authoring |
|
||||
| [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md) | Circuit breakers, cooldowns, queue, anti-thundering herd, TLS spoofing |
|
||||
| [Auto-Combo Engine](docs/routing/AUTO-COMBO.md) | 12-factor scoring, mode packs, self-healing |
|
||||
| [Proxy Guide](docs/ops/PROXY_GUIDE.md) | 3-level proxy system, 1proxy marketplace, registry CRUD |
|
||||
| [Free Tiers](docs/reference/FREE_TIERS.md) | 25+ free API providers consolidated directory |
|
||||
| [Features Gallery](docs/guides/FEATURES.md) | Visual dashboard tour with screenshots |
|
||||
| [Codebase Documentation](docs/architecture/CODEBASE_DOCUMENTATION.md) | Beginner-friendly codebase walkthrough |
|
||||
|
||||
### 🤖 Protocols & APIs
|
||||
|
||||
| Document | Description<br><img src="docs/screenshots/spacer.svg" width="700" height="1" alt=""> |
|
||||
| ------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| [API Reference](docs/reference/API_REFERENCE.md) | All endpoints with examples |
|
||||
| [OpenAPI Spec](docs/openapi.yaml) | OpenAPI 3.0 specification |
|
||||
| [MCP Server](open-sse/mcp-server/README.md) | 95 MCP tools, IDE configs, Python/TS/Go clients |
|
||||
| [MCP Server Guide](docs/frameworks/MCP-SERVER.md) | MCP installation, transports, and tool reference |
|
||||
| [A2A Server](src/lib/a2a/README.md) | JSON-RPC 2.0 protocol, skills, streaming, task mgmt |
|
||||
| [A2A Server Guide](docs/frameworks/A2A-SERVER.md) | A2A agent card, tasks, skills, and streaming |
|
||||
| Document | Description |
|
||||
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [API Reference](docs/reference/API_REFERENCE.md) | All endpoints with examples |
|
||||
| [OpenAPI Spec](docs/openapi.yaml) | OpenAPI 3.0 specification |
|
||||
| [MCP Server](open-sse/mcp-server/README.md) | 104 MCP tools, IDE configs, Python/TS/Go clients |
|
||||
| [MCP Server Guide](docs/frameworks/MCP-SERVER.md) | MCP installation, transports, and tool reference |
|
||||
| [A2A Server](src/lib/a2a/README.md) | JSON-RPC 2.0 protocol, skills, streaming, task mgmt |
|
||||
| [A2A Server Guide](docs/frameworks/A2A-SERVER.md) | A2A agent card, tasks, skills, and streaming |
|
||||
|
||||
### 📋 Project & Quality
|
||||
|
||||
| Document | Description<br><img src="docs/screenshots/spacer.svg" width="690" height="1" alt=""> |
|
||||
| -------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| [Contributing](CONTRIBUTING.md) | Development setup and guidelines |
|
||||
| [Changelog](CHANGELOG.md) | Full per-version release history |
|
||||
| [Security Policy](SECURITY.md) | Vulnerability reporting and security practices |
|
||||
| [i18n Guide](docs/guides/I18N.md) | 40+ language support, translation workflow, RTL |
|
||||
| [Release Checklist](docs/ops/RELEASE_CHECKLIST.md) | Pre-release validation steps |
|
||||
| [Coverage Plan](docs/ops/COVERAGE_PLAN.md) | Test coverage strategy and 21,000+ test suite |
|
||||
| Document | Description |
|
||||
| -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Contributing](CONTRIBUTING.md) | Development setup and guidelines |
|
||||
| [Changelog](CHANGELOG.md) | Full per-version release history |
|
||||
| [Security Policy](SECURITY.md) | Vulnerability reporting and security practices |
|
||||
| [i18n Guide](docs/guides/I18N.md) | 40+ language support, translation workflow, RTL |
|
||||
| [Release Checklist](docs/ops/RELEASE_CHECKLIST.md) | Pre-release validation steps |
|
||||
| [Coverage Plan](docs/ops/COVERAGE_PLAN.md) | Test coverage strategy and 25,000+ test suite |
|
||||
|
||||
<br/>
|
||||
|
||||
@@ -1251,7 +1077,7 @@ MIT License - see [LICENSE](LICENSE) for details.
|
||||
|
||||
**[⬆ Back to top](#-omniroute)** · Built with ❤️ for the open-source AI community.
|
||||
|
||||
<sub>OmniRoute v3.8.43 · Node ≥22.22.2 · MIT License · <a href="https://omniroute.online">omniroute.online</a></sub>
|
||||
<sub>OmniRoute v3.8.49 · Node ≥22.22.2 · MIT License · <a href="https://omniroute.online">omniroute.online</a></sub>
|
||||
|
||||
</div>
|
||||
<!-- GitHub Discussions enabled for community Q&A -->
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
- README: unified animated card system — numbers audited against the v3.8.49 tree (268 providers, 104 MCP tools, 25k+ tests, 26 CLIs, 40+ free-forever, 43 locales, regenerated provider reference); one flat style contract across all cards; 5 new SMIL cards (hero fused with the budget card, "Why" 10-row pain-vs-fix ledger, 18-strategy flow grid, "Private & Local-First" 11-row guarantee ledger, 3-layer resilience card replacing the always-on combo card) plus a rebuilt compact half-height CLI terminal; every animation is pause-at-t0-safe — the first frame is always the finished composition (includes the budget-bar freeze fix on the shipped free-tier card) (#7769)
|
||||
@@ -17,7 +17,7 @@ It provides a single OpenAI-compatible endpoint (`/v1/*`) and routes traffic acr
|
||||
|
||||
Core capabilities:
|
||||
|
||||
- OpenAI-compatible API surface for CLI/tools (237 providers, 75 executors)
|
||||
- OpenAI-compatible API surface for CLI/tools (268 providers, 84 executors)
|
||||
- Request/response translation across provider formats
|
||||
- Model combo fallback (multi-model sequence)
|
||||
- Structured combo steps (`provider + model + connection`) with runtime ordering by `compositeTiers`
|
||||
|
||||
@@ -452,7 +452,7 @@ open-sse/
|
||||
├── types.d.ts
|
||||
├── config/ Provider registries, header profiles, identity, …
|
||||
├── handlers/ Request handlers (chat, embeddings, audio, image, …)
|
||||
├── executors/ 75 provider-specific HTTP executors
|
||||
├── executors/ 84 provider-specific HTTP executors
|
||||
├── translator/ Format conversion (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro)
|
||||
├── transformer/ Responses API ↔ Chat Completions stream transformer
|
||||
├── services/ 80+ service modules (combos, fallback, quotas, identity, …)
|
||||
@@ -482,7 +482,7 @@ open-sse/
|
||||
|
||||
### 4.2 `open-sse/executors/`
|
||||
|
||||
75 provider executors, each extending `BaseExecutor` (`base.ts`):
|
||||
84 provider executors, each extending `BaseExecutor` (`base.ts`):
|
||||
|
||||
`antigravity`, `azure-openai`, `blackbox-web`, `chatgpt-web`, `cliproxyapi`,
|
||||
`cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`,
|
||||
@@ -491,7 +491,7 @@ open-sse/
|
||||
(shared identity helper) and `index.ts` (registry).
|
||||
|
||||
> Note: providers not listed here are served by `default.ts` using the generic
|
||||
> OpenAI-compatible executor. The full provider catalog (237 entries) lives in
|
||||
> OpenAI-compatible executor. The full provider catalog (268 entries) lives in
|
||||
> `src/shared/constants/providers.ts`.
|
||||
|
||||
### 4.3 `open-sse/translator/`
|
||||
|
||||
@@ -27,14 +27,20 @@ Not every diagram comes from a `.mmd` source. Hand-authored SVGs live at this
|
||||
directory's root and animate with SMIL only (no JS, no external fonts), so they play
|
||||
inside GitHub's `<img>` sandbox:
|
||||
|
||||
| File | Used in | Notes |
|
||||
| ---------------------------------------- | ---------------- | ---------------------------------------------------------------------------- |
|
||||
| [tier-cascade.svg](./tier-cascade.svg) | README.md (root) | Animated 4-tier auto-fallback cascade (16s loop, 4 acts). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [pool-fair-share.svg](./pool-fair-share.svg) | README.md (root) | Animated key-pool fair-share quota (generous → strict, 16s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [combo-always-on.svg](./combo-always-on.svg) | README.md (root) | Animated priority-combo fallback (4 layers, 16s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [cli-terminal.svg](./cli-terminal.svg) | README.md (root) | Animated terminal cycling 3 CLI commands (providers/combo/health) + subcommand ticker (18s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [compression-pipeline.svg](./compression-pipeline.svg) | README.md (root) | Animated 10-engine compression funnel (8s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [free-tier-budget.svg](./free-tier-budget.svg) | README.md (root) | Animated free-tier budget card (~1.6B/mo headline, 21-pool budget bar, per-model grid, signup credits, 10s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| File | Used in | Notes |
|
||||
| ------------------------------------------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [tier-cascade.svg](./tier-cascade.svg) | README.md (root) | Animated 4-tier auto-fallback cascade (16s loop, 4 acts). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [pool-fair-share.svg](./pool-fair-share.svg) | README.md (root) | Animated key-pool fair-share quota (generous → strict, 16s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [combo-always-on.svg](./combo-always-on.svg) | style reference | Animated priority-combo fallback (4 layers, 16s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [cli-terminal.svg](./cli-terminal.svg) | README.md (root) | Compact half-height animated terminal (1200×350): 3 real CLI commands cycling with typewriter + scrolling subcommand ticker; first frame = completed providers screen. Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [compression-pipeline.svg](./compression-pipeline.svg) | README.md (root) | Animated 10-engine compression funnel (8s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [free-tier-budget.svg](./free-tier-budget.svg) | README.md (root) | Animated free-tier budget card (~1.6B/mo headline, 21-pool budget bar, per-model grid, signup credits, 10s loop). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [readme-hero.svg](./readme-hero.svg) | README.md (root) | Animated hero card (tagline, 268-provider/90+ free headline, full-width compression bar demo, 6 stat chips). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [promise-pillars.svg](./promise-pillars.svg) | README.md (root) | Animated "The Promise" 6-pillar card (12s border-highlight sweep). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [why-pain-fix.svg](./why-pain-fix.svg) | README.md (root) | Animated "Why OmniRoute" 10-row pain-vs-fix ledger (15s green row sweep). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [strategies-grid.svg](./strategies-grid.svg) | README.md (root) | Animated 6×3 grid of all 18 routing-strategy flows (one micro-stage per strategy, staggered dot loops). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [privacy-local.svg](./privacy-local.svg) | README.md (root) | Animated "Private & Local-First" 11-row guarantee ledger with receipt chips (16s green row sweep). Edit the SVG directly — there is no `.mmd` source. |
|
||||
| [resilience-layers.svg](./resilience-layers.svg) | README.md (root) | Animated 3-layer resilience card (breaker states CLOSED→OPEN→HALF-OPEN, key cooldown with ×2 backoff, model lockout — 18s loops). Edit the SVG directly — there is no `.mmd` source. |
|
||||
|
||||
## How to update
|
||||
|
||||
|
||||
@@ -1,120 +1,42 @@
|
||||
<svg viewBox="0 0 1200 700" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Animated terminal demoing the OmniRoute CLI: omniroute providers list, omniroute combo list and omniroute health, cycling over the 80+ command surface: providers, oauth, keys, combo, nodes, models, cache, compression, cost, usage, quota, health, resilience, telemetry, logs, audit, mcp, a2a, cloud, memory, skills, eval, tunnel, backup, sync, webhooks, policy, pricing, translator, simulate and more.">
|
||||
<defs>
|
||||
<clipPath id="tickerClipM"><rect x="16" y="648" width="1168" height="40"/></clipPath>
|
||||
<clipPath id="twMA"><rect x="72" y="104" height="32" width="0">
|
||||
<animate attributeName="width" calcMode="discrete" values="0;36;72;108;144;180;216;252;288;288" keyTimes="0;0.014;0.021;0.028;0.035;0.042;0.049;0.056;0.063;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect></clipPath>
|
||||
<clipPath id="twMB"><rect x="72" y="104" height="32" width="0">
|
||||
<animate attributeName="width" calcMode="discrete" values="0;36;72;108;144;180;216;240;240" keyTimes="0;0.348;0.355;0.362;0.369;0.376;0.383;0.390;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect></clipPath>
|
||||
<clipPath id="twMC"><rect x="72" y="104" height="32" width="0">
|
||||
<animate attributeName="width" calcMode="discrete" values="0;36;72;108;144;180;192;192" keyTimes="0;0.654;0.661;0.668;0.675;0.682;0.689;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect></clipPath>
|
||||
</defs>
|
||||
|
||||
<!-- ═══ Window ═══ -->
|
||||
<rect x="8" y="8" width="1184" height="684" rx="16" fill="#0d1117" stroke="#ffffff" stroke-opacity="0.1" stroke-width="1"/>
|
||||
<path d="M 24 8 h 1152 a 16 16 0 0 1 16 16 v 32 h -1184 v -32 a 16 16 0 0 1 16 -16 z" fill="#161b22"/>
|
||||
<path d="M 8 56 L 1192 56" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<circle cx="46" cy="32" r="8" fill="#ff5f56"/>
|
||||
<circle cx="76" cy="32" r="8" fill="#ffbd2e"/>
|
||||
<circle cx="106" cy="32" r="8" fill="#27c93f"/>
|
||||
<text x="600" y="38" text-anchor="middle" font-family="Consolas, 'Courier New', monospace" font-size="15" fill="#71717a">omniroute — 80+ commands</text>
|
||||
|
||||
<!-- ═══ Screen A · omniroute providers list ═══ -->
|
||||
<g>
|
||||
<animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.315;0.33;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#twMA)">
|
||||
<text x="72" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#F7F6FC">omniroute providers list</text>
|
||||
</g>
|
||||
<rect y="108" width="10" height="26" fill="#a1a1aa">
|
||||
<animate attributeName="x" calcMode="discrete" values="72;108;144;180;216;252;288;324;360;360" keyTimes="0;0.014;0.021;0.028;0.035;0.042;0.049;0.056;0.063;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="1;0.15;1;0.15;1;0.15;1;0.15;1;0;0" keyTimes="0;0.011;0.022;0.033;0.044;0.055;0.066;0.077;0.085;0.09;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<g font-family="Consolas, 'Courier New', monospace" font-size="20">
|
||||
<text x="40" y="192" font-weight="700" fill="#38bdf8" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.075" dur="18s" repeatCount="indefinite"/>OmniRoute Providers</text>
|
||||
<text x="40" y="234" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.083" dur="18s" repeatCount="indefinite"/>1f3a9c2e  anthropic   Claude Max 20x    <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="276" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.090" dur="18s" repeatCount="indefinite"/>8c2d5b1a  codex       Codex Pro (team)  <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="318" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.097" dur="18s" repeatCount="indefinite"/>f4e0a97b  glm         GLM Coding Plan   <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="360" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.104" dur="18s" repeatCount="indefinite"/>03bd6e5f  kimi        Kimi K2 free      <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="402" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.111" dur="18s" repeatCount="indefinite"/>9d4e1a08  gemini-cli  Gemini 2.5 Pro    <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="444" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.118" dur="18s" repeatCount="indefinite"/>b7c3f26d  copilot     GPT-5 (Copilot)   <tspan fill="#22c55e">active</tspan></text>
|
||||
<text x="40" y="486" fill="#71717a" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;1" keyTimes="0;0.125" dur="18s" repeatCount="indefinite"/>… 253 more connections</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- ═══ Screen B · omniroute combo list ═══ -->
|
||||
<g opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.333;0.345;0.62;0.635;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#twMB)">
|
||||
<text x="72" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#F7F6FC">omniroute combo list</text>
|
||||
</g>
|
||||
<rect y="108" width="10" height="26" fill="#a1a1aa">
|
||||
<animate attributeName="x" calcMode="discrete" values="72;108;144;180;216;252;288;312;312" keyTimes="0;0.348;0.355;0.362;0.369;0.376;0.383;0.390;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0;1;0.15;1;0.15;1;0.15;1;0;0" keyTimes="0;0.345;0.352;0.362;0.372;0.382;0.392;0.402;0.41;0.42;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<g font-family="Consolas, 'Courier New', monospace" font-size="20">
|
||||
<text x="40" y="192" font-weight="700" fill="#38bdf8" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.402;0.404" dur="18s" repeatCount="indefinite"/>OmniRoute Combos</text>
|
||||
<text x="40" y="234" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.412;0.414" dur="18s" repeatCount="indefinite"/>  <tspan fill="#22c55e">●</tspan> always-on     [priority      ] <tspan fill="#22c55e">enabled</tspan></text>
|
||||
<text x="40" y="276" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.419;0.421" dur="18s" repeatCount="indefinite"/>  <tspan fill="#71717a">○</tspan> cost-saver    [cost-optimized] <tspan fill="#22c55e">enabled</tspan></text>
|
||||
<text x="40" y="318" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.426;0.428" dur="18s" repeatCount="indefinite"/>  <tspan fill="#71717a">○</tspan> fusion-panel  [fusion        ] <tspan fill="#22c55e">enabled</tspan></text>
|
||||
<text x="40" y="360" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.433;0.435" dur="18s" repeatCount="indefinite"/>  <tspan fill="#71717a">○</tspan> context-relay [context-relay ] <tspan fill="#22c55e">enabled</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- ═══ Screen C · omniroute health ═══ -->
|
||||
<g opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.639;0.651;0.93;0.945;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#twMC)">
|
||||
<text x="72" y="128" font-family="Consolas, 'Courier New', monospace" font-size="20" fill="#F7F6FC">omniroute health</text>
|
||||
</g>
|
||||
<rect y="108" width="10" height="26" fill="#a1a1aa">
|
||||
<animate attributeName="x" calcMode="discrete" values="72;108;144;180;216;252;264;264" keyTimes="0;0.654;0.661;0.668;0.675;0.682;0.689;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0;1;0.15;1;0.15;1;0;0" keyTimes="0;0.651;0.658;0.668;0.678;0.688;0.694;0.70;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<g font-family="Consolas, 'Courier New', monospace" font-size="20">
|
||||
<text x="40" y="192" font-weight="700" fill="#38bdf8" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.694;0.696" dur="18s" repeatCount="indefinite"/>OmniRoute Health</text>
|
||||
<text x="40" y="234" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.702;0.704" dur="18s" repeatCount="indefinite"/>  Status: <tspan fill="#22c55e">healthy</tspan></text>
|
||||
<text x="40" y="276" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.709;0.711" dur="18s" repeatCount="indefinite"/>  Uptime: 4d 12h 33m</text>
|
||||
<text x="40" y="318" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.716;0.718" dur="18s" repeatCount="indefinite"/>  Requests (24h): 18,412</text>
|
||||
<text x="40" y="378" font-weight="700" fill="#F7F6FC" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.728;0.730" dur="18s" repeatCount="indefinite"/>  Circuit Breakers</text>
|
||||
<text x="40" y="420" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.735;0.737" dur="18s" repeatCount="indefinite"/>    <tspan fill="#22c55e">● closed</tspan>     24</text>
|
||||
<text x="40" y="462" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.742;0.744" dur="18s" repeatCount="indefinite"/>    <tspan fill="#f59e0b">○ half-open</tspan>  1</text>
|
||||
<text x="40" y="504" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.749;0.751" dur="18s" repeatCount="indefinite"/>    <tspan fill="#ef4444">○ open</tspan>       0</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- ═══ Command ticker (the 30 subcommands, scrolling) ═══ -->
|
||||
<path d="M 8 636 L 1192 636" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<g clip-path="url(#tickerClipM)">
|
||||
<g font-family="Consolas, 'Courier New', monospace" font-size="15" fill="#71717a">
|
||||
<animateTransform attributeName="transform" type="translate" from="0 0" to="-2570 0" dur="60s" repeatCount="indefinite"/>
|
||||
<text x="24" y="674"><tspan fill="#8b5cf6">providers</tspan> · oauth · keys · <tspan fill="#8b5cf6">combo</tspan> · nodes · models · cache · <tspan fill="#8b5cf6">compression</tspan> · cost · usage · quota · <tspan fill="#8b5cf6">health</tspan> · resilience · telemetry · logs · audit · <tspan fill="#8b5cf6">mcp</tspan> · a2a · cloud · <tspan fill="#8b5cf6">memory</tspan> · skills · eval · tunnel · backup · sync · webhooks · policy · pricing · translator · simulate …</text>
|
||||
<text x="2594" y="674"><tspan fill="#8b5cf6">providers</tspan> · oauth · keys · <tspan fill="#8b5cf6">combo</tspan> · nodes · models · cache · <tspan fill="#8b5cf6">compression</tspan> · cost · usage · quota · <tspan fill="#8b5cf6">health</tspan> · resilience · telemetry · logs · audit · <tspan fill="#8b5cf6">mcp</tspan> · a2a · cloud · <tspan fill="#8b5cf6">memory</tspan> · skills · eval · tunnel · backup · sync · webhooks · policy · pricing · translator · simulate …</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<svg viewBox="0 0 1200 350" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Animated terminal demoing the OmniRoute CLI: omniroute providers list (268 providers registered, anthropic, codex, glm, kimi shown active), omniroute combo list (always-on priority, cost-saver, fusion-panel, context-relay) and omniroute health (healthy, 18412 requests in 24h, p95 412ms, circuit breakers 24 closed, 1 half-open, 0 open), cycling over the 80+ command surface: providers, oauth, keys, combo, nodes, models, cache, compression, cost, usage, quota, health, resilience, telemetry, logs, audit, mcp, a2a, cloud, memory, skills, eval, doctor, repl, tunnel, backup, sync, webhooks, policy, pricing, translator, simulate and more.">
|
||||
<desc>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.</desc>
|
||||
<defs><clipPath id="tickerClip"><rect x="12" y="304" width="1176" height="40"/></clipPath><clipPath id="tw0"><rect x="64" y="46" height="26" width="0"><animate attributeName="width" calcMode="discrete" values="0;31;61;92;122;153;184;214;245;245" keyTimes="0;0.012;0.018;0.024;0.030;0.036;0.042;0.048;0.054;1" dur="18s" repeatCount="indefinite"/></rect></clipPath><clipPath id="tw1"><rect x="64" y="46" height="26" width="0"><animate attributeName="width" calcMode="discrete" values="0;26;51;76;102;128;153;178;204;204" keyTimes="0;0.345;0.351;0.357;0.363;0.369;0.375;0.381;0.387;1" dur="18s" repeatCount="indefinite"/></rect></clipPath><clipPath id="tw2"><rect x="64" y="46" height="26" width="0"><animate attributeName="width" calcMode="discrete" values="0;20;41;61;82;102;122;143;163;163" keyTimes="0;0.678;0.684;0.690;0.696;0.702;0.708;0.714;0.720;1" dur="18s" repeatCount="indefinite"/></rect></clipPath></defs>
|
||||
<rect width="1200" height="350" fill="#0d1117"/>
|
||||
<rect x="0" y="0" width="1200" height="34" fill="#161b22"/>
|
||||
<path d="M 0 34 L 1200 34" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<circle cx="24" cy="17" r="6" fill="#ff5f56"/><circle cx="46" cy="17" r="6" fill="#ffbd2e"/><circle cx="68" cy="17" r="6" fill="#27c93f"/>
|
||||
<text x="600" y="22" text-anchor="middle" font-family="Consolas, 'Courier New', monospace" font-size="13" fill="#71717a">omniroute — 80+ commands</text>
|
||||
<g font-family="Consolas, 'Courier New', monospace" font-size="17"><animate attributeName="opacity" values="1;0;0" keyTimes="0;0.006;1" dur="18s" repeatCount="indefinite"/><text x="64" y="66" fill="#F7F6FC">omniroute providers list</text><text x="40" y="100" font-weight="700" fill="#38bdf8">OmniRoute Providers</text><text x="40" y="128" fill="#a1a1aa">1f3a9c2e  anthropic   Claude Max 20x    <tspan fill='#22c55e'>active</tspan></text><text x="40" y="154" fill="#a1a1aa">8c2d5b1a  codex       Codex Pro (team)  <tspan fill='#22c55e'>active</tspan></text><text x="40" y="180" fill="#a1a1aa">f4e0a97b  glm         GLM Coding Plan   <tspan fill='#22c55e'>active</tspan></text><text x="40" y="206" fill="#a1a1aa">03bd6e5f  kimi        Kimi K2 free      <tspan fill='#22c55e'>active</tspan></text><text x="40" y="232" fill="#71717a">… 264 more providers</text></g><g opacity="1" font-family="Consolas, 'Courier New', monospace" font-size="17">
|
||||
<animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.315;0.33;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="66" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#tw0)"><text x="64" y="66" fill="#F7F6FC">omniroute providers list</text></g>
|
||||
<rect y="52" width="9" height="20" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="x" calcMode="discrete" values="64;95;125;156;186;217;248;278;309;309" keyTimes="0.000;0.012;0.018;0.024;0.030;0.036;0.042;0.048;0.054;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0;1;0.2;1;0.2;1;0;0" keyTimes="0;0.011;0.012;0.022;0.032;0.042;0.052;0.074;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<text x="40" y="100" font-weight="700" fill="#38bdf8" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.045;0.047" dur="18s" repeatCount="indefinite"/>OmniRoute Providers</text><text x="40" y="128" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.053;0.055" dur="18s" repeatCount="indefinite"/>1f3a9c2e  anthropic   Claude Max 20x    <tspan fill='#22c55e'>active</tspan></text><text x="40" y="154" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.061;0.063" dur="18s" repeatCount="indefinite"/>8c2d5b1a  codex       Codex Pro (team)  <tspan fill='#22c55e'>active</tspan></text><text x="40" y="180" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.069;0.07100000000000001" dur="18s" repeatCount="indefinite"/>f4e0a97b  glm         GLM Coding Plan   <tspan fill='#22c55e'>active</tspan></text><text x="40" y="206" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.077;0.079" dur="18s" repeatCount="indefinite"/>03bd6e5f  kimi        Kimi K2 free      <tspan fill='#22c55e'>active</tspan></text><text x="40" y="232" fill="#71717a" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.085;0.08700000000000001" dur="18s" repeatCount="indefinite"/>… 264 more providers</text>
|
||||
</g><g opacity="0" font-family="Consolas, 'Courier New', monospace" font-size="17">
|
||||
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.333;0.34500000000000003;0.648;0.663;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="66" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#tw1)"><text x="64" y="66" fill="#F7F6FC">omniroute combo list</text></g>
|
||||
<rect y="52" width="9" height="20" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="x" calcMode="discrete" values="64;90;115;140;166;192;217;242;268;268" keyTimes="0;0.345;0.351;0.357;0.363;0.369;0.375;0.381;0.387;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0;1;0.2;1;0.2;1;0;0" keyTimes="0;0.34400000000000003;0.34500000000000003;0.355;0.365;0.375;0.385;0.407;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<text x="40" y="100" font-weight="700" fill="#38bdf8" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.378;0.38" dur="18s" repeatCount="indefinite"/>OmniRoute Combos</text><text x="40" y="128" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.386;0.388" dur="18s" repeatCount="indefinite"/>  <tspan fill='#22c55e'>●</tspan> always-on     [priority      ] <tspan fill='#22c55e'>enabled</tspan></text><text x="40" y="154" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.394;0.396" dur="18s" repeatCount="indefinite"/>  <tspan fill='#71717a'>○</tspan> cost-saver    [cost-optimized] <tspan fill='#22c55e'>enabled</tspan></text><text x="40" y="180" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.402;0.404" dur="18s" repeatCount="indefinite"/>  <tspan fill='#71717a'>○</tspan> fusion-panel  [fusion        ] <tspan fill='#22c55e'>enabled</tspan></text><text x="40" y="206" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.41;0.412" dur="18s" repeatCount="indefinite"/>  <tspan fill='#71717a'>○</tspan> context-relay [context-relay ] <tspan fill='#22c55e'>enabled</tspan></text><text x="40" y="232" fill="#71717a" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.418;0.42" dur="18s" repeatCount="indefinite"/>… run: omniroute combo create</text>
|
||||
</g><g opacity="0" font-family="Consolas, 'Courier New', monospace" font-size="17">
|
||||
<animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.666;0.678;0.93;0.945;1" dur="18s" repeatCount="indefinite"/>
|
||||
<text x="40" y="66" fill="#22c55e">$</text>
|
||||
<g clip-path="url(#tw2)"><text x="64" y="66" fill="#F7F6FC">omniroute health</text></g>
|
||||
<rect y="52" width="9" height="20" fill="#a1a1aa" opacity="0">
|
||||
<animate attributeName="x" calcMode="discrete" values="64;84;105;125;146;166;186;207;227;227" keyTimes="0;0.678;0.684;0.690;0.696;0.702;0.708;0.714;0.720;1" dur="18s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0;1;0.2;1;0.2;1;0;0" keyTimes="0;0.677;0.678;0.688;0.698;0.708;0.718;0.74;1" dur="18s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<text x="40" y="100" font-weight="700" fill="#38bdf8" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.711;0.713" dur="18s" repeatCount="indefinite"/>OmniRoute Health</text><text x="40" y="128" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.719;0.721" dur="18s" repeatCount="indefinite"/>  Status: <tspan fill='#22c55e'>healthy</tspan>   Uptime: 4d 12h 33m</text><text x="40" y="154" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.727;0.729" dur="18s" repeatCount="indefinite"/>  Requests (24h): 18,412   p95: 412ms</text><text x="40" y="180" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.735;0.737" dur="18s" repeatCount="indefinite"/>  Breakers: <tspan fill='#22c55e'>● 24 closed</tspan>  <tspan fill='#f59e0b'>◒ 1 half-open</tspan>  <tspan fill='#ef4444'>○ 0 open</tspan></text><text x="40" y="206" fill="#a1a1aa" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.743;0.745" dur="18s" repeatCount="indefinite"/>  Providers: 268 registered   90+ free tiers</text><text x="40" y="232" fill="#71717a" opacity="0"><animate attributeName="opacity" calcMode="discrete" values="0;0;1" keyTimes="0;0.751;0.753" dur="18s" repeatCount="indefinite"/>… live: /dashboard · omniroute status</text>
|
||||
</g>
|
||||
<path d="M 0 300 L 1200 300" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<g clip-path="url(#tickerClip)"><g font-family="Consolas, 'Courier New', monospace" font-size="14" fill="#71717a">
|
||||
<animateTransform attributeName="transform" type="translate" from="0 0" to="-2432 0" dur="55s" repeatCount="indefinite"/>
|
||||
<text x="24" y="330"><tspan fill="#8b5cf6">providers</tspan> · oauth · keys · <tspan fill="#8b5cf6">combo</tspan> · nodes · models · cache · <tspan fill="#8b5cf6">compression</tspan> · cost · usage · quota · <tspan fill="#8b5cf6">health</tspan> · resilience · telemetry · logs · audit · <tspan fill="#8b5cf6">mcp</tspan> · a2a · cloud · <tspan fill="#8b5cf6">memory</tspan> · skills · eval · <tspan fill="#8b5cf6">doctor</tspan> · repl · tunnel · backup · sync · webhooks · policy · pricing · translator · simulate …</text><text x="2456" y="330"><tspan fill="#8b5cf6">providers</tspan> · oauth · keys · <tspan fill="#8b5cf6">combo</tspan> · nodes · models · cache · <tspan fill="#8b5cf6">compression</tspan> · cost · usage · quota · <tspan fill="#8b5cf6">health</tspan> · resilience · telemetry · logs · audit · <tspan fill="#8b5cf6">mcp</tspan> · a2a · cloud · <tspan fill="#8b5cf6">memory</tspan> · skills · eval · <tspan fill="#8b5cf6">doctor</tspan> · repl · tunnel · backup · sync · webhooks · policy · pricing · translator · simulate …</text>
|
||||
</g></g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
@@ -22,7 +22,7 @@
|
||||
<clipPath id="barShapeF"><rect x="60" y="372" width="1080" height="18" rx="9"/></clipPath>
|
||||
<clipPath id="barRevF">
|
||||
<rect x="60" y="372" width="0" height="18">
|
||||
<animate attributeName="width" values="0;1080;1080" keyTimes="0;0.22;1" dur="10s" repeatCount="indefinite"/>
|
||||
<animate attributeName="width" values="1080;0;1080;1080" keyTimes="0;0.02;0.24;1" dur="10s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
</clipPath>
|
||||
</defs>
|
||||
@@ -70,7 +70,7 @@
|
||||
<text x="704" y="116" font-family="Consolas, 'Courier New', monospace" font-size="10.5" letter-spacing="2.5" font-weight="700" fill="#a78bfa">THE HONEST MATH</text>
|
||||
<text x="704" y="172" font-family="Consolas, 'Courier New', monospace" font-size="34" font-weight="800" fill="#71717a">~10B</text>
|
||||
<line x1="698" y1="161" x2="810" y2="161" stroke="#ef4444" stroke-width="3" stroke-linecap="round" stroke-dasharray="112" stroke-dashoffset="112">
|
||||
<animate attributeName="stroke-dashoffset" values="112;112;0;0" keyTimes="0;0.10;0.18;1" dur="10s" repeatCount="indefinite"/>
|
||||
<animate attributeName="stroke-dashoffset" values="0;112;0;0" keyTimes="0;0.10;0.18;1" dur="10s" repeatCount="indefinite"/>
|
||||
</line>
|
||||
<text x="836" y="156" font-family="Consolas, 'Courier New', monospace" font-size="11.5" fill="#a1a1aa">every rate limit · 24/7</text>
|
||||
<text x="836" y="176" font-family="Consolas, 'Courier New', monospace" font-size="11.5" fill="#ef4444" opacity="0.85">we don't publish that</text>
|
||||
@@ -108,8 +108,8 @@
|
||||
</g>
|
||||
</g>
|
||||
<circle r="3.2" fill="#F7F6FC">
|
||||
<animateMotion path="M 60,381 L 1140,381" keyPoints="0;1;1" keyTimes="0;0.22;1" calcMode="linear" dur="10s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="1;1;0;0" keyTimes="0;0.21;0.24;1" dur="10s" repeatCount="indefinite"/>
|
||||
<animateMotion path="M 60,381 L 1140,381" keyPoints="0;0;1;1" keyTimes="0;0.02;0.24;1" calcMode="linear" dur="10s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.23;0.26;1" dur="10s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<text x="60" y="416" font-family="Consolas, 'Courier New', monospace" font-size="11.5" fill="#71717a">each segment = one free pool · widths floored so every provider shows · honest numbers below</text>
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
25
docs/diagrams/privacy-local.svg
Normal file
|
After Width: | Height: | Size: 12 KiB |
139
docs/diagrams/promise-pillars.svg
Normal file
@@ -0,0 +1,139 @@
|
||||
<svg viewBox="0 0 1200 540" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="The OmniRoute promise: one endpoint, 268 providers — never stop building, OmniRoute picks the cheapest one that works. Six pillars. Never hit limits: auto-fallback across 268 providers in milliseconds, quota out means the next provider takes over with zero downtime. Save up to 95 percent of tokens: RTK plus Caveman stacked compression cuts 15 to 95 percent of eligible tokens, about 89 percent average on tool-heavy sessions. Zero dollars to start: 90+ providers with a free tier, 40+ free forever — Qoder, Pollinations, Cloudflare, SiliconFlow — no card needed. Every tool works: 26 coding agents including Claude Code, Codex, Cursor, Cline, Copilot and Antigravity through one config. One endpoint: OpenAI, Claude, Gemini and Responses API translation — point any tool at /v1 and it just works. Production-grade: circuit breakers, TLS stealth, MCP with 104 tools, A2A, memory, guardrails, evals — 25,000+ tests.">
|
||||
<desc>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.</desc>
|
||||
<defs>
|
||||
<pattern id="gridPaperP" width="32" height="32" patternUnits="userSpaceOnUse">
|
||||
<path d="M 32 0 L 0 0 0 32" fill="none" stroke="#ffffff" stroke-opacity="0.06" stroke-width="1"/>
|
||||
</pattern>
|
||||
<radialGradient id="bgGlowP" cx="70%" cy="14%" r="55%">
|
||||
<stop offset="0%" stop-color="#e54d5e" stop-opacity="0.12"/>
|
||||
<stop offset="55%" stop-color="#8b5cf6" stop-opacity="0.06"/>
|
||||
<stop offset="100%" stop-color="#6366f1" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
|
||||
<rect width="1200" height="540" fill="#0b0e14"/>
|
||||
<rect width="1200" height="540" fill="url(#gridPaperP)"/>
|
||||
<rect width="1200" height="540" fill="url(#bgGlowP)"/>
|
||||
|
||||
<!-- header -->
|
||||
<g>
|
||||
<text x="40" y="58" font-family="Consolas, 'Courier New', monospace" font-size="13" letter-spacing="2.5" fill="#a78bfa">THE PROMISE</text>
|
||||
<line x1="150" y1="53" x2="1160" y2="53" stroke="#232b38" stroke-width="1.5"/>
|
||||
</g>
|
||||
<g>
|
||||
<text x="40" y="100" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="23" font-weight="600" fill="#c9d1d9">One endpoint. <tspan fill="#a78bfa" font-weight="800">268 providers.</tspan> Never stop building — OmniRoute picks <tspan fill="#7ee787" font-weight="700">the cheapest one that works</tspan>.</text>
|
||||
</g>
|
||||
|
||||
<g font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif">
|
||||
|
||||
<!-- cell 1: never hit limits (blue) -->
|
||||
<g>
|
||||
<rect x="40" y="130" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="40" y="130" width="360" height="164" rx="14" fill="none" stroke="#74b9ff" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.9;0;0" keyTimes="0;0.055;0.12;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="40" y="146" width="4" height="132" rx="2" fill="#0984e3"/>
|
||||
<g transform="translate(66,152)" stroke="#74b9ff" stroke-width="2.4" fill="none" stroke-linecap="round">
|
||||
<circle cx="11" cy="11" r="10.5"/>
|
||||
<line x1="3.9" y1="3.9" x2="18.1" y2="18.1"/>
|
||||
</g>
|
||||
<text x="102" y="170" font-size="18" font-weight="800" fill="#74b9ff">Never hit limits</text>
|
||||
<text x="66" y="204" font-size="13.5" fill="#a1a1aa">Auto-fallback across 268 providers in</text>
|
||||
<text x="66" y="226" font-size="13.5" fill="#a1a1aa">milliseconds. Quota out? The next provider</text>
|
||||
<text x="66" y="248" font-size="13.5" fill="#a1a1aa">takes over — zero downtime.</text>
|
||||
</g>
|
||||
|
||||
<!-- cell 2: save tokens (orange) -->
|
||||
<g>
|
||||
<rect x="420" y="130" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="420" y="130" width="360" height="164" rx="14" fill="none" stroke="#e17055" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;0.9;0;0" keyTimes="0;0.167;0.222;0.287;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="420" y="146" width="4" height="132" rx="2" fill="#e17055"/>
|
||||
<g transform="translate(446,152)" stroke="#e17055" stroke-width="2.4" fill="none" stroke-linecap="round">
|
||||
<circle cx="5.5" cy="5.5" r="4"/>
|
||||
<circle cx="16.5" cy="16.5" r="4"/>
|
||||
<line x1="19" y1="3" x2="3" y2="19"/>
|
||||
</g>
|
||||
<text x="482" y="170" font-size="18" font-weight="800" fill="#e17055">Save up to 95% tokens</text>
|
||||
<text x="446" y="204" font-size="13.5" fill="#a1a1aa">RTK + Caveman stacked compression cuts</text>
|
||||
<text x="446" y="226" font-size="13.5" fill="#a1a1aa">15–95% of eligible tokens — ~89% average</text>
|
||||
<text x="446" y="248" font-size="13.5" fill="#a1a1aa">on tool-heavy sessions.</text>
|
||||
</g>
|
||||
|
||||
<!-- cell 3: $0 to start (gold) -->
|
||||
<g>
|
||||
<rect x="800" y="130" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="800" y="130" width="360" height="164" rx="14" fill="none" stroke="#fdcb6e" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;0.9;0;0" keyTimes="0;0.334;0.389;0.454;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="800" y="146" width="4" height="132" rx="2" fill="#fdcb6e"/>
|
||||
<g transform="translate(826,152)" stroke="#fdcb6e" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M 2,9.5 L 2,3 A 1,1 0 0 1 3,2 L 9.5,2 L 20,12.5 A 1.6,1.6 0 0 1 20,14.8 L 14.8,20 A 1.6,1.6 0 0 1 12.5,20 Z"/>
|
||||
<circle cx="6.6" cy="6.6" r="1.4" fill="#fdcb6e" stroke="none"/>
|
||||
</g>
|
||||
<text x="862" y="170" font-size="18" font-weight="800" fill="#fdcb6e">$0 to start</text>
|
||||
<text x="826" y="204" font-size="13.5" fill="#a1a1aa">90+ providers with a free tier, 40+ free</text>
|
||||
<text x="826" y="226" font-size="13.5" fill="#a1a1aa">forever — Qoder, Pollinations, Cloudflare,</text>
|
||||
<text x="826" y="248" font-size="13.5" fill="#a1a1aa">SiliconFlow… No card needed.</text>
|
||||
</g>
|
||||
|
||||
<!-- cell 4: every tool works (violet) -->
|
||||
<g>
|
||||
<rect x="40" y="314" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="40" y="314" width="360" height="164" rx="14" fill="none" stroke="#a78bfa" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;0.9;0;0" keyTimes="0;0.5;0.555;0.62;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="40" y="330" width="4" height="132" rx="2" fill="#8b5cf6"/>
|
||||
<g transform="translate(66,336)" stroke="#a78bfa" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M 6,2 L 6,7 M 14,2 L 14,7"/>
|
||||
<path d="M 3.5,7 L 16.5,7 L 16.5,11.5 A 6.5,6.5 0 0 1 10,18 A 6.5,6.5 0 0 1 3.5,11.5 Z"/>
|
||||
<path d="M 10,18 L 10,22"/>
|
||||
</g>
|
||||
<text x="102" y="354" font-size="18" font-weight="800" fill="#a78bfa">Every tool works</text>
|
||||
<text x="66" y="388" font-size="13.5" fill="#a1a1aa">26 coding agents — Claude Code, Codex,</text>
|
||||
<text x="66" y="410" font-size="13.5" fill="#a1a1aa">Cursor, Cline, Copilot, Antigravity —</text>
|
||||
<text x="66" y="432" font-size="13.5" fill="#a1a1aa">through one config.</text>
|
||||
</g>
|
||||
|
||||
<!-- cell 5: one endpoint (cyan) -->
|
||||
<g>
|
||||
<rect x="420" y="314" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="420" y="314" width="360" height="164" rx="14" fill="none" stroke="#00cec9" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;0.9;0;0" keyTimes="0;0.667;0.722;0.787;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="420" y="330" width="4" height="132" rx="2" fill="#00cec9"/>
|
||||
<g transform="translate(446,336)" stroke="#00cec9" stroke-width="2.2" fill="none" stroke-linecap="round">
|
||||
<path d="M 2,3 L 13,8.5 M 2,11 L 13,11 M 2,19 L 13,13.5"/>
|
||||
<circle cx="18.5" cy="11" r="3.2" fill="#00cec9" stroke="none"/>
|
||||
</g>
|
||||
<text x="482" y="354" font-size="18" font-weight="800" fill="#00cec9">One endpoint</text>
|
||||
<text x="446" y="388" font-size="13.5" fill="#a1a1aa">OpenAI ↔ Claude ↔ Gemini ↔ Responses API</text>
|
||||
<text x="446" y="410" font-size="13.5" fill="#a1a1aa">translation. Point any tool at /v1 —</text>
|
||||
<text x="446" y="432" font-size="13.5" fill="#a1a1aa">it just works.</text>
|
||||
</g>
|
||||
|
||||
<!-- cell 6: production-grade (green) -->
|
||||
<g>
|
||||
<rect x="800" y="314" width="360" height="164" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<rect x="800" y="314" width="360" height="164" rx="14" fill="none" stroke="#7ee787" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0;0.9;0;0" keyTimes="0;0.834;0.889;0.954;1" dur="12s" begin="3s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
<rect x="800" y="330" width="4" height="132" rx="2" fill="#22c55e"/>
|
||||
<g transform="translate(826,336)" stroke="#7ee787" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M 11,1.5 L 19.5,5 L 19.5,11 C 19.5,16.5 16,19.8 11,21.5 C 6,19.8 2.5,16.5 2.5,11 L 2.5,5 Z"/>
|
||||
<path d="M 7,11 L 10,14 L 15.4,8.2"/>
|
||||
</g>
|
||||
<text x="862" y="354" font-size="18" font-weight="800" fill="#7ee787">Production-grade</text>
|
||||
<text x="826" y="388" font-size="13.5" fill="#a1a1aa">Circuit breakers, TLS stealth, MCP (104</text>
|
||||
<text x="826" y="410" font-size="13.5" fill="#a1a1aa">tools), A2A, memory, guardrails, evals —</text>
|
||||
<text x="826" y="432" font-size="13.5" fill="#a1a1aa">25,000+ tests.</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- footer -->
|
||||
<g>
|
||||
<text x="40" y="516" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#71717a">$ npm i -g omniroute  ·  point your tool at http://localhost:20128/v1  ·  $0</text>
|
||||
<text x="1160" y="516" text-anchor="end" font-family="Consolas, 'Courier New', monospace" font-size="12" letter-spacing="1.5" fill="#71717a">MIT · OPEN SOURCE</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
87
docs/diagrams/readme-hero.svg
Normal file
@@ -0,0 +1,87 @@
|
||||
<svg viewBox="0 0 1200 548" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="OmniRoute hero: Never stop coding. Every AI tool to 268 providers — 90+ free — through one endpoint. Claude Code, Codex, Cursor, Cline, Copilot and Antigravity into free Claude, GPT and Gemini with auto-fallback. RTK + Caveman stacked compression saves 15 to 95 percent of tokens — about 89 percent average on tool-heavy sessions — so you never hit limits. Stats: 268 AI providers, 90+ free tiers, about 1.6B free tokens per month, 15 to 95 percent token savings, 18 routing strategies, zero dollars to start.">
|
||||
<desc>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.</desc>
|
||||
<defs>
|
||||
<pattern id="gridPaperH" width="32" height="32" patternUnits="userSpaceOnUse">
|
||||
<path d="M 32 0 L 0 0 0 32" fill="none" stroke="#ffffff" stroke-opacity="0.06" stroke-width="1"/>
|
||||
</pattern>
|
||||
<radialGradient id="bgGlowH" cx="24%" cy="20%" r="55%">
|
||||
<stop offset="0%" stop-color="#e54d5e" stop-opacity="0.14"/>
|
||||
<stop offset="55%" stop-color="#8b5cf6" stop-opacity="0.06"/>
|
||||
<stop offset="100%" stop-color="#6366f1" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="gradBrandH" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#e54d5e"/>
|
||||
<stop offset="100%" stop-color="#a855f7"/>
|
||||
</linearGradient>
|
||||
<path id="dividerPathH" d="M 48,252 L 1152,252"/>
|
||||
</defs>
|
||||
|
||||
<rect width="1200" height="548" fill="#0b0e14"/>
|
||||
<rect width="1200" height="548" fill="url(#gridPaperH)"/>
|
||||
<rect width="1200" height="548" fill="url(#bgGlowH)"/>
|
||||
|
||||
<!-- kicker -->
|
||||
<text x="48" y="66" font-family="Consolas, 'Courier New', monospace" font-size="13" letter-spacing="2.5" fill="#a78bfa">OMNIROUTE — THE FREE AI GATEWAY</text>
|
||||
<text x="1152" y="66" text-anchor="end" font-family="Consolas, 'Courier New', monospace" font-size="12" letter-spacing="1.5" fill="#71717a">ONE ENDPOINT · /v1</text>
|
||||
|
||||
<!-- tagline -->
|
||||
<text x="48" y="138" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="60" font-weight="800" fill="#e9edf3">Never stop coding<tspan fill="#a855f7">.</tspan></text>
|
||||
|
||||
<!-- subheadline -->
|
||||
<text x="48" y="184" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="25" font-weight="600" fill="#c9d1d9">Every AI tool → <tspan fill="#a78bfa" font-weight="800">268 providers</tspan> — <tspan fill="#7ee787" font-weight="800">90+ free</tspan> — through one endpoint.</text>
|
||||
|
||||
<!-- plug line -->
|
||||
<text x="48" y="222" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="16.5" fill="#a1a1aa">Claude Code · Codex · Cursor · Cline · Copilot · Antigravity  →  <tspan fill="#7ee787" font-weight="700">FREE</tspan> Claude / GPT / Gemini · auto-fallback</text>
|
||||
|
||||
<!-- divider + traveling pulse -->
|
||||
<line x1="48" y1="252" x2="1152" y2="252" stroke="#232b38" stroke-width="1.5"/>
|
||||
<circle r="4" fill="url(#gradBrandH)" opacity="0">
|
||||
<animateMotion dur="6s" repeatCount="indefinite" keyPoints="0;1" keyTimes="0;1" calcMode="linear">
|
||||
<mpath href="#dividerPathH"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0;0.9;0.9;0" keyTimes="0;0.08;0.6;0.75" dur="6s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
|
||||
<!-- compression band -->
|
||||
<g>
|
||||
<rect x="48" y="284" width="1104" height="132" rx="14" fill="#161b22" stroke="#ffffff" stroke-opacity="0.08" stroke-width="1"/>
|
||||
<text x="76" y="314" font-family="Consolas, 'Courier New', monospace" font-size="11" letter-spacing="2" fill="#e17055">RTK + CAVEMAN · STACKED COMPRESSION</text>
|
||||
<text x="76" y="346" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="22" font-weight="800" fill="#e9edf3">Save 15–95% tokens</text>
|
||||
<!-- live bar demo -->
|
||||
<rect x="76" y="364" width="640" height="12" rx="6" fill="#0b0e14" stroke="#232b38" stroke-width="1"/>
|
||||
<rect x="76" y="364" width="640" height="12" rx="6" fill="#e17055">
|
||||
<animate attributeName="width" values="640;640;70;70;640" keyTimes="0;0.12;0.5;0.88;1" dur="8s" repeatCount="indefinite" calcMode="spline" keySplines="0.4 0 0.2 1;0.4 0 0.2 1;0.4 0 0.2 1;0.4 0 0.2 1"/>
|
||||
</rect>
|
||||
<text x="76" y="402" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="13" fill="#a1a1aa">your prompt
|
||||
<animate attributeName="opacity" values="1;1;0;0;1" keyTimes="0;0.12;0.35;0.88;1" dur="8s" repeatCount="indefinite" calcMode="discrete"/>
|
||||
</text>
|
||||
<text x="76" y="402" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="13" font-weight="700" fill="#e17055" opacity="0">−89% avg on tool-heavy sessions
|
||||
<animate attributeName="opacity" values="0;0;1;1;0" keyTimes="0;0.35;0.36;0.88;1" dur="8s" repeatCount="indefinite" calcMode="discrete"/>
|
||||
</text>
|
||||
<text x="1124" y="340" text-anchor="end" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="16" font-weight="700" fill="#e9edf3">never hit limits</text>
|
||||
<text x="1124" y="364" text-anchor="end" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="13" fill="#a1a1aa">auto-fallback keeps you coding</text>
|
||||
<text x="1124" y="402" text-anchor="end" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#71717a">$ npm i -g omniroute</text>
|
||||
</g>
|
||||
|
||||
<!-- stat chips -->
|
||||
<g font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" text-anchor="middle">
|
||||
<rect x="48" y="448" width="172" height="52" rx="12" fill="#161b22" stroke="#6c5ce7" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="134" y="471" font-size="17" font-weight="800" fill="#a78bfa">268</text>
|
||||
<text x="134" y="490" font-size="11" fill="#a1a1aa">AI PROVIDERS</text>
|
||||
<rect x="234" y="448" width="172" height="52" rx="12" fill="#161b22" stroke="#22c55e" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="320" y="471" font-size="17" font-weight="800" fill="#7ee787">90+</text>
|
||||
<text x="320" y="490" font-size="11" fill="#a1a1aa">FREE TIERS</text>
|
||||
<rect x="420" y="448" width="172" height="52" rx="12" fill="#161b22" stroke="#22c55e" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="506" y="471" font-size="17" font-weight="800" fill="#7ee787">~1.6B</text>
|
||||
<text x="506" y="490" font-size="11" fill="#a1a1aa">FREE TOKENS / MO</text>
|
||||
<rect x="606" y="448" width="172" height="52" rx="12" fill="#161b22" stroke="#e17055" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="692" y="471" font-size="17" font-weight="800" fill="#e17055">15–95%</text>
|
||||
<text x="692" y="490" font-size="11" fill="#a1a1aa">TOKEN SAVINGS</text>
|
||||
<rect x="792" y="448" width="172" height="52" rx="12" fill="#161b22" stroke="#0984e3" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="878" y="471" font-size="17" font-weight="800" fill="#74b9ff">18</text>
|
||||
<text x="878" y="490" font-size="11" fill="#a1a1aa">ROUTING STRATEGIES</text>
|
||||
<rect x="978" y="448" width="174" height="52" rx="12" fill="#161b22" stroke="#fdcb6e" stroke-opacity="0.55" stroke-width="1.5"/>
|
||||
<text x="1065" y="471" font-size="17" font-weight="800" fill="#fdcb6e">$0</text>
|
||||
<text x="1065" y="490" font-size="11" fill="#a1a1aa">TO START</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.3 KiB |
22
docs/diagrams/resilience-layers.svg
Normal file
|
After Width: | Height: | Size: 22 KiB |
110
docs/diagrams/strategies-grid.svg
Normal file
@@ -0,0 +1,110 @@
|
||||
<svg viewBox="0 0 1200 644" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="All 18 OmniRoute combo routing strategies, each tile animating the flow it executes: priority drains the first target then the next; fill-first fills a target's quota before moving on; weighted picks randomly by weight; round-robin cycles targets in order; p2c picks two random targets and routes to the lighter one; least-used picks the lowest current load; random picks uniformly; strict-random allows repeats; cost-optimized routes to the cheapest request; headroom picks the most remaining quota; reset-window prefers the quota window resetting soonest; reset-aware ranks by reset time, short windows first; context-relay hands off long context across targets; context-optimized fits the current context size; lkgp sticks to the last successful target; auto scores every connection on 12 live factors; fusion fans out to a panel and a judge synthesizes one answer; pipeline chains steps so each output feeds the next.">
|
||||
<desc>Animated grid of 18 routing-strategy tiles; static tracks show each flow on the first frame while a small dot repeatedly travels the path each strategy takes.</desc>
|
||||
<defs>
|
||||
<pattern id="gridPaperS" width="32" height="32" patternUnits="userSpaceOnUse">
|
||||
<path d="M 32 0 L 0 0 0 32" fill="none" stroke="#ffffff" stroke-opacity="0.06" stroke-width="1"/>
|
||||
</pattern>
|
||||
<radialGradient id="bgGlowS" cx="22%" cy="12%" r="55%">
|
||||
<stop offset="0%" stop-color="#e54d5e" stop-opacity="0.10"/>
|
||||
<stop offset="55%" stop-color="#8b5cf6" stop-opacity="0.05"/>
|
||||
<stop offset="100%" stop-color="#6366f1" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<rect width="1200" height="644" fill="#0b0e14"/>
|
||||
<rect width="1200" height="644" fill="url(#gridPaperS)"/>
|
||||
<rect width="1200" height="644" fill="url(#bgGlowS)"/>
|
||||
<text x="40" y="52" font-family="Consolas, 'Courier New', monospace" font-size="13" letter-spacing="2.5" fill="#a78bfa">COMBO ROUTING · ALL 18 STRATEGY FLOWS</text>
|
||||
<line x1="418" y1="47" x2="1160" y2="47" stroke="#232b38" stroke-width="1.5"/>
|
||||
<text x="40" y="80" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="13.5" fill="#71717a">● request → ▮ targets — each tile animates the path its strategy takes · <tspan fill="#7ee787">green outline = the pick</tspan></text>
|
||||
<g transform="translate(40,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">priority</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="0.0s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="0.0s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">drain the 1st, then the next</text>
|
||||
</g><g transform="translate(229,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">fill-first</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="118" y="40.5" width="15.8" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="64.5" width="3.3" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="0.22s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="0.22s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">fill T1’s quota, then move on</text>
|
||||
</g><g transform="translate(418,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">weighted</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 110,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.6" stroke-width="2.6"/><path d="M 26,79 C 62,79 84,67.5 110,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.45" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,91.5 110,91.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.3" stroke-width="1"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#232b38" stroke-width="1.1"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">60%</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">30%</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">10%</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="0.44s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.04;0.3;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.04;0.06;0.27999999999999997;0.3;1" begin="0.44s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="0.44s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.4;0.62;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.4;0.42000000000000004;0.6;0.62;1" begin="0.44s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="0.44s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.7;0.92;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.7;0.72;0.9;0.92;1" begin="0.44s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">weighted random pick</text>
|
||||
</g><g transform="translate(607,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">round-robin</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="0.66s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.21;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.19;0.21;1" begin="0.66s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="0.66s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.29;0.44999999999999996;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.29;0.31;0.42999999999999994;0.44999999999999996;1" begin="0.66s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,91.5 110,91.5" begin="0.66s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.53;0.69;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.53;0.55;0.6699999999999999;0.69;1" begin="0.66s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,115.5 110,115.5" begin="0.66s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.77;0.9299999999999999;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.77;0.79;0.9099999999999999;0.9299999999999999;1" begin="0.66s" dur="4.0s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">cycle in order 1→2→3→4</text>
|
||||
</g><g transform="translate(796,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">p2c</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">20%</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">65%</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="0.88s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.24;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.22;0.24;1" begin="0.88s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,115.5 110,115.5" begin="0.88s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.24;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.22;0.24;1" begin="0.88s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#7ee787" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="0.88s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.4;0.68;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.4;0.42000000000000004;0.66;0.68;1" begin="0.88s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">pick 2, take the lighter</text>
|
||||
</g><g transform="translate(985,104)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">least-used</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="40.5" width="16.5" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">75%</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="118" y="64.5" width="4.4" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">20%</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="88.5" width="12.1" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">55%</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="112.5" width="8.8" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">40%</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="1.1s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="1.1s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">lowest current load wins</text>
|
||||
</g><g transform="translate(40,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">random</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#232b38" stroke-width="1.1"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,91.5 110,91.5" begin="1.32s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.2;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.18000000000000002;0.2;1" begin="1.32s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="1.32s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.28;0.43;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.28;0.30000000000000004;0.41;0.43;1" begin="1.32s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,115.5 110,115.5" begin="1.32s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.51;0.66;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.51;0.53;0.64;0.66;1" begin="1.32s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="1.32s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.74;0.89;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.74;0.76;0.87;0.89;1" begin="1.32s" dur="4.0s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">uniform random (deduped)</text>
|
||||
</g><g transform="translate(229,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">strict-random</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#232b38" stroke-width="1.1"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#232b38" stroke-width="1.1"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">×2!</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="1.54s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.2;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.18000000000000002;0.2;1" begin="1.54s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="1.54s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.28;0.43;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.28;0.30000000000000004;0.41;0.43;1" begin="1.54s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,115.5 110,115.5" begin="1.54s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.51;0.66;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.51;0.53;0.64;0.66;1" begin="1.54s" dur="4.0s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="1.54s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.74;0.89;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.74;0.76;0.87;0.89;1" begin="1.54s" dur="4.0s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">pure random — repeats ok</text>
|
||||
</g><g transform="translate(418,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">cost-optimized</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,115.5 112,115.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">$9</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">$3</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">$0.5</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">FREE</text><circle r="2.8" fill="#7ee787" opacity="0"><animateMotion path="M 26,79 C 62,79 84,115.5 110,115.5" begin="1.76s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="1.76s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">cheapest $ per request</text>
|
||||
</g><g transform="translate(607,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">headroom</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="40.5" width="2.2" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">10%</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="118" y="64.5" width="17.6" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">80%</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="88.5" width="8.8" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">40%</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="118" y="112.5" width="13.2" height="6" rx="1.5" fill="#8b5cf6" fill-opacity="0.55"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">60%</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="1.98s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="1.98s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">most remaining quota</text>
|
||||
</g><g transform="translate(796,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">reset-window</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">58m</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">2m!</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">31m</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">12h</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="2.2s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="2.2s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">resets soonest → use it</text>
|
||||
</g><g transform="translate(985,280)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">reset-aware</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">3rd</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">1st</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">2nd</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">4th</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="2.42s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.28;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.26;0.28;1" begin="2.42s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,91.5 110,91.5" begin="2.42s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.42;0.62;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.42;0.44;0.6;0.62;1" begin="2.42s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">rank by reset — short first</text>
|
||||
</g><g transform="translate(40,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">context-relay</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 112,43.5 C 96,43.5 96,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="3.2" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5 C 94,43.5 94,67.5 110,67.5" begin="2.64s" dur="4.0s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.6;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.58;0.6;1" begin="2.64s" dur="4.0s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">hand off long context</text>
|
||||
</g><g transform="translate(229,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">context-optimized</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">8K</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">200K</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">32K</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">128K</text><circle r="3.4" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="2.86s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="2.86s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">fit the context size</text>
|
||||
</g><g transform="translate(418,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">lkgp</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><g transform="translate(125.0,63.5)" stroke="#7ee787" stroke-width="1.6" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M 0,4 L 3,7 L 8,1"/></g><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="3.08s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.28;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.26;0.28;1" begin="3.08s" dur="3.6s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="3.08s" dur="3.6s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.45;0.68;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.45;0.47000000000000003;0.66;0.68;1" begin="3.08s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">sticky to last success</text>
|
||||
</g><g transform="translate(607,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">auto</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">72</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">91</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">64</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><text x="147" y="118.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">55</text><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="3.3s" dur="3.6s" repeatCount="indefinite"/><animate attributeName="opacity" values="0;1;1;0;0" keyTimes="0;0.02;0.3;0.33999999999999997;1" begin="3.3s" dur="3.6s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">live 12-factor scoring</text>
|
||||
</g><g transform="translate(796,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">fusion</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 62,79 84,43.5 112,43.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,67.5 112,67.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><path d="M 26,79 C 62,79 84,91.5 112,91.5" fill="none" stroke="#71717a" stroke-opacity="0.5" stroke-width="1.1" stroke-dasharray="3 3"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,43.5 110,43.5" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.25;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.23;0.25;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,67.5 110,67.5" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.25;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.23;0.25;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 62,79 84,91.5 110,91.5" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.25;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.23;0.25;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.2" fill="#7ee787" opacity="0"><animateMotion path="M 110,43.5 C 84,43.5 62,79 30,79" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.35;0.55;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.35;0.37;0.53;0.55;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.2" fill="#7ee787" opacity="0"><animateMotion path="M 110,67.5 C 84,67.5 62,79 30,79" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.35;0.55;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.35;0.37;0.53;0.55;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.2" fill="#7ee787" opacity="0"><animateMotion path="M 110,91.5 C 84,91.5 62,79 30,79" begin="3.52s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.35;0.55;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.35;0.37;0.53;0.55;1" begin="3.52s" dur="4.2s" repeatCount="indefinite"/></circle><g transform="translate(44,72)"><path d="M 8,0 L 16,7 L 8,14 L 0,7 Z" fill="none" stroke="#fdcb6e" stroke-width="1.4"/></g>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">panel + judge → one answer</text>
|
||||
</g><g transform="translate(985,456)">
|
||||
<rect width="173" height="158" rx="10" fill="#161b22" stroke="#ffffff" stroke-opacity="0.07" stroke-width="1"/>
|
||||
<text x="12" y="21" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#a78bfa">pipeline</text>
|
||||
<circle cx="20" cy="79" r="4" fill="none" stroke="#c9d1d9" stroke-width="1.6"/><circle cx="20" cy="79" r="1.6" fill="#c9d1d9"/><path d="M 26,79 C 56,79 80,43.5 112,43.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 142,43.5 C 158,43.5 158,67.5 142,67.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><path d="M 116,67.5 C 96,67.5 96,91.5 116,91.5" fill="none" stroke="#8b5cf6" stroke-opacity="0.55" stroke-width="1.6"/><rect x="116" y="38.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="46.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">1</text><rect x="116" y="62.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="70.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">2</text><rect x="116" y="86.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#7ee787" stroke-opacity="0.8" stroke-width="1"/><text x="147" y="94.5" font-family="Consolas, 'Courier New', monospace" font-size="8.5" fill="#71717a">3</text><rect x="116" y="110.0" width="26" height="11" rx="2.5" fill="#1c2330" stroke="#ffffff" stroke-opacity="0.10" stroke-width="1"/><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 26,79 C 56,79 80,43.5 110,43.5" begin="3.74s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.05;0.22;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.05;0.07;0.2;0.22;1" begin="3.74s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 142,43.5 C 158,43.5 158,67.5 142,67.5" begin="3.74s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.28;0.45;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.28;0.30000000000000004;0.43;0.45;1" begin="3.74s" dur="4.2s" repeatCount="indefinite"/></circle><circle r="2.8" fill="#a78bfa" opacity="0"><animateMotion path="M 116,67.5 C 96,67.5 96,91.5 116,91.5" begin="3.74s" dur="4.2s" repeatCount="indefinite" keyPoints="0;0;1;1" keyTimes="0;0.51;0.68;1" calcMode="linear"/><animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;0.51;0.53;0.66;0.68;1" begin="3.74s" dur="4.2s" repeatCount="indefinite"/></circle>
|
||||
<text x="12" y="148" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="9.5" fill="#71717a">each output feeds the next</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 45 KiB |
107
docs/diagrams/why-pain-fix.svg
Normal file
@@ -0,0 +1,107 @@
|
||||
<svg viewBox="0 0 1200 664" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Why OmniRoute — stop juggling 10 dashboards, dead API keys and surprise bills. Ten daily pains and how OmniRoute fixes each: subscription quota expiring unused — maximize subscriptions, track quota and use every token before reset. Rate limits stopping you mid-coding — 4-tier auto-fallback from Subscription to API to Cheap to Free in milliseconds. Tool outputs like git diff, grep and logs burning tokens — RTK + Caveman compression saves 15 to 95 percent of eligible tokens per request. Expensive APIs at 20 to 50 dollars per month per provider — cost-optimized routing to the cheapest viable model. Each AI tool wanting its own setup — one endpoint, every tool, one dashboard. AI blocked in your country — 3-level proxy plus TLS fingerprint stealth. Dead keys and banned accounts killing your flow — 3-layer resilience with circuit breakers, key cooldown and model lockout. One subscription shared by a whole team — key pools with fair-share quotas per member enforced in the hot path. Prompts routed through someone else's cloud — local-first, runs on your machine with AES-256-GCM encrypted keys. No idea where tokens and money go — live analytics with usage, quota, savings and p95 latency per provider.">
|
||||
<desc>Animated comparison ledger: ten pain-versus-fix rows are fully readable on the first frame; a soft green highlight sweeps down the rows in a continuous cycle.</desc>
|
||||
<defs>
|
||||
<pattern id="gridPaperW" width="32" height="32" patternUnits="userSpaceOnUse">
|
||||
<path d="M 32 0 L 0 0 0 32" fill="none" stroke="#ffffff" stroke-opacity="0.06" stroke-width="1"/>
|
||||
</pattern>
|
||||
<radialGradient id="bgGlowW" cx="76%" cy="12%" r="55%">
|
||||
<stop offset="0%" stop-color="#e54d5e" stop-opacity="0.10"/>
|
||||
<stop offset="55%" stop-color="#8b5cf6" stop-opacity="0.05"/>
|
||||
<stop offset="100%" stop-color="#6366f1" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
|
||||
<rect width="1200" height="664" fill="#0b0e14"/>
|
||||
<rect width="1200" height="664" fill="url(#gridPaperW)"/>
|
||||
<rect width="1200" height="664" fill="url(#bgGlowW)"/>
|
||||
|
||||
<!-- header -->
|
||||
<text x="40" y="56" font-family="Consolas, 'Courier New', monospace" font-size="13" letter-spacing="2.5" fill="#a78bfa">WHY OMNIROUTE</text>
|
||||
<line x1="172" y1="51" x2="1160" y2="51" stroke="#232b38" stroke-width="1.5"/>
|
||||
<text x="40" y="100" font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="23" font-weight="600" fill="#c9d1d9">Stop juggling <tspan fill="#f87171" font-weight="800">10 dashboards</tspan>, <tspan fill="#fdcb6e" font-weight="800">dead API keys</tspan>, and <tspan fill="#e17055" font-weight="800">surprise bills</tspan>.</text>
|
||||
|
||||
<!-- column headers -->
|
||||
<g transform="translate(48,138)" stroke="#f87171" stroke-width="2.4" fill="none" stroke-linecap="round">
|
||||
<line x1="0" y1="0" x2="11" y2="11"/><line x1="11" y1="0" x2="0" y2="11"/>
|
||||
</g>
|
||||
<text x="72" y="149" font-family="Consolas, 'Courier New', monospace" font-size="12.5" letter-spacing="2" fill="#f87171">THE DAILY PAIN</text>
|
||||
<g transform="translate(632,137)" stroke="#7ee787" stroke-width="2.6" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M 0,7 L 4.5,11.5 L 13,2"/>
|
||||
</g>
|
||||
<text x="660" y="149" font-family="Consolas, 'Courier New', monospace" font-size="12.5" letter-spacing="2" fill="#7ee787">HOW OMNIROUTE FIXES IT</text>
|
||||
<line x1="40" y1="166" x2="1160" y2="166" stroke="#232b38" stroke-width="1.5"/>
|
||||
|
||||
<!-- sweeping row highlight (invisible on the first frame) -->
|
||||
<rect x="40" y="170" width="1120" height="46" fill="#7ee787" opacity="0">
|
||||
<animate attributeName="y" calcMode="discrete" values="170;216;262;308;354;400;446;492;538;584" keyTimes="0;0.1;0.2;0.3;0.4;0.5;0.6;0.7;0.8;0.9" dur="15s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0;0.055;0.055;0" keyTimes="0;0.015;0.985;1" dur="15s" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
|
||||
<!-- rows -->
|
||||
<g font-family="Inter, 'Segoe UI', Arial, Helvetica, system-ui, sans-serif" font-size="14.5">
|
||||
<!-- row separators -->
|
||||
<g stroke="#232b38" stroke-width="1">
|
||||
<line x1="40" y1="216" x2="1160" y2="216"/><line x1="40" y1="262" x2="1160" y2="262"/>
|
||||
<line x1="40" y1="308" x2="1160" y2="308"/><line x1="40" y1="354" x2="1160" y2="354"/>
|
||||
<line x1="40" y1="400" x2="1160" y2="400"/><line x1="40" y1="446" x2="1160" y2="446"/>
|
||||
<line x1="40" y1="492" x2="1160" y2="492"/><line x1="40" y1="538" x2="1160" y2="538"/>
|
||||
<line x1="40" y1="584" x2="1160" y2="584"/>
|
||||
</g>
|
||||
<line x1="612" y1="170" x2="612" y2="630" stroke="#232b38" stroke-width="1"/>
|
||||
|
||||
<!-- pain markers -->
|
||||
<g stroke="#f87171" stroke-opacity="0.85" stroke-width="2" fill="none" stroke-linecap="round">
|
||||
<g transform="translate(48,188)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,234)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,280)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,326)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,372)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,418)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,464)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,510)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,556)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
<g transform="translate(48,602)"><line x1="0" y1="0" x2="8" y2="8"/><line x1="8" y1="0" x2="0" y2="8"/></g>
|
||||
</g>
|
||||
<!-- fix markers -->
|
||||
<g stroke="#7ee787" stroke-width="2.2" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<g transform="translate(632,187)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,233)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,279)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,325)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,371)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,417)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,463)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,509)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,555)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
<g transform="translate(632,601)"><path d="M 0,6 L 4,10 L 11.5,1.5"/></g>
|
||||
</g>
|
||||
|
||||
<!-- pain column -->
|
||||
<g fill="#c9d1d9">
|
||||
<text x="72" y="197">Subscription quota expires unused every month</text>
|
||||
<text x="72" y="243">Rate limits stop you mid-coding</text>
|
||||
<text x="72" y="289">Tool outputs (git diff, grep, logs) burn tokens</text>
|
||||
<text x="72" y="335">Expensive APIs — $20–50/mo per provider</text>
|
||||
<text x="72" y="381">Each AI tool wants its own setup</text>
|
||||
<text x="72" y="427">AI blocked in your country</text>
|
||||
<text x="72" y="473">Dead keys and banned accounts kill your flow</text>
|
||||
<text x="72" y="519">One subscription, a whole team fighting over it</text>
|
||||
<text x="72" y="565">Your prompts routed through someone else's cloud</text>
|
||||
<text x="72" y="611">No idea where tokens and money go</text>
|
||||
</g>
|
||||
|
||||
<!-- fix column -->
|
||||
<g fill="#a1a1aa">
|
||||
<text x="660" y="197"><tspan font-weight="700" fill="#7ee787">Maximize subscriptions</tspan> — track quota, use every token before reset</text>
|
||||
<text x="660" y="243"><tspan font-weight="700" fill="#7ee787">4-tier auto-fallback</tspan> — Subscription → API → Cheap → Free, in ms</text>
|
||||
<text x="660" y="289"><tspan font-weight="700" fill="#7ee787">RTK + Caveman compression</tspan> — save 15–95% eligible tokens</text>
|
||||
<text x="660" y="335"><tspan font-weight="700" fill="#7ee787">Cost-optimized routing</tspan> — auto-route to the cheapest viable model</text>
|
||||
<text x="660" y="381"><tspan font-weight="700" fill="#7ee787">One endpoint</tspan> — every tool, one config, one dashboard</text>
|
||||
<text x="660" y="427"><tspan font-weight="700" fill="#7ee787">3-level proxy + TLS stealth</tspan> — use AI from anywhere</text>
|
||||
<text x="660" y="473"><tspan font-weight="700" fill="#7ee787">3-layer resilience</tspan> — circuit breakers, key cooldown, model lockout</text>
|
||||
<text x="660" y="519"><tspan font-weight="700" fill="#7ee787">Key pools</tspan> — fair-share quotas per member, hot-path enforced</text>
|
||||
<text x="660" y="565"><tspan font-weight="700" fill="#7ee787">Local-first</tspan> — your machine, keys encrypted (AES-256-GCM)</text>
|
||||
<text x="660" y="611"><tspan font-weight="700" fill="#7ee787">Live analytics</tspan> — usage, quota, savings & p95 latency per provider</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.0 KiB |
@@ -1,16 +1,16 @@
|
||||
---
|
||||
title: "Provider Reference"
|
||||
version: 3.8.49
|
||||
lastUpdated: 2026-07-18
|
||||
lastUpdated: 2026-07-19
|
||||
---
|
||||
|
||||
# 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-07-18
|
||||
> **Last generated:** 2026-07-19
|
||||
|
||||
Total providers: **265**. See category breakdown below.
|
||||
Total providers: **268**. See category breakdown below.
|
||||
|
||||
## Categories
|
||||
|
||||
@@ -31,7 +31,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
|
||||
---
|
||||
|
||||
## OAuth Providers (22)
|
||||
## OAuth Providers (23)
|
||||
|
||||
| ID | Alias | Name | Tags | Website | Notes |
|
||||
|----|-------|------|------|---------|-------|
|
||||
@@ -49,12 +49,13 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | OAuth application with ai_features + read_user scopes. Configure GITLAB_DUO_OAUTH_CLIENT_ID and optionally GITLAB_DUO_OAUTH_CLIENT_SECRET on this OmniRoute instance. |
|
||||
| `grok-cli` | `gc` | Grok Build | OAuth | — | Paste your ~/.grok/auth.json (or the JWT access token) from the Grok Build CLI; refresh_token is rotated automatically. |
|
||||
| `kilocode` | `kc` | Kilo Code | OAuth | — | — |
|
||||
| `kimi-coding` | `kmc` | Kimi Coding | OAuth | — | — |
|
||||
| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | — | Sign in with the same Kimi account used by Kimi Code CLI. OmniRoute uses the CLI OAuth flow and Kimi Coding Plan endpoints. |
|
||||
| `kiro` | `kr` | Kiro AI | OAuth | — | Free tier: 50 credits/month (~25K–100K tokens). ⚠️ Kiro ToS prohibits third-party proxy/harness use. |
|
||||
| `qoder` | `if` | Qoder | OAuth | — | — |
|
||||
| `qwen` | `qw` | Qwen Code | OAuth | — | ⚠️ **DEPRECATED.** Qwen OAuth free tier was discontinued on 2026-04-15. Use 'bailian-coding-plan', 'alibaba', 'alibaba-cn', or 'openrouter' provider with API key instead. |
|
||||
| `trae` | `tr` | Trae | OAuth | [link](https://trae.ai) | Trae is an AI-native IDE by ByteDance (SOLO remote agent). Authorize via trae.ai in the popup, or sign in at solo.trae.ai and paste the Cloud-IDE-JWT (sent as 'Authorization: Cloud-IDE-JWT <token>', ~14-day lifetime) as the access token; web_id/biz_user_id/user_unique_id/scope/tenant/region propagate via providerSpecificData. No headless refresh for pasted tokens — re-paste on expiry. |
|
||||
| `windsurf` | `ws` | Windsurf (Devin CLI) | OAuth | [link](https://windsurf.com) | In the Windsurf / VS Code IDE, open the command palette and run `Windsurf: Provide Auth Token` (or click the Jupyter "Get Windsurf Authentication Token" button), then copy the shown token and paste it here. Note: opening windsurf.com/show-auth-token directly only renders a "Redirecting" page — the IDE must initiate the flow (it adds a `?state=...` param) for the token to appear. |
|
||||
| `xai-oauth` | `xao` | xAI OAuth (Grok) | OAuth | [link](https://x.ai) | Sign in with xAI to use api.x.ai models such as Grok 4.5. This is separate from Grok Build JWT sessions, which use cli-chat-proxy.grok.com and grok-build model aliases. |
|
||||
| `zed` | `zd` | Zed IDE | OAuth | [link](https://zed.dev) | Zed stores LLM provider credentials (OpenAI, Anthropic, Google, Mistral, xAI) in the OS keychain. Use the Import button below to discover and import them automatically. |
|
||||
| `zed-hosted` | — | Zed Hosted Models | OAuth | [link](https://zed.dev) | Sign in with your Zed account (native-app sign-in). OmniRoute generates a one-time RSA keypair and opens zed.dev to authorize it — on a remote/headless install, copy the resulting 127.0.0.1 callback URL from your browser's address bar and paste it back here. Distinct from the 'Zed IDE' credential-import entry above: this proxies chat completions through Zed's own hosted model aggregator (cloud.zed.dev), fronting Anthropic/OpenAI/Google/xAI models under your Zed plan. |
|
||||
|
||||
@@ -75,7 +76,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
| `grok-web` | `gw` | Grok Web (Subscription) | Web cookie | [link](https://grok.com) | Paste the full grok.com cookie line from DevTools → Application → Cookies. Include both `sso` and `sso-rw` (e.g. `sso=...; sso-rw=...`) — Grok's anti-bot rejects `sso` on its own. |
|
||||
| `huggingchat` | `huggingchat` | HuggingChat (Free) | Web cookie | [link](https://huggingface.co/chat) | Paste the full Cookie header from huggingface.co/chat (DevTools → Network → /chat/conversation → Request Headers → Cookie). It should include hf-chat and may also include token / aws-waf-token. |
|
||||
| `inner-ai` | `in-ai` | Inner.ai (Subscription) | Web cookie | [link](https://app.innerai.com) | Paste your token cookie and email separated by a space: open DevTools → Application → Cookies → .innerai.com, copy the token value, then append a space and your Inner.ai login email. Example: eyJhbG... user@example.com |
|
||||
| `kimi-web` | `kimi-web` | Kimi Web (Moonshot AI) | Web cookie | [link](https://www.kimi.com) | Paste `access_token` from www.kimi.com DevTools → Application → Local Storage. A legacy `kimi-auth` cookie is also accepted. |
|
||||
| `kimi-web` | `kimi-web` | Kimi Web | Web cookie | [link](https://www.kimi.com) | Paste access_token from www.kimi.com DevTools → Application → Local Storage. A legacy kimi-auth cookie is also accepted. |
|
||||
| `lmarena` | `lma` | Arena (Free) | Web cookie | [link](https://arena.ai) | Paste the full Cookie header from arena.ai (DevTools → Network → request → Cookie). Include arena-auth-prod-v1.0/.1… and cf_clearance/__cf_bm when present. OmniRoute uses Chrome TLS impersonation; if Arena still 403s, set providerSpecificData.recaptchaV3Token from a live browser session. |
|
||||
| `microsoft-designer-web` | `msdesigner` | Microsoft Designer (Image Generation) | Web cookie | [link](https://designer.microsoft.com) | Sign in at designer.microsoft.com, then open DevTools → Network, generate an image, and find the request to DallE.ashx?action=GetDallEImagesCogSci. Copy the value of its Authorization: Bearer header (the access_token — no 'Bearer ' prefix). The token is short-lived; this is an unofficial, reverse-engineered integration. |
|
||||
| `muse-spark-web` | `ms-web` | Muse Spark Web (Meta AI) | Web cookie | [link](https://www.meta.ai) | Paste your ecto_1_sess value or full cookie header from meta.ai |
|
||||
@@ -90,12 +91,13 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
| `zai-web` | `zw` | Z.ai Web (Free) | Web cookie | [link](https://chat.z.ai) | Paste the full Cookie header from chat.z.ai (must include the token=<JWT> cookie) |
|
||||
| `zenmux-free` | `zmf` | ZenMux Free (Web) | Web cookie | [link](https://zenmux.ai) | Login at zenmux.ai, then export all cookies using EditThisCookie or Cookie-Editor and paste the full Cookie header string here. Refresh every ~30 days. |
|
||||
|
||||
## API Key Providers (paid / paid-with-free-credits) (177)
|
||||
## API Key Providers (paid / paid-with-free-credits) (179)
|
||||
|
||||
| ID | Alias | Name | Tags | Website | Notes |
|
||||
|----|-------|------|------|---------|-------|
|
||||
| `360ai` | `360ai` | 360 AI | API key | [link](https://ai.360.cn) | Get API key at ai.360.cn |
|
||||
| `agentrouter` | `agentrouter` | AgentRouter | API key, aggregator | [link](https://agentrouter.org) | $200 free credits on signup - multi-model routing gateway |
|
||||
| `agnes` | `agnes` | Agnes AI | API key | [link](https://agnes-ai.com) | Get API key at agnes-ai.com |
|
||||
| `ai21` | `ai21` | AI21 Labs | API key | [link](https://www.ai21.com) | $10 trial credits on signup (valid 3 months), no credit card required |
|
||||
| `aimlapi` | `aiml` | AI/ML API | API key, aggregator | [link](https://aimlapi.com) | Free tier paused (2026) — AI/ML API is now pay-as-you-go only (min $20 top-up); no recurring free credits. |
|
||||
| `alibaba` | `ali` | Alibaba | API key | [link](https://bailian.console.alibabacloud.com/) | — |
|
||||
@@ -128,6 +130,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
| `command-code` | `cmd` | Command Code | API key | [link](https://commandcode.ai/) | Use a Command Code API key. Requests are sent to Command Code's /alpha/generate endpoint. |
|
||||
| `coze` | `coze` | Coze | API key | [link](https://coze.com) | Get API key at coze.com/open/api |
|
||||
| `crof` | `crof` | CrofAI | API key | [link](https://crof.ai) | — |
|
||||
| `dahl` | `dahl` | Dahl | API key | [link](https://inference.dahl.global) | Click 'Add Account' to auto-generate a token. |
|
||||
| `databricks` | `databricks` | Databricks | API key, enterprise | [link](https://www.databricks.com) | — |
|
||||
| `datarobot` | `datarobot` | DataRobot | API key, enterprise | [link](https://docs.datarobot.com) | Use your DataRobot API token. Optional Base URL can be the account root (for LLM Gateway) or a deployment URL under /api/v2/deployments/<id>. |
|
||||
| `deepinfra` | `deepinfra` | DeepInfra | API key | [link](https://deepinfra.com) | Free signup credits for API testing and model exploration |
|
||||
@@ -180,8 +183,8 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each
|
||||
| `kenari` | `kenari` | Kenari | API key | [link](https://kenari.id) | Use your Kenari API key (kn-...) in Authorization: Bearer <key>. Fully OpenAI-compatible. API base URL: https://kenari.id/v1. |
|
||||
| `kie` | `kie` | KIE.AI | API key | [link](https://kie.ai) | — |
|
||||
| `kilo-gateway` | `kg` | Kilo Gateway | API key, aggregator | [link](https://kilo.ai) | — |
|
||||
| `kimi` | `kimi` | Kimi | API key | [link](https://platform.moonshot.ai) | — |
|
||||
| `kimi-coding-apikey` | `kmca` | Kimi Coding (API Key) | API key | [link](https://www.kimi.com/code) | — |
|
||||
| `kimi` | `kimi` | Kimi (Legacy Moonshot API) | API key | [link](https://platform.moonshot.ai) | — |
|
||||
| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API key | [link](https://www.kimi.com/code) | — |
|
||||
| `lambda-ai` | `lambda` | Lambda AI | API key | [link](https://lambda.ai) | — |
|
||||
| `laozhang` | `lz` | LaoZhang AI | API key, aggregator | [link](https://api.laozhang.ai) | — |
|
||||
| `leonardo` | `leo` | Leonardo AI | API key, video | [link](https://leonardo.ai) | Get API key at leonardo.ai/developer |
|
||||
|
||||
1
public/providers/cli-generic.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" width="52" height="52"><rect x="3.5" y="8" width="45" height="36" rx="7" fill="none" stroke="#8b8b95" stroke-width="3"/><path d="M 13 21 L 21 26 L 13 31" fill="none" stroke="#8b8b95" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><line x1="26" y1="32.5" x2="38" y2="32.5" stroke="#8b8b95" stroke-width="3" stroke-linecap="round"/></svg>
|
||||
|
After Width: | Height: | Size: 415 B |