diff --git a/.env.example b/.env.example index 7d92b7cad5..91df9f1217 100644 --- a/.env.example +++ b/.env.example @@ -1226,17 +1226,6 @@ GITHUB_OAUTH_CLIENT_ID=Iv1.b507a08c87ecfe98 # VISION_BRIDGE_BASE_URL= # VISION_BRIDGE_API_KEY= -# ── Raycast Pro (local auto-import) ── -# Raycast Pro AI is a reverse-engineered, unofficial API — local/personal use -# only (no OAuth client_id/secret; token is captured via macOS Auto-Import -# from the Keychain + local Raycast SQLite DB, or pasted manually). These -# vars are optional manual overrides used by open-sse/services/raycast.ts -# and the direct-probe benchmark script scripts/raycast/usage-benchmark.mjs. -# RAYCAST_BEARER_TOKEN= -# RAYCAST_DEVICE_ID= -# RAYCAST_AID= -# RAYCAST_SIG_SECRET= - # ───────────────────────────────────────────────────────────────────────────── # ⚠️ GOOGLE OAUTH (Antigravity) & OTHER PROVIDERS — REMOTE SERVERS # ───────────────────────────────────────────────────────────────────────────── @@ -1904,12 +1893,6 @@ APP_LOG_TO_FILE=true # Base backoff after a transient 408 response (ms); five attempts maximum. # ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS=8000 -# ── Microsoft Designer Web (Image Generation) ── -# Polling config for the microsoft-designer-web submit-then-poll image job. -# Used by: open-sse/handlers/imageGeneration/providers/designerWeb.ts -# DESIGNER_WEB_POLL_TIMEOUT_MS=60000 # Max wait for job completion (default: 60s) -# DESIGNER_WEB_POLL_INTERVAL_MS=2000 # Poll frequency (default: 2s) - # ── Adobe Firefly (Image Upscale) ── # Base delay (ms) for the submit-retry exponential backoff when Adobe Firefly's # upscale job submission is rate-limited. Used by: diff --git a/AGENTS.md b/AGENTS.md index 34e60ac16d..353110135f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,7 +46,7 @@ Repository map and Reference Documentation sections below. ## Project at a Glance -**OmniRoute** — unified AI proxy/router. One endpoint, 350 LLM providers, auto-fallback. +**OmniRoute** — unified AI proxy/router. One endpoint, 346 LLM providers, auto-fallback. | Layer | Location | Purpose | | ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -56,9 +56,9 @@ Repository map and Reference Documentation sections below. | Translators | `open-sse/translator/` | Format conversion (OpenAI↔Claude↔Gemini) | | Transformer | `open-sse/transformer/` | Responses API ↔ Chat Completions | | Services | `open-sse/services/` | Combo routing, rate limits, caching, etc | -| Database | `src/lib/db/` | SQLite domain modules (159 migrations) | +| Database | `src/lib/db/` | SQLite domain modules (160 migrations) | | Domain/Policy | `src/domain/` | Policy engine, cost rules, fallback logic | -| MCP Server | `open-sse/mcp-server/` | 110 tools (44 canonical + memory/skill/GitHub/pool/gamification/plugin/Notion/Obsidian/local-corpus/RTK modules), 3 transports (stdio / SSE / Streamable HTTP), 33 scopes | +| MCP Server | `open-sse/mcp-server/` | 110 tools (45 canonical + memory/skill/GitHub/pool/gamification/plugin/Notion/Obsidian/local-corpus/RTK modules), 3 transports (stdio / SSE / Streamable HTTP), 33 scopes | | A2A Server | `src/lib/a2a/` | JSON-RPC 2.0 agent protocol | | Skills | `src/lib/skills/` | Extensible skill framework | | Memory | `src/lib/memory/` | Persistent conversational memory | @@ -83,7 +83,7 @@ Client → /v1/chat/completions (Next.js route) API routes follow a consistent pattern: `Route → CORS preflight → Zod body validation → Optional auth (extractApiKey/isValidApiKey) → API key policy enforcement → Handler delegation (open-sse)`. No global Next.js middleware — interception is route-specific. -**Combo routing** (`open-sse/services/combo.ts`): 19 public strategies (priority, weighted, fill-first, round-robin, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, context-relay, fusion, pipeline). Each target calls `handleSingleModel()` which wraps `handleChatCore()` with per-target error handling and circuit breaker checks. The `fusion` strategy is the exception: it fans out to a panel of models in parallel, then a judge model synthesizes one final answer (`open-sse/services/fusion.ts`). See `docs/routing/AUTO-COMBO.md` for the 14-factor Auto-Combo scoring + the full strategy table and `docs/architecture/RESILIENCE_GUIDE.md` for the 3 resilience layers. +**Combo routing** (`open-sse/services/combo.ts`): 19 public strategies (priority, weighted, fill-first, round-robin, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, context-relay, fusion, pipeline). Each target calls `handleSingleModel()` which wraps `handleChatCore()` with per-target error handling and circuit breaker checks. The `fusion` strategy is the exception: it fans out to a panel of models in parallel, then a judge model synthesizes one final answer (`open-sse/services/fusion.ts`). See `docs/routing/AUTO-COMBO.md` for the 15-factor Auto-Combo scoring + the full strategy table and `docs/architecture/RESILIENCE_GUIDE.md` for the 3 resilience layers. --- @@ -411,7 +411,7 @@ For any non-trivial change, read the matching deep-dive first: | Repo navigation | `docs/architecture/REPOSITORY_MAP.md` | | Architecture | `docs/architecture/ARCHITECTURE.md` | | Engineering reference | `docs/architecture/CODEBASE_DOCUMENTATION.md` | -| Auto-Combo (14-factor scoring, 19 strategies) | `docs/routing/AUTO-COMBO.md` | +| Auto-Combo (15-factor scoring, 19 strategies) | `docs/routing/AUTO-COMBO.md` | | Resilience (3 mechanisms) | `docs/architecture/RESILIENCE_GUIDE.md` | | Reasoning replay | `docs/routing/REASONING_REPLAY.md` | | Skills framework | `docs/frameworks/SKILLS.md` | diff --git a/CHANGELOG.md b/CHANGELOG.md index 05d3989c59..0f6674c108 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ ### ✨ New Features +--- + +## [3.8.50] — 2026-08-23 + +_Living section — reconciled 2026-08-23 from all cycle commits (cycle open `ed2db6cb19` → `0b41259f39`). Bullets carry verified PR and contributor provenance; commits without inline PR refs are reconciled separately by carrier, rollup or explicit HOLD._ + +### ✨ New Features - **feat(sse): STRICT_ZERO_COST** — opt-in, off-by-default `freeAccessPolicy: "strict"` setting that hard-verifies every auto-combo candidate against live quota state and per-connection economic safety before it can be dispatched, going beyond `hidePaidModels`'s static catalog @@ -12,23 +19,14 @@ by multiple accounts has its `allowedConnectionIds` narrowed to exactly the connections independently verified `SAFE`, so dispatch can never use an unverified account. An `excludeTosAvoid` guard (default `false`) is available separately for contractual risk. See - `docs/routing/STRICT_ZERO_COST.md`. - ---- - -## [3.8.50] — TBD - -_Living section — regenerated 2026-08-12 from all cycle commits (cycle open `ed2db6cb19` → tip). Bullets carry the merged PR and its author; direct pushes listed separately._ - -### ✨ New Features -- **feat(search):** first-class X Search provider (`x-search`) on `POST /v1/search` and MCP `omniroute_x_search` using SuperGrok / xAI server-side `x_search`. Explicit provider or `search_type: "x"` only — never auto-selected for web. Reuses `xai-oauth` / `xao` / `xai` credentials. Not the X Developer Platform MCP. ([#10985](https://github.com/diegosouzapw/OmniRoute/issues/10985)) + `docs/routing/STRICT_ZERO_COST.md`. ([#10965](https://github.com/diegosouzapw/OmniRoute/pull/10965)) — thanks @mymusicmyspace +- **feat(search):** first-class X Search provider (`x-search`) on `POST /v1/search` and MCP `omniroute_x_search` using SuperGrok / xAI server-side `x_search`. Explicit provider or `search_type: "x"` only — never auto-selected for web. Reuses `xai-oauth` / `xao` / `xai` credentials. Not the X Developer Platform MCP. ([#10985](https://github.com/diegosouzapw/OmniRoute/issues/10985)) ([#10988](https://github.com/diegosouzapw/OmniRoute/pull/10988)) — thanks @RaviTharuma - **feat(core):** add Layer A capability filter at router (#5696) - **feat(providers):** add DeepAI as paid API-key image provider ([#6671](https://github.com/diegosouzapw/OmniRoute/issues/6671)) - **feat(providers):** add Naga.ac and ChatAnywhere aggregator gateway providers (#6674 — thanks @chirag127) - **feat(api):** add response content encoding verification — confirms Next.js compress:true and documents stripStaleForwardingHeaders behavior ([#6736](https://github.com/diegosouzapw/OmniRoute/issues/6736)) - **feat(api):** add plugins marketplace install endpoint with checksum verification ([#6752](https://github.com/diegosouzapw/OmniRoute/issues/6752)) - **feat(chatgpt-web):** harden prompt-emulated tool contract for thinking models (#7679 — thanks @horacecar) -- **docs:** add management authentication terminology guide ([#7786](https://github.com/diegosouzapw/OmniRoute/issues/7786)) - feat(a2a): Conductor bridge — long-lived SSE consumer that mirrors OmniConductor hub tasks into the A2A TaskManager (explicit `canceled→cancelled` mapping with tests, persisted `last_event_id` cursor in the `key_value` table, exponential-backoff reconnection; opt-in via `CONDUCTOR_HUB_URL`/`CONDUCTOR_HUB_TOKEN`) ([#8080](https://github.com/diegosouzapw/OmniRoute/pull/8080)) - feat(a2a): the Agent Card (`/.well-known/agent.json`) now announces skills derived from the OmniConductor fleet (`GET /v1/runners` OASF capabilities — one skill per online CLI profile + declared fleet skills), cached ~60s and fail-open when the hub is unset/offline ([#8119](https://github.com/diegosouzapw/OmniRoute/pull/8119)) - feat(dashboard): "Conductor" panel — OmniConductor fleet (runners + task queue) live via server-side proxy routes (`/api/conductor/*`, management auth, hub token never reaches the browser), task detail with manifest/council and cancel-with-confirmation; sidebar entry under Tools ([#8221](https://github.com/diegosouzapw/OmniRoute/pull/8221)) @@ -158,9 +156,11 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **feat(usage): add Command Code quota tracking** ([#9921](https://github.com/diegosouzapw/OmniRoute/pull/9921)) — thanks @yansigit - **feat(combo): add quota-only priority fallback** ([#9983](https://github.com/diegosouzapw/OmniRoute/pull/9983)) — thanks @xz-dev - **feat(onboarding): add one-click free provider setup** ([#10014](https://github.com/diegosouzapw/OmniRoute/pull/10014)) -- **feat(admission) — direct pushes:** adaptive overload/pressure controls with shared admission wired across the LLM routes, plus mutation-test registration for the capability-filter suite -- **feat(agentrouter) — direct pushes:** support Claude and Codex protocols — infer the protocol from the client endpoint and honor the alternate protocol through the chat pipeline -- **feat(providers) — direct pushes:** ChatGPT Web session credential guide with a Cookie Editor fast-path (canonical chromewebstore install link) and web-session fast-path test coverage +- **feat(admission) — 3 first-parent commits without inline PR refs:** adaptive overload/pressure controls with shared admission wired across the LLM routes, plus mutation-test registration for the capability-filter suite — thanks @xz-dev +- **feat(agentrouter) — 3 first-parent commits without inline PR refs:** support Claude and Codex protocols — infer the protocol from the client endpoint and honor the alternate protocol through the chat pipeline +- **feat(providers) — 5 internal commits carried by [#9781](https://github.com/diegosouzapw/OmniRoute/pull/9781) and [#9784](https://github.com/diegosouzapw/OmniRoute/pull/9784):** ChatGPT Web session credential guide with a Cookie Editor fast-path (canonical chromewebstore install link), i18n parity and web-session fast-path coverage — thanks @benzntech +- **feat(cli) — 5 first-parent commits without inline PR refs:** close the relay-like CLI surface with target manifests, Codex TOML, the Gemini launcher, smoke guards and synchronized CLI documentation ([commit `0a74bfb`](https://github.com/diegosouzapw/OmniRoute/commit/0a74bfbdeae4cc45b34c83d10348e33b7cdd85e4)) — thanks @backryun +- **feat(radar) — 31 internal commits carried by [#10418](https://github.com/diegosouzapw/OmniRoute/pull/10418):** complete local catalog state, guided combos + MCP discovery, signed supporter offers/Intel/news, CLI sync, verified metadata, guided setup and final trust/quality hardening — thanks @backryun - **feat(sse):** honor provider-rule lock scope for agentrouter (connection vs model) ([#10419](https://github.com/diegosouzapw/OmniRoute/pull/10419)) - **feat(ocr):** Vertex AI DeepSeek-OCR provider ([#10398](https://github.com/diegosouzapw/OmniRoute/pull/10398)) - **feat(providers):** derive imageToText from the OCR registry + chutes dots.ocr seed ([#10400](https://github.com/diegosouzapw/OmniRoute/pull/10400)) @@ -172,17 +172,129 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **feat(sse):** add i-have-adhd output style to compression catalog ([#10271](https://github.com/diegosouzapw/OmniRoute/pull/10271)) - **feat(codex):** add OAuth fingerprint convergence modes ([#10243](https://github.com/diegosouzapw/OmniRoute/pull/10243)) — thanks @xz-dev - **feat(i18n):** complete Portuguese (PT-PT) translation ([#10250](https://github.com/diegosouzapw/OmniRoute/pull/10250)) — thanks @DarkEsteves -- **feat(providers):** publish Poolside's probed Laguna Preview catalog ([#10216](https://github.com/diegosouzapw/OmniRoute/pull/10216)) — thanks @pacocartones +- **feat(providers):** publish Poolside's probed Laguna Preview catalog — `poolside/laguna-xs-2.1` and `poolside/laguna-s-2.1`, each with 262144-token context, 32768-token output, tools and reasoning support ([#10216](https://github.com/diegosouzapw/OmniRoute/pull/10216)) — thanks @pacocartones - **feat(crof):** advertise reasoning effort tiers incl. max from live discovery and registry ([#10062](https://github.com/diegosouzapw/OmniRoute/pull/10062)) — thanks @excessivechaos - **feat(open-sse):** expose provider-level circuit breaker thresholds via env vars (#10040) ([#10046](https://github.com/diegosouzapw/OmniRoute/pull/10046)) — thanks @tiangao88 - **feat(dashboard):** Kimi 15% first-top-up campaign — dedicated tracked link + discount-first banner copy ([#10240](https://github.com/diegosouzapw/OmniRoute/pull/10240)) - **feat(providers):** integrate audited free-tier gateways ([#9210](https://github.com/diegosouzapw/OmniRoute/pull/9210)) +- **feat(credential-health):** pace the credential health sweep per connection via `provider_connections.healthCheckInterval` (minutes, 0 = never), with `CREDENTIAL_HEALTH_CHECK_INTERVAL` as the global default ([#8443](https://github.com/diegosouzapw/OmniRoute/issues/8443)) +- **behavior change:** `healthCheckInterval` is a shared column — it paces both the OAuth token refresh and the credential health sweep, and `0` disables both. The connection editor defaults it to 60, so configured OAuth connections are now credential-checked at 60min instead of the previous ~10min (aligned with the probe-volume goal of #8443) +- feat(modality-bridge): bridge Chat and Responses video parts through a strict trusted-loopback, quota-bounded FFmpeg broker; enforce HTTPS redirects/SSRF plus format, protocol, stream, pixel, frame, 50 MiB broker/remote, 36 MiB inline, and 120-second limits; propagate caller aborts; preserve the actual successful fallback model through cache/meta/headers; expose sampled latency and honest success telemetry; and ship the localized Video settings UI ([#9760](https://github.com/diegosouzapw/OmniRoute/pull/9760)) +- **feat(radar):** Persist local model display-name/enabled overrides and hide/restore tombstones, with authenticated catalog controls and feed safety precedence ([#9830](https://github.com/diegosouzapw/OmniRoute/pull/9830)) +- **feat(radar):** add curated-family combo suggestions, a guided combo page, and the read-only Radar MCP catalog tool ([#9836](https://github.com/diegosouzapw/OmniRoute/pull/9836)) +- **feat(providers):** Cursor PKCE login with Bearer quota, auto router, and empty-turn errors ([#9909](https://github.com/diegosouzapw/OmniRoute/pull/9909)) — thanks @yansigit +- **feat(radar):** add a signed live offers feed and supporter offers dashboard ([#9912](https://github.com/diegosouzapw/OmniRoute/pull/9912)) +- **feat(radar):** add signed Intel insights, supporter recognition, and local Radar CLI commands ([#9923](https://github.com/diegosouzapw/OmniRoute/pull/9923)) +- **feat(radar):** add a localized public news feed and dismissible dashboard launch banner, with the Radar announcement staged inactive for a separately authorized launch ([#9926](https://github.com/diegosouzapw/OmniRoute/pull/9926)) +- **feat(admission):** add lane-aware admission probes for combo/fusion/chaos fan-out (fail-open, queueing disabled), an env-wins `OMNIROUTE_CHAT_VIRTUAL_LANES` activation flag applied at boot, and adaptive-lane visibility in the `omniroute_get_health` MCP tool (related to #9654) +- **docs(mcp):** complete the MCP server README tool reference so the `schemas/` catalog is fully covered (agent-skills, oneproxy, web, tool-search, combo/routing, pricing and DB-health tools were previously only discoverable via `omniroute_tool_search`) +- **feat(cli):** container-aware auto-config — `setup-*`, `omniroute configure`, `omniroute config set` and the CLI-tool config APIs now refuse to write into a containerised OmniRoute's ephemeral home (CLI exits `2`, API returns `422` with `containerEphemeralTarget`) and point at the host-CLI or bind-mount setup instead; `--allow-container-write` / `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` opt back in. Also fixes `CLI_CONFIG_HOME` so the Compose `host` profile's `/host-home` bind mounts are honoured instead of silently falling back to the container home. (#10057) +- **feat(routing):** add quota-aware provider scheduling — Phase 2 ([#10126](https://github.com/diegosouzapw/OmniRoute/pull/10126)) — thanks @benzntech, @adevwithpurpose +- **feat(providers):** add tencent-aistudio-web cookie provider (tasw) ([#10174](https://github.com/diegosouzapw/OmniRoute/pull/10174)) — thanks @MeRezaRezaei, @adevwithpurpose +- **feat(providers):** add local ZCode ACP backend ([#10184](https://github.com/diegosouzapw/OmniRoute/pull/10184)) — thanks @megamen32, @adevwithpurpose +- **feat(providers):** add Grok 4.6 and refresh DeepSeek V4 ([#10195](https://github.com/diegosouzapw/OmniRoute/pull/10195)) — thanks @backryun +- **feat(providers):** refresh Qwen3.8 model catalogs ([#10226](https://github.com/diegosouzapw/OmniRoute/pull/10226)) — thanks @backryun +- **feat(responses):** virtualize previous_response_id continuation regardless of upstream support ([#10262](https://github.com/diegosouzapw/OmniRoute/pull/10262)) — thanks @hartmark, @adevwithpurpose +- **feat(dashboard):** agentic conversation tracking — v4, decoupled + storage-architecture concern resolved ([#10263](https://github.com/diegosouzapw/OmniRoute/pull/10263)) — thanks @hartmark +- feat(dashboard): opt-in `DASHBOARD_ALLOW_EMBED=vscode` relaxes CSP `frame-ancestors` to `'self' vscode-webview:` and drops `X-Frame-Options` for HTML pages only, so the dashboard renders inside the VS Code Simple Browser (OmniCopilot). Default posture unchanged — API routes stay unframable (#10273) +- **feat(resilience):** warn when `/healthz` is served under event-loop lag ≥200ms so a slow 200 is visible as sick, not healthy ([#10303](https://github.com/diegosouzapw/OmniRoute/issues/10303)) +- **feat(oauth):** add gemini-3.7-flash models for antigravity and agy providers ([#10305](https://github.com/diegosouzapw/OmniRoute/pull/10305)) — thanks @Chewji9875, @adevwithpurpose +- **feat(docker):** add `GET`/`HEAD` `/livez` as a process-alive probe, distinct from `/healthz` readiness ([#10316](https://github.com/diegosouzapw/OmniRoute/issues/10316)) +- **feat(proxy):** non-destructive auto-disable mode for the proxy health scheduler ([#10342](https://github.com/diegosouzapw/OmniRoute/pull/10342)) — thanks @Gi99lin, @adevwithpurpose +- **feat(combo):** Auto-Combo snapshot generation/duplication in the UX ([#10354](https://github.com/diegosouzapw/OmniRoute/pull/10354)) — thanks @swingtempo +- **feat(routing):** add client-, provider-, and model-neutral exclusive managed session connection leases with API-key-bound generation fencing, durable SQLite ownership, explicit allowlist policy, and bounded 429 capacity retry semantics ([#10362](https://github.com/diegosouzapw/OmniRoute/pull/10362)) — thanks @KaspaPulse. +- feat(providers): add **Cloudflare AI Playground** as a No Auth provider (`cloudflare-playground`, alias `cfp`) — free anonymous chat over the reverse-engineered `cf_agent` WebSocket protocol (PartySocket transport, no account/API key/cookies) with GLM 5.2, Kimi K2.7 Code, DeepSeek V4 Pro, gpt-oss-120B, Llama 3.3 70B, Qwen2.5 Coder 32B and 14 more curated models. The executor drives a headless Chromium via Playwright (the WS upgrade is TLS-fingerprint-gated), translates the `cf_agent` frame stream into OpenAI SSE, and surfaces upstream rate limits (3021) as HTTP 429. Fixes #10389 +- **feat(sse):** bring i-have-adhd to vi/ja/id parity and guard the style × language matrix ([#10425](https://github.com/diegosouzapw/OmniRoute/pull/10425)) +- **feat(ops):** canary deploy with provenance gate, real smoke and rollback anchor ([#10446](https://github.com/diegosouzapw/OmniRoute/pull/10446)) +- **feat(dashboard):** VS Code Copilot Chat home banner, remove Provider Quota home card ([#10520](https://github.com/diegosouzapw/OmniRoute/pull/10520)) — thanks @backryun +- **feat(providers):** AI Horde accepts an optional registered API key and advertises only live image models that currently have workers ([#10542](https://github.com/diegosouzapw/OmniRoute/pull/10542)) +- **fix(providers):** AI Horde Check validates keys via `/v2/find_user` instead of the unauthenticated OpenAI models list ([#10542](https://github.com/diegosouzapw/OmniRoute/pull/10542)) +- **feat(providers):** complete Jina AI as one credential pool — dashboard `jina-ai` / `jina-reader` share a token, `JINA_AI_API_KEY` is a real fallback, Test probes `GET https://api.jina.ai/v1/models` (embeddings fallback hits `jina-embeddings-v5-omni-small`), embed/rerank logs keep `connection_id`, catalog adds `jina-reranker-v3.5`, Omni v5 multimodal `{text}`/`{image}`/`{content}` docs pass through intact, and OmniRoute proxies classify / segment / `jina-search` (`s.jina.ai`). Reader stays a separate `r.jina.ai` card with an explicit label. Gemini Embedding 2 (`gemini/gemini-embedding-2`, alias `google/gemini-embedding-2`) uses dashboard `gemini` keys (or `GEMINI_API_KEY` / `GOOGLE_API_KEY` only when none exist), forwards native multimodal parts, and maps N OpenAI `input` items to N `:batchEmbedContents` vectors instead of one aggregated `:embedContent`. ([#10581](https://github.com/diegosouzapw/OmniRoute/pull/10581)) +- **feat(providers):** accept `response_format=ogg` on `/v1/audio/speech` as an alias for the existing Opus/Ogg encoder ([#10587](https://github.com/diegosouzapw/OmniRoute/issues/10587)) +- **feat(settings):** add `autoDisableBannedScope` so permanent-ban auto-disable can target subscription/OAuth accounts only, leaving prepaid API keys in the routing pool ([#10617](https://github.com/diegosouzapw/OmniRoute/pull/10617)) +- **feat(docker):** add hardened Linux VPS deployment ([#10623](https://github.com/diegosouzapw/OmniRoute/pull/10623)) — thanks @freudantunes +- **feat(compression):** adota omniglyph 1.4.0, perfis semânticos e contabilidade com evidência ([#10647](https://github.com/diegosouzapw/OmniRoute/pull/10647)) — thanks @backryun, @adevwithpurpose +- **feat(db):** report the SQLite driver and its durability on the DB health check ([#10652](https://github.com/diegosouzapw/OmniRoute/pull/10652)) — thanks @maxmad64bis +- feat(server): emit systemd sd_notify READY/WATCHDOG/STOPPING (generated unit becomes Type=notify with WatchdogSec=180) so a frozen server process is killed and restarted by systemd instead of lingering undetected +- **feat(providers):** add the TabiToken NewAPI gateway (`tabitoken`) and teach the existing HCNSec entry (`hcnsec`) the three further protocols it actually serves. TabiToken leaves the NewAPI pricing endpoint public, so its catalog is read from the host rather than guessed: four Claude models, each reporting the Anthropic and OpenAI protocols. HCNSec shipped OpenAI-only; probing the host showed `/v1/messages`, `/v1/responses` and the Gemini `/v1beta` path all reach its token layer, so each is now declared as an alternate format — with its default format, base URL, auth scheme and regional catalog classification untouched. ([#10668](https://github.com/diegosouzapw/OmniRoute/pull/10668)) — thanks @yawar-aquil +- **feat(sse):** allow an alternate protocol to build its own upstream URL. `AlternateFormat` gained an optional `urlBuilder`, because the Gemini protocol carries the model inside the path (`{base}/{model}:generateContent`) and the existing `chatPath`/`urlSuffix` fields are constants that cannot express it. The route builder is extracted as `buildGeminiGenerateContentUrl` and shared with the native `gemini` provider so the two consumers cannot drift on the `?alt=sse` streaming suffix. ([#10668](https://github.com/diegosouzapw/OmniRoute/pull/10668)) — thanks @yawar-aquil +- **feat(call_logs):** persist the per-call error family in `call_logs.error_type` and expose a failure breakdown (`errorBreakdown`) in the usage analytics endpoint, reusing the existing production classifier ([#10670](https://github.com/diegosouzapw/OmniRoute/issues/10670)) +- **feat(proxy):** the proxy-health sweep and `GET /api/settings/proxies/egress` now report an anonymous summary of egress-IP sharing — how many rotation groups share an egress IP and the largest number of accounts behind one IP — computed from persisted `proxy_logs` over a 24h window. No IPs and no account identities by default; `PROXY_LOG_INCLUDE_IPS=true` restores raw details. ([#10677](https://github.com/diegosouzapw/OmniRoute/issues/10677)) +- **docs(guides):** OmniRoute now serves VS Code's **native Copilot Chat model picker** through the [OmniCopilot](https://github.com/diegosouzapw/OmniCopilot) extension ([Marketplace](https://marketplace.visualstudio.com/items?itemName=diegosouzapw.omnicopilot) · [Open VSX](https://open-vsx.org/extension/diegosouzapw/omnicopilot) — Cursor, Windsurf, VSCodium, Theia…) — no Copilot subscription needed since VS Code 1.122. New [`docs/guides/VSCODE-COPILOT.md`](docs/guides/VSCODE-COPILOT.md) covers setup, how the picker collapses the `dual`-prefix catalog via `GET /v1/models?prefix=alias`, and the **build-time** `DASHBOARD_ALLOW_EMBED=vscode` flag that renders the dashboard in an editor tab ([#10697](https://github.com/diegosouzapw/OmniRoute/pull/10697)) +- **feat(docker):** `DASHBOARD_ALLOW_EMBED` is now a Docker build argument — `docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` produces an image whose dashboard renders inside the VS Code Simple Browser (OmniCopilot's `dashboardOpen: "editor"`). Previously the flag was only reachable from a source build: Docker silently drops a `--build-arg` with no matching `ARG`, so the operator got the default image and no error. Builder-stage only and empty by default — the runtime stages deliberately do not carry it, and the unframable default posture is unchanged ([#10701](https://github.com/diegosouzapw/OmniRoute/pull/10701)) +- **feat(codex):** sync v178 identity mechanisms — turn-state relay, persisted seeds, identity faces ([#10716](https://github.com/diegosouzapw/OmniRoute/pull/10716)) — thanks @xz-dev +- **feat(providers):** add Token Kiosk as an OpenAI-compatible provider ([#10722](https://github.com/diegosouzapw/OmniRoute/pull/10722)) — thanks @hgaib +- **feat(providers):** new `cursor-api` provider (card "Cursor API", alias `cua`): connect a Cursor user API key (`crsr_…`) and route `cursor-api/` through the existing Cursor agent executor (the key is exchanged for a 1h session token and cached), plus a `/api/cursor-cli/*` passthrough so the Cursor CLI itself runs through OmniRoute (`CURSOR_API_ENDPOINT=http:///api/cursor-cli`, `CURSOR_API_KEY=`) with every RPC attributed and logged. The IDE `cursor` provider is unchanged. (#10729) +- **feat(combo):** opaque per-invocation decision trace for priority fallbacks (#10681) ([#10730](https://github.com/diegosouzapw/OmniRoute/pull/10730)) — thanks @stanleytejakusuma +- **feat(api):** `GET /api/health` now answers `{ status, timestamp }` without a key. Until now the path had no route, so the management-auth boundary answered first with a 401 — indistinguishable from a wrong key or an unknown route, which left Docker HEALTHCHECKs and Kubernetes probes unable to tell "down" from "misconfigured". Kept deliberately minimal: version, uptime and memory stay behind the authenticated `/api/monitoring/health` ([#10771](https://github.com/diegosouzapw/OmniRoute/pull/10771)) — thanks @maxmad64bis. +- feat(routing): make Task-Aware Smart Routing's detection patterns operator-configurable via `settings.taskRouting.patternOverrides` (`PUT /api/settings/task-routing`) — the built-in patterns are English-only, so a non-English dashboard had no recourse short of turning detection off entirely; an override now replaces the pattern list for one task type without touching the rest (#10783) +- **feat(radar):** stable catalog export workflow with provenance ([#10826](https://github.com/diegosouzapw/OmniRoute/pull/10826)) — thanks @backryun +- **feat(cli):** support Grok Build custom host configuration ([#10830](https://github.com/diegosouzapw/OmniRoute/pull/10830)) — thanks @tuandinh0801 +- **feat(a2a):** A2A v1.0 client compatibility (SendMessage alias + v1.0 agent card) ([#10839](https://github.com/diegosouzapw/OmniRoute/pull/10839)) — thanks @wpec +- feat(api): accept PATCH on /api/combos/[id], the verb the OpenAPI spec already documents (#10869) +- **feat(routing):** adaptive feedback loop v2 — operational/semantic quality, confidence, TTFT/ITL, end-to-end test ([#10881](https://github.com/diegosouzapw/OmniRoute/pull/10881)) — thanks @Egorich-print +- **feat(sse):** add GLM-5.3 support (`glm-5.3`, `glm-5.3-high`, `glm-5.3-low`) across the z.ai first-party providers, mapping the upstream `reasoning_effort` request parameter to the existing 5.2 tier UX ([#10896](https://github.com/diegosouzapw/OmniRoute/pull/10896)) — thanks @phuongddx +- **feat(home):** add a live **Recent Requests** panel beside the home Provider Topology (polls `GET /api/usage/call-logs?excludeTests=1` every ~3s, gated by the topology appearance toggle + page visibility). `excludeTests` is now an allowlist of real provider inference (`/v1/%` or `/api/v1/%`), applied before `LIMIT`, so connection-test/model-sync/management rows can never leak into the feed ([#10897](https://github.com/diegosouzapw/OmniRoute/pull/10897), extracted from [#8450](https://github.com/diegosouzapw/OmniRoute/pull/8450)) — thanks @nguyenha935 +- **feat(rankings):** free provider rankings now expose a `reliability` field (raw `testStatus`/`rateLimitedUntil` per connection plus a `healthy`/`degraded`/`down` state, reusing the `ProviderHealthState` vocabulary of the provider health matrix) when the configured/available filters are active — derived from already-loaded data, without touching the ranking order ([#10909](https://github.com/diegosouzapw/OmniRoute/pull/10909)) +- `feat(resilience)`: when an allowlisted provider (opencode family) answers + 429 classified `quota_exhausted` or `rate_limit_exceeded` and its free-tier + quota is bucketed by egress IP (#9611), every connection of that family + sharing the IP is cooled down together before the rotation tries them — one + guaranteed-failed upstream call per episode instead of N, on the combo path + as well. For the allowlisted family a 429 now cools the connection instead + of locking a single model. Exclusive allowlist, never terminal, best-effort + when the egress IP is unknown (#10920). +- **feat(rankings):** free provider rankings can now report what each provider actually served — `reliability.usage` (requests, successes, success rate over a window) behind the opt-in `withUsage`/`usageRange` query parameters, so a provider that answers every call with an error is no longer described as healthy ([#10926](https://github.com/diegosouzapw/OmniRoute/pull/10926)) +- **feat(sse):** add kimi web token lifecycle manager, rolling auto-refresh and 401 recovery ([#10944](https://github.com/diegosouzapw/OmniRoute/pull/10944)) — thanks @MeRezaRezaei +- **feat(providers):** add Logfare as a free OpenAI-compatible provider — dashboard card with a Free badge and request-logging disclosure (every prompt/completion is logged for research; opt out at logfare.ai/consent), live model discovery from `https://logfare.ai/v1/models` (20 models, 11 chat-capable: kimi-k3, deepseek-v4-pro, glm-5.2, gpt-5.6-luna, minimax-m3…), full chat/streaming through the existing OpenAI-compatible path, the real Logfare logo on the card, and a listing in the free-tiers guide. ([#10987](https://github.com/diegosouzapw/OmniRoute/pull/10987)) +- **feat(cli):** add native Bun backend support and Dockerfile.bun ([#11039](https://github.com/diegosouzapw/OmniRoute/pull/11039)) — thanks @rqzbeh +- **feat(redis):** add configurable key namespace prefix ([#11042](https://github.com/diegosouzapw/OmniRoute/pull/11042)) — thanks @MeRezaRezaei +- **feat(dashboard):** trigger key validation on Enter in AddApiKeyModal (#10995) ([#11056](https://github.com/diegosouzapw/OmniRoute/pull/11056)) — thanks @rqzbeh +- **feat(api):** flag a pinned account on /v1/combos steps without leaking the id ([#11076](https://github.com/diegosouzapw/OmniRoute/pull/11076)) — thanks @ntdatt812 +- **feat(providers):** let operators declare per-provider error rules through `settings.providerErrorRules` instead of patching the catalog — an operator-supplied rule for a provider is consulted before the built-in `providerRuleRegistry`, receives the raw error text, and has its declared scope/cooldown/reason actually honored end to end, for any provider (declaring the rule is the opt-in — no extra allowlist entry needed). Matches are plain case-insensitive substrings (never RegExp) and bounded to 50 rules to keep the hot path safe ([#11104](https://github.com/diegosouzapw/OmniRoute/pull/11104)) +- **feat(search):** add Context7 as a library-docs search and fetch provider ([#11140](https://github.com/diegosouzapw/OmniRoute/pull/11140)) — thanks @HouMinXi +- **feat(mcp):** implement dynamic runtime tool schema plumbing for blocked providers (#11100) ([#11155](https://github.com/diegosouzapw/OmniRoute/pull/11155)) — thanks @rqzbeh +- **feat(ci):** publish Bun container images (-bun and -web-bun) in Docker workflow (#11039) ([#11168](https://github.com/diegosouzapw/OmniRoute/pull/11168)) — thanks @rqzbeh +- **feat(api):** `/api/usage/om-usage` gains a structured form — `?format=json` returns the key's own usage as `ApiKeyUsageLimitStatus` + `UsageSnapshot` instead of `text/plain`. This is the surface a UI (the OmniCopilot panel) consumes to show a key holder their daily/weekly spend and quota reset. The route is self-service (the caller's own key, gated by `allowUsageCommand`), not the management surface; refusals come back as a discriminated `{ "allowed": false, "error": … }` so a UI can tell "not allowed" apart from "allowed but nothing cached yet". The endpoint was previously undocumented in `API_REFERENCE.md`; it now has a section ([#11190](https://github.com/diegosouzapw/OmniRoute/pull/11190)) +- **feat(api):** `/api/usage/om-usage?format=json` now returns `providers[]` — every connection's quota snapshot, not just the single selected one — so a panel can render Codex / Claude / OpenCode side by side. The collector already gathered all of them; the single-pick `provider` field (kept) is a terminal presentation choice. Closes the per-connection gap from OmniCopilot #8 ([#11192](https://github.com/diegosouzapw/OmniRoute/pull/11192)) +- **feat(dashboard):** orient users before API key management ([#11195](https://github.com/diegosouzapw/OmniRoute/pull/11195)) — thanks @ignamiranda +- **feat(dashboard):** add CheaperInference sponsor banner and route banner links through the shortener ([#11196](https://github.com/diegosouzapw/OmniRoute/pull/11196)) — thanks @backryun +- **feat(dashboard):** frame ACP as optional advanced setup ([#11206](https://github.com/diegosouzapw/OmniRoute/pull/11206)) — thanks @ignamiranda +- **feat:** Beginner UX: lead resilience page with plain-language reassurance ([#11215](https://github.com/diegosouzapw/OmniRoute/pull/11215)) — thanks @ignamiranda +- **feat:** Beginner UX: interpret health status with plain-language verdict ([#11224](https://github.com/diegosouzapw/OmniRoute/pull/11224)) — thanks @ignamiranda +- **feat:** Beginner UX: lead batch page with stable outcome header ([#11227](https://github.com/diegosouzapw/OmniRoute/pull/11227)) — thanks @ignamiranda +- **feat:** Beginner UX: guided endpoint connection header ([#11228](https://github.com/diegosouzapw/OmniRoute/pull/11228)) — thanks @ignamiranda +- feat(command-code): advertise low/medium/high/xhigh/max reasoning-effort suffixes for reasoning-capable models in the catalog and Combo Builder, with request-time resolution to reasoning_effort +- feat(sse): add Cursor plan image generation via Agent CLI (`IMAGE_PROVIDERS.cursor`, format `cursor-agent-image`), reusing the chat Cursor OAuth connection +- feat(routing): add the default-off `DISABLE_CONTEXT_WINDOW_CHECKS` feature flag to let operators bypass OmniRoute's local context-window and max-input-token check for direct single-model requests, leaving upstream limits, prompt compression, and output-token caps intact. +- **feat(usage):** show Kimi Coding's fixed-order Code 5-hour/7-day quota windows plus Extra Usage status, balance, monthly spend/limit, and the official Additional Credits link on Dashboard → Quota cards. +- **feat(providers):** copilot-m365-web now supports OpenAI tool calling — a router planning turn asks the substrate model (as a tool-selection assistant emitting `CALL_TOOL: name({...})` / `NO_TOOL_NEEDED` text, which bypasses its plugin-registry refusal) and validated decisions surface as `tool_calls` with `finish_reason: "tool_calls"` in both stream and non-stream modes; also flattens the full message history (assistant `tool_calls` + compacted tool results) so multi-turn agent loops keep context, replies to SignalR `type:6` keepalives, surfaces `type:3` error frames instead of a silent empty `stop`, and suppresses `writeAtCursor` text from tool-progress frames +- **feat(api):** add `GET`/`POST` `/v1/multimodal-embeddings` as an alias of `/v1/embeddings` so Jina-compatible clients do not receive HTTP 404 `unknown_route` — thanks @RaviTharuma +- feat(opencode-go): expose Muse Spark 1.2 Contributor reasoning-effort aliases (minimal/low/medium/high/xhigh) in the Combo Builder +- **feat(providers):** restore the operator-owned upstream timeout tier per connection via `providerSpecificData.timeoutMs` (preempts the maintainer-only model/provider registry tiers and the global `FETCH_TIMEOUT_MS`), and make the combo per-target timeout ceiling follow the selected connection +- **feat:** add Video Bridge frame sampling ([#10483](https://github.com/diegosouzapw/OmniRoute/pull/10483)) +- **gemini-web:** expose image generation through /v1/images/generations (closes #10466) ([#10494](https://github.com/diegosouzapw/OmniRoute/pull/10494)) — thanks @Abhishek4512009 +- **api:** alias /v1/multimodal-embeddings to /v1/embeddings ([#10568](https://github.com/diegosouzapw/OmniRoute/pull/10568)) — thanks @RaviTharuma +- **server:** native systemd sd_notify watchdog (Type=notify) ([#10662](https://github.com/diegosouzapw/OmniRoute/pull/10662)) — thanks @maxmad64bis +- **usage:** show Kimi Coding Extra Usage ([#10712](https://github.com/diegosouzapw/OmniRoute/pull/10712)) — thanks @xz-dev +- **api:** add GET /livez as a process-alive probe ([#10819](https://github.com/diegosouzapw/OmniRoute/pull/10819)) — thanks @RaviTharuma +- **speech:** accept response_format=ogg as an opus alias ([#10822](https://github.com/diegosouzapw/OmniRoute/pull/10822)) — thanks @RaviTharuma +- **resilience:** warn on slow /healthz event-loop lag ([#10827](https://github.com/diegosouzapw/OmniRoute/pull/10827)) — thanks @RaviTharuma +- **sse:** Cursor plan images via Agent CLI (IMAGE_PROVIDERS.cursor) ([#10842](https://github.com/diegosouzapw/OmniRoute/pull/10842)) +- **proxy:** surface anonymous egress-IP sharing in the health sweep and the egress API ([#10876](https://github.com/diegosouzapw/OmniRoute/pull/10876)) — thanks @maxmad64bis +- **opencode-go:** expose Muse Spark reasoning effort aliases ([#10883](https://github.com/diegosouzapw/OmniRoute/pull/10883)) — thanks @excessivechaos +- **command-code:** expose reasoning effort suffixes ([#10884](https://github.com/diegosouzapw/OmniRoute/pull/10884)) — thanks @excessivechaos +- **providers:** restore per-connection upstream timeout tier ([#10885](https://github.com/diegosouzapw/OmniRoute/pull/10885)) — thanks @maxmad64bis +- **home:** add Recent Requests panel + excludeTests allowlist fix ([#10900](https://github.com/diegosouzapw/OmniRoute/pull/10900)) +- **routing:** add DISABLE_CONTEXT_WINDOW_CHECKS bypass for the direct-request input/context check ([#10927](https://github.com/diegosouzapw/OmniRoute/pull/10927)) — thanks @jxnlexn +- **providers:** tool calling for copilot-m365-web via router planning ([#10948](https://github.com/diegosouzapw/OmniRoute/pull/10948)) — thanks @acc0mplish +- **api:** alias GET/HEAD /readyz to /healthz ([#10977](https://github.com/diegosouzapw/OmniRoute/pull/10977)) — thanks @RaviTharuma ### 🐛 Bug Fixes -- **security(search)**: block SSRF via `/v1/search` `provider_options.baseUrl` for the Firecrawl search provider — the client-controlled override is now validated as a public URL before it is used to build the server-side fetch target, so a caller with a valid API key can no longer redirect search requests at loopback, RFC1918, or cloud-metadata hosts — thanks @zmf963 -- **providers**: honor `PATCH /api/providers/[id]` so `omniroute providers rotate` stops 405ing (the OpenAPI spec and CLI already use PATCH) (PR #10366) -- **cli**: route provider test commands through configured connection test endpoints (#10570) +- **security(search):** block SSRF via `/v1/search` `provider_options.baseUrl` for the Firecrawl search provider — the client-controlled override is now validated as a public URL before it is used to build the server-side fetch target, so a caller with a valid API key can no longer redirect search requests at loopback, RFC1918, or cloud-metadata hosts ([#10738](https://github.com/diegosouzapw/OmniRoute/pull/10738)) — thanks @zmf963 for the report and @hartmark for the implementation +- **fix(providers):** honor `PATCH /api/providers/[id]` so `omniroute providers rotate` stops returning 405; PATCH delegates to the same partial-update path as PUT ([#10366](https://github.com/diegosouzapw/OmniRoute/pull/10366)) — thanks @benzntech +- **fix(cli):** route provider test commands through configured connection test endpoints, fixing #10570 ([#10572](https://github.com/diegosouzapw/OmniRoute/pull/10572)) — thanks @hydraxman - **executors**: fix internal timeout misclassified as client disconnect (499) for 7 niche executors — pass TimeoutError reason to controller.abort() (#8197 side-finding) - test(combo): guard auto/best-free never leaks the combo name as a model (#7754) - fix(vision-bridge): describe-model no longer returns unreachable "openai/gpt-4o-mini" when every vision-capable provider is unreachable on the instance — returns null instead and surfaces a clear error (#8430) @@ -579,13 +691,14 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **fix(translator): restore TitleCase tool names on the Claude to Gemini path** ([#9993](https://github.com/diegosouzapw/OmniRoute/pull/9993)) — thanks @engmarcosjr - **fix(providers): scope model-level targetFormat to declaring provider catalog** ([#9994](https://github.com/diegosouzapw/OmniRoute/pull/9994)) — thanks @Chewji9875 - **fix(kimi): apply K3 effort policy to aliases** ([#10005](https://github.com/diegosouzapw/OmniRoute/pull/10005)) — thanks @jackjinke -- **fix(adobe-firefly) — direct pushes:** harden credential parsing and login hostname comparison (parse-and-compare instead of substring match), sync models/media capabilities, and retain the Topaz catalog models -- **fix(combo/sse) — direct pushes:** ignore benign empty error fields in streaming-quality validation, classify local target timeouts as gateway timeouts, avoid the usage-normalization short-circuit in Responses, and type empty-choice collector events -- **fix(logging) — direct pushes:** make stream-chunk capture and request-shape logging opt-in diagnostics -- **fix(i18n) — direct pushes:** restore/unescape HTML entities in UI strings, translate capability-filter messages, complete web-session guide translations and Vietnamese parity -- **fix(providers) — direct pushes:** repair the DeepAI registry import + executor -- **fix(deps) — direct pushes:** CVE-driven bumps (nanoid, dompurify, mermaid, js-yaml + transitive deps for 26 Dependabot alerts) and retained isolated-build runtime dependencies in the pack -- **fix(ci):** pin Build (advisory) to a hosted runner with memory provisioning ([#10408](https://github.com/diegosouzapw/OmniRoute/pull/10408)) +- **fix(adobe-firefly) — 4 commits without inline PR refs:** harden credential parsing and login hostname comparison (parse-and-compare instead of substring match), sync models/media capabilities, retain the Topaz catalog models and pin the credential-parsing gate — thanks @artickc +- **fix(combo/sse) — 5 commits without inline PR refs:** repair `nativeCodexTurnPin`, ignore benign empty error fields in streaming-quality validation, classify local target timeouts as gateway timeouts, avoid the usage-normalization short-circuit in Responses and type empty-choice collector events — thanks @adevwithpurpose, @xz-dev +- **fix(logging) — 2 commits without inline PR refs:** make stream-chunk capture and request-shape logging opt-in diagnostics — thanks @benzntech +- **fix(i18n) — 4 commits without inline PR refs:** restore/unescape HTML entities in UI strings, translate capability-filter messages and complete Vietnamese parity — thanks @dionjoshualobo, @wgordon17 +- **fix(providers) — 2 commits without inline PR refs:** repair the DeepAI registry import/executor and close the follow-on provider/typecheck base-reds — thanks @backryun +- **fix(deps) — 3 material commits without inline PR refs:** apply CVE-driven bumps for nanoid, dompurify, mermaid, js-yaml and transitive dependencies covering 26 Dependabot alerts — thanks @wgordon17 +- **fix(network/api/db) — 3 commits without inline PR refs:** bound direct-path response-start time, hash API keys in the model-catalog cache key and renumber the exclusive-lease migration — thanks @excessivechaos, @RaviTharuma, @adevwithpurpose +- **fix(ci):** pin Build (advisory) to a hosted runner with memory provisioning so fork PRs regain a production-build signal ([#10408](https://github.com/diegosouzapw/OmniRoute/pull/10408)) - **fix(providers):** refresh the translate-path golden for the bailian Token Plan endpoint ([#10410](https://github.com/diegosouzapw/OmniRoute/pull/10410)) - **fix(sse):** surface Qwen/Alibaba personal Token Plan quota in dashboard and preflight ([#10290](https://github.com/diegosouzapw/OmniRoute/pull/10290)) - **fix(deps):** pin next to an exact version so a fresh upstream release cannot break installs ([#10340](https://github.com/diegosouzapw/OmniRoute/pull/10340)) @@ -603,15 +716,15 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **fix(opencode-plugin):** respect log level for lifecycle output (#8982) ([#9316](https://github.com/diegosouzapw/OmniRoute/pull/9316)) — thanks @xiaoyaner0201 - **fix(providers):** raise default provider probe timeout from 5s to 8s ([#9283](https://github.com/diegosouzapw/OmniRoute/pull/9283)) — thanks @Sam280903 - **fix(opencode-plugin):** stop warning when an auto combo replaces its expected /v1/models twin (#8983) ([#9042](https://github.com/diegosouzapw/OmniRoute/pull/9042)) — thanks @xiaoyaner0201 -- **fix(opencode):** force CLI User-Agent when CLI identity synthesis is enabled ([#10222](https://github.com/diegosouzapw/OmniRoute/pull/10222)) — thanks @adevwithpurpose +- **fix(opencode):** force the synthesized CLI User-Agent for non-CLI clients when CLI identity synthesis is enabled, preventing generic datacenter identities from hitting the free-tier rejection path ([#10222](https://github.com/diegosouzapw/OmniRoute/pull/10222)) — thanks @adevwithpurpose - **fix(deepseek-web):** classify business auth rejection as 401 ([#10218](https://github.com/diegosouzapw/OmniRoute/pull/10218)) — thanks @Zartharas - **fix(combo):** make failoverBeforeRetry actually skip the same-model retry ([#10217](https://github.com/diegosouzapw/OmniRoute/pull/10217)) — thanks @hartmark - **fix(responses):** preserve case-insensitive combo names before Codex rewrite ([#10177](https://github.com/diegosouzapw/OmniRoute/pull/10177)) — thanks @ddarkr -- **fix(discovery):** parse reasoning tiers nested under metadata.reasoning.supported_efforts ([#10138](https://github.com/diegosouzapw/OmniRoute/pull/10138)) — thanks @excessivechaos -- **fix(combo):** isolate session stickiness by combo ([#10137](https://github.com/diegosouzapw/OmniRoute/pull/10137)) — thanks @hydraxman +- **fix(discovery):** parse reasoning tiers nested under `metadata.reasoning.supported_efforts`, including the Neuralwatt discovery shape ([#10138](https://github.com/diegosouzapw/OmniRoute/pull/10138)) — thanks @excessivechaos +- **fix(combo):** isolate session-stickiness bindings by combo so an identical first message cannot carry a successful target into another priority chain ([#10137](https://github.com/diegosouzapw/OmniRoute/pull/10137)) — thanks @hydraxman - **fix(combo):** default chaos SSE to comment-only for OpenAI-compatible clients ([#10128](https://github.com/diegosouzapw/OmniRoute/pull/10128)) — thanks @herjarsa - **fix(kimi):** normalize MFJS tool schemas ([#10079](https://github.com/diegosouzapw/OmniRoute/pull/10079)) — thanks @xz-dev -- **fix(mcp):** move pack validation out of unit suite ([#10065](https://github.com/diegosouzapw/OmniRoute/pull/10065)) — thanks @yansigit +- **fix(mcp):** move live `npm pack` validation out of the unit suite into the pack-artifact and pack-policy gates, preventing prepare/Husky and monorepo walks from stalling concurrent unit tests ([#10065](https://github.com/diegosouzapw/OmniRoute/pull/10065)) — thanks @yansigit - **fix(zed-hosted):** send the provider wire values cloud.zed.dev accepts ([#10051](https://github.com/diegosouzapw/OmniRoute/pull/10051)) — thanks @ARC345 - **fix(ci):** repair and wire the two live-server E2E suites ([#10050](https://github.com/diegosouzapw/OmniRoute/pull/10050)) — thanks @ARC345 - **fix(reasoning):** preserve and replay assistant turns ([#10045](https://github.com/diegosouzapw/OmniRoute/pull/10045)) — thanks @jackjinke @@ -641,10 +754,452 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **fix(docker):** eliminate npm-bundled CVEs from the published image ([#10182](https://github.com/diegosouzapw/OmniRoute/pull/10182)) - **fix(security):** resolve open CodeQL alerts ([#10188](https://github.com/diegosouzapw/OmniRoute/pull/10188)) - **fix(dashboard):** retarget Kimi promo CTA to the API platform aff link ([#10200](https://github.com/diegosouzapw/OmniRoute/pull/10200)) -- **fix(build):** repair broken production build, red lint gate and SWR crash ([#10198](https://github.com/diegosouzapw/OmniRoute/pull/10198)) +- **fix(build):** repair the broken Turbopack production build, red lint gate and SWR crash by resolving swallowed constants, duplicate provider imports, stale catalog-cache consumers, dangling refresh statements, a WASM sidecar resolution, a wrong outbound-guard import and a malformed DB-adapter test ([#10198](https://github.com/diegosouzapw/OmniRoute/pull/10198)) +- fix(cli): repair hollow externalized package dirs in the nested `/node_modules` bundle location too, not just the top-level one, fixing macOS/Linux Electron `ERR_MODULE_NOT_FOUND` on Turbopack-externalized packages (#7346) +- **Electron packaged smoke test:** add a cold-restart mode (`ELECTRON_SMOKE_COLD_RESTART=1`, wired blocking on the Linux release leg) that relaunches the packaged app against its own persisted `DATA_DIR` and asserts a native SQLite driver was selected instead of the sql.js WASM fallback, closing the regression-test gap flagged in the stale-ABI `better-sqlite3` investigation ([#7592](https://github.com/diegosouzapw/OmniRoute/issues/7592)). +- **fix(images):** retry Codex image generation on a sibling ChatGPT account when the requested model isn't entitled on the current account, instead of failing the request outright ([#8307](https://github.com/diegosouzapw/OmniRoute/pull/8307)). +- fix(dashboard): treat UncloseAI as a no-auth provider so the connect form no longer forces a fake API key (#8864) +- **fix(dashboard):** model-level allowed/blocked param edits now persist when the compatibility popover is closed by clicking outside, and a failed save no longer clears the edit or reports success ([#9013](https://github.com/diegosouzapw/OmniRoute/pull/9013)) +- fix(ssrf): make `getProviderOutboundGuard()` (used for search-provider connection validation, image generation and remote image fetch) honor the local-first default `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` the same way the chat validation guard already does, so a LAN-hosted SearXNG/Brave search provider works with only the LOCAL flag set instead of silently requiring `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` ([#9123](https://github.com/diegosouzapw/OmniRoute/issues/9123)). +- fix(compression): preserve unfenced raw code (e.g. Copilot #file references) from Caveman's prose recapitalization/whitespace cleanup, which was corrupting keyword casing and indentation (#9144) +- fix(api): yield the event loop during catalog builds and bulk-load override/hidden-model tables (#9147) +- **fix(adobe-firefly):** renew sessions through durable CDP ([#9255](https://github.com/diegosouzapw/OmniRoute/pull/9255)) — thanks @artickc +- fix(combo): recovery hint for all_targets_skipped now points at provider quota/availability instead of 'transient, just retry' (#9303) +- fix(providers): strip uniqueItems from Gemini tool schemas (Gemini rejects it with 400 'Unknown name uniqueItems') (#9617) +- **fix(translator):** convert OpenAI `image_url` blocks nested in `role: "tool"` / `tool_result` content to Claude `image` source blocks so OpenAI-compatible clients (Kimi Code CLI `ReadMediaFile`, and any other tool that returns media) no longer 400 the next Claude-format upstream turn ([#9692](https://github.com/diegosouzapw/OmniRoute/issues/9692)) +- **fix(resilience):** retry a retryable Codex pre-output 502/503/504/507 once on the same account (2–3s jitter) before cooling the connection, and stop translating that mixed pool into an all-accounts quota `429` ([#9708](https://github.com/diegosouzapw/OmniRoute/issues/9708)) +- **fix(ratelimit):** respect operator `minTimeBetweenRequestsMs` floor when relaxing the limiter on headroom — the adaptive rate-limit learning no longer silently erases a configured minimum gap between requests when the upstream reports plenty of remaining capacity ([#9763](https://github.com/diegosouzapw/OmniRoute/issues/9763)). +- fix(dashboard): media mini-playgrounds authenticate via session instead of sending the masked API key as Bearer, fixing 401s under REQUIRE_API_KEY (#9935) +- fix(sse): exclude search providers from credential-health scheduler sweep to stop burning billed API queries (#9970) +- **fix(affinity):** evict the sticky session pin on a combo per-model timeout ([#10016](https://github.com/diegosouzapw/OmniRoute/pull/10016)) — thanks @fenix007 +- **Passthrough streaming:** stop leaking upstream SSE control lines (`id:`/`event:`/`retry:`/`:` comments) to plain OpenAI Chat-Completions-format clients, while preserving `event:` framing for OpenAI Responses API and Claude Messages API passthrough ([#10017](https://github.com/diegosouzapw/OmniRoute/issues/10017)). +- fix(cli): stop diagnosing every Next.js instrumentation-hook failure as the Android/Termux cache bug — only the Android "Unsupported platform: android" signal now triggers the Android hint, so a win32/desktop instrumentation error surfaces its real cause instead of a useless `mkdir -p ~/.cache` (#10028) +- **fix(providers):** the five g4f.space sub-providers (Groq, Gemini, Pollinations, Ollama, NVIDIA) no longer advertise a free tier — a keyless `POST /v1/chat/completions` now returns `402 insufficient_credits` behind a proof-of-work "cake" wall (re-verified live 2026-08-22), so `hasFree` is `false` and the notes point at `g4f.dev/members.html`. The gateway still works with a member key, so its registry wiring and `authType: "optional"` are unchanged ([#10071](https://github.com/diegosouzapw/OmniRoute/issues/10071)) — thanks @chirag127 +- **fix(providers):** scope model target formats to providers ([#10072](https://github.com/diegosouzapw/OmniRoute/pull/10072)) — thanks @xz-dev, @adevwithpurpose +- **fix(chatgpt-web):** Preserve native `max` thinking effort through ChatGPT Web routing ([#10077](https://github.com/diegosouzapw/OmniRoute/pull/10077)) — thanks @zannen7 +- Fix: wire AgentRouter's existing console balance fetcher into the Dashboard Quota UI (visibility gate + provider-limits data path + background sync) so its wallet balance renders instead of falling back to "Usage API not implemented" (#10078) +- Fix: AgentRouter's dollar balance now renders as a currency-formatted "$X.XX" credits row in the Dashboard Quota UI instead of a bare percentage, and an exhausted wallet always shows exactly $0.00 (#10078) +- fix(sse): bridge generic openai-compatible/anthropic-compatible provider type ids to their concrete uuid node id in credential lookup (#10085) +- fix(domain): stop treating an unreported Antigravity quota fraction (`fractionReported:false`) as 0% remaining in `quotaCache.ts`, which was falsely marking every fresh/newly-connected account as exhausted and blocking multi-account rotation (#10095) +- fix(dashboard): remap unified Kimi Code card API-key save to the admitted `kimi-coding-apikey` connection id, fixing 400 "Invalid provider" on Save (#10096) +- fix(antigravity): strip trailing model turn for native Gemini requests too, not just Claude (#10104) +- **fix(admission):** stop the adaptive latency-gradient collapse from permanently locking out ordinary requests — individually valid requests now make solo progress when the system is idle and normal pressure, and the collapsed limit actively recovers on sustained idle windows instead of being stuck; the critical-pressure fuse still wins over solo progress (#10111) +- **fix(account-fallback):** classify 'insufficient credits' as credits-exhausted ([#10116](https://github.com/diegosouzapw/OmniRoute/pull/10116)) — thanks @Chewji9875, @adevwithpurpose +- fix(sse): downgrade client-supplied `thinking:{type:"adaptive"}` to `enabled` and gate the `context-1m-2025-08-07` beta on model eligibility when a combo/fallback re-routes a request to a non-adaptive/non-1M model like claude-haiku-4-5 (avoids "adaptive thinking is not supported on this model" and "long context beta is not yet available" 400s, #10119) +- **fix(logging):** move call-log artifact serialization and filesystem writes to a bounded singleton worker to keep request handling responsive (#10123) +- **fix(routing):** fallback to default model alias seeds when unmapped in database ([#10124](https://github.com/diegosouzapw/OmniRoute/pull/10124)) — thanks @benzntech +- **perf(logging):** bound each scheduled call-log rotation pass to incremental database and filesystem work (#10125) +- **fix(streaming):** start early SSE heartbeats when Responses or Messages requests opt into streaming through the request body (#10127) +- **fix(translator):** resolve the Claude thinking output cap with the routed provider so a provider-scoped-only `max_output_tokens` override is no longer invisible to `fitThinkingToMaxTokens()`, which previously let the synthesized `max_tokens` (caller room + thinking budget) go out unbounded and 400 upstream ([#10139](https://github.com/diegosouzapw/OmniRoute/issues/10139)) +- fix(providers): correct the conol-web registry fallback-models import depth, which pointed at a + non-existent `open-sse/config/services/` and made any suite loading the provider registry fail to + resolve (#10140) +- **fix(oauth):** Claude connections created via `claude-auth/import` now send required CLI headers on the bootstrap identity call and persist a `cliUserID` device identity, fixing intermittent "Third-party apps now draw from your extra usage" 400s on otherwise valid imported subscription tokens ([#10144](https://github.com/diegosouzapw/OmniRoute/pull/10144), fixes [#10143](https://github.com/diegosouzapw/OmniRoute/issues/10143)) +- **fix(sse):** Responses-passthrough `response.completed` snapshots now drop `phase:"commentary"` items the same way live SSE frames already do, so the terminal `response.output` array no longer echoes internal commentary text that was already suppressed from the stream (#10156). +- fix(proxy-subscriptions): allow local/loopback proxy-subscription fetch URLs (local-first, cloud-metadata still blocked) (#10158) +- **fix(routing):** keep approximate Combo context estimates advisory so requests reach concrete targets instead of returning a pre-dispatch 400 ([#10162](https://github.com/diegosouzapw/OmniRoute/pull/10162)) — thanks @xz-dev +- **docs(settings):** document Thinking Budget modes (passthrough vs auto-strip); fix dashboard i18n key collision that showed Auto Combo routing copy on the thinking tab; clarify independence from compression/cache ([#10169](https://github.com/diegosouzapw/OmniRoute/pull/10169)) +- fix(cli): guarantee a non-empty `[STARTUP] Fatal:` log line for any instrumentation-hook boot throw, not just DB-driver init failures (#10171) +- fix(sse): gate structural chat admission shedding on real heap pressure instead of unconditional capacity, with a bounded headroom budget so a healthy heap can no longer bypass admission control indefinitely (#10183, #10268) +- **fix(guardrails):** Vision Bridge handles OpenAI Responses `input`/`input_image` requests before combo vision filtering ([#10202](https://github.com/diegosouzapw/OmniRoute/pull/10202)) — thanks @Zartharas +- **fix(mcp):** dynamically generate web search provider enum from registry ([#10209](https://github.com/diegosouzapw/OmniRoute/pull/10209)) — thanks @sadSanta-07, @adevwithpurpose +- **fix(cursor):** Stop truncating pending tool calls on non-composer models when a KV checkpoint arrives after text but before the `exec_mcp` frame — the KV short-circuit is now gated to the composer family where it was verified ([#10215](https://github.com/diegosouzapw/OmniRoute/issues/10215)). +- **fix(responses):** repair corrupted SSE deltas for non-ASCII streams by keeping a single stream-aware `TextDecoder` (`{ stream: true }`) across `transform()` calls instead of recreating it per chunk and decoding without the `stream` flag. When a multi-byte UTF-8 character (CJK/emoji) was split across two TCP chunks — common in Chinese streaming text — the per-chunk decoder truncated it to `U+FFFD`, corrupting every delta while the rebuilt `*.done` snapshot stayed internally identical ([#10223](https://github.com/diegosouzapw/OmniRoute/issues/10223)) +- **fix(combo):** defer the known-context-overflow hard rejection for compressible requests so compression runs before the final context gate, instead of a raw-body estimate 400'ing generic Responses clients targeting a large model before OmniRoute can shrink it ([#10225](https://github.com/diegosouzapw/OmniRoute/issues/10225)) +- **fix(api):** deleting a manually-added custom model no longer tombstones a provider-synced model that shares its id. `DELETE /api/provider-models` is addressed by `provider` + `model` alone, so when both a custom row and a synced row existed for one id it removed both and wrote `isDeleted:true`. `replaceSyncedAvailableModelsForConnection` then filtered that id out of every subsequent re-import, so the provider could never resync — model sync kept reporting `added: N` while the catalog stayed empty and `/v1/models` never listed the model again, even though routing to it still worked. The custom row is now removed first and its presence is treated as the operator's intent, leaving the synced sibling importable; a synced-only delete still tombstones as before (#3199, #3782 unaffected) ([#10228](https://github.com/diegosouzapw/OmniRoute/pull/10228)) — thanks @Neuron-Mr-White +- **Audio Bridge:** fix production transcription self-loop uploads so real audio reaches the configured STT provider instead of falling back to an unavailable-provider stub ([#10229](https://github.com/diegosouzapw/OmniRoute/pull/10229)). +- **fix(api):** DeepSeek V4's native `max` reasoning tier is now reachable. DeepSeek accepts `reasoning_effort` `low`/`high`/`max` and maps `medium`/`xhigh` down to `high`, while OmniRoute's canonical vocabulary collapses `max` onto `xhigh` — so `{"effort":"max"}` silently resolved to `high` and the catalog never advertised a `max` tier (or its `-max` variant). Following the existing `extendCodexGpt56EffortValues` precedent, the native tier is now preserved for `deepseek`/`ds` V4 models only; the global effort vocabulary is unchanged, routed namespaces (`openrouter/deepseek/…`, `tllm/deepseek_v4`, `oc/deepseek-v4-flash-free`) keep the canonical behavior, and an explicit client `reasoning_effort` still wins ([#10230](https://github.com/diegosouzapw/OmniRoute/pull/10230)) — thanks @Neuron-Mr-White +- **fix(providers):** FreeAIAPIKey now targets `api.freeaiapikey.com`, the host upstream names in its `410 endpoint_moved` response — every request through the provider was failing — and its catalog is resynced to the 10 models the live `/v1/models` actually serves ([#10233](https://github.com/diegosouzapw/OmniRoute/pull/10233)) +- **fix(providers):** MonsterAPI's deprecation now actually applies — the flag was written as `isDeprecated`, a key no consumer or schema reads, so the provider kept rendering as healthy in the dashboard, the onboarding wizard and the generated provider reference ([#10234](https://github.com/diegosouzapw/OmniRoute/pull/10234)) +- **fix(cliproxy):** read platform/arch at runtime via `os.platform()`/`os.arch()` in `binaryManager` so the embedded installer selects the Windows/ARM assets even when the release bundle is built on a Linux runner (fixes #10244) +- **fix(cli):** recognize native `opencode.jsonc` files in OpenCode detection, generated-provider setup, and dashboard save/apply flows; preserve unrelated JSONC comments and provider settings, write updates back to the selected file, and refuse to overwrite invalid config ([#10227](https://github.com/diegosouzapw/OmniRoute/issues/10227)) ([#10246](https://github.com/diegosouzapw/OmniRoute/pull/10246)) — implemented by @y4ho0; thanks @tito13kfm for the report +- **fix(providers):** compatible/custom providers now save valid Data URL icons and show Add/Edit save failures instead of silently doing nothing ([#10247](https://github.com/diegosouzapw/OmniRoute/pull/10247)) — thanks @xz-dev +- **fix(models):** custom model metadata and compatible-provider context overrides now take precedence over discovered metadata, while deleting a synced model no longer creates a permanent tombstone so a later provider sync can restore it ([#10248](https://github.com/diegosouzapw/OmniRoute/pull/10248)) — thanks @jackjinke +- fix(open-sse): stop concurrent requests colliding on the same dedup hash for non-OpenAI target formats (#10249) +- **fix(translator):** Text-format tool calls emitted inline by some models are now converted to proper `tool_use` blocks. Certain models (DeepSeek, Qwen) return tool invocations as `{"name":"Bash","arguments":{…}}` or `TOOL_CALL Read: {"file_path":"…"}` inside the text stream instead of the structured `tool_calls` field. Both formats leaked through the Claude translators as plain text, so Claude Code rendered the raw block and stalled instead of executing the tool. `extractXmlInvokeBlocks` (previously ``-only) now scans for all three shapes in a single pass and emits `content_block_start`/`input_json_delta`/`content_block_stop` events, in both `openai-to-claude` and `gemini-to-claude` (Antigravity) paths ([#10251](https://github.com/diegosouzapw/OmniRoute/pull/10251)) +- **fix(api):** scale pool usage snapshot limits by pool member count (summed budget) ([#10253](https://github.com/diegosouzapw/OmniRoute/pull/10253)) — thanks @dpozimski, @ritheshcn25, @RaviTharuma +- fix(dashboard): make provider card warning indicators expose the interaction they advertise (#10261) +- fix(command-code): route chat to the documented /provider/v1/chat/completions endpoint instead of the CLI-only /alpha/generate, which Command Code gates/blocks for external callers (#10265) +- **fix(providers):** preserve validator HTTP status codes in API-key and web connection-test results so callers can distinguish authentication, rate-limit, and upstream failures ([#10272](https://github.com/diegosouzapw/OmniRoute/pull/10272)) — thanks @Zartharas +- **fix(sse):** tiny-budget reasoning probes (e.g. Claude Code's `/model` check sends `max_tokens: 1`) are answered with a valid truncated 200 instead of relaying the upstream 5xx "empty response content" — which previously also marked the connection unavailable and poisoned fallback/cooldown bookkeeping for a request that is only a probe ([#10281](https://github.com/diegosouzapw/OmniRoute/issues/10281)) — thanks @harkaranbrar7 +- fix(video): stop advertising the googleflow (Veo) video provider as working and fail fast with a clear diagnostic — its submit/poll endpoints 404 and no server-side OAuth transport can satisfy the working endpoint (#10285) +- fix(sse): mark gemini-3.5-flash as thinking-capable so reasoning_effort is no longer rejected with a spurious 400 (#10286) +- **fix(docker):** prefix cache mount ids with Railway service scope ([#10288](https://github.com/diegosouzapw/OmniRoute/pull/10288)) — thanks @anudeepadi +- **fix(build):** stop Turbopack from dead-code-eliminating the Windows Tailscale branches of `src/lib/tailscaleTunnel.ts` in the published build (#10293). The release `dist` is bundled on a Linux runner, and the bundler constant-folds `process.platform`, pruning every non-Linux branch — the Windows installers shipped with no `where` lookup, an always-injected `--socket`, and a lost `net start Tailscale`/windows-default-binary path. The module now reads the platform at runtime via `os.platform()` (a function call a bundler cannot fold), so the Windows branches survive on any build machine; a vitest regression test mocking `os.platform()` → `win32` guards the anti-fold invariant (RED before, GREEN after). +- **fix(ops):** Docker HEALTHCHECK defaults to the lightweight `/healthz` lifecycle probe instead of the heavy `/api/monitoring/health` path, with an `OMNIROUTE_HEALTHCHECK_PATH` opt-in override ([#10311](https://github.com/diegosouzapw/OmniRoute/pull/10311)) +- fix(api): hash the API key before using it as the model-catalog cache Map key (no raw credentials in process heap) (#10313) +- fix(resilience): keep combo quality and auth failure reasons separate and redact connection labels in terminal errors (#10314) +- fix(dashboard): send periodic WS heartbeat pings so live dashboard connections stop dropping every ~35s (#10319) +- **fix(chat-body-admission):** restore a single process-wide admission budget — heavyweight leases and queued bytes are now bounded once for the whole process instead of per session, so one session can no longer mint extra capacity or starve others; per-session fairness is preserved via round-robin dispatch ([#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110)) +- **fix(providers):** validate Z.ai web Local Storage sessions against the authenticated user-settings endpoint and preserve exact upstream status codes ([#10329](https://github.com/diegosouzapw/OmniRoute/pull/10329)) — thanks @Zartharas +- **fix(sse):** close the synthetic keepalive reasoning item + harden output_index allocation ([#10330](https://github.com/diegosouzapw/OmniRoute/pull/10330)) — thanks @hartmark, @adevwithpurpose +- **fix(logging):** capture early-keepalive bytes in the call-log artifact ([#10331](https://github.com/diegosouzapw/OmniRoute/pull/10331)) — thanks @hartmark +- **fix(opencode-plugin):** publish bare combo model ids without the plugin provider prefix so OpenCode can select them ([#10345](https://github.com/diegosouzapw/OmniRoute/issues/10345)) +- **fix(backend):** log `auto/ matched no connected models` once per process per label instead of every minute ([#10346](https://github.com/diegosouzapw/OmniRoute/issues/10346)) +- fix(backend): redact client IPs and account prefixes from default proxy logs (#10348) +- **fix(docker):** warn at boot when `OMNIROUTE_MEMORY_MB` disagrees with `NODE_OPTIONS --max-old-space-size`, and document that the standalone/Docker launcher appends `OMNIROUTE_MEMORY_MB` last ([#10353](https://github.com/diegosouzapw/OmniRoute/issues/10353)) +- **fix(providers):** remove invalid CodeBuddy CN glm-4.7 and add hy3 (0.0x… ([#10356](https://github.com/diegosouzapw/OmniRoute/pull/10356)) — thanks @rizxfrog, @ritheshcn25, @RaviTharuma +- **fix(image):** support OpenRouter reference-image edits (#10197) ([#10363](https://github.com/diegosouzapw/OmniRoute/pull/10363)) — thanks @tiangao88 +- fix(providers): GitLab Duo falls back to the public Code Suggestions endpoint when direct_access returns 401 (#10365) +- **fix(monitoring):** canonicalize provider aliases in health matrix ([#10370](https://github.com/diegosouzapw/OmniRoute/pull/10370)) — thanks @tkgo11 +- **fix(services):** use CLIProxy executable on Windows ([#10371](https://github.com/diegosouzapw/OmniRoute/pull/10371)) — thanks @tkgo11 +- **fix(db):** `getSettings()` defaults `debugMode` to `false` — fresh installs no longer run in debug mode (persisted `debugMode: true` is preserved) ([#10372](https://github.com/diegosouzapw/OmniRoute/pull/10372) — thanks @lamchun1110) +- **fix(translator):** Consolidate tool-name casing normalization into a single `restoreClaudeToolName` helper reused across every response path (`openai-to-claude`, `gemini-to-claude`, `stream` passthrough, xAI and Antigravity handlers), replacing six hand-copied 7-entry casing maps. The shared helper resolves via the request-side `toolNameMap` first (preserving declared PascalCase and MCP/alias names), then the complete `TOOL_RENAME_MAP` (which already covers `glob`/`grep`/`task`/`todowrite`/`skill`/`askuserquestion`/etc.), then the `#7926` TitleCase→lowercase fallback for map-less clients. This closes the coverage gap that left `TodoWrite` and other tools failing with `Error: No such tool available: todowrite`, fixes a `ReferenceError` in `remapToolNamesInResponse`, and preserves the Gemini thought-signature persistence (`#8979`) and OpenAI→Claude `toolNameMap` restoration that must not regress ([#10374](https://github.com/diegosouzapw/OmniRoute/issues/10374)) +- **fix(responses):** preserve native tool definitions for custom OpenAI-compatible providers when using the Responses API (`/v1/responses`). When `apiType` is set to `"responses"` (or `_omnirouteForceResponsesUpstream` is enabled), OmniRoute passes native tool shapes (`custom` with lark grammars, `namespace`, `local_shell`) directly upstream without running a lossy Responses→Chat→Responses conversion ([#10374](https://github.com/diegosouzapw/OmniRoute/issues/10374)) +- **fix(antigravity):** unblock Gemini and Claude reasoning capabilities ([#10376](https://github.com/diegosouzapw/OmniRoute/pull/10376)) — thanks @Chewji9875, @adevwithpurpose +- **fix(security):** sanitize test regex and annotate CodeQL hash false-positives ([#10380](https://github.com/diegosouzapw/OmniRoute/pull/10380)) — thanks @backryun, @adevwithpurpose +- fix(dashboard): Free Tier 'used this month' now includes live usage_history rows, not just the rolled-up daily summary (#10381) +- **fix(executors):** OpencodeExecutor and MimocodeExecutor now rotate to the next account on network exceptions (timeout, connection refused/reset) when the failed account has a dedicated proxy, not only on 429 — a throw on one account no longer fails the whole request when other accounts remain. Accounts sharing the default egress (no proxy) fail fast instead of retrying the same outage against every account. The shared rotation mechanics (`pickAccount`/`markCooldown`/`markSuccess`) are now extracted into `accountRotation.ts`, fixing an identical unconditional-cooldown gap that pre-dated this PR in MimocodeExecutor ([#10393](https://github.com/diegosouzapw/OmniRoute/pull/10393)) +- **fix(chat):** guard search providers from OpenAI fallback ([#10394](https://github.com/diegosouzapw/OmniRoute/pull/10394)) — thanks @azzaouiomar19-sketch, @darkesteves +- **fix(sse):** the header-budget drop warning fires once per unique dropped-header set instead of on every SSE response (warn-storm fix) ([#10397](https://github.com/diegosouzapw/OmniRoute/pull/10397) — thanks @lamchun1110) +- fix(sse): fail over combo streaming responses that reach `finish_reason` with zero content, reasoning, or tool_calls instead of forwarding a terminated-but-empty completion (#10404) +- **fix(guardrails):** Vision Bridge now reroutes whole requests for named combos whose targets have zero vision-capable models (previously such image requests died with `capability_mismatch` when the describe path could not run), and when the fallback describe path also fails for every image the request degrades to explicit `(unavailable)` stub text instead of preserving images the combo cannot consume ([#10415](https://github.com/diegosouzapw/OmniRoute/pull/10415)) — thanks @rqzbeh +- **fix(antigravity):** geo-blocked egress (Google "User location is not supported") is now classified (scoped to the Google AI surfaces that emit it: Cloud Code/Gemini Code Assist, Gemini API, Vertex), cached as a 24h per-account exclusion so routing continues with other accounts, and surfaced with an actionable message; the dashboard connection test now probes the real `streamGenerateContent` model surface instead of the non-geo-restricted OAuth userinfo endpoint ([#10420](https://github.com/diegosouzapw/OmniRoute/pull/10420)) — thanks @rqzbeh +- **fix(antigravity):** strip competing-agent identity sentences from system prompts (e.g. "You are a Claude agent, built on Anthropic's Claude Agent SDK.") that Antigravity flags and answers with 429 RESOURCE_EXHAUSTED (port of decolua/9router b566b20) ([#10420](https://github.com/diegosouzapw/OmniRoute/pull/10420)) — thanks @rqzbeh +- **fix(antigravity):** discover live chat models dynamically ([#10422](https://github.com/diegosouzapw/OmniRoute/pull/10422)) — thanks @JxnLexn +- **fix(db):** prune pre-migration backups so db_backups stops growing unbounded ([#10423](https://github.com/diegosouzapw/OmniRoute/pull/10423)) — thanks @backryun +- **fix(antigravity):** accounts with an empty Cloud Code `projectId` now heal themselves — failed auto-onboarding (`onboardUser`) attempts are retried after a short backoff instead of being memoized forever, so the missing Google project is created without user action on a later request or token refresh ([#10424](https://github.com/diegosouzapw/OmniRoute/pull/10424)) — thanks @rqzbeh +- **fix(antigravity):** Google deprecated automatic project creation for standard-tier (personal) accounts — when `onboardUser` completes without a project id the account now fails fast with a clear `403 GCP_PROJECT_REQUIRED` message (no more generic 422 or delayed 429 RESOURCE_EXHAUSTED), and a manual GCP Project ID override is available in the connection editor so operators can enter their own project id ([#10424](https://github.com/diegosouzapw/OmniRoute/pull/10424)) — thanks @rqzbeh +- **fix(usage):** read Gemini `usageMetadata` out of the antigravity `{ response: {...} }` envelope so non-streaming requests log real token usage instead of `IN 0 | OUT 0` (port of decolua/9router#59d858b) ([#10430](https://github.com/diegosouzapw/OmniRoute/pull/10430)) — thanks @rqzbeh +- **fix(db):** keep test runs off the operator's real DATA_DIR ([#10432](https://github.com/diegosouzapw/OmniRoute/pull/10432)) +- **fix(sse):** buffer '/` form in `response.model` so clients validating against `/v1/models` don't warn ([#10571](https://github.com/diegosouzapw/OmniRoute/pull/10571)) +- **fix(backend,combo,cursor):** header budget, Codex failover, kv_after_text ([#10573](https://github.com/diegosouzapw/OmniRoute/pull/10573)) — thanks @HouMinXi +- **fix(mcp):** make GitHub skill tools discoverable through `omniroute_tool_search` +- fix(providers): remove 10 retired model ids from the crof seed catalog so /v1/models stops advertising models crof.ai no longer serves (#10577) +- **fix(audio):** when a prefix-matched STT provider has no credentials, retry gateways that list the same nested model id (e.g. `deepgram/nova-3` → `openrouter/deepgram/nova-3`) and mention those ids in the 400; stop documenting bare `deepgram/nova-3` as the default example ([#10583](https://github.com/diegosouzapw/OmniRoute/issues/10583)) +- fix(sse): resolve the short provider-alias prefix (e.g. `el/`) advertised by GET /v1/models for audio speech, transcription and translation model ids (#10586) +- fix(sse): map OpenAI-compat voice names to real ElevenLabs voice_ids in direct TTS (#10589) +- fix(dashboard): route the Playground's ChatTab "Send" through the endpoint actually selected in StudioConfigPane (`search`, `web.fetch`, etc.) instead of always POSTing to `/api/v1/chat/completions`, fixing the false "No active credentials for provider" 404 when testing search-only providers (#10592) +- **fix(providers):** Magnific Mystic is now the canonical provider (`/dashboard/providers/magnific`, `magnific/`). It uses the Magnific API (`api.magnific.com` + `x-magnific-api-key`), dashboard Test Connection validates keys without starting a paid generation, and the old `freepik` slug remains a legacy alias ([#10594](https://github.com/diegosouzapw/OmniRoute/pull/10594)) +- **fix(sse):** Include the redacted upstream error body in the per-target COMBO failure log (`Model X failed, trying next`) so operators can triage a 400/500 without reproducing the request ([#10597](https://github.com/diegosouzapw/OmniRoute/issues/10597)) +- **fix(xai):** trim Chat Completions `messages` and Responses `input` to xAI's 800-item history cap before dispatch, so long tool loops no longer die on `413 Chat history exceeds the 800-message limit` ([#10601](https://github.com/diegosouzapw/OmniRoute/pull/10601)) +- **fix(gemini):** inject missing items schema for array typed mcp tools (#10578) ([#10605](https://github.com/diegosouzapw/OmniRoute/pull/10605)) — thanks @sadSanta-07 +- **fix(api):** accept .opus uploads on /v1/audio/transcriptions ([#10607](https://github.com/diegosouzapw/OmniRoute/pull/10607)) — thanks @pucedoteth +- **fix(streaming):** preserve completed Codex tool handoffs ([#10608](https://github.com/diegosouzapw/OmniRoute/pull/10608)) — thanks @JxnLexn +- **fix(cli):** derive the machine-id token correctly under plain Node — `await import("node-machine-id")` puts the CJS exports on `.default`, so the destructured `machineIdSync` was `undefined` and the catch blanked the token, sending every management request unauthenticated; `OMNIROUTE_CLI_SALT` rotation is now honored too ([#10612](https://github.com/diegosouzapw/OmniRoute/pull/10612)) +- **fix(cli):** `omniroute setup --add-provider --api-key ` no longer aborts with "Provider API key is required" — Commander bound the value to the program-level `--api-key` (the OmniRoute server key), leaving the subcommand's own option undefined; `OMNIROUTE_API_KEY` now works as the error message advertised ([#10613](https://github.com/diegosouzapw/OmniRoute/pull/10613)) +- **fix(auth):** add missing state parameter to OIDC authorization URL ([#10614](https://github.com/diegosouzapw/OmniRoute/pull/10614)) — thanks @MeRezaRezaei +- fix(dashboard): make /api/models agree with /v1/models on synced-catalog coverage instead of reporting stale models as available (#10615) +- **fix(oauth):** treat Kiro social poll status as alias of error for pending states ([#10620](https://github.com/diegosouzapw/OmniRoute/pull/10620)) — thanks @krishna3554 +- **fix(sse):** route bare qwen3.8-max to the canonical -preview id ([#10632](https://github.com/diegosouzapw/OmniRoute/pull/10632)) +- **fix(providers):** validate bailian-coding-plan against the Token Plan host ([#10634](https://github.com/diegosouzapw/OmniRoute/pull/10634)) — thanks @backryun +- **fix(pricing):** DeepSeek V4 static defaults stale by 4 days, off by ~1.6-2.4x ([#10635](https://github.com/diegosouzapw/OmniRoute/pull/10635)) — thanks @stanleytejakusuma +- **fix(pricing):** 3 dead entries in LITELLM_PROVIDER_MAP silently drop synced pricing ([#10636](https://github.com/diegosouzapw/OmniRoute/pull/10636)) — thanks @stanleytejakusuma +- **fix(chatgpt-web):** refresh current model catalog ([#10637](https://github.com/diegosouzapw/OmniRoute/pull/10637)) — thanks @backryun +- **fix(api):** a target refusing the egress IP is not a healthy proxy ([#10654](https://github.com/diegosouzapw/OmniRoute/pull/10654)) — thanks @maxmad64bis +- **fix(compression):** gate de estágio não derruba o pipeline com engine sem metadata ([#10655](https://github.com/diegosouzapw/OmniRoute/pull/10655)) — thanks @backryun, @adevwithpurpose +- **fix(api):** share one probe-target resolution between both proxy health checks ([#10657](https://github.com/diegosouzapw/OmniRoute/pull/10657)) — thanks @maxmad64bis +- **fix(compression):** bound RTK raw-output store growth and make pointer reads O(bucket) (#10659) ([#10660](https://github.com/diegosouzapw/OmniRoute/pull/10660)) — thanks @stanleytejakusuma +- **fix(api):** classify OAuth probe timeout as network_error ([#10663](https://github.com/diegosouzapw/OmniRoute/pull/10663)) — thanks @HouMinXi +- **fix(proxy):** probe a proxy's assigned provider host instead of a generic target ([#10664](https://github.com/diegosouzapw/OmniRoute/pull/10664)) — thanks @maxmad64bis +- **fix(files):** validate the list limit query parameter ([#10673](https://github.com/diegosouzapw/OmniRoute/pull/10673)) — thanks @pacocartones +- **fix(sse):** advance Claude cache breakpoints on growing tails ([#10684](https://github.com/diegosouzapw/OmniRoute/pull/10684)) — thanks @cryptiklemur +- **fix(analytics):** query auto routing from call logs ([#10685](https://github.com/diegosouzapw/OmniRoute/pull/10685)) — thanks @cryptiklemur +- **Combo routing:** await each connection's token limit before reserving quota. The old lookup treated the `Promise` as a connection and dropped `rateLimitOverrides.tpm` ([#10686](https://github.com/diegosouzapw/OmniRoute/pull/10686)). +- **fix(sse):** import localDb through its real .ts extension (#10674) ([#10691](https://github.com/diegosouzapw/OmniRoute/pull/10691)) — thanks @backryun +- **fix(probe):** isolate probe-origin failures from all deactivation sites ([#10694](https://github.com/diegosouzapw/OmniRoute/pull/10694)) — thanks @maxmad64bis +- **fix(config):** keep the SQLite driver out of the client bundle (#10692) ([#10695](https://github.com/diegosouzapw/OmniRoute/pull/10695)) — thanks @backryun +- **fix(skills):** regenerate the CLI skills the quota subcommands left stale ([#10698](https://github.com/diegosouzapw/OmniRoute/pull/10698)) — thanks @backryun +- **fix(ops):** judge the canary install by the SHA on disk, not npm's exit code ([#10699](https://github.com/diegosouzapw/OmniRoute/pull/10699)) — thanks @backryun +- fix(guardrails): resolve the public provider alias before querying credentials in the Vision Bridge router, so command-code/opencode (and any alias!=id provider) are no longer reported as "unusable" despite active connections (#10702) +- fix(dashboard): filter the Modality Bridge Vision model picker to vision-capable models, matching the sibling Video/Audio tabs (#10703) +- fix(usage): repair provider-reported input_tokens: 0 on non-trivial requests instead of passing it through unrepaired (#10705) +- **fix(cline):** label internal health checks ([#10706](https://github.com/diegosouzapw/OmniRoute/pull/10706)) — thanks @arafatkatze +- **fix(db):** prevent Windows native-driver hang from stalling requests (#10627) ([#10709](https://github.com/diegosouzapw/OmniRoute/pull/10709)) — thanks @jonlwheat2-gif +- fix(cli): distinguish a CLI-probe timeout from a genuinely absent binary in locateCommand, and resolve the Hermes Agent Apply flow's `keyId` server-side instead of writing the `YOUR_OMNIROUTE_API_KEY_HERE` placeholder (#10710, #10711) +- fix(cli): pass --allow-scripts for the runtime's own npm-installed dependencies, so npm 12+'s default install-scripts block no longer silently skips better-sqlite3's native build (#10713) +- fix(db): filter `getProviderMetrics()` to providers with a live `provider_connections` row so a deleted provider stops permanently ghost-haunting the Home "Provider Topology" widget (#10714) +- **fix(agent-bridge):** make the regenerate-cert endpoint actually mint a new cert (#10467) ([#10715](https://github.com/diegosouzapw/OmniRoute/pull/10715)) — thanks @ntdatt812 +- **fix(electron):** keep the desktop window usable on Windows by binding the embedded Next.js server to loopback instead of the machine hostname ([#10717](https://github.com/diegosouzapw/OmniRoute/pull/10717)) — thanks @echoriver89 +- fix(proxy): keep password-only proxy credentials instead of dropping them when no username is set (#10720) +- **fix(oauth):** keep the Kiro profileArn on IAM Identity Center logins ([#10725](https://github.com/diegosouzapw/OmniRoute/pull/10725)) — thanks @MichaelYcJo +- **fix(executors):** the Meta AI (muse-spark-web) WebSocket send-message timeout now reports the socket's `readyState` at the moment it fires, so a "Meta AI WS timed out" failure can be told apart as either the connection never opening (`readyState=0`) or opening successfully and then going silent (`readyState=1`) — the exact ambiguity that made #10727 undiagnosable from logs alone (#10727). +- **fix(providers):** copilot-m365-web chat turns no longer surface as `(empty response)` — the type:4 invocation is aligned with the 2026-08 wire shape and now carries its type:1 Metrics follow-up in the same socket write, and the access token pre-flight-refreshes from a stored refresh_token instead of requiring a DevTools re-capture every ~75 minutes ([#10732](https://github.com/diegosouzapw/OmniRoute/pull/10732) — thanks @acc0mplish) +- **fix(sensenova):** clamp max reasoning effort to xhigh ([#10733](https://github.com/diegosouzapw/OmniRoute/pull/10733)) — thanks @InkshadeWoods +- **fix(catalog):** stop counting `getTokenLimit()`'s generic 128k catch-all as a known combo window, so `/v1/models` advertises the min of sourced member contexts instead of collapsing a 500k combo to 128k ([#10734](https://github.com/diegosouzapw/OmniRoute/issues/10734)) +- **fix(search):** name `/v1/search` 502s with provider id and sanitized Node cause code, without hostnames ([#10735](https://github.com/diegosouzapw/OmniRoute/issues/10735)) +- **fix(db):** pause call-log rotation and record SQLITE_CORRUPT on `/api/db/health` instead of retrying writes against a malformed pager ([#10736](https://github.com/diegosouzapw/OmniRoute/issues/10736)) +- **fix(fusion):** apply vision-compatibility filter to fusion panel + judge ([#10737](https://github.com/diegosouzapw/OmniRoute/pull/10737)) +- **fix(security):** zero out open CodeQL code-scanning alerts ([#10739](https://github.com/diegosouzapw/OmniRoute/pull/10739)) — thanks @hartmark +- fix(compression): skip the expensive `createCompressionStats()` pass in RTK when no message was actually compressed, matching every sibling stacked engine (#10765) +- **fix(api):** `/api/cache/stats` reported the prompt-cache LRU, which no request path ever writes to — it answered `0 hit / 0 miss, size 0` while the semantic cache served real traffic, and the Health and Usage dashboards rendered that as fact. It now reports the semantic cache's in-memory entries, with the same response shape ([#10769](https://github.com/diegosouzapw/OmniRoute/pull/10769)) — implemented by @maxmad64bis; thanks @Poid-ZA, who first fixed this in #9446. +- **fix(logging):** the app log is filterable and readable again. Entries from the tagged logger (`[LEVEL] [TAG] message`) were filed under the level instead of the component, and printf format strings were never applied, so `%s`/`%d` stayed literal with the values trailing behind them unlabelled — including every LiveWS connection line, where the format is deliberate hardening against injected format specifiers ([#10770](https://github.com/diegosouzapw/OmniRoute/pull/10770)) — thanks @maxmad64bis. +- **fix(api):** reset mcp sse singleton on new client initialize (#10690) ([#10772](https://github.com/diegosouzapw/OmniRoute/pull/10772)) — thanks @sadSanta-07 +- **fix(analytics):** Claude Code (`claude`/`cc`) is a flat-rate subscription, so cost analytics reports `$0` for it instead of estimating Anthropic list prices — the metered `anthropic` API keeps its real cost, and budget/quota/routing still estimate as before ([#10774](https://github.com/diegosouzapw/OmniRoute/pull/10774)) — thanks @electrumguy +- fix(db): periodically run `wal_checkpoint(TRUNCATE)` so the SQLite WAL file shrinks on long-running servers (default 6h, override with `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`, `0` disables) (#10781) +- fix(sse): replace LiveWS's application-only liveness check with a protocol-level `ws.ping()`/`pong` heartbeat (RFC 6455 §5.5.2) alongside the existing one, so a read-only dashboard subscriber that never sends anything survives the connection timeout — a socket that stops reading frames entirely is still reaped exactly as before (#10782) +- **fix(open-sse):** declare `supportedThinkingEfforts` (`low`/`medium`/`high`/`max`) on Ollama Cloud's `glm-5.1`, `glm-5.2`, `deepseek-v4-pro` and `deepseek-v4-flash` registry entries so the catalog's `appendSyncedEffortVariants()` pass — which only synthesizes selectable `-low`/`-high`/`-max` model ids from an already-populated `capabilities.effort_tiers` — can expose an effort selector for these reasoning-capable models, matching what `gpt-oss:20b`/`gpt-oss:120b` already had (#10788) +- **fix(resilience):** scope the same-account transport retry (#9708) out of emergency-fallback and combo hops — it was retrying the free fallback model and combo targets too, doubling upstream calls and corrupting the terminal error status on those paths ([commit `5089c17`](https://github.com/diegosouzapw/OmniRoute/commit/5089c17b4408068f0ee03543a30054ba61a22735)) — thanks @hartmark +- **fix(relay):** normalize bifrost errors, remap credential 404, fix analytics ([#10797](https://github.com/diegosouzapw/OmniRoute/pull/10797)) +- **fix(opencode-plugin):** respect log level in provider.models() catalog path so debug/info/warn messages are suppressed when `features.logLevel` is set to `"error"` ([#10798](https://github.com/diegosouzapw/OmniRoute/pull/10798)) — thanks @tientien17 +- **fix(providers):** Keep NVIDIA timeout probes and generic Antigravity/AGY HTTP 400 probes from poisoning credential health while preserving explicit Google geo-block handling ([#10799](https://github.com/diegosouzapw/OmniRoute/pull/10799)) — thanks @Zartharas +- **fix(conversations):** bound reconnect walk + memoize turn hashes (#7847) ([#10800](https://github.com/diegosouzapw/OmniRoute/pull/10800)) — thanks @adevwithpurpose +- **fix(sse):** re-run strict system hoist after format translation ([#10803](https://github.com/diegosouzapw/OmniRoute/pull/10803)) — thanks @Kizuno18 +- **fix(cursor):** discover account Agent endpoint ([#10804](https://github.com/diegosouzapw/OmniRoute/pull/10804)) — thanks @tuandinh0801 +- **fix(sse,compression):** graceful silent-close truncation + compressToolResults boolean guard ([#10805](https://github.com/diegosouzapw/OmniRoute/pull/10805)) — thanks @minhlongs +- **fix(responses):** replace synthetic reasoning keepalive ([#10806](https://github.com/diegosouzapw/OmniRoute/pull/10806)) — thanks @xz-dev +- **fix(compression):** bump vendored GCF with numeric-domain and surplus fixes ([#10807](https://github.com/diegosouzapw/OmniRoute/pull/10807)) — thanks @blackwell-systems +- **fix(zed-hosted):** add connection test support for Zed Hosted Models ([#10810](https://github.com/diegosouzapw/OmniRoute/pull/10810)) — thanks @Hsia97 +- **fix(admission):** reserve Responses and Messages bodies before clone ([#10814](https://github.com/diegosouzapw/OmniRoute/pull/10814)) — thanks @RaviTharuma +- fix(db): disambiguate `createProviderConnection()`'s OAuth email dedup by `providerSpecificData.profileArn` in addition to `username`, so adding a second Kiro/AWS profile with the same email creates a new connection instead of silently merging into the first (#10815) +- **fix(images):** register OpenAI `dall-e-3` in the image registry so unprefixed `dall-e-3` (and `openai/dall-e-3`) route to OpenAI Images instead of Microsoft Designer Web, and so the chat catalog no longer lists `openai/dall-e-3` as a 128k chat model ([#10832](https://github.com/diegosouzapw/OmniRoute/issues/10832)) +- **fix(cli):** prevent DEP0190 child process spawn deprecation on Windows ([#10835](https://github.com/diegosouzapw/OmniRoute/pull/10835)) — thanks @adevwithpurpose +- **fix(build):** ensure standalone package.json declares module type for Node 24 worker compatibility ([#10836](https://github.com/diegosouzapw/OmniRoute/pull/10836)) — thanks @adevwithpurpose +- **fix(security):** Outbound URL guard now resolves IPv4-mapped IPv6 literals to their embedded address, so `[::ffff:169.254.169.254]` is refused by the unconditional cloud-metadata block like its dotted spelling; `[::]` is refused alongside `0.0.0.0` ([#10843](https://github.com/diegosouzapw/OmniRoute/pull/10843)) — thanks @ntdat812 +- **fix(combo):** prevent unhandledRejection from per-model-timeout abort ([#10846](https://github.com/diegosouzapw/OmniRoute/pull/10846)) — thanks @HouMinXi +- fix(config): exclude cookie-auth image bridges (chatgpt-web, gemini-web) from the unprefixed model scan so a bare id never silently binds to an unofficial web bridge (#10848) +- fix(api): POST /v1/search now replies with a named `Unknown search provider: ` error (and field-named validation messages) instead of an opaque `Invalid request` for unrecognized or short-alias provider ids like `brave`/`serper` (#10849) +- **fix(api):** alias `GET`/`HEAD` `/readyz` to `/healthz` so Kubernetes readiness probes do not 404 ([#10850](https://github.com/diegosouzapw/OmniRoute/issues/10850)) +- **fix(i18n):** The "Disabled" status no longer renders as the noun for a person with a disability in Japanese, Spanish, Hindi, Polish, Telugu, Urdu and both Chinese locales — 24 strings now use each catalog's existing wording (ja 無効, es Deshabilitado, hi अक्षम, pl Wyłączone, te నిలిపివేయబడింది, ur غیر فعال, zh-CN 已禁用, zh-TW 已停用) ([#10812](https://github.com/diegosouzapw/OmniRoute/issues/10812), [#10853](https://github.com/diegosouzapw/OmniRoute/pull/10853)) — thanks @ntdat812 +- **fix(skills):** Marketplace-installed skills are available to API-key-scoped requests, including existing SkillsMP and skills.sh installs ([#10854](https://github.com/diegosouzapw/OmniRoute/pull/10854)) — thanks @kriptoburak +- **fix(onboarding):** add warning when skipping password in setup wizard ([#10855](https://github.com/diegosouzapw/OmniRoute/pull/10855)) — thanks @krishna3554 +- **fix(catalog):** `/v1/models` no longer advertises the built-in `auto/*` ids while auto routing is disabled — they were listed but rejected at request time with `Auto routing is disabled` ([#10831](https://github.com/diegosouzapw/OmniRoute/issues/10831), [#10857](https://github.com/diegosouzapw/OmniRoute/pull/10857)) — thanks @ntdat812 +- **fix(context):** Base64 file payloads (OpenAI `file` parts, Responses `input_file`, Claude `document` blocks) are budgeted like the Gemini `inlineData` path instead of being counted as prompt text — a ~1MB PDF estimated at 350k tokens and was rejected on the context limit before reaching the provider's document pipeline ([#10840](https://github.com/diegosouzapw/OmniRoute/issues/10840), [#10858](https://github.com/diegosouzapw/OmniRoute/pull/10858)) — thanks @ntdat812 +- **fix(mcp):** MCP tool calls that wait on a model provider no longer abort after 10 seconds. `omniRouteFetch` applied a single hardcoded `AbortSignal.timeout(10000)` to every internal hop, and `omniroute_route_request` — which posts to `/v1/chat/completions` and waits on the upstream provider, plus auto-combo candidate probing before a provider is even chosen — passed no signal of its own, so it inherited it. Any route slower than 10s failed from the MCP side while the identical request succeeded through the REST API. `omniroute_web_search` and `omniroute_web_fetch` in the same file already carried an explicit 60s signal, so that value is now shared by all three provider-bound calls instead of being repeated as a literal, while management reads (health, resilience, rate limits, combos, quota, usage) keep their fast-fail 10s budget so a stalled local endpoint still cannot hold a tool call open. Both budgets are overridable through `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` and `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS`, replacing the reported workaround of patching the compiled `dist/.build/next/server/chunks/*.js`; a malformed or non-positive override falls back to the default rather than disabling the timeout +- **fix(providers):** importing models with an expired API key now surfaces the credential error instead of reporting "No new models were added". The Import button posts to `/api/providers/{id}/sync-models`, which self-fetches the models route; that route does not fail on an upstream 401 but degrades to a catalog it already has, preferring the cache and using the local catalog only when there is no cache. A provider that imported successfully once therefore has a cache, so an expired key produced `{ source: "cache", warning: "Models probe failed (401) — using cached catalog" }` with HTTP 200 — and the #5460/#5465 degradation guard only recognised the `local_catalog` branch, so model-sync accepted it as a successful discovery, found every cached model already imported, and returned the empty-diff result. Retest does not go through this path, which is why it failed correctly and made the import look like a genuine "nothing to do". The existing rule — a degraded discovery must not be persisted as the synced catalog — is now applied to the branch it missed rather than special-casing 401/403, discriminating on the warning the fallback builder always attaches (an ordinary non-refresh cache hit attaches none, and model-sync always requests `refresh=true`). `isDegradedLocalCatalog` keeps its exact meaning and its existing tests +- fix(api): reject a combo update that removes every model, and store the copilot's combo targets where the router reads them (#10866) +- **fix(proxy):** proxy "Test connection" no longer reports an IPv4-only SOCKS5/SSH proxy as dead. #1255 moved every egress probe from `api.ipify.org` to `api64.ipify.org` so proxies with IPv6 egress could be tested, but `api64` is IPv6-first: a tunnel with no IPv6 route has nothing to connect to, so the probe hung until the caller's deadline and a proxy that was carrying live LLM traffic came back as a failure. Swapping the target to `api4` fixes that case and re-breaks the one #1255 fixed, so the probe now tries the targets in order instead — `api64` first, so a proxy with working IPv6 answers on the first attempt and keeps the exact behaviour #1255 introduced, including which of its addresses is reported (the egress IP is used as an identity to detect accounts of one rotation group sharing an address, so the attempts are sequential rather than raced). The attempts split the budget each call site already enforced, so no probe can take longer than it could before, and each attempt gets its own `AbortController` so exhausting the budget on an unreachable target does not abort the next one. `OMNIROUTE_PROXY_ECHO_URL` pins a single target — including a self-hosted echo — replacing the workaround of rewriting the compiled bundle after every upgrade. The relay branch of the test route still targets `api64` through `x-relay-target`, since that request egresses from the relay worker rather than the operator's tunnel +- fix(cli): warn when a .env line never takes effect, and stop swallowing an unreadable .env (#10870) +- **fix(dashboard):** guard non-string apiKey in CLI tool cards ([#10872](https://github.com/diegosouzapw/OmniRoute/pull/10872)) — thanks @Rahulsharma0810 +- **fix(db):** Remove stale MiMoCode provider configuration, including the legacy `mcode` alias, left after provider retirement while preserving historical usage and call logs ([#10873](https://github.com/diegosouzapw/OmniRoute/pull/10873)) — thanks @Zartharas +- **fix(opencode):** route Muse Spark 1.2 models to OpenAI Responses API ([#10874](https://github.com/diegosouzapw/OmniRoute/pull/10874)) — thanks @zoser69 +- **fix(sse):** `getResetAwareProvider()` and the auto-combo quota lookup in `combo.ts` now canonicalize the provider id via `resolveProviderId()` before calling `getQuotaFetcher()`, so a fetcher registered under a provider's canonical id (e.g. `ollama-cloud`, `codex`) is found for combo targets stored under an alias spelling (e.g. `ollamacloud`, `cx`) instead of silently degrading reset-aware/reset-window/auto quota-aware routing to plain priority ordering (#10877) +- **fix(provider-health):** Keep unsupported 404/405 validation probes neutral so they do not poison stored credential health or scheduler failure state, while still honoring per-connection health-check pacing ([#10878](https://github.com/diegosouzapw/OmniRoute/pull/10878)) — thanks @Zartharas +- **fix(antigravity):** map Gemini 3.7 Flash tier ids (`gemini-3.7-flash-high/medium/low`, bare `gemini-3.7-flash`) to the upstream `gemini-3.7-flash-tiered` model id Google's Cloud Code endpoint expects, and configure per-tier thinking budgets ([#10882](https://github.com/diegosouzapw/OmniRoute/pull/10882)) — thanks @adevwithpurpose +- **fix(memory):** enable agent memory save/update via MCP tools (`memory_save`/`update`/`search`/`delete` builtins with per-provider schemas, `apiKeyId` optional with caller-principal fallback) and gate server-side memory builtin injection to non-stream requests only ([#10887](https://github.com/diegosouzapw/OmniRoute/pull/10887)) — thanks @Egorich-print +- **fix(security):** clear new CodeQL code-scanning alerts (round 2) ([#10888](https://github.com/diegosouzapw/OmniRoute/pull/10888)) +- **fix(settings):** add customSystemPrompt fields to updateSettingsSchema (#10865) ([#10890](https://github.com/diegosouzapw/OmniRoute/pull/10890)) — thanks @rqzbeh +- **fix(model):** return model_not_found for unrecognized prefix models when provider is inactive (#10856) ([#10894](https://github.com/diegosouzapw/OmniRoute/pull/10894)) — thanks @rqzbeh +- **fix(models):** persist apiFormat, targetFormat, and supportsVision overrides for catalog models (#10871) ([#10898](https://github.com/diegosouzapw/OmniRoute/pull/10898)) — thanks @rqzbeh +- **fix(auth):** add opencode/opencode-zen to search pairs for credential resolution (#10892) ([#10899](https://github.com/diegosouzapw/OmniRoute/pull/10899)) — thanks @rqzbeh +- **fix(search):** enforce blockedProviders setting on search endpoint (#10863) ([#10901](https://github.com/diegosouzapw/OmniRoute/pull/10901)) — thanks @rqzbeh +- **fix(perplexity-web):** make the built-in-search hint appended to every system message opt-in via `OMNIROUTE_PPLX_SEARCH_HINT` (off by default) — Perplexity's answer engine searches anyway, and the hint leaked into replies as meta-commentary for coding clients ([#10902](https://github.com/diegosouzapw/OmniRoute/pull/10902), extracted from [#8634](https://github.com/diegosouzapw/OmniRoute/pull/8634)) — thanks @danscMax +- **fix(providers):** the loopback readiness gate no longer memorizes a failed probe — the next caller after 30s starts a fresh probe, and a readiness failure is logged once per probe instead of once per caller ([#10903](https://github.com/diegosouzapw/OmniRoute/pull/10903)) +- **fix(relay):** the Cloudflare proxy-relay worker now resolves `x-relay-path` through the shared `resolveRelayTarget()` guard instead of concatenating it onto the validated target. PR #4643 and its follow-up applied that guard to the Deno and Vercel workers; the Cloudflare generator, ported separately from upstream `decolua/9router` PR #1360, kept `fetch(targetBase + relayPath)`. Validating `x-relay-target` and then concatenating is not sufficient — the path re-points the request past the host that was just checked, through userinfo (`/x@evil.com`), a backslash (`\evil.com`), or a protocol-relative path (`//evil.com/x`). The guard is embedded verbatim under a literal `const resolveRelayTarget =` binding so the hardcoded call site still resolves when the SWC-minified standalone build mangles the source function's own name (#6149), and the new regression test pins that property for this worker by renaming the embedded function and re-evaluating the emitted source. The auth check and the private/loopback target guard are unchanged +- **fix(build):** the `next` Docker image no longer crashes on boot with `ReferenceError: require is not defined in ES module scope`. The standalone `server.js` is CommonJS, but the `postbuild` colocate step was re-adding `"type":"module"` to the standalone root `package.json` (undoing `assembleStandalone`'s strip) to make its ESM worker bundles load. The `type:module` scope is now written per-worker-directory instead of on the root, so `server.js` stays CommonJS while the workers stay ESM ([#10936](https://github.com/diegosouzapw/OmniRoute/pull/10936), fixes [#10933](https://github.com/diegosouzapw/OmniRoute/issues/10933)) — thanks @arminanton +- fix(cli): always emit limit.output in generated OpenCode config so schema validation passes for metadata-less models (#10940) +- **fix(relay):** the private/loopback guard the three proxy-relay workers embed no longer misses four host spellings, and now lives in one place instead of three byte-identical inline copies. Driving `new URL(target).hostname` the way the workers do, the previous guard allowed `::` (the unspecified address, which reaches a service bound to the IPv6 loopback), `localhost.` (the FQDN root dot defeated the exact match and every `.localhost`/`.local`/`.internal` suffix rule, so `svc.internal.` slipped too), `::127.0.0.1` (the deprecated IPv4-compatible form — only `::ffff:` was checked), and `feb0::1` (link-local is `fe80::/10`, spanning `fe80`–`febf`, but only the literal `fe80:` spelling matched). The policy moved to `src/lib/proxyRelay/privateHostname.ts` and is embedded verbatim via `Function#toString` under a literal const name, the same mechanism `resolveRelayTarget` already uses for these workers, so a minified standalone build cannot break the call site (#6149). Nothing previously blocked is now allowed. Severity is low — reaching a worker needs the `x-relay-auth` secret and these are edge runtimes where loopback has nothing listening — but the suffix-rule bypass held regardless of runtime +- **Account rotation:** make `fallbackStrategy: "least-used"` actually rotate. The strategy sorts on `lastUsedAt` but never wrote it — only the round-robin branch committed — so on a pool where every `last_used_at` was still `NULL` the tie-break fell through to `priority` and returned the same connection on every dispatch ([#10945](https://github.com/diegosouzapw/OmniRoute/issues/10945)). +- **fix(executor):** respect apiType="chat" in forceResponsesUpstream (#5483 regression) ([#10946](https://github.com/diegosouzapw/OmniRoute/pull/10946)) — thanks @YunyunZhai +- **Desktop auto-update (Windows):** stop the in-app updater 404ing on every release. NSIS used electron-builder's default artifact name, whose spaces GitHub rewrites to `.` on upload while `latest.yml` keeps `-`, so the manifest pointed at `OmniRoute-Setup-X.Y.Z.exe` while the published asset was `OmniRoute.Setup.X.Y.Z.exe`. The name is now set explicitly to the dot form the asset already has, so nothing published changes name ([#10947](https://github.com/diegosouzapw/OmniRoute/issues/10947)). +- Preserve explicit plaintext reasoning when a Responses reasoning item also carries opaque provider state (rare OpenCode Go `deepseek-v4-flash` responses). Mixed plaintext + opaque input is projected onto the target transport: plaintext targets keep portable text, opaque targets keep provider state. Opaque-only reasoning is dropped when the selected target cannot replay it, allowing cross-model conversations to continue. (#10949, #10959) +- **fix(catalog):** preserve provider-declared reasoning effort tiers instead of replacing them with generic defaults ([#10953](https://github.com/diegosouzapw/OmniRoute/pull/10953)) — thanks @xz-dev +- fix(cli): combo create accepts --models and no longer creates empty combos (#10954) +- fix(cli): resolve $ref path params and add PATCH combos requestBody in generated API commands (#10955) +- **fix(catalog):** declare GLM reasoning effort tiers ([#10963](https://github.com/diegosouzapw/OmniRoute/pull/10963)) — thanks @xz-dev +- **fix(release):** repair v3.8.50 base-red tail after latest root lift ([#10964](https://github.com/diegosouzapw/OmniRoute/pull/10964)) — thanks @backryun +- fix(sse): combo diagnostics no longer truncate `exhausted_connection` entries to a hardcoded `provider: "unknown"` with the provider prefix eaten by an 8-char slice — the real provider id is preserved and only the connection id is truncated (#10967) +- fix(sse): combo terminal failures caused entirely by quota/account-balance exhaustion (including a durable HTTP 403 `insufficient_quota` / `AUTHZ_INSUFFICIENT_BALANCE`) now stamp a stable `quota_exhausted` diagnostics reason with a `switch-combo` recovery hint instead of the misleading default `retry` action (#10966) +- **fix(providers):** 401 when active terminal grok-cli credentials expire (#10969) ([#10971](https://github.com/diegosouzapw/OmniRoute/pull/10971)) — thanks @RaviTharuma +- **fix(providers):** remove dead existingConnections lookups on connection creation ([#10973](https://github.com/diegosouzapw/OmniRoute/pull/10973)) — thanks @maxmad64bis +- **fix(providers):** remove ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE, a flag that governs nothing ([#10974](https://github.com/diegosouzapw/OmniRoute/pull/10974)) — thanks @maxmad64bis +- **fix(search):** skip catalog-default SearXNG `http://localhost:8888/search` so Docker/K8s search does not ECONNREFUSED then 502 into the next provider ([#10976](https://github.com/diegosouzapw/OmniRoute/issues/10976)) +- **fix(sse):** guard reasoning-cache write by the same predicate its readers use ([#10978](https://github.com/diegosouzapw/OmniRoute/pull/10978)) — thanks @maxmad64bis +- **fix(sse):** surface bare upstream close as response.failed for Responses clients ([#10980](https://github.com/diegosouzapw/OmniRoute/pull/10980)) — thanks @linhdmn +- fix(command-code): surface reasoning-only output as content when a model emits no text-delta (#10986) +- **fix(ci):** clear inherited `release/v3.8.50` quality-gate reds on the X Search PR: drop the stale `copilot-m365-web.ts:330` public-creds allowlist, document six missing env vars, register four covering Stryker tap tests, prune leftover ESLint suppressions, replace the phantom `@/lib/db/connections` Utilization import with `getProviderConnectionById`, and fix open-sse/dashboard typecheck regressions in freebuff, browser-backed chat, auth, health matrix, and Monaco ([#10988](https://github.com/diegosouzapw/OmniRoute/pull/10988)). +- **fix(ci):** clear remaining `release/v3.8.50` unit-shard reds on the X Search PR: pin `onnxruntime-node` to the transformers 1.24.3 copy, rebaseline OpenAPI coverage, sync goldens/i18n, honor eye-hidden no-auth models across provider aliases, await rejected-request call-log writes, absorb catalog event-loop shard contention in #9147, and align inherited tests with advisory context estimates, #10501 combo terminal-status aggregation, and current catalog/auth behavior ([#10988](https://github.com/diegosouzapw/OmniRoute/pull/10988)). +- **Static model catalog for v0-vercel-web:** seed a static catalog for the v0-vercel-web web-cookie provider (v0-1.0-md, v0-1.5-lg, v0-1.5-md) so its dashboard "Available Models" / "Import from /models" UI serves a usable list instead of falling through to the route's 400 "does not support models listing" ([#10990](https://github.com/diegosouzapw/OmniRoute/issues/10990)). +- fix(providers): mark the blackbox provider deprecated — api.blackbox.ai returns HTTP 404 on every path variant (sweep 2026-08-21), so the public inference surface is dead and the catalog entry now carries a deprecation notice. ([#10997](https://github.com/diegosouzapw/OmniRoute/issues/10997)) +- fix(providers): validate Dify keys against its native /v1/chat-messages endpoint (#11002) +- **fix(accounts):** `markCooldown` now carries the failure origin (`transient` vs `terminal`) — transient 429/network only cools down, repeated terminal failures evict and are skipped by `pickAccount` until a success or operator clear ([#11008](https://github.com/diegosouzapw/OmniRoute/pull/11008)) — thanks @maxmad64bis +- **fix(providers):** route terminal `testStatus` writes (`banned`, `deactivated`, `credits_exhausted`) through a single origin-aware passage — probe failures are recorded but never deactivate the connection ([#11009](https://github.com/diegosouzapw/OmniRoute/pull/11009)) — thanks @maxmad64bis +- **fix(codex):** drop non-standard `codex.*` SSE events by default so OpenAI SDK / Codex CLI `/v1/responses` clients are not 502'd by `event: codex.rate_limits` ([#11014](https://github.com/diegosouzapw/OmniRoute/issues/11014)) — thanks @RaviTharuma +- **fix(resilience):** count heavyweight `/v1` admission leases in the SIGTERM drain and send `Retry-After` on shutdown 503s so Recreate no longer looks like an empty 502 ([#11015](https://github.com/diegosouzapw/OmniRoute/issues/11015)) — thanks @RaviTharuma +- **fix(startup):** log `Credential health scheduler disabled` when `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` is set instead of lying with `started` ([#11016](https://github.com/diegosouzapw/OmniRoute/issues/11016)) — thanks @RaviTharuma +- **docs(api-keys):** document that unset `DEFAULT_RATE_LIMIT_PER_DAY` is unlimited (#2289), not a hidden 1000/day cap ([#11017](https://github.com/diegosouzapw/OmniRoute/issues/11017)) — thanks @RaviTharuma +- **fix:** strip unsupported message metadata for Groq ([#11026](https://github.com/diegosouzapw/OmniRoute/pull/11026)) — thanks @sanforex24h +- **fix(security):** close 4 STILL-REAL advisory findings (ACP RCE hardening, db-backups tier, uppercase authz bypass, spawn-veto drift) ([#11028](https://github.com/diegosouzapw/OmniRoute/pull/11028)) +- **fix(combo):** accept SSE comment lines (e.g. OpenRouter keep-alives) in response quality validation ([#11036](https://github.com/diegosouzapw/OmniRoute/pull/11036)) — thanks @asorourx +- **fix(security):** close remaining v3.8.50 advisories (batch 2 — 11 findings) ([#11040](https://github.com/diegosouzapw/OmniRoute/pull/11040)) +- **fix(codex):** make remote compaction V2 complete reliably ([#11041](https://github.com/diegosouzapw/OmniRoute/pull/11041)) — thanks @jackjinke +- **fix(sse):** split concatenated tool_call arguments from same-name index collisions ([#11043](https://github.com/diegosouzapw/OmniRoute/pull/11043)) — thanks @maxmad64bis +- **fix(kimi):** point kimi-web to international www.kimi.ai ([#11045](https://github.com/diegosouzapw/OmniRoute/pull/11045)) — thanks @MeRezaRezaei +- **fix(sse):** resolve OpencodeExecutor target format through the provider alias ([#11047](https://github.com/diegosouzapw/OmniRoute/pull/11047)) — thanks @maxmad64bis +- **fix(providers):** route Muse Spark to the Responses API on opencode-zen too ([#11049](https://github.com/diegosouzapw/OmniRoute/pull/11049)) — thanks @maxmad64bis +- **fix(webhooks):** remove 3 declared-but-never-emitted events (`provider.error`, `provider.recovered`, `combo.switched`) from `WebhookEvent` — catalog now `request.completed | request.failed | quota.exceeded | test.ping`; `POST /api/webhooks` and `PUT /api/webhooks/[id]` reject ghost values with 400; OpenAPI webhook description updated across 43 locales ([#11050](https://github.com/diegosouzapw/OmniRoute/pull/11050)) — thanks @maxmad64bis +- **fix(cli):** default limit.context to 128k when unknown in OpenCode configs (#11035, #11032) ([#11054](https://github.com/diegosouzapw/OmniRoute/pull/11054)) — thanks @rqzbeh +- **fix(providers):** update hailuo-web domain to chat.minimax.io (#11000) ([#11055](https://github.com/diegosouzapw/OmniRoute/pull/11055)) — thanks @rqzbeh +- **fix(gamification):** validate leaderboard limit/offset before the SQLite bind ([#11059](https://github.com/diegosouzapw/OmniRoute/pull/11059)) — thanks @pacocartones +- fix(providers): filter Perplexity model import to the Sonar family so Agent-API catalog ids stop surfacing as routable chat models (#11060) +- **fix(dashboard):** compute unique connection names from array to avoid overwrite (#11033) ([#11067](https://github.com/diegosouzapw/OmniRoute/pull/11067)) — thanks @rqzbeh +- **fix(resilience):** keep Ollama model-not-found failures scoped to connection model lockout (#11071) ([#11078](https://github.com/diegosouzapw/OmniRoute/pull/11078)) — thanks @rqzbeh +- **fix(cli):** support OpenCode V2 config format in setup-opencode (#11070) ([#11079](https://github.com/diegosouzapw/OmniRoute/pull/11079)) — thanks @rqzbeh +- **fix(api):** save call logs and add endpoint fallback for local rerank providers ([#11081](https://github.com/diegosouzapw/OmniRoute/pull/11081)) — thanks @AndrianBalanescu +- **fix(logs):** apply filter predicates to merged in-memory call-log rows ([#11082](https://github.com/diegosouzapw/OmniRoute/pull/11082)) — thanks @AndrianBalanescu +- **fix(compression):** CCR must not strand prompts for callers without the retrieve tool ([#11084](https://github.com/diegosouzapw/OmniRoute/pull/11084)) — thanks @HouMinXi +- **fix(claude):** restore canonical tool names (`bash` → `Bash`, `croncreate` → `CronCreate`) on non-streaming OpenAI→Claude conversion and through identity-echo alias maps, so Claude Code stops rejecting tool calls with "No such tool available" ([#11085](https://github.com/diegosouzapw/OmniRoute/pull/11085)) — thanks @linhdmn +- **fix(resilience):** filter chat connection selection by each connection's *synced* model inventory on multi-host self-hosted providers (`ollama-local`, `lm-studio`, `vllm`, …), so a request for a model only one host advertises is pinned to that host instead of failing over onto a host that never had it ([#11089](https://github.com/diegosouzapw/OmniRoute/issues/11089)) +- fix(install): make the ONNX dependency chain optional so Termux/Android installs succeed again (#11095) +- **fix(search):** fall back to duckduckgo-free when no search provider is configured ([#11097](https://github.com/diegosouzapw/OmniRoute/pull/11097)) — thanks @Egorich-print +- **fix(providers):** Reject silent validation degradation on provider connection patch — unknown `rateLimitOverrides` keys (e.g. a typo'd `tpm`) and empty/non-numeric values now return `400` with the rejected key list instead of being silently dropped ([#11101](https://github.com/diegosouzapw/OmniRoute/pull/11101)) +- **Autopilot suggestion counter:** the combo health autopilot summary now reports `suggestionCount` (the real number of suggested actions across all issues) instead of conflating it with link counts, while keeping `actionableCount` as a deprecated alias for backward compatibility. The `run_combo_test` action now links to the dashboard with the combo id (`/dashboard/combos?test=`) rather than the read-only API route, so operators can actually trigger a test from the UI ([#11102](https://github.com/diegosouzapw/OmniRoute/pull/11102)). +- **Config audit persistence:** persist the configuration audit trail to SQLite (`config_audit_log`) instead of an in-memory buffer capped at 1000 volatile entries, and bound its growth with `cleanupConfigAudit()` driven by the `retention.configAudit` setting (default 30 days), wired into `runAutoCleanup` ([#11103](https://github.com/diegosouzapw/OmniRoute/pull/11103)). +- **fix(routing):** preserve combo precedence and skip hidden models in alias resolver ([#11107](https://github.com/diegosouzapw/OmniRoute/pull/11107)) — thanks @SCys +- fix(sse): resume mid-stream recovery after a _completed_ tool call — `finish_reason: "tool_calls"` is now tracked per-call instead of as a general terminal marker, so truncation of trailing prose after a fully-delivered tool call is recoverable while in-flight calls stay blocked ([#11109](https://github.com/diegosouzapw/OmniRoute/pull/11109)) +- **fix(sse):** default summary + strip malformed id on kept Responses input items ([#11110](https://github.com/diegosouzapw/OmniRoute/pull/11110)) — thanks @maxmad64bis +- **fix(sse):** merge purify_history compression notice into the leading system message ([#11113](https://github.com/diegosouzapw/OmniRoute/pull/11113)) — thanks @ggdayup +- **fix(memory):** treat TokenRouter as system-must-be-first (live HTTP 400 confirmed) ([#11114](https://github.com/diegosouzapw/OmniRoute/pull/11114)) — thanks @ggdayup +- **fix(providers):** `reasoning_effort` now learns the accepted values from a provider's own 400/422 response and clamps to the highest one instead of forwarding an unsupported `xhigh`/`max` (or a hardcoded `"high"` fallback) — fixes custom OpenAI-compatible connections and registered providers with no reasoning metadata ([#11116](https://github.com/diegosouzapw/OmniRoute/pull/11116)) — thanks @maxmad64bis +- **fix(providers):** require API key for Pollinations and fix optional key i18n labels (#11096) ([#11117](https://github.com/diegosouzapw/OmniRoute/pull/11117)) — thanks @rqzbeh +- **fix(providers):** remove Hack Club AI provider (#11118) ([#11123](https://github.com/diegosouzapw/OmniRoute/pull/11123)) — thanks @rqzbeh +- **fix(search):** enforce blockedProviders setting on search endpoint (#11100) ([#11125](https://github.com/diegosouzapw/OmniRoute/pull/11125)) — thanks @rqzbeh +- **fix(sse):** default summary on freshly-built Chat->Responses reasoning items ([#11129](https://github.com/diegosouzapw/OmniRoute/pull/11129)) — thanks @maxmad64bis +- **fix(cline):** use valid modelType/model format for Cline provider models (#11099) ([#11132](https://github.com/diegosouzapw/OmniRoute/pull/11132)) — thanks @rqzbeh +- **fix(registry):** restore models[0] default + guards; note muse-spark overlay (#11051/#11049) ([#11133](https://github.com/diegosouzapw/OmniRoute/pull/11133)) — thanks @maxmad64bis +- **fix(mcp):** honor the mcp:connect carve-out in transport route guards ([#11139](https://github.com/diegosouzapw/OmniRoute/pull/11139)) — thanks @HouMinXi +- **fix(oauth):** recover connections stuck on upstream 400 after token staleness ([#11141](https://github.com/diegosouzapw/OmniRoute/pull/11141)) — thanks @HouMinXi +- **fix(sse):** parallel `function_call` items in a Responses API stream (e.g. several tool calls dispatched in the same turn) now each get a stable, distinct `index`/`id` when translated to Chat Completions streaming deltas, instead of colliding on index 0 and tripping strict stream parsers with `Expected 'id' to be a string.` ([#11144](https://github.com/diegosouzapw/OmniRoute/pull/11144)) +- **fix(analytics):** `opencode-go` is now classified as a flat-rate subscription, so cost analytics shows $0 for it instead of billing every call at the underlying model’s metered rate — it resells GLM, Kimi, Grok, DeepSeek, MiniMax, Qwen and GPT-5.x under one flat monthly fee, which made the overstatement large rather than marginal ([#11149](https://github.com/diegosouzapw/OmniRoute/pull/11149)) — thanks @electrumguy +- **fix(sse):** resume stream recovery after a clean stop with reasoning-only output ([#11151](https://github.com/diegosouzapw/OmniRoute/pull/11151)) — thanks @maxmad64bis +- **fix(sse):** reject a low-overlap stream-recovery continuation instead of concatenating it raw ([#11152](https://github.com/diegosouzapw/OmniRoute/pull/11152)) — thanks @maxmad64bis +- fix(dashboard): keep `open-sse/config/providerRegistry.ts` free of `node:net` so the provider detail client bundle builds again — the host classification moved to a platform-free `src/shared/network/privateHost.ts` with a pure-JS `isIP` equivalent, leaving the #11122 routing behaviour unchanged (#11154) +- **fix(executors):** OpencodeExecutor rotates (or retries once on a single-account direct path) on upstream 400 empty-body rejections — malformed completion envelopes with no error field were propagated as success and killed client sessions. Bounded +1 attempt per request; body reads are conditioned on status 400 so successful/streaming responses are never buffered. 400s carrying an error field keep propagating immediately ([#11158](https://github.com/diegosouzapw/OmniRoute/pull/11158)) — thanks @maxmad64bis. +- **fix(tests):** update translate-path golden snapshot and docs for hailuo-web (#11000) ([#11161](https://github.com/diegosouzapw/OmniRoute/pull/11161)) — thanks @rqzbeh +- **Combo create:** creating a routing combo without any model is now refused (`400`) — the CLI requires `--models`/`--model` on `combo create`, matching the dashboard which already rejected empty combos. +- **fix(bun):** update Dockerfile.bun entrypoint and native bun:sqlite instantiation (#11039) ([#11163](https://github.com/diegosouzapw/OmniRoute/pull/11163)) — thanks @rqzbeh +- **fix(resilience):** a missing-model `404` on a provider that declares `passthroughModels: true` in the shared registry (novita, uncloseai, orcarouter and 37 others) now locks out only that model instead of cooling the entire connection — `hasPerModelQuota()` previously read only the open-sse registry and the local/self-hosted families ([#11165](https://github.com/diegosouzapw/OmniRoute/pull/11165)) — thanks @yourspraveen +- **fix(cli):** resolve blank device code and undefined verification URL in oauth start (#11164) ([#11173](https://github.com/diegosouzapw/OmniRoute/pull/11173)) — thanks @rqzbeh +- **fix(auth):** replace router.push with window.location navigation after login (#11143) ([#11175](https://github.com/diegosouzapw/OmniRoute/pull/11175)) — thanks @rqzbeh +- **fix(sse):** unpin static Antigravity sessionId and add DNS retry classification (#10443) ([#11177](https://github.com/diegosouzapw/OmniRoute/pull/11177)) — thanks @rqzbeh +- **fix(routing):** a custom `openai-compatible-*` / `anthropic-compatible-*` connection pointing at a keyless self-hosted backend (llama.cpp, Ollama, vLLM started without an API key) now stays in the `auto/*` candidate pool instead of being silently dropped by the credential gate — for those IDs "no credential" is the normal configuration, not an unconfigured connection ([#11180](https://github.com/diegosouzapw/OmniRoute/pull/11180)) — thanks @marcs7 +- **fix(routing):** the Routing tab's "last known good provider" toggle now actually takes effect — `lkgpEnabled` was persisted and the `lkgp` strategy guarded on it, but the setting was never forwarded into the `RoutingContext` built in `resolveAutoStrategyOrder()`, so `context.lkgpEnabled` was always `undefined` and the off-switch was unreachable ([#11181](https://github.com/diegosouzapw/OmniRoute/issues/11181)) +- **fix(security):** add test coverage for Tier 1 local-only route guard process-spawning endpoints ([#11189](https://github.com/diegosouzapw/OmniRoute/pull/11189)) — thanks @rqzbeh +- **fix(sse):** stop keyless pollinations 401s from poisoning the noauth pool (#9827) ([#11194](https://github.com/diegosouzapw/OmniRoute/pull/11194)) — thanks @jonlwheat2-gif +- **fix(ci):** finish greening release/v3.8.50 base (#9985, #11203) ([#11201](https://github.com/diegosouzapw/OmniRoute/pull/11201)) — thanks @jonlwheat2-gif +- **fix(i18n):** complete vi parity for cheaperInferenceSponsorBanner ([#11208](https://github.com/diegosouzapw/OmniRoute/pull/11208)) — thanks @backryun +- **fix(api-manager):** Allowed Combos can now be restricted to zero entries: **All** is stored explicitly as `combo/*`, while **Restrict** with no selection saves an empty allowlist that denies Combo routes without blocking direct models. Existing keys are migrated to preserve their previous allow-all behavior. +- fix(build): tolerate a same-realpath symlink or stale-typed dest in the standalone bundle assembler, fixing non-deterministic `ERR_FS_CP_EINVAL`/`ERR_FS_CP_DIR_TO_NON_DIR` crashes under heavy concurrent build I/O +- **fix(auto):** rate-limit `auto/ matched no connected models` warnings to once per minute per label (`open-sse/services/autoCombo/virtualFactory.ts`) +- fix(cli): drop the orphaned `resolveOpencodeConfigDir` re-export from `cliRuntime` — it lost its last consumer in #10246 and diverged from the canonical resolver by one directory level (#9985) +- **fix(api):** hash API keys in the `/v1/models` catalog cache Map key so heap dumps cannot leak bearer tokens (`src/app/api/v1/models/catalogCache.ts`) +- **fix(providers):** register live OpenRouter Gemini Embedding 2 ids (`google/gemini-embedding-2` and `google/gemini-embedding-2-preview`, 3072-d) in the curated embeddings catalog so `GET /v1/models` and `GET /v1/embeddings` list the ids that already serve — thanks @RaviTharuma +- **fix(translator):** merge consecutive same-role contents in direct Claude to Gemini request translation to prevent upstream HTTP 400 errors +- **fix(cline):** Preserve client-supplied Cline task IDs and omit the header when clients provide none, preventing request-scoped proxy IDs from being reported as tasks. +- **fix(catalog):** derive combo reasoning-effort tiers from the exact runtime-selectable connection scope, intersecting dynamic, pinned, allowlisted, and compatible provider-node evidence while failing closed on unknown capabilities. +- fix(combo): evict in-memory session-stickiness bindings when a combo disables stickiness, so stale pins stop overriding the declared priority order until TTL/restart +- fix(combo): resolve effort-suffixed command-code variants (e.g. `deepseek-v4-flash-max`) to their base model for capability lookups, so tool-bearing combo requests keep the declared priority order instead of reordering behind models with confirmed capabilities +- **fix(db):** the `compression_run_telemetry` retention sweep now actually deletes expired rows. Its cutoff was computed in epoch seconds while the column stores epoch milliseconds, so `WHERE timestamp < cutoff` never matched and the table added by #6848 to bound `storage.sqlite` growth was unbounded in practice. Same unit mismatch as #9625, which corrected the sibling `domain_cost_history` sweep and missed this call site +- **fix(db):** database settings API no longer returns HTTP 500 on SQLite builds compiled without the optional `dbstat` virtual table (sql.js/WASM); per-table sizes degrade to 0 instead of failing the whole stats call +- **fix(ops):** Docker HEALTHCHECK probes lightweight `/healthz` instead of `/api/monitoring/health` so a busy event loop does not mark the container Unhealthy (`scripts/dev/healthcheck.mjs`) +- **fix(api):** `/v1/embeddings` 400s for native `gemini-embedding-2` now name the working OpenRouter ids (`openrouter/google/gemini-embedding-2` and the preview alias) instead of only `No credentials for embedding provider: gemini` — thanks @RaviTharuma +- **fix(sse):** keep Codex/Anthropic quota headers under the upstream forwarding budget; drop `x-codex-turn-state` and raise the 768-byte cap (`open-sse/handlers/chatCore/responseHeaders.ts`) +- **fix(sse):** MiniMax music models now generate audio instead of failing with `Unsupported music format: minimax-music` — the provider entry was registered in the music registry (and advertised by `/v1/models`), but `handleMusicGeneration` had no branch for its format, so every `minimax/*` music request fell through the dispatch chain to a 400. Adds the missing dispatch: a single synchronous POST with the `base_resp` envelope check (a non-zero `status_code` arrives on HTTP 200 too), `data.status` handling (an unfinished generation is reported instead of polled — the operation has no task id and no query endpoint), `url` and `hex` output formats (hex normalized to base64), `mp3`/`wav`/`pcm` containers via `audio_setting`, and the regional endpoint through the per-connection base-URL override, which is also the only host that accepts `aigc_watermark`. The registry entry gains the generation and cover model ids it was missing and drops a query URL that does not exist for this operation. Regression guard: `tests/unit/minimax-music-generation.test.ts` (9 tests). +- **fix(models):** honor `MODELS_DEV_SYNC_ENABLED=0` as a hard kill switch over the dashboard setting so a wedged `/healthz` / UI can be recovered without HTTP (`src/lib/modelsDevSync.ts`) +- **OpenCode config merge:** stop `mergeOpenCodeConfig` splaying a malformed `provider` block into index keys. The root was already guarded against a non-object; the `provider` branch it spreads one level down was not, so an existing `"provider": ["a", "b"]` merged to `{"0": "a", "1": "b", …}`. Its sibling `mergeOpenCodeConfigText` already refuses the same input. +- **fix(models):** a model synced from a provider's own `/models` discovery is now enforced at its real context window immediately, instead of waiting up to 24h for the Feature 5004 reconciler's next tick. The request-time token-limit chain resolves the window from `auto:discovery` overrides, which previously were only written at startup and on a 24h interval — so any model synced mid-cycle (models.dev not indexing it yet, no static registry entry) fell through to the provider's static `defaultContextLength` (128K for OpenRouter) while `/v1/models` simultaneously advertised the real window from the same discovery data. Measured: `openrouter/stealth/ox-alpha` advertised `context_length: 1048576` but rejected requests over 128K with `context_length_exceeded` for a full day after its sync. The reconcile now also runs opportunistically (debounced, fire-and-forget) right after a synced catalog write changes. Companion fix: discovery now captures the vendor-declared `reasoning.default_effort` (e.g. OpenRouter `stealth/ox-alpha` declares `max`, normalized to `xhigh`) as `defaultThinkingEffort`, and the OpenAI dispatch path injects it when a request carries no reasoning field of any shape — the lowest-priority default behind a `-{effort}` suffix alias and a static `ModelSpec.defaultReasoningEffort` — so a reasoning model that returns an empty response without an explicit effort gets the vendor default instead of `upstream_empty_response`. +- fix(api): repair broken `@/lib/db/connections` import in the usage utilization route that failed the production build (#10939 follow-up) +- chore(docs): regenerate PROVIDER_REFERENCE and refresh README diagram SVGs to the real provider count (347) +- chore(lint): prune ESLint suppressions orphaned on the release branch +- **fix(db):** the sql.js fallback now publishes the database atomically — temp file in the same directory, `fsync`, then `rename()` — instead of rewriting it in place with `writeFileSync`. sql.js has no incremental write path, so every save rewrote the whole image through an `O_TRUNC` open: for the duration of the write the on-disk database was 0 bytes and then partial, a window that scales with database size and recurs on every save. Unlike better-sqlite3 / node:sqlite, that window is not covered by SQLite's locking protocol, so it was visible to every OTHER process reading the same file (a backup job, a metrics exporter, an operator running `sqlite3`), which got `SQLITE_CORRUPT` — "database disk image is malformed" — while `PRAGMA integrity_check` passed moments later. It also closes a total-loss window: a crash mid-write used to leave the real database truncated, and now only leaves a stale temp file +- **api-manager:** allow empty combo restrictions ([#10066](https://github.com/diegosouzapw/OmniRoute/pull/10066)) — thanks @xz-dev, @adevwithpurpose +- **db:** publish the sql.js database atomically instead of rewriting it in place ([#10278](https://github.com/diegosouzapw/OmniRoute/pull/10278)) — thanks @maxmad64bis, @adevwithpurpose +- **cline:** stop generating proxy task ids ([#10279](https://github.com/diegosouzapw/OmniRoute/pull/10279)) — thanks @arafatkatze +- **models:** honor MODELS_DEV_SYNC_ENABLED=0 over dashboard settings ([#10299](https://github.com/diegosouzapw/OmniRoute/pull/10299)) — thanks @RaviTharuma, @ritheshcn25, @adevwithpurpose +- **sse:** keep Codex quota headers under the forwarding budget ([#10306](https://github.com/diegosouzapw/OmniRoute/pull/10306)) — thanks @RaviTharuma, @ritheshcn25 +- **ops:** Docker HEALTHCHECK probes /healthz not deep monitoring ([#10307](https://github.com/diegosouzapw/OmniRoute/pull/10307)) — thanks @RaviTharuma, @ritheshcn25, @adevwithpurpose +- **auto:** rate-limit empty-pool AUTO warnings ([#10344](https://github.com/diegosouzapw/OmniRoute/pull/10344)) — thanks @RaviTharuma +- **translator:** Normalize tool call names from lowercase to PascalCase when translating upstream responses to Claude Messages API format ([#10392](https://github.com/diegosouzapw/OmniRoute/pull/10392)) — thanks @giauphan +- **executors:** rotate to the next account on network throws when the account has a dedicated proxy ([#10402](https://github.com/diegosouzapw/OmniRoute/pull/10402)) — thanks @maxmad64bis +- **proxy-subscriptions:** allow local/loopback proxy-subscription fetch URLs ([#10416](https://github.com/diegosouzapw/OmniRoute/pull/10416)) — thanks @adevwithpurpose +- **sse:** bridge generic compatible-provider type id to concrete node id in credential lookup ([#10434](https://github.com/diegosouzapw/OmniRoute/pull/10434)) — thanks @adevwithpurpose +- **sse:** exclude search providers from credential-health scheduler sweep ([#10435](https://github.com/diegosouzapw/OmniRoute/pull/10435)) — thanks @adevwithpurpose +- **antigravity:** strip trailing model turn for native Gemini requests too ([#10436](https://github.com/diegosouzapw/OmniRoute/pull/10436)) — thanks @adevwithpurpose +- **sse:** gate structural chat admission shedding on real heap pressure ([#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437)) — thanks @adevwithpurpose +- **open-sse:** stop concurrent requests colliding on dedup hash for non-OpenAI formats ([#10438](https://github.com/diegosouzapw/OmniRoute/pull/10438)) — thanks @adevwithpurpose +- **cli:** guarantee non-empty [STARTUP] Fatal log on instrumentation-hook boot throw ([#10447](https://github.com/diegosouzapw/OmniRoute/pull/10447)) — thanks @adevwithpurpose +- **dashboard:** make provider card warning indicators expose the interaction they advertise ([#10448](https://github.com/diegosouzapw/OmniRoute/pull/10448)) — thanks @adevwithpurpose +- **dashboard:** media playground cards stop sending masked API key as Bearer ([#10449](https://github.com/diegosouzapw/OmniRoute/pull/10449)) — thanks @adevwithpurpose +- **sse:** mark gemini-3.5-flash as thinking-capable ([#10450](https://github.com/diegosouzapw/OmniRoute/pull/10450)) — thanks @adevwithpurpose +- **dashboard:** send periodic WS heartbeat pings to stop live-dashboard reconnect churn ([#10452](https://github.com/diegosouzapw/OmniRoute/pull/10452)) — thanks @adevwithpurpose +- **sse:** do not ZWJ-obfuscate the substring hermes in user text ([#10488](https://github.com/diegosouzapw/OmniRoute/pull/10488)) — thanks @RaviTharuma +- **models:** correct Codex context and combo limit resolution ([#10533](https://github.com/diegosouzapw/OmniRoute/pull/10533)) — thanks @jackjinke +- Database settings page returns HTTP 500 when SQLite lacks the optional dbstat table ([#10558](https://github.com/diegosouzapw/OmniRoute/pull/10558)) — thanks @TechNickAI +- **api:** name working OpenRouter ids when Gemini embed creds are missing ([#10565](https://github.com/diegosouzapw/OmniRoute/pull/10565)) — thanks @RaviTharuma +- **providers:** catalog OpenRouter Gemini Embedding 2 ids ([#10566](https://github.com/diegosouzapw/OmniRoute/pull/10566)) — thanks @RaviTharuma +- **reasoning:** preserve compatible response state ([#10574](https://github.com/diegosouzapw/OmniRoute/pull/10574)) — thanks @jackjinke +- **mcp:** make GitHub skill tools discoverable through omniroute_tool_search ([#10575](https://github.com/diegosouzapw/OmniRoute/pull/10575)) — thanks @branben +- **audio:** fall back nested STT models when the prefix provider has no credentials ([#10584](https://github.com/diegosouzapw/OmniRoute/pull/10584)) — thanks @RaviTharuma +- **deps:** upgrade @atjsh/llmlingua-2 to 2.0.5 and drop @tensorflow/tfjs ([#10610](https://github.com/diegosouzapw/OmniRoute/pull/10610)) — thanks @jonlwheat2-gif +- **sse:** add the missing minimax-music dispatch to music generation ([#10650](https://github.com/diegosouzapw/OmniRoute/pull/10650)) — thanks @octo-patch +- **translator:** merge consecutive same-role contents in direct claudeToGeminiRequest ([#10658](https://github.com/diegosouzapw/OmniRoute/pull/10658)) — thanks @Siva010 +- **catalog:** scope combo reasoning efforts by connection ([#10723](https://github.com/diegosouzapw/OmniRoute/pull/10723)) — thanks @xz-dev +- **tests:** drain two base-reds on release/v3.8.50 — auto/glm family pool and the ESLint gate ([#10726](https://github.com/diegosouzapw/OmniRoute/pull/10726)) — thanks @MichaelYcJo +- **search:** name /v1/search 502 provider and cause ([#10756](https://github.com/diegosouzapw/OmniRoute/pull/10756)) — thanks @RaviTharuma +- **build:** tolerate same-realpath symlink / stale-typed dest in assembleStandalone ([#10776](https://github.com/diegosouzapw/OmniRoute/pull/10776)) +- **docker:** warn when OMNIROUTE_MEMORY_MB disagrees with NODE_OPTIONS heap ([#10818](https://github.com/diegosouzapw/OmniRoute/pull/10818)) — thanks @RaviTharuma +- **auto:** log empty auto-family pools once per process ([#10820](https://github.com/diegosouzapw/OmniRoute/pull/10820)) — thanks @RaviTharuma +- **opencode-plugin:** keep bare combo ids unprefixed ([#10821](https://github.com/diegosouzapw/OmniRoute/pull/10821)) — thanks @RaviTharuma +- **images:** retry Codex image generation on a sibling ChatGPT account ([#10838](https://github.com/diegosouzapw/OmniRoute/pull/10838)) +- **images:** route bare dall-e-3 to OpenAI ([#10847](https://github.com/diegosouzapw/OmniRoute/pull/10847)) — thanks @RaviTharuma +- **mcp:** give provider-bound tool calls their own fetch budget ([#10860](https://github.com/diegosouzapw/OmniRoute/pull/10860)) — thanks @ntdat812 +- **providers:** treat a degraded cached catalog as a failed model sync ([#10862](https://github.com/diegosouzapw/OmniRoute/pull/10862)) — thanks @ntdat812 +- **proxy:** stop reporting IPv4-only proxies as dead ([#10868](https://github.com/diegosouzapw/OmniRoute/pull/10868)) — thanks @ntdat812 +- **perplexity-web:** make the built-in-search hint opt-in ([#10904](https://github.com/diegosouzapw/OmniRoute/pull/10904)) +- **combo:** clear stale sticky pins when stickiness is disabled ([#10907](https://github.com/diegosouzapw/OmniRoute/pull/10907)) — thanks @excessivechaos +- **relay:** resolve x-relay-path through the shared guard in the CF worker ([#10935](https://github.com/diegosouzapw/OmniRoute/pull/10935)) — thanks @ntdat812 +- **relay:** share one private-host guard across the three relay workers ([#10941](https://github.com/diegosouzapw/OmniRoute/pull/10941)) — thanks @ntdat812 +- **models:** enforce a synced model's real context window and default effort immediately ([#10957](https://github.com/diegosouzapw/OmniRoute/pull/10957)) — thanks @Neuron-Mr-White +- **db:** pause call-log rotate on SQLITE_CORRUPT ([#10979](https://github.com/diegosouzapw/OmniRoute/pull/10979)) — thanks @RaviTharuma +- **search:** skip catalog-default SearXNG localhost:8888 ([#10981](https://github.com/diegosouzapw/OmniRoute/pull/10981)) — thanks @RaviTharuma +- **opencode:** guard the provider block when merging an existing config ([#11004](https://github.com/diegosouzapw/OmniRoute/pull/11004)) — thanks @ntdat812 +- **resilience:** drain heavyweight SSE on SIGTERM ([#11020](https://github.com/diegosouzapw/OmniRoute/pull/11020)) — thanks @RaviTharuma +- **release:** drain v3.8.50 base-reds — build-breaking import, stale provider docs, orphaned suppressions ([#11038](https://github.com/diegosouzapw/OmniRoute/pull/11038)) +- **api:** refuse creating a routing combo without any model ([#11162](https://github.com/diegosouzapw/OmniRoute/pull/11162)) — thanks @maxmad64bis +- **routing:** forward lkgpEnabled into RoutingContext so the LKGP toggle works ([#11193](https://github.com/diegosouzapw/OmniRoute/pull/11193)) — thanks @pacocartones +- **routing:** keep keyless custom-compatible connections in the auto/* pool ([#11198](https://github.com/diegosouzapw/OmniRoute/pull/11198)) — thanks @pacocartones +- **analytics:** classify opencode-go as a flat-rate subscription ([#11199](https://github.com/diegosouzapw/OmniRoute/pull/11199)) — thanks @pacocartones ### 📝 Maintenance +- **docs(auth):** distinguish dashboard sessions, `oma_live_…` Access Tokens, manage-scoped API keys, and inference keys (addresses [#7786](https://github.com/diegosouzapw/OmniRoute/issues/7786)) ([#10823](https://github.com/diegosouzapw/OmniRoute/pull/10823)) — thanks @RaviTharuma - **refactor(providers):** removed the Puter provider (id `puter`, alias `pu`) entirely — registry entry, `PuterExecutor`, API-key preset, 33 free-catalog models, i18n auth hints and docs — at the request of Puter's owner, Nariman Jelveh. Migration 152 cleans up any locally stored Puter connections/keys/custom models; historical usage records are preserved. - **fix(types):** preserve the client response format contract while estimating usage for non-streaming responses (#8484) - Preserve the Responses API transform options contract under TypeScript 7. @@ -673,7 +1228,7 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **test(cli):** OpenCode plugin suite realigned to the bare-key static-catalog contract from #9178/#9175 (21 tests were red on every opencode-plugin CI run; 287/287 after) ([#9614](https://github.com/diegosouzapw/OmniRoute/pull/9614)) - Removed the unused `RadarReferrals` type export left by the radar referral-links feature (#9697), returning the dead-code ratchet to its 227 baseline. (#9738) - Reconcile the final v3.8.50 bundle-size and file-size ratchets against the measured release tip, preserving exact direction-down ceilings and their source attribution. ([#9839](https://github.com/diegosouzapw/OmniRoute/pull/9839)) -- **chore(quality):** expand all file-size baselines by +30% ahead of v3.8.51 (authorized DRIFT rebaseline) to unblock the pre-release queue; no functionality changes. (#9950) +- **chore(quality):** ratify in v3.8.50 a 30% per-file headroom increase for existing frozen and test-frozen baselines while retaining the global `1000`-line caps for new files; the initial top-level cap adjustment was corrected in the follow-up commit, with no runtime behavior change. ([`44fd0ed`](https://github.com/diegosouzapw/OmniRoute/commit/44fd0edd85a3089f2448c28a4b38bcc20f4d5667), [`fbbef4e`](https://github.com/diegosouzapw/OmniRoute/commit/fbbef4eaaf8b705f62c032c0dc952f5dfd58ddb5)) - fix(quality): tighten eslintWarnings baseline 5000->0 to match the gate's suppressions-applied measurement (unblocks require-tighten on every code PR) - **[v3.8.50] feat: add RTL layout compatibility CSS (fixes #7680)** ([#7987](https://github.com/diegosouzapw/OmniRoute/pull/7987)) — thanks @Dingding-leo - **[v3.8.50] feat(devin-desktop): replace public Windsurf provider** ([#8228](https://github.com/diegosouzapw/OmniRoute/pull/8228)) — thanks @backryun @@ -783,14 +1338,138 @@ _Living section — regenerated 2026-08-12 from all cycle commits (cycle open `e - **[TS7] fix(types): restore provider breaker predicate import** ([#10088](https://github.com/diegosouzapw/OmniRoute/pull/10088)) — thanks @backryun - **[TS7] ci: block new TypeScript 7 diagnostics** ([#10134](https://github.com/diegosouzapw/OmniRoute/pull/10134)) — thanks @backryun - **chore(repo): remove tracked local artifacts** ([#10178](https://github.com/diegosouzapw/OmniRoute/pull/10178)) — thanks @backryun -- **maintenance — direct pushes (rollup):** release-gate and base-red repairs pushed straight to the release branch (typecheck, unit, quality-ratchet, file-size and ESLint-baseline corrections, stale assertion updates), repository hygiene (`_tasks` symlink untracking, `.source`/`.playwright-cli`/`.cbmignore` ignore entries, Electron build-output ignores, Open Collective link removal) and CI re-triggers after GitHub Actions incidents +- **unreferenced-commit reconciliation — 140 commits:** the residual helper set contains 66 first-parent commits and 74 side-branch commits carried by merge PRs, all lacking an inline `#PR` in their own subjects. Disposition: 112 material commits are represented by their carrier PR, a domain rollup or the maintenance ledger; 18 remain explicit release HOLDs below; 2 commits are the same `_tasks`-untracking patch and are described once; 3 are net no-ops at integration; 3 are empty CI re-triggers retained only as history; and 2 stale count-sync commits are superseded by the frozen tip. Conventional-commit distribution across the full set is 33 features, 60 fixes and 47 maintenance/docs/test/refactor/CI/performance commits; the non-contiguous residual spans [commit `1b5f7dd`](https://github.com/diegosouzapw/OmniRoute/commit/1b5f7dd7e6808be31d6a258b57b60b2941058897) through [commit `9349af2`](https://github.com/diegosouzapw/OmniRoute/commit/9349af29c46ad94132c9592cfb07aa555594cb7f). External authors/co-authors in this set: thanks @backryun, @wgordon17, @adevwithpurpose, @benzntech, @hartmark, @xz-dev, @RaviTharuma, @dionjoshualobo, @excessivechaos, @artickc +- **RELEASE HOLD — not declared shipped: Video Bridge follow-ups.** Eighteen first-parent commits ([exact range `91ea94fb508487d43072a7eaab9f2754f93f8861^..34bb018d2167f7f7d24cc35aeea145014635345e`](https://github.com/diegosouzapw/OmniRoute/compare/ea0cdc559ccc087d723f311a4217598cee4bb2b8...34bb018d2167f7f7d24cc35aeea145014635345e)) implement the parked VB-FU follow-up set, but the private follow-up backlog still records no release authorization. The code is present in this release tip; it must not be treated as v3.8.50 release content until the owner explicitly decides to include or remove it — implementation by @backryun. +- **maintenance(provenance):** remove the Raycast, Hailuo Web, Felo Web, Qwen Web, Microsoft Designer Web, Gemini Web image-generation and EdgeTTS surfaces whose implementation provenance was not compatible with the project's MIT-only distribution policy; migration 163 clears their active credentials, aliases, combo targets and cached model state while preserving historical usage records. Negative contracts keep those surfaces absent and preserve the independent official MiniMax, Qwen Cloud/token-plan, Gemini chat, ChatGPT Web, OpenAI DALL-E and hosted OpenAI-compatible gateway paths. +- **maintenance(quality):** restore the exact 221 React Compiler suppressions that a stale baseline overwrite dropped, retain newer legitimate baseline changes, and add a regression contract for the six affected Hooks rules; also repair the malformed guided-endpoint header and compare structured ratchet-bank notes by value instead of object identity. Focused TDD and lint checks pass; the full official lint is rerun on the final integrated release OID before publication. - **deps (rollup):** dependency bumps and lockfile maintenance across the cycle — Dependabot groups and manual CVE-driven bumps ([#9081](https://github.com/diegosouzapw/OmniRoute/pull/9081), [#9082](https://github.com/diegosouzapw/OmniRoute/pull/9082), [#9427](https://github.com/diegosouzapw/OmniRoute/pull/9427), [#9458](https://github.com/diegosouzapw/OmniRoute/pull/9458), [#9459](https://github.com/diegosouzapw/OmniRoute/pull/9459), [#9461](https://github.com/diegosouzapw/OmniRoute/pull/9461), [#9462](https://github.com/diegosouzapw/OmniRoute/pull/9462), [#9472](https://github.com/diegosouzapw/OmniRoute/pull/9472)) - **docs/chore (rollup):** documentation, refactoring and repository-hygiene upkeep across the cycle ([#8954](https://github.com/diegosouzapw/OmniRoute/pull/8954), [#8991](https://github.com/diegosouzapw/OmniRoute/pull/8991), [#9059](https://github.com/diegosouzapw/OmniRoute/pull/9059), [#9194](https://github.com/diegosouzapw/OmniRoute/pull/9194), [#9258](https://github.com/diegosouzapw/OmniRoute/pull/9258), [#9508](https://github.com/diegosouzapw/OmniRoute/pull/9508)) - **main-branch plumbing (rollup):** work that landed on `main` between cycles and was carried into this one — the Mergify merge-queue migration and tuning (#7168, #7179, #7216, #7220, #7225), npm-publish unblock via dynamic runner + CI build reuse (#8941), CodeQL-driven e2e mock hardening (#7559), hermetic self-ref guard (#6634, #7341), coverage-baseline tightening (#7347), Dependabot alert resolutions via npm overrides (#8067, #8070), README flag/doc-link polish (#8317), and the v3.8.49 release plumbing itself (#7076) -- **deps:** bump the development group across 1 directory with 22 updates ([#10043](https://github.com/diegosouzapw/OmniRoute/pull/10043)) — thanks @app/dependabot -- **deps:** bump electron from 43.2.0 to 43.3.0 in /electron ([#10042](https://github.com/diegosouzapw/OmniRoute/pull/10042)) — thanks @app/dependabot -- **maint(release):** 45 direct pushes to the release branch with no PR ref — base-red and quality-gate repairs, i18n string completion and stream/type fixes (quality ×6, i18n ×5, deps ×3, agentrouter ×3, providers ×2, release ×2, security ×2, logging ×2) +- **deps:** bump the development group across 1 directory with 22 updates ([#10043](https://github.com/diegosouzapw/OmniRoute/pull/10043)) +- **deps:** bump electron from 43.2.0 to 43.3.0 in /electron ([#10042](https://github.com/diegosouzapw/OmniRoute/pull/10042)) - **maint(repo):** 29 chore/ci/test/docs commits rolled up — quality baselines, mutation registration, CI re-triggers, doc restructure and repo hygiene (#10187, #10189, #10190, #10193, #10196, #10203, #10204, #10205, #10207, #10210, #10236, #10318) +- **credit:** preserve attribution for the mutable cloud-route management-auth hardening whose GitHub author link is unresolved ([commit `7e2b839`](https://github.com/diegosouzapw/OmniRoute/commit/7e2b8399359d70b00fee81ea142a2e1f26441c0f)) — thanks @vittoroliveira-dev +- **refactor(codex):** isolate virtual quota pools ([#8367](https://github.com/diegosouzapw/OmniRoute/pull/8367)) — thanks @xz-dev +- **docs:** add troubleshooting guide for rate-limiting on free providers (429/400/401) ([#10112](https://github.com/diegosouzapw/OmniRoute/pull/10112)) — thanks @mrcram2021, @adevwithpurpose, and Bruno +- **maintenance:** Remove/mimocode sunset provider ([#10186](https://github.com/diegosouzapw/OmniRoute/pull/10186)) — thanks @Tushar49, @adevwithpurpose +- **refactor(providers):** unify xAI authentication entry point ([#10201](https://github.com/diegosouzapw/OmniRoute/pull/10201)) — thanks @backryun +- **docs(ops):** document Kubernetes probe recommendations — TCP (or soft HTTP) liveness, HTTP `/healthz` readiness, avoid `/api/monitoring/health` as kubelet liveness ([#10297](https://github.com/diegosouzapw/OmniRoute/pull/10297)) — thanks @RaviTharuma +- **docs(docker):** spell out that `:latest` tracks the highest **published** stable SemVer (not git `main`), and that GitOps should pin `X.Y.Z` ([#10317](https://github.com/diegosouzapw/OmniRoute/issues/10317)) +- **perf(electron):** bound lightweight readiness polling ([#10324](https://github.com/diegosouzapw/OmniRoute/pull/10324)) — thanks @backryun +- **ci(electron):** streamline release dependency setup ([#10325](https://github.com/diegosouzapw/OmniRoute/pull/10325)) — thanks @backryun +- **perf(electron):** defer hidden-start renderer creation ([#10327](https://github.com/diegosouzapw/OmniRoute/pull/10327)) — thanks @backryun +- **perf(electron):** optionally unload renderer on close (4/8) ([#10328](https://github.com/diegosouzapw/OmniRoute/pull/10328)) — thanks @backryun +- **docs(backend):** document that memory extraction, skills injection, and token refresh share the request event loop, plus dashboard kill switches ([#10349](https://github.com/diegosouzapw/OmniRoute/issues/10349)) +- **docs(docker):** document default SQLite as single-replica / HA-unsupported, including Recreate and HEALTHCHECK session blast radius ([#10350](https://github.com/diegosouzapw/OmniRoute/issues/10350)) +- **docs(backend):** document that pre-write SQLite backups (including models.dev pricing) are throttled to once per 60 minutes and can be disabled with `DISABLE_SQLITE_AUTO_BACKUP` ([#10351](https://github.com/diegosouzapw/OmniRoute/issues/10351)) +- **perf(electron):** prune authoring docs from packages ([#10359](https://github.com/diegosouzapw/OmniRoute/pull/10359)) — thanks @backryun +- **perf(electron):** verify better-sqlite3 v13 Node-API prebuilds instead of source rebuild ([#10367](https://github.com/diegosouzapw/OmniRoute/pull/10367)) — thanks @backryun +- **perf(electron):** ship optional ML/browser deps as installable packs ([#10382](https://github.com/diegosouzapw/OmniRoute/pull/10382)) — thanks @backryun +- **perf(electron):** build the Next standalone once and hydrate natives per leg (#10321 stage 8) ([#10390](https://github.com/diegosouzapw/OmniRoute/pull/10390)) — thanks @backryun +- **deps:** bump the production group across 1 directory with 21 updates ([#10403](https://github.com/diegosouzapw/OmniRoute/pull/10403)) — thanks @adevwithpurpose +- **chore(deps):** bump github/codeql-action from 4.37.4 to 4.37.6 ([#10405](https://github.com/diegosouzapw/OmniRoute/pull/10405)) +- **chore(deps):** bump github/codeql-action/analyze from 4.37.4 to 4.37.6 ([#10406](https://github.com/diegosouzapw/OmniRoute/pull/10406)) +- **chore(deps):** bump github/codeql-action/init from 4.37.4 to 4.37.6 ([#10407](https://github.com/diegosouzapw/OmniRoute/pull/10407)) +- **maintenance:** Sanitize test fixtures, add developer .env guidance, and add gitleaks… ([#10411](https://github.com/diegosouzapw/OmniRoute/pull/10411)) — thanks @blarovse +- **docs:** correct drifted counts, reconcile the v3.8.50 changelog and gate the free-forever number ([#10433](https://github.com/diegosouzapw/OmniRoute/pull/10433)) — thanks @backryun +- **test(build):** resolve standalone fixture paths from file URLs ([#10451](https://github.com/diegosouzapw/OmniRoute/pull/10451)) — thanks @backryun +- **maintenance:** Update SETUP_GUIDE.md ([#10490](https://github.com/diegosouzapw/OmniRoute/pull/10490)) — thanks @realize000 +- **docs:** add OmniCopilot (VS Code Copilot Chat) to platform table and links ([#10512](https://github.com/diegosouzapw/OmniRoute/pull/10512)) — thanks @backryun +- **deps:** bump electron from 43.3.0 to 43.4.0 in /electron ([#10622](https://github.com/diegosouzapw/OmniRoute/pull/10622)) +- **deps:** bump the production group with 14 updates ([#10625](https://github.com/diegosouzapw/OmniRoute/pull/10625)) — thanks @adevwithpurpose +- **deps:** bump the development group with 13 updates ([#10626](https://github.com/diegosouzapw/OmniRoute/pull/10626)) +- **refactor(sse):** ExecutorRegistry — route executor lookup through a runtime registry (R0.3) ([#10633](https://github.com/diegosouzapw/OmniRoute/pull/10633)) — thanks @backryun, @hartmark, @adevwithpurpose +- **docs:** add the VS Code Copilot Chat guide and document the /v1/models prefix modes ([#10648](https://github.com/diegosouzapw/OmniRoute/pull/10648)) — thanks @backryun +- **docs(compression):** document the output-style catalog and its extension point ([#10649](https://github.com/diegosouzapw/OmniRoute/pull/10649)) — thanks @backryun +- **test(aihorde):** guard client browser bundles ([#10682](https://github.com/diegosouzapw/OmniRoute/pull/10682)) — thanks @cryptiklemur +- **test(chatcore):** wait for queued call log writes ([#10683](https://github.com/diegosouzapw/OmniRoute/pull/10683)) — thanks @cryptiklemur +- **test(mcp):** declara a precondição de env dos testes de principal do CCR/MCP ([#10689](https://github.com/diegosouzapw/OmniRoute/pull/10689)) — thanks @backryun +- **test(guard):** widen the client-bundle guard to every "use client" entry point (#10692) ([#10700](https://github.com/diegosouzapw/OmniRoute/pull/10700)) — thanks @backryun +- **fix(tests):** drain three base-reds on the release branch — the Vietnamese locale regained parity with English (6 keys added), the chatCore SSE test now asserts the comment-free default that #10539 introduced instead of the trailer it replaced, and the Antigravity cloudcode test asserts the missing-messages guard it is named for instead of a `/ok/` regex that only ever matched the "ok" inside `: x-omniroute-tokens-in` ([#10704](https://github.com/diegosouzapw/OmniRoute/pull/10704)) +- **maintenance:** pUpdate python_requests.py ([#10731](https://github.com/diegosouzapw/OmniRoute/pull/10731)) — thanks @pandaaaa1990 +- chore(security): remove the unused `enforceSecrets()` duplicate of the boot secret check and pin the live `enforceWebRuntimeEnv()` wiring with a regression test (#10775) +- **maintenance:** add fa readme ([#10777](https://github.com/diegosouzapw/OmniRoute/pull/10777)) — thanks @farshidrezaei +- fix(quality): register GrokBuildToolCard.tsx react-hooks/set-state-in-effect suppression (dropped in #10778's uncommitted fix) +- **docs:** Custom combos are only invoked by their exact name in the `model` field — `auto` remains a separate zero-config router, and `openrouter/auto` is a paid OpenRouter product, not an alias ([#10779](https://github.com/diegosouzapw/OmniRoute/pull/10779)) — thanks @maxmad64bis +- chore(startup): remove `src/server-init.ts` (183 lines, never imported — the boot path is `src/instrumentation-node.ts`) and correct four `"called from server-init.ts"` comments left pointing at the dead entry point (#10780) +- **perf(compression):** accelerate Lite and Caveman whitespace & artifact cleaners with native V8 RegExp ([#10834](https://github.com/diegosouzapw/OmniRoute/pull/10834)) — thanks @adevwithpurpose +- fix(quality): rebaseline file-size for #10859's own modelCapabilities.ts/commandCode.ts growth (missed at merge time) +- **docs(openapi):** document the `GET` and `PUT` operations on `/api/combos/{id}`, and add an operation-level coverage floor so a missing verb can no longer hide behind a path that already counts as covered ([#10875](https://github.com/diegosouzapw/OmniRoute/pull/10875)) +- fix(quality): bump EXPECTED_FEATURE_FLAG_COUNT to 52 for #10889's own new flag (missed at merge time) +- **test(db):** replace three empty `test.skip` placeholders in the critical DB-state suite with real assertions — `resetDbInstance` must swap the singleton while the on-disk row survives, the on-disk DB must open in WAL journal mode, and `db_meta` must hold the seeded `schema_version` — so a regression in any of those invariants can no longer pass as silently green ([#10906](https://github.com/diegosouzapw/OmniRoute/pull/10906)) +- **refactor(tls):** consolidate 6 TLS client providers into shared factory + wrappers (reopen) ([#10910](https://github.com/diegosouzapw/OmniRoute/pull/10910)) — thanks @oyi77 +- **chore(deps):** bump github/codeql-action from 4.37.6 to 4.37.7 ([#10928](https://github.com/diegosouzapw/OmniRoute/pull/10928)) +- **chore(deps):** bump github/codeql-action/analyze from 4.37.6 to 4.37.7 ([#10929](https://github.com/diegosouzapw/OmniRoute/pull/10929)) +- **chore(deps):** bump github/codeql-action/init from 4.37.6 to 4.37.7 ([#10930](https://github.com/diegosouzapw/OmniRoute/pull/10930)) +- **deps:** bump the production group with 5 updates ([#10931](https://github.com/diegosouzapw/OmniRoute/pull/10931)) +- **deps:** bump the development group with 2 updates ([#10932](https://github.com/diegosouzapw/OmniRoute/pull/10932)) +- **provider(agnes):** refresh chat catalog to 2026.07.30 (openai chat/completions, 1.5/2.0/2.5-flash) ([#10942](https://github.com/diegosouzapw/OmniRoute/pull/10942)) — thanks @oyi77 +- **docs(docker):** document runtime RAM for coding-agent `/v1/responses` (image default 1 GiB heap is dashboard-only; 8–12 GiB heap for agents) ([#10982](https://github.com/diegosouzapw/OmniRoute/issues/10982)) +- **docs(docker):** document N independent `DATA_DIR`s as the supported large `/v1/responses` scale-out (one V8 heap ≠ host RAM; do not `replicas>1` on one SQLite file) ([#11024](https://github.com/diegosouzapw/OmniRoute/issues/11024)) — thanks @RaviTharuma +- **docs:** DEFAULT_RATE_LIMIT_PER_DAY unset is unlimited ([#11031](https://github.com/diegosouzapw/OmniRoute/pull/11031)) — thanks @Prajeeth-12 +- fix(quality): rebaseline file-size for modelCapabilities.ts (1016->1072) drift from merged tip fixes (#11034 et al) +- **refactor(providers):** dedupe identical opencode-zen/opencode-go model entries ([#11051](https://github.com/diegosouzapw/OmniRoute/pull/11051)) — thanks @maxmad64bis +- fix(quality): register `tests/unit/authz/oauth-autoimport-local-only.test.ts` in stryker `tap.testFiles` (residual of #11053) +- **test(stream):** direct coverage + comment for splitConcatenatedToolCallArguments (#11043 followup) ([#11135](https://github.com/diegosouzapw/OmniRoute/pull/11135)) — thanks @maxmad64bis +- **test(services):** align adoption tests with the opt-in contract from #11040 ([#11147](https://github.com/diegosouzapw/OmniRoute/pull/11147)) — thanks @backryun +- **refactor(dashboard):** mirror check button disable state in AddApiKeyModal Enter handler (#10995) ([#11156](https://github.com/diegosouzapw/OmniRoute/pull/11156)) — thanks @rqzbeh +- **docs(cli):** update opencode.ts JSDoc to reflect 128k context fallback (#11035) ([#11157](https://github.com/diegosouzapw/OmniRoute/pull/11157)) — thanks @rqzbeh +- chore(quality): drain two `release/v3.8.50` base-reds — refresh the drifted doc counts (159 migrations, 56 free-forever providers, 40 free-tier pools, incl. the 42 `llm.txt` locale mirrors) and move `uncloseai-noauth.test.ts` to a collected path so the UncloseAI no-auth regression guard actually runs (#11160) +- **perf(proxy):** implement non-blocking async proxy log batching and performance optimizations (A, B, C, D) ([#11182](https://github.com/diegosouzapw/OmniRoute/pull/11182)) — thanks @rqzbeh +- **refactor(dashboard):** format custom provider quota keys into title-cased labels ([#11188](https://github.com/diegosouzapw/OmniRoute/pull/11188)) — thanks @rqzbeh +- **docs(i18n):** clarify embedded services purpose for beginners ([#11204](https://github.com/diegosouzapw/OmniRoute/pull/11204)) — thanks @ignamiranda +- **docs:** add an embeddings client runbook with live-verified working/broken model ids and Hindsight 0.9.1 / Memorix 1.6.0 notes — thanks @RaviTharuma +- **chore(ci):** keep ad-hoc `BOT_TOKEN`/`BOT_URL` out of runtime env-doc sync and lock the exclusion in tests; this is the durable reapplication after the fully reverted #10828 attempt ([implementation](https://github.com/diegosouzapw/OmniRoute/commit/8bc2f0f10c4c8057604b27e4ed476d1966be24bf), [test](https://github.com/diegosouzapw/OmniRoute/commit/567b9db04dce68779014400f0ff43a54f3395a76)) — thanks @RaviTharuma +- chore(test): regenerate the provider/translate-path golden snapshot to reflect freebuff (#10531), fixing a base-red left by that merge (freebuff/freeinference key ordering only, no value changes). +- **chore(release):** resync the v3.8.50 provider and CLI catalogs, register the existing ChatCore mutation-coverage test, and document the local ZCode handshake identifier so the release quality gates reflect the current tree without changing ratchet baselines. +- **fix(ci):** route `open-sse/handlers/imageGeneration/providers/geminiWeb.ts`'s b64_json + download-failure message through `sanitizeErrorMessage()` instead of embedding a raw + `err.message`, clearing the `check:error-helper` base-red on `release/v3.8.50` (#9985). +- **fix(ci):** drain three more base-reds on `release/v3.8.50` (#9985). ESLint was reporting + 219 errors locally (vs. 25 in the last CI run) — all from `react-hooks/set-state-in-effect`, + `react-hooks/preserve-manual-memoization`, `react-hooks/immutability`, + `react-hooks/static-components`, `react-hooks/refs` and `react-hooks/purity`, six React + Compiler lint rules that `eslint-plugin-react-hooks` v7 turns on by default and that were + never frozen in `config/quality/eslint-suppressions.json` after the dependency bump. Froze + the pre-existing violations for those six rules via ESLint's native + `--suppress-rule`/`--suppressions-location` mechanism (the same pattern already used for + `@next/next/no-location-assign-relative-destination`) — no application code changed, no rule + disabled, only genuinely-new violations stay blocking. `check:dead-code` was at 418 against a + 415 baseline: removed the unused `src/lib/quota/providerCapabilities.ts` file and the unused + `ProviderQuotaMonitor` interface in `providerQuotaTelemetry.ts` (both dead since PR #10148, + 2026-08-18, confirmed via `grep`/knip cross-reference), landing at 416; the residual +1 could + not be attributed to a single recent commit after checking every dead-list entry touched + since the 2026-08-14 baseline measurement, so it is rebaselined with the investigation + recorded in `quality-baseline.json`. `tests/unit/autoCombo/tieredRotation.test.ts`'s + "rotates across all 43 Cerebras connection IDs" case was hitting vitest's 5000ms default + timeout on a 200-iteration synchronous `selectProvider()` loop under shared-devbox + contention (load average 40-60+ observed) — widened its explicit timeout to 20000ms; the + assertion itself is unchanged. +- **fix(tests):** drain two base-reds on the release branch — `auto/glm` now expects the Cloudflare AI Playground backend (its registry advertises `zai-org/glm-5.2` and `zai-org/glm-4.7-flash`, so it belongs in the family pool by the same rule already documented for `auggie`, `devin-cli-agentic` and `zcode`), and the ESLint gate is green again after the GitLab executor test dropped its five `as any` casts for a declared response shape and the CLI OAuth suppression count caught up with the two casts #10491 added. +- **fix(tests):** realign the two `stream-utils` passthrough cases that still asserted the pre-#10017 SSE framing — the event-boundary case declares the OpenAI Responses client format it actually exercises, and the metadata case now pins that surviving lines stay inside one event instead of expecting the `:`/`id:` control lines that #10473 stopped forwarding to every client format. +- **fix(tests):** drain several base-reds on `release/v3.8.50` (#9985) that were all instances + of the same pattern — a legitimate product change landed without updating the test that + asserted the old behavior: `tests/unit/glm-provider-model-import-route.test.ts` (12 tests) + and `tests/unit/model-sync-route.test.ts` (2 tests) predate #10603's "upstream model sync is + opt-in and manual overrides are preserved" change; `tests/unit/antigravity-model-aliases.test.ts` + predated #10537 retiring the collapsed `gemini-3.7-flash` alias in favor of its three tiered + ids. Also fixes a real data drift in `open-sse/config/freeModelCatalog.data.ts` (the `qwen-web` + free-catalog entry still pointed at the retired `qwen3.8-max-preview` id instead of the + current `qwen3.8-max`), corrects the zh-TW `providers.autoFetchModelsTooltip` string to the + glossary-canonical 快取 instead of 緩存, and removes an unused default export from + `src/lib/oauth/providers/zed-hosted.ts` (the named export already covers every consumer) to + shave one symbol off the `check:dead-code` ratchet regression. +- **chore(release):** synchronize migration-count documentation and document the opt-in `PROXY_LOG_INCLUDE_IPS` logging flag so the v3.8.50 quality gates match the release tree. +- fix(i18n): translate the 14 `providers.harImport*` keys into Vietnamese (parity gap left by #11069) +- **docs:** add embeddings client runbook for Gemini 2 and Jina omni ([#10569](https://github.com/diegosouzapw/OmniRoute/pull/10569)) — thanks @RaviTharuma +- **docker:** clarify latest tracks published stable SemVer ([#10816](https://github.com/diegosouzapw/OmniRoute/pull/10816)) — thanks @RaviTharuma +- **docker:** document SQLite single-replica HA limits ([#10817](https://github.com/diegosouzapw/OmniRoute/pull/10817)) — thanks @RaviTharuma +- **db:** document throttled pre-write SQLite backups ([#10824](https://github.com/diegosouzapw/OmniRoute/pull/10824)) — thanks @RaviTharuma +- **backend:** document memory/skills/token-refresh event-loop cost ([#10825](https://github.com/diegosouzapw/OmniRoute/pull/10825)) — thanks @RaviTharuma +- **docs:** document runtime RAM for coding-agent /v1/responses ([#10983](https://github.com/diegosouzapw/OmniRoute/pull/10983)) — thanks @RaviTharuma + + + ### 🙌 Contributors @@ -799,7 +1478,10 @@ Thanks to everyone whose work landed in v3.8.50: | Contributor | PRs / Issues | | --- | --- | | [@AbdullahFageeh](https://github.com/AbdullahFageeh) | #9087 | -| [@adevwithpurpose](https://github.com/adevwithpurpose) | #9790, #10118, #10222 | +| [@abhijeetnardele24-hash](https://github.com/abhijeetnardele24-hash) | #10498 | +| [@Abhishek4512009](https://github.com/Abhishek4512009) | #10494 | +| [@acc0mplish](https://github.com/acc0mplish) | #10732, #10948 | +| [@adevwithpurpose](https://github.com/adevwithpurpose) | #9790, #10118, #10222, #10403, #10416, #10434, #10435, #10436, #10437, #10438, #10447, #10448, #10449, #10450, #10452, #10506, #10625, #10800, #10834, #10835, #10836, #10882 | | [@adrianojiu](https://github.com/adrianojiu) | #8438 | | [@agisota](https://github.com/agisota) | #9837 | | [@AgnesRiber](https://github.com/AgnesRiber) | #9718, #9976 | @@ -808,79 +1490,112 @@ Thanks to everyone whose work landed in v3.8.50: | [@AlanSyue](https://github.com/AlanSyue) | direct commit / report | | [@alex-jordan547](https://github.com/alex-jordan547) | #9235, #9245, #9813 | | [@amartinawi](https://github.com/amartinawi) | #10090, #10091, #10092, #10097, #10101 | -| [@AndrianBalanescu](https://github.com/AndrianBalanescu) | #8888, #8889, #8890, #8891, #8892, #8893, #8894, #8895 | +| [@AndrianBalanescu](https://github.com/AndrianBalanescu) | #8888, #8889, #8890, #8891, #8892, #8893, #8894, #8895, #11081, #11082 | | [@AnhLead](https://github.com/AnhLead) | #9722 | | [@aniketshukla1](https://github.com/aniketshukla1) | #9148 | | [@Anjielon](https://github.com/Anjielon) | #8776 | +| [@anudeepadi](https://github.com/anudeepadi) | #10288 | | [@apoapostolov](https://github.com/apoapostolov) | #8916 | +| [@arafatkatze](https://github.com/arafatkatze) | #10279, #10706 | | [@ARC345](https://github.com/ARC345) | #9628, #10050, #10051 | -| [@artickc](https://github.com/artickc) | #8571, #8578, #8791, #8843, #8870, #8927, #8974, #9097, #9549 | +| [@arminanton](https://github.com/arminanton) | #10933 | +| [@aron-intframe](https://github.com/aron-intframe) | #10459 | +| [@artickc](https://github.com/artickc) | #8571, #8578, #8791, #8843, #8870, #8927, #8974, #9097, #9255, #9549 | | [@Arul-](https://github.com/Arul-) | #9761 | +| [@asorourx](https://github.com/asorourx) | #11036 | | [@AStupidBear](https://github.com/AStupidBear) | #10180 | +| [@azzaouiomar19-sketch](https://github.com/azzaouiomar19-sketch) | #10394 | | [@b1nhm1nh](https://github.com/b1nhm1nh) | direct commit / report | -| [@backryun](https://github.com/backryun) | #8228, #8451, #8627, #8809, #8818, #9084, #9086, #9090, #9091, #9092, #9093, #9114, #9119, #9120, #9122, #9135, #9136, #9137, #9138, #9139, #9141, #9561, #9562, #9563, #9564, #9565, #9566, #9742, #9747, #9748, #9751, #9753, #9755, #9791, #9792, #9793, #9795, #9796, #9797, #9798, #9920, #9972, #9973, #9974, #9975, #9977, #9978, #9979, #9984, #9986, #9987, #9988, #9989, #9990, #9998, #10087, #10088, #10134, #10178, #10175, #10254, #10255, #10256, #10257, #10258, #10339 | +| [@backryun](https://github.com/backryun) | #8228, #8451, #8627, #8809, #8818, #9084, #9086, #9090, #9091, #9092, #9093, #9114, #9119, #9120, #9122, #9135, #9136, #9137, #9138, #9139, #9141, #9561, #9562, #9563, #9564, #9565, #9566, #9742, #9747, #9748, #9751, #9753, #9755, #9791, #9792, #9793, #9795, #9796, #9797, #9798, #9920, #9972, #9973, #9974, #9975, #9977, #9978, #9979, #9984, #9986, #9987, #9988, #9989, #9990, #9998, #10087, #10088, #10134, #10175, #10178, #10195, #10201, #10226, #10254, #10255, #10256, #10257, #10258, #10324, #10325, #10327, #10328, #10339, #10359, #10367, #10380, #10382, #10390, #10418, #10423, #10433, #10451, #10453, #10464, #10487, #10512, #10520, #10633, #10634, #10637, #10647, #10648, #10649, #10655, #10689, #10691, #10695, #10698, #10699, #10700, #10826, #10964, #11147, #11196, #11208 | | [@Benson-mk](https://github.com/Benson-mk) | #8369 | -| [@benzntech](https://github.com/benzntech) | #9810, #9812, #9939 | +| [@benzntech](https://github.com/benzntech) | #9784, #9810, #9812, #9939, #10124, #10126, #10366, #10458 | | [@Bl0ck154](https://github.com/Bl0ck154) | #9231 | +| [@blackwell-systems](https://github.com/blackwell-systems) | #10807 | +| [@blarovse](https://github.com/blarovse) | #10411 | | [@bortolidiego](https://github.com/bortolidiego) | #10058 | -| [@branben](https://github.com/branben) | #9940 | -| [@Chewji9875](https://github.com/Chewji9875) | #9257, #9420, #9821, #9994, #10160 | -| [@chirag127](https://github.com/chirag127) | #6674 | +| [@branben](https://github.com/branben) | #9940, #10575 | +| [@Chewji9875](https://github.com/Chewji9875) | #9257, #9420, #9821, #9994, #10116, #10160, #10305, #10376 | +| [@chirag127](https://github.com/chirag127) | #6674, #10071 | | [@chloeassistant](https://github.com/chloeassistant) | #9675, #9746 | | [@configurowebmax](https://github.com/configurowebmax) | #8877 | | [@corefusiion](https://github.com/corefusiion) | #8285 | | [@costaeder](https://github.com/costaeder) | #8626, #8629, #8630 | +| [@cryptiklemur](https://github.com/cryptiklemur) | #10682, #10683, #10684, #10685 | | [@csoftware-arigpt](https://github.com/csoftware-arigpt) | #3440 | | [@DaDecky](https://github.com/DaDecky) | direct commit / report | +| [@danscMax](https://github.com/danscMax) | #8634 | | [@DarkEsteves](https://github.com/DarkEsteves) | #10250 | +| [@dcox79](https://github.com/dcox79) | #10543 | | [@ddarkr](https://github.com/ddarkr) | #9035, #9036, #10177 | -| [@diegosouzapw](https://github.com/diegosouzapw) | maintainer | | [@Dingding-leo](https://github.com/Dingding-leo) | #7987, #8640, #8678, #8704, #8774, #8790, #8808, #8817 | | [@DinonowDev](https://github.com/DinonowDev) | #8804 | +| [@dionjoshualobo](https://github.com/dionjoshualobo) | direct commit / report | +| [@dpozimski](https://github.com/dpozimski) | #10253 | | [@Dragost](https://github.com/Dragost) | #8339 | | [@dsitmilis](https://github.com/dsitmilis) | direct commit / report | -| [@Egorich-print](https://github.com/Egorich-print) | #9001, #9020, #9058 | +| [@echoriver89](https://github.com/echoriver89) | #10717 | +| [@Egorich-print](https://github.com/Egorich-print) | #9001, #9020, #9058, #10881, #10887, #11097 | +| [@electrumguy](https://github.com/electrumguy) | #10774, #11149 | | [@engmarcosjr](https://github.com/engmarcosjr) | #9993 | | [@epsilonode](https://github.com/epsilonode) | #8871 | | [@ervareza](https://github.com/ervareza) | direct commit / report | -| [@excessivechaos](https://github.com/excessivechaos) | #10062, #10138 | +| [@excessivechaos](https://github.com/excessivechaos) | #10062, #10138, #10552, #10883, #10884, #10907 | | [@fajarhide](https://github.com/fajarhide) | #9191, #9198 | -| [@fenix007](https://github.com/fenix007) | #9618 | +| [@farshidrezaei](https://github.com/farshidrezaei) | #10777 | +| [@fenix007](https://github.com/fenix007) | #9618, #10016 | +| [@freudantunes](https://github.com/freudantunes) | #10623 | | [@Gecky2102](https://github.com/Gecky2102) | #9280 | -| [@ggdayup](https://github.com/ggdayup) | #10199 | +| [@geek007git](https://github.com/geek007git) | #10441 | +| [@ggdayup](https://github.com/ggdayup) | #10199, #11113, #11114 | +| [@Gi99lin](https://github.com/Gi99lin) | #10342 | +| [@giauphan](https://github.com/giauphan) | #10392 | | [@Gioxaa](https://github.com/Gioxaa) | #9162, #9171 | | [@HaoNgo232](https://github.com/HaoNgo232) | direct commit / report | | [@Hariprajwal](https://github.com/Hariprajwal) | #9922 | -| [@hartmark](https://github.com/hartmark) | #9635, #9704, #9711, #9712, #9727, #9734, #9735, #9738, #9741, #9744, #9745, #9822, #10025, #10034, #10037, #10038, #10041, #10121, #10217 | +| [@harkaranbrar7](https://github.com/harkaranbrar7) | #10281 | +| [@hartmark](https://github.com/hartmark) | #9635, #9704, #9708, #9711, #9712, #9727, #9734, #9735, #9738, #9741, #9744, #9745, #9822, #10025, #10034, #10037, #10038, #10041, #10121, #10217, #10262, #10263, #10330, #10331, #10739 | | [@Hdiaktoros](https://github.com/Hdiaktoros) | #8930 | | [@HectorBernstorff](https://github.com/HectorBernstorff) | direct commit / report | | [@HellFiveOsborn](https://github.com/HellFiveOsborn) | #9248 | -| [@herjarsa](https://github.com/herjarsa) | #9714, #9816, #9937, #9946, #10128 | +| [@herjarsa](https://github.com/herjarsa) | #9714, #9816, #9937, #9946, #10128, #10456, #10463 | +| [@hgaib](https://github.com/hgaib) | #10722 | | [@horacecar](https://github.com/horacecar) | #7679 | -| [@HouMinXi](https://github.com/HouMinXi) | #8886, #8904, #8905, #8976, #8984, #9079, #9106, #9207, #9242, #9328, #9340, #9342, #9351, #9365, #9380, #9381, #9392, #9449, #9482, #9483, #9509, #9510, #9572, #9631, #9634, #9695, #9929 | +| [@HouMinXi](https://github.com/HouMinXi) | #8886, #8904, #8905, #8976, #8984, #9079, #9106, #9207, #9242, #9328, #9340, #9342, #9351, #9365, #9380, #9381, #9392, #9449, #9482, #9483, #9509, #9510, #9572, #9631, #9634, #9695, #9929, #10457, #10475, #10525, #10529, #10573, #10663, #10846, #11084, #11139, #11140, #11141 | | [@hppsc1215](https://github.com/hppsc1215) | #8970 | -| [@hydraxman](https://github.com/hydraxman) | #10137 | +| [@Hsia97](https://github.com/Hsia97) | #10810 | +| [@hydraxman](https://github.com/hydraxman) | #10137, #10572 | | [@Iammilansoni](https://github.com/Iammilansoni) | #9353, #9397 | +| [@ignamiranda](https://github.com/ignamiranda) | #11195, #11204, #11206, #11215, #11224, #11227, #11228 | | [@ikelvingo](https://github.com/ikelvingo) | #8591, #8872, #9053 | | [@infinit-X](https://github.com/infinit-X) | #9095 | +| [@InkshadeWoods](https://github.com/InkshadeWoods) | #10733 | | [@isaaclb98](https://github.com/isaaclb98) | #9730 | -| [@jackjinke](https://github.com/jackjinke) | #9556, #9601, #10005, #10045 | +| [@jackjinke](https://github.com/jackjinke) | #9556, #9601, #10005, #10045, #10248, #10533, #10540, #10574, #11041 | | [@jax-novita](https://github.com/jax-novita) | #8913 | | [@jeff-alves](https://github.com/jeff-alves) | #10221 | | [@jeyhunfaslanov](https://github.com/jeyhunfaslanov) | #10259 | | [@jhordanjw123](https://github.com/jhordanjw123) | #8736 | | [@jktan0504](https://github.com/jktan0504) | #9025 | | [@joachimBrindeau](https://github.com/joachimBrindeau) | #9200 | +| [@jonlwheat2-gif](https://github.com/jonlwheat2-gif) | #10610, #10709, #11194, #11201 | | [@JoshimOfficial](https://github.com/JoshimOfficial) | #9011 | | [@jowimila](https://github.com/jowimila) | #9325 | -| [@JxnLexn](https://github.com/JxnLexn) | #8933, #8940, #8944, #8949 | +| [@jxnlexn](https://github.com/jxnlexn) | #10927 | +| [@JxnLexn](https://github.com/JxnLexn) | #8933, #8940, #8944, #8949, #10422, #10608 | | [@Kaedo17](https://github.com/Kaedo17) | #8922 | +| [@KaspaPulse](https://github.com/KaspaPulse) | #10362 | | [@khoazero123](https://github.com/khoazero123) | #9272 | +| [@killmonger2317-coder](https://github.com/killmonger2317-coder) | #10445 | | [@KittisakT](https://github.com/KittisakT) | #9423 | +| [@Kizuno18](https://github.com/Kizuno18) | #10803 | | [@KooshaPari](https://github.com/KooshaPari) | #7329 | +| [@kriptoburak](https://github.com/kriptoburak) | #10854 | +| [@krishna3554](https://github.com/krishna3554) | #10620, #10855 | +| [@lamchun1110](https://github.com/lamchun1110) | #10372, #10397 | | [@larin-vas](https://github.com/larin-vas) | #9828 | | [@lazysaltyfish](https://github.com/lazysaltyfish) | direct commit / report | | [@LeonG606](https://github.com/LeonG606) | #9457 | +| [@linhdmn](https://github.com/linhdmn) | #10980, #11085 | | [@Llliao1113](https://github.com/Llliao1113) | #8921 | | [@lucasalx](https://github.com/lucasalx) | #9919 | | [@lucasmellos](https://github.com/lucasmellos) | #8925 | @@ -889,76 +1604,116 @@ Thanks to everyone whose work landed in v3.8.50: | [@mad-gooze](https://github.com/mad-gooze) | #9052 | | [@maisdesign](https://github.com/maisdesign) | #8858 | | [@marchlhw](https://github.com/marchlhw) | #9050 | +| [@marcs7](https://github.com/marcs7) | #11180 | | [@matiasbaglieri](https://github.com/matiasbaglieri) | #9707 | -| [@maxmad64bis](https://github.com/maxmad64bis) | #9150, #9246, #9291, #9414 | +| [@maxmad64bis](https://github.com/maxmad64bis) | #9150, #9246, #9291, #9414, #10278, #10402, #10652, #10654, #10657, #10662, #10664, #10694, #10770, #10771, #10779, #10876, #10885, #10973, #10974, #10978, #11008, #11009, #11043, #11047, #11049, #11050, #11051, #11110, #11116, #11129, #11133, #11135, #11151, #11152, #11158, #11162 | | [@McLuck](https://github.com/McLuck) | #8914 | +| [@megamen32](https://github.com/megamen32) | #10184 | +| [@MeRezaRezaei](https://github.com/MeRezaRezaei) | #10174, #10614, #10944, #11042, #11045 | | [@Michael-Rocco-Goldmann](https://github.com/Michael-Rocco-Goldmann) | #9770, #9773, #9777, #9787 | -| [@MichaelYcJo](https://github.com/MichaelYcJo) | #8244 | +| [@MichaelYcJo](https://github.com/MichaelYcJo) | #8244, #10725, #10726 | +| [@minhlongs](https://github.com/minhlongs) | #10805 | | [@minhnhat166](https://github.com/minhnhat166) | direct commit / report | | [@MohitRawat017](https://github.com/MohitRawat017) | #8718, #8772, #9605 | | [@Momen4444](https://github.com/Momen4444) | #9612 | +| [@mrcram2021](https://github.com/mrcram2021) | #10112 | | [@MrShitFox](https://github.com/MrShitFox) | #9826 | | [@mtb-ninja](https://github.com/mtb-ninja) | #10114 | | [@MumuTW](https://github.com/MumuTW) | #8839 | | [@mvanhorn](https://github.com/mvanhorn) | #9542 | | [@Mynacol](https://github.com/Mynacol) | #9733 | -| [@nguyenha935](https://github.com/nguyenha935) | #9044, #9215 | +| [@NahuSaruf](https://github.com/NahuSaruf) | #10545 | +| [@Neuron-Mr-White](https://github.com/Neuron-Mr-White) | #10228, #10230, #10957 | +| [@nguyenha935](https://github.com/nguyenha935) | #8450, #9044, #9215 | | [@nordz0r](https://github.com/nordz0r) | #10170 | | [@nosolosoft](https://github.com/nosolosoft) | #8900 | -| [@oyi77](https://github.com/oyi77) | #8299, #8752, #9158, #9818 | -| [@pacocartones](https://github.com/pacocartones) | #10216 | +| [@ntdat812](https://github.com/ntdat812) | #10843, #10853, #10857, #10858, #10860, #10862, #10868, #10935, #10941, #11004 | +| [@ntdatt812](https://github.com/ntdatt812) | #10715, #11076 | +| [@octo-patch](https://github.com/octo-patch) | #10650 | +| [@oyi77](https://github.com/oyi77) | #8299, #8752, #9158, #9818, #10910, #10942 | +| [@pacocartones](https://github.com/pacocartones) | #10216, #10673, #11059, #11193, #11198, #11199 | +| [@pandaaaa1990](https://github.com/pandaaaa1990) | #10731 | +| [@phatchau036](https://github.com/phatchau036) | #10517 | +| [@phuongddx](https://github.com/phuongddx) | #10896 | | [@PixmaNts](https://github.com/PixmaNts) | #9432 | | [@pizzav-xyz](https://github.com/pizzav-xyz) | #9077 | -| [@Poid-ZA](https://github.com/Poid-ZA) | #9467 | +| [@Poid-ZA](https://github.com/Poid-ZA) | #9467, #10769 | +| [@Prajeeth-12](https://github.com/Prajeeth-12) | #11031 | | [@Prudhvivuda](https://github.com/Prudhvivuda) | #8807, #9014, #9015, #9016 | +| [@pucedoteth](https://github.com/pucedoteth) | #10607 | | [@qianze0628](https://github.com/qianze0628) | #9038 | | [@raflyazf](https://github.com/raflyazf) | direct commit / report | -| [@Rahulsharma0810](https://github.com/Rahulsharma0810) | #8961 | -| [@rinseaid](https://github.com/rinseaid) | #8945, #9037, #9932, #9933, #9969, #9982 | +| [@Rahulsharma0810](https://github.com/Rahulsharma0810) | #8961, #10872 | +| [@RaviTharuma](https://github.com/RaviTharuma) | #10297, #10299, #10306, #10307, #10344, #10488, #10565, #10566, #10568, #10569, #10584, #10756, #10814, #10816, #10817, #10818, #10819, #10820, #10821, #10822, #10823, #10824, #10825, #10827, #10828, #10847, #10971, #10977, #10979, #10981, #10983, #10988, #11014, #11015, #11016, #11017, #11020, #11024 | +| [@realize000](https://github.com/realize000) | #10490 | +| [@redzrush101](https://github.com/redzrush101) | #10492 | +| [@rinseaid](https://github.com/rinseaid) | #8945, #9037, #9932, #9933, #9969, #9982, #10554 | | [@rixzkiye](https://github.com/rixzkiye) | direct commit / report | +| [@rizxfrog](https://github.com/rizxfrog) | #10356, #10546 | | [@RobertsXML](https://github.com/RobertsXML) | direct commit / report | | [@royanrosyad85](https://github.com/royanrosyad85) | direct commit / report | +| [@rqzbeh](https://github.com/rqzbeh) | #10415, #10420, #10424, #10430, #10465, #10470, #10890, #10894, #10898, #10899, #10901, #11039, #11054, #11055, #11056, #11067, #11078, #11079, #11117, #11123, #11125, #11132, #11155, #11156, #11157, #11161, #11163, #11168, #11173, #11175, #11177, #11182, #11188, #11189 | | [@rushsinging](https://github.com/rushsinging) | #8947 | | [@ryan-brosas](https://github.com/ryan-brosas) | #9693 | | [@ryanngit](https://github.com/ryanngit) | direct commit / report | -| [@sadSanta-07](https://github.com/sadSanta-07) | #9938 | +| [@sadSanta-07](https://github.com/sadSanta-07) | #9938, #10209, #10605, #10772 | | [@SalyyS1](https://github.com/SalyyS1) | direct commit / report | | [@Sam280903](https://github.com/Sam280903) | #9274, #9278, #9281, #9283, #9448 | +| [@sanforex24h](https://github.com/sanforex24h) | #11026 | +| [@SCys](https://github.com/SCys) | #11107 | | [@seakleangnhak](https://github.com/seakleangnhak) | direct commit / report | | [@seanford](https://github.com/seanford) | #8523 | | [@SemonCat](https://github.com/SemonCat) | direct commit / report | +| [@sha367](https://github.com/sha367) | #10471 | | [@shixi-li](https://github.com/shixi-li) | #9022, #9513, #10001 | +| [@Siva010](https://github.com/Siva010) | #10658 | +| [@SnCr90](https://github.com/SnCr90) | #10534 | | [@soulhakr](https://github.com/soulhakr) | #8799 | -| [@stanleytejakusuma](https://github.com/stanleytejakusuma) | #9610 | +| [@stanleytejakusuma](https://github.com/stanleytejakusuma) | #9610, #10635, #10636, #10660, #10730 | | [@Stazyu](https://github.com/Stazyu) | #9007, #9226, #9438 | | [@SupremeNexas](https://github.com/SupremeNexas) | #9913 | -| [@swingtempo](https://github.com/swingtempo) | #9307 | +| [@swingtempo](https://github.com/swingtempo) | #9307, #10354 | | [@szzhoujiarui](https://github.com/szzhoujiarui) | #9218 | | [@tald26](https://github.com/tald26) | #9959 | | [@taltas](https://github.com/taltas) | direct commit / report | -| [@TechNickAI](https://github.com/TechNickAI) | #9251 | +| [@TechNickAI](https://github.com/TechNickAI) | #9251, #10558 | | [@TengSivtean](https://github.com/TengSivtean) | #10000, #10002, #10086 | | [@TheFrenchGhosty](https://github.com/TheFrenchGhosty) | #9326 | -| [@tiangao88](https://github.com/tiangao88) | #10046 | +| [@tiangao88](https://github.com/tiangao88) | #10046, #10363 | +| [@tientien17](https://github.com/tientien17) | #10798 | +| [@tito13kfm](https://github.com/tito13kfm) | #10246 | +| [@tkgo11](https://github.com/tkgo11) | #10370, #10371 | +| [@tuandinh0801](https://github.com/tuandinh0801) | #10804, #10830 | +| [@Tushar49](https://github.com/Tushar49) | #10186 | | [@tuxmonteiro](https://github.com/tuxmonteiro) | #9065 | | [@vinogradovnet](https://github.com/vinogradovnet) | #9581 | +| [@vittoroliveira-dev](https://github.com/vittoroliveira-dev) | direct commit / report | | [@VXNCXNX](https://github.com/VXNCXNX) | #9111, #9783 | | [@wgordon17](https://github.com/wgordon17) | #8909, #9233, #9441, #9619 | | [@Witroch4](https://github.com/Witroch4) | #8713 | | [@witt3rd](https://github.com/witt3rd) | #9962, #9963 | +| [@wpec](https://github.com/wpec) | #10839 | | [@XDayonline](https://github.com/XDayonline) | #10053 | -| [@xiaoyaner0201](https://github.com/xiaoyaner0201) | #8757, #8869, #8876, #8883, #8906, #8931, #9021, #9027, #9452, #9042, #9316 | -| [@xz-dev](https://github.com/xz-dev) | #8908, #9199, #9205, #9262, #9290, #9313, #9555, #9569, #9629, #9788, #9983, #10079, #10243 | -| [@yansigit](https://github.com/yansigit) | #9834, #9911, #9917, #9921, #10065 | +| [@xiaoyaner0201](https://github.com/xiaoyaner0201) | #8757, #8869, #8876, #8883, #8906, #8931, #9021, #9027, #9042, #9316, #9452, #10468 | +| [@xz-dev](https://github.com/xz-dev) | #8367, #8908, #9199, #9205, #9262, #9290, #9313, #9555, #9569, #9629, #9788, #9983, #10066, #10072, #10079, #10162, #10243, #10247, #10712, #10716, #10723, #10806, #10953, #10963 | +| [@yansigit](https://github.com/yansigit) | #9834, #9909, #9911, #9917, #9921, #10065 | +| [@yawar-aquil](https://github.com/yawar-aquil) | #10668 | | [@yidecode](https://github.com/yidecode) | direct commit / report | +| [@yourspraveen](https://github.com/yourspraveen) | #11165 | | [@yulinlina](https://github.com/yulinlina) | #10013 | +| [@YunyunZhai](https://github.com/YunyunZhai) | #10946 | | [@yutuknown](https://github.com/yutuknown) | #8999 | | [@zabrodschiipavel-sketch](https://github.com/zabrodschiipavel-sketch) | #9312 | -| [@Zartharas](https://github.com/Zartharas) | #9161, #9164, #9181, #9182, #9184, #9185, #9186, #9189, #9294, #9825, #9833, #9936, #9965, #9992, #10218 | +| [@zannen7](https://github.com/zannen7) | #10077 | +| [@Zartharas](https://github.com/Zartharas) | #9161, #9164, #9181, #9182, #9184, #9185, #9186, #9189, #9294, #9825, #9833, #9936, #9965, #9992, #10202, #10218, #10272, #10329, #10518, #10519, #10521, #10799, #10873, #10878 | | [@Zenlyte](https://github.com/Zenlyte) | #9005 | | [@zhiru](https://github.com/zhiru) | #9099, #9101 | | [@ziuus](https://github.com/ziuus) | #8912 | +| [@zmf963](https://github.com/zmf963) | #10738 | +| [@zoser69](https://github.com/zoser69) | #10874 | | [@zuckdorsey](https://github.com/zuckdorsey) | #9723 | +| Bruno (GitHub handle unresolved) | #10112 — commit co-author | +| [@diegosouzapw](https://github.com/diegosouzapw) | maintainer | --- diff --git a/PROVIDER_REFERENCE.md b/PROVIDER_REFERENCE.md deleted file mode 100644 index 571fe0e904..0000000000 --- a/PROVIDER_REFERENCE.md +++ /dev/null @@ -1,447 +0,0 @@ ---- -title: "Provider Reference" -version: 3.8.50 -lastUpdated: 2026-08-21 ---- - -# Provider Reference - -> **Auto-generated** from `src/shared/constants/providers.ts` — do not edit by hand. -> Regenerate with: `npm run gen:provider-reference` -> **Last generated:** 2026-08-21 - -Total providers: **349**. See category breakdown below. - -## Categories - -- **Free** — free tier with API key (configured via dashboard) -- **No-auth** — public endpoints that require no key or sign-in at all -- **OAuth** — sign-in flow handled by OmniRoute, no API key needed -- **Web cookie** — wraps the provider's web app via cookie auth -- **API key** — paid provider configured via API key (free credits may apply) -- **Local** — runs on the user's machine (Ollama, LM Studio, vLLM, etc.) -- **Search** — web search providers -- **Audio** — audio-only providers (TTS/STT) -- **Upstream proxy** — providers that proxy to other providers -- **Cloud agent** — long-running coding agents (Codex Cloud, Devin, Jules) -- **System** — OmniRoute-internal providers (loopback, etc.) - -Additional tags: `image`, `video`, `aggregator`, `enterprise`, `embed/rerank`, `self-hosted`. - -`Tool calling` (where shown): `native` — real function-calling API; `emulated` — the `tools` array is prompt-emulated via `webTools.ts` (regex-parsed `{...}` blocks); `none` — `tools` is currently silently dropped. See #7286. - -Use the dashboard at `/dashboard/providers` to enable, configure, and test each provider. - ---- - -## No-auth Providers (no key required) (11) - -| ID | Alias | Name | Tags | Website | Notes | Tool calling | -|----|-------|------|------|---------|-------|--------------| -| `aihorde` | `horde` | AI Horde | No-auth | [link](https://aihorde.net) | No API key required — uses AI Horde's documented anonymous key. Adding a free aihorde.net key is optional and only buys higher queue priority (kudos). | — | -| `auggie` | `aug` | Augment (Auggie CLI) | No-auth | [link](https://augmentcode.com) | No API key stored by OmniRoute. Install the Auggie CLI and run `auggie login` on this machine, then OmniRoute spawns it locally for each request. | — | -| `chipotle` | `pepper` | Chipotle Pepper AI (Free) | No-auth | [link](https://amelia.chipotle.com) | No credentials required. Uses Chipotle's public support chatbot via reverse-engineered SockJS/STOMP protocol. | — | -| `cloudflare-playground` | `cfp` | Cloudflare AI Playground | No-auth | [link](https://playground.ai.cloudflare.com) | No credentials required — anonymous browser sessions over a reverse-engineered cf_agent WebSocket protocol (Playwright transport). | — | -| `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | No-auth | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Authentication is owned by the official Devin CLI in its isolated bridge volume. | emulated | -| `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | No-auth | [link](https://duckduckgo.com/duckchat) | No credentials required — DuckDuckGo AI Chat is anonymous and free. | emulated | -| `felo-web` | `felo` | Felo | No-auth | [link](https://felo.ai) | No credentials required — Felo is a free, no-signup chat/search aggregator. | — | -| `opencode` | `oc` | OpenCode Free | No-auth | [link](https://opencode.ai) | No API key required — uses OpenCode's public free endpoint. | — | -| `theoldllm` | `tllm` | The Old LLM (Free) | No-auth | [link](https://theoldllm.vercel.app) | No credentials required. The executor auto-generates access tokens via an embedded Playwright browser instance. | — | -| `veoaifree-web` | `veo-free` | Veo AI Free | No-auth, video | [link](https://veoaifree.com) | No auth required. Rate limited to 6 requests/hour per IP. | — | -| `zcode` | `zc` | ZCode (GLM Coding Plan) | No-auth | [link](https://zcode.z.ai) | No API key stored by OmniRoute. The local ZCode app-server uses the existing builtin:zai-coding-plan login. | — | - -## OAuth Providers (25) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `agy` | `agy` | Antigravity CLI | OAuth | [link](https://antigravity.google) | Import your Antigravity CLI (`agy`) login (paste/upload its token file), auto-detect a local CLI login, or sign in with Google. Shares the Antigravity backend (incl. Claude models). | -| `amazon-q` | `aq` | Amazon Q | OAuth | [link](https://aws.amazon.com/q/developer/) | Uses the same AWS Builder ID or imported refresh-token flow as Kiro, but keeps Amazon Q connections separate. | -| `antigravity` | — | Antigravity | OAuth | — | — | -| `claude` | `cc` | Claude Code | OAuth | — | — | -| `cline` | `cl` | Cline | OAuth | — | — | -| `clinepass` | `cp` | ClinePass | OAuth | [link](https://cline.bot/cline-pass) | ClinePass is Cline's $9.99/mo subscription bundling 10 open coding models. Sign in with your Cline account (same login as the Cline CLI/IDE), or paste a direct ClinePass API key (app.cline.bot → Settings → API Keys). A ClinePass subscription unlocks the cline-pass/* models. Reuses the Cline WorkOS OAuth flow. | -| `codebuddy-cn` | `cbcn` | CodeBuddy CN | OAuth | [link](https://copilot.tencent.com) | Tencent CodeBuddy CN (copilot.tencent.com). Sign in via the official CLI device-code flow, or paste a direct API key (sent as Authorization: Bearer). Catalog: GLM / Kimi / MiniMax / DeepSeek / Hunyuan. | -| `codex` | `cx` | OpenAI Codex | OAuth | — | — | -| `cursor` | `cu` | Cursor IDE | OAuth | — | — | -| `devin-cli` | `dv` | Devin CLI | OAuth | [link](https://cli.devin.ai) | Requires the Devin CLI binary. Run `devin auth login` to authenticate, or provide your WINDSURF_API_KEY. Install: https://cli.devin.ai | -| `devin-desktop` | — | Devin Desktop | OAuth | [link](https://devin.ai) | Paste an existing Devin API key from an authenticated Devin session. Key export availability and steps vary by Devin version and account. | -| `ghe-copilot` | `ghe-copilot` | GitHub Enterprise Copilot | OAuth | — | Enter your GHE instance URL (e.g., https://ghe.company.com) in provider settings, then authenticate via device flow. | -| `github` | `gh` | GitHub Copilot | OAuth | — | — | -| `gitlab-duo` | `gitlab-duo` | GitLab Duo | OAuth | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab Duo OAuth is not configured. Register an OAuth application at https://gitlab.com/-/profile/applications with redirect URI http://localhost:20128/callback and scopes "ai_features read_user", then set GITLAB_DUO_OAUTH_CLIENT_ID (and optionally GITLAB_DUO_OAUTH_CLIENT_SECRET) and restart. | -| `grok-cli` | `gc` | Grok Build | OAuth | — | Sign in with your browser, or paste your ~/.grok/auth.json (or the JWT access token) from the Grok Build CLI; refresh_token is rotated automatically either way. | -| `kilocode` | `kc` | Kilo Code | OAuth | — | — | -| `kimi-coding` | `kmc` | Kimi Code CLI | OAuth | [link](https://www.kimi.com/code?aff=omniroute) | 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. | -| `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Sign in with your Openference account to route requests through api.openference.com. An active plan is required for inference — OAuth may authenticate but return 402 without one. | -| `qoder` | `if` | Qoder | OAuth | — | — | -| `raycast` | `rc` | Raycast Pro AI | OAuth | [link](https://raycast.com/ai) | Unofficial integration — uses your Raycast Pro subscription via credentials from the macOS app (Auto-Import or manual capture). May break on Raycast updates. Not for redistribution; personal use only. | -| `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 ', ~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. | -| `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. | - -## Web Cookie Providers (35) - -| ID | Alias | Name | Tags | Website | Notes | Tool calling | -|----|-------|------|------|---------|-------|--------------| -| `adapta-web` | `adp-web` | Adapta.org (Adapta One Web) | Web cookie | [link](https://agent.adapta.one) | Paste your __client cookie value from .clerk.agent.adapta.one (DevTools → Application → Cookies) | emulated | -| `adobe-firefly` | `firefly` | Adobe Firefly (Image/Video) | Web cookie | [link](https://firefly.adobe.com) | RECOMMENDED: firefly.adobe.com signed-in → F12 → Network → click firefly-3p.ff.adobe.io (generate-async or models/discovery) → Request Headers → Authorization → copy the token AFTER 'Bearer ' (starts with eyJ…). Cookie-only from firefly.adobe.com mints a GUEST token → 401/403; only multi-domain IMS cookies (adobelogin.com) or that Bearer JWT work. Unofficial/experimental media + Limits. | — | -| `blackbox-web` | `bb-web` | Blackbox Web (Subscription) | Web cookie | [link](https://app.blackbox.ai) | Paste your __Secure-authjs.session-token value or full cookie header from app.blackbox.ai | emulated | -| `chatgpt-web` | `cgpt-web` | ChatGPT Web (Plus/Pro) | Web cookie | [link](https://chatgpt.com) | Paste your __Secure-next-auth.session-token cookie value from chatgpt.com | emulated | -| `chatgpt-web-codex` | `cgpt-codex` | ChatGPT Web (Codex) | Web cookie | [link](https://chatgpt.com) | Paste the full ChatGPT Cookie header. OmniRoute verifies it in an isolated headless browser profile. | native | -| `claude-web` | `cw` | Claude Web | Web cookie | [link](https://claude.ai) | Paste your session cookie from claude.ai | none | -| `conol-web` | `cnl` | Conol (Unofficial/Experimental) | Web cookie | [link](https://conol.ai) | Use browser sign-in, or paste the full Cookie header from conol.ai. The __Secure-better-auth.session_token cookie is required. | — | -| `copilot-m365-web` | `m365copilot` | Microsoft 365 Copilot (BizChat) | Web cookie | [link](https://m365.cloud.microsoft/chat) | Sign in at m365.cloud.microsoft/chat, then open DevTools → Network → filter 'WS' → click the Chathub WebSocket connection. Copy both the access_token query parameter AND the account-specific Chathub path segment from its request URL (wss://…/Chathub/?…&access_token=…). It is NOT an Authorization: Bearer header on an XHR/Fetch request. The token is short-lived; this is an unofficial integration. Optional: store a refresh_token in providerSpecificData.refreshToken (any Microsoft device-code/refresh flow for the substrate.office.com/sydney scopes) and OmniRoute pre-flight-refreshes the access token itself — otherwise re-capture after every ~75 min expiry. | — | -| `copilot-web` | `copilot` | Microsoft Copilot Web | Web cookie | [link](https://copilot.microsoft.com) | Paste the access_token from an authenticated copilot.microsoft.com request (DevTools → Network → Authorization), or export a HAR while logged in | — | -| `deepseek-web` | `ds-web` | DeepSeek Web | Web cookie | [link](https://chat.deepseek.com) | Paste your userToken from chat.deepseek.com — DevTools → Application → Local Storage → userToken | emulated | -| `doubao-web` | `db` | Dola Web (ByteDance) | Web cookie | [link](https://www.dola.com) | Paste the full Cookie header from www.dola.com. It should include sessionid, ttwid, and s_v_web_id. If s_v_web_id is unavailable, fp=verify_... from a chat/completion request URL can be used as a fallback. | — | -| `gemini-business` | `gembiz` | Gemini Business (Enterprise) | Web cookie | [link](https://business.gemini.google) | From your enterprise account: open business.gemini.google/home/cid/{your-cid}, then copy __Secure-1PSID and __Secure-1PSIDTS cookies from DevTools → Application → Cookies. Paste as a cookie header below. | — | -| `gemini-web` | `gweb` | Gemini Web (Free) | Web cookie | [link](https://gemini.google.com) | Paste your __Secure-1PSID cookie value from gemini.google.com. Optionally add __Secure-1PSIDTS separated by semicolon. | emulated | -| `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. | — | -| `hailuo-web` | `hailuo-web` | Hailuo Web (MiniMax) | Web cookie | [link](https://hailuo.ai) | Open hailuo.ai, log in, then open DevTools → Application → Local Storage → copy the "_token" value. device_id/uuid fingerprint fields are derived automatically; if requests fail, re-capture _token (sessions can expire). | — | -| `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. | — | -| `hyperagent` | `ha` | HyperAgent (Unofficial/Experimental) | Web cookie | [link](https://hyperagent.com) | Paste the full Cookie header from hyperagent.com (DevTools → Network → any request → Request Headers → Cookie). Session cookies power chat + billing usage. | — | -| `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 | emulated | -| `kimi-web` | `kimi-web` | Kimi Web | Web cookie | [link](https://www.kimi.com/code?aff=omniroute) | 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 cookie AND the ecto1:... WS auth token from meta.ai. Capture the ecto1: token in DevTools → Network → WS → the clippy request's Authorization query param. Example: ecto_1_sess=4240a308...NVDg0; ecto1:ABCD... | emulated | -| `notion-web` | `nw` | Notion AI Web (Unofficial/Experimental) | Web cookie | [link](https://www.notion.so) | Paste only the token_v2 cookie VALUE from app.notion.com (DevTools → Application → Cookies → token_v2). Do not paste token_v2= or the full Cookie header. Workspace is auto-detected; space_id / notion_user_id are optional. | — | -| `perplexity-web` | `pplx-web` | Perplexity Web (Pro/Max) | Web cookie | [link](https://www.perplexity.ai) | Paste your __Secure-next-auth.session-token cookie value from perplexity.ai | emulated | -| `poe-web` | `poe` | Poe Web (Subscription) | Web cookie | [link](https://poe.com) | Paste your p-b cookie value from poe.com (DevTools → Application → Cookies → p-b) | — | -| `promptql` | `pql` | PromptQL (Unofficial/Experimental) | Web cookie | [link](https://prompt.ql.app) | Paste the Bearer JWT from prompt.ql.app DevTools → Network → graphql → Authorization (token only). Optional projectId + session Cookie for refresh. | — | -| `qwen-web` | `qwen-web` | Qwen Web (Free) | Web cookie | [link](https://chat.qwen.ai) | Open chat.qwen.ai, log in, then open DevTools → Application → Local Storage → copy the "token" value (or use tongyi_sso_ticket cookie as Bearer token). | emulated | -| `t3-web` | `t3chat` | t3.chat (Pro/Free) | Web cookie | [link](https://t3.chat) | Open t3.chat in your browser, log in, then open DevTools → Application → Local Storage → https://t3.chat. Copy the value of 'convex-session-id'. Also open DevTools → Network, copy the Cookie header from any request. Paste both values here. See provider setup docs for a step-by-step guide. | emulated | -| `tencent-aistudio-web` | `tasw` | Tencent AI Studio (Free) | Web cookie | [link](https://aistudio.tencent.ai) | Log in to aistudio.tencent.ai, open DevTools -> Network, copy any request Cookie header containing session tokens. | — | -| `tinycms-web` | `tcw` | TinyCMS Web (Free/Sub) | Web cookie | [link](https://site.tinycms.xyz) | Go to site.tinycms.xyz, open DevTools → Application → Local Storage, copy the value of 'app-config-uuid' (starts with 'R'), and paste it here. | — | -| `v0-vercel-web` | `v0-vercel-web` | v0 Vercel Web (Code Gen) | Web cookie | [link](https://v0.dev) | Paste your session cookie from v0.dev (DevTools → Application → Cookies) | — | -| `venice-web` | `ven` | Venice Web (Privacy) | Web cookie | [link](https://venice.ai) | Paste your session cookie from venice.ai (DevTools → Application → Cookies) | — | -| `yuanbao-web` | `ybw` | Tencent Yuanbao (Free) | Web cookie | [link](https://yuanbao.tencent.com) | Log in to yuanbao.tencent.com, then paste the full Cookie header (DevTools → Network → any /api request → Request Headers → Cookie). It must contain hy_user and hy_token. | — | -| `zai-web` | `zw` | Z.ai Web | Web cookie | [link](https://chat.z.ai) | Copy the "token" value from chat.z.ai → DevTools → Application → Local Storage. Do not copy cookies; OmniRoute handles the per-request CAPTCHA through its browser transport. | — | -| `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) (233) - -| 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, video | [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. | -| `ainative` | `ainative` | AINative Studio | API key | [link](https://ainative.studio) | Create a free API key at ainative.studio (no card), then paste it here as a Bearer token. | -| `aion` | `aion` | Aion Labs | API key | [link](https://www.aionlabs.ai) | Create a free API key at aionlabs.ai (no card), then paste it here as a Bearer token. | -| `alibaba` | `ali` | Alibaba Cloud Model Studio | API key | [link](https://bailian.console.alibabacloud.com/) | — | -| `alibaba-cn` | `ali-cn` | Alibaba (China) | API key | [link](https://dashscope.console.aliyun.com/) | — | -| `ant-ling` | `ling` | Ant Ling / Ring (inclusionAI) | API key | [link](https://developer.ant-ling.com/en/docs/) | Register and create an API key at the Ant Ling API console (https://chat.ant-ling.com/open), then paste it here. OmniRoute routes chat traffic to https://api.ant-ling.com/v1/chat/completions; the provider is OpenAI-compatible and also exposes an Anthropic-compatible surface. | -| `anthropic` | `anthropic` | Anthropic | API key | [link](https://platform.claude.com) | — | -| `anyapi` | `anyapi` | AnyAPI AI | API key, aggregator | [link](https://anyapi.ai) | Free plan: 100,000 ANY Tokens/day and 100 RPM for eligible Free/Basic models; no credit card required. | -| `api-airforce` | `af` | Api.airforce | API key | [link](https://api.airforce) | 55 free tier models including Grok-3, Claude 3.7, Qwen3, Kimi-K2, Gemini 2.5 Flash, DeepSeek-V3 | -| `arcee-ai` | `arcee` | Arcee AI | API key | [link](https://arcee.ai) | Get API key at arcee.ai | -| `auriko` | `auriko` | Auriko | API key, aggregator | [link](https://www.auriko.ai) | Free plan publishes 1,000 Platform RPM and 10,000 BYOK RPM. Platform inference still passes through provider cost; this is not a free-token pool or unlimited free inference. | -| `azure-ai` | `azure-ai` | Azure AI Foundry | API key, enterprise | [link](https://learn.microsoft.com/azure/ai-foundry) | Use your Azure AI Foundry key. Base URL can be https://.services.ai.azure.com/openai/v1/ or https://.openai.azure.com/openai/v1/. | -| `azure-openai` | `azure` | Azure OpenAI | API key, enterprise | [link](https://azure.microsoft.com/products/ai-services/openai-service) | Use your Azure OpenAI API key. Base URL should be your resource endpoint, for example https://my-resource.openai.azure.com. | -| `bai` | `bai` | b.ai | API key | [link](https://b.ai) | Bearer API key for the b.ai OpenAI-compatible LLM gateway (distinct from TheB.AI). Create a key at https://docs.b.ai, then use https://api.b.ai/v1 as the OpenAI-compatible base URL. | -| `baichuan` | `baichuan` | Baichuan | API key | [link](https://www.baichuan-ai.com/) | Get API key at platform.baichuan-ai.com | -| `baidu` | `baidu` | Baidu (ERNIE) | API key | [link](https://ernie.baidu.com/) | Get API key at console.bce.baidu.com | -| `bailian-coding-plan` | `bcp` | Alibaba Token Plan | API key | [link](https://www.alibabacloud.com/help/en/model-studio/token-plan-overview) | — | -| `baseten` | `baseten` | Baseten | API key | [link](https://baseten.co) | $30 free trial credits for GPU inference | -| `bazaarlink` | `bzl` | BazaarLink | API key | [link](https://bazaarlink.ai) | Use your BazaarLink API key (starts with sk-bl-) in Authorization: Bearer . OpenAI SDK works with base URL https://bazaarlink.ai/api/v1. Models use provider/model-name format. | -| `bedrock` | `bedrock` | Amazon Bedrock | API key, enterprise | [link](https://aws.amazon.com/bedrock) | Use your Amazon Bedrock API key and configure the AWS region where your models are enabled (for example eu-west-2). OmniRoute calls Bedrock's native Converse API directly. | -| `black-forest-labs` | `bfl` | Black Forest Labs | API key, image | [link](https://blackforestlabs.ai) | — | -| `blackbox` | `bb` | Blackbox AI | API key | [link](https://blackbox.ai) | Limited free access is available through Blackbox; model availability and account limits apply | -| `bluesminds` | `bm` | BluesMinds | API key | [link](https://www.bluesminds.com) | Free daily pi credits — supports 200+ models including GPT-4o, GPT-4.1, Claude Sonnet 4.5, Gemini 2.0 Flash, DeepSeek V4, Qwen, Kimi K2 | -| `byteplus` | `bpm` | BytePlus ModelArk | API key | [link](https://console.byteplus.com/ark) | — | -| `bytez` | `bytez` | Bytez | API key | [link](https://bytez.com) | $1 free credits, refreshes every 4 weeks | -| `cerebras` | `cerebras` | Cerebras | API key | [link](https://inference.cerebras.ai) | Free Trial: 1M tokens/day, 30K TPM, 5 RPM — no credit card. | -| `charm-hyper` | `charm-hyper` | Charm Hyper | API key | [link](https://hyper.charm.land) | 100 free monthly Hypercredits on signup | -| `chat-oripe` | `chat-oripe` | Chat Oripe | API key, aggregator | [link](https://api.oriper.com) | Official metadata advertises 2M tokens/month, but the public site and documentation were blocked during audit; treat the quota and brand mapping as unconfirmed. | -| `chatanywhere` | `chatanywhere` | ChatAnywhere | API key, aggregator | [link](https://chatanywhere.tech) | Personal, educational or research use only: public documentation cites 10,000 points/day and 200 requests/day per IP/key; do not use for commercial traffic. | -| `cheaperinference` | `cinf` | Cheaper Inference | API key | [link](https://cheaperinference.com/?utm_source=omniroute) | — | -| `chenzk` | `chenzk` | Chenzk API | API key | [link](https://chenzk.top) | — | -| `chutes` | `chutes` | Chutes.ai | API key, aggregator | [link](https://chutes.ai) | Bearer API key for the Chutes OpenAI-compatible gateway. | -| `clarifai` | `clarifai` | Clarifai | API key, enterprise | [link](https://docs.clarifai.com) | Use your Clarifai PAT or app-specific API key. OmniRoute targets the OpenAI-compatible endpoint at https://api.clarifai.com/v2/ext/openai/v1 and authenticates with Authorization: Key . | -| `cloudcode-one` | `cloudcode-one` | CloudCode.ONE | API key, aggregator | [link](https://cloudcode.one) | Published free models include glm-4.7-flash and glm-4.6v-flash; no numeric quota is published, and key creation may require credit or a coupon. | -| `cloudflare-ai` | `cf` | Cloudflare Workers AI | API key | [link](https://developers.cloudflare.com/workers-ai) | Requires API Token AND Account ID (found at dash.cloudflare.com) | -| `clova-studio` | `clova` | Naver CLOVA Studio | API key | [link](https://api.ncloud-docs.com/docs/en/ai-naver-clovastudio-summary) | — | -| `codestral` | `codestral` | Codestral | API key | [link](https://mistral.ai) | — | -| `cohere` | `cohere` | Cohere | API key | [link](https://cohere.com) | Free Trial: 1,000 API calls/month for testing, no credit card required | -| `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) | — | -| `cursor-api` | `cua` | Cursor API | API key | [link](https://cursor.com/dashboard/api) | Paste a Cursor user API key (crsr_...) from cursor.com/dashboard/api. OmniRoute exchanges it for a session token on demand; no IDE or cursor-agent install is needed. Usage bills to the Cursor plan that owns the key. | -| `dahl` | `dahl` | Dahl | API key | [link](https://inference.dahl.global) | Click 'Add Account' to auto-generate a token, or add a manual API key. | -| `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/. | -| `deepai` | `deepai` | DeepAI | API key, image | [link](https://deepai.org) | Use your DeepAI API key. Get one at deepai.org — requires a Pro subscription ($9.99/mo). | -| `deepinfra` | `deepinfra` | DeepInfra | API key | [link](https://deepinfra.com) | Free signup credits for API testing and model exploration | -| `deepseek` | `ds` | DeepSeek | API key | [link](https://platform.deepseek.com) | 5M free tokens on signup - no credit card required | -| `dgrid` | `dgrid` | DGrid | API key | [link](https://dgrid.ai) | DGrid Free Models Router: 10 requests/minute and 100 requests/day. A $5 lifetime top-up unlocks up to 20 requests/minute and 1,000 requests/day. | -| `dify` | `dify` | Dify | API key | [link](https://dify.ai) | Get API key from your Dify instance. | -| `digitalocean` | `digitalocean` | DigitalOcean | API key | [link](https://docs.digitalocean.com/products/ai-platform/) | — | -| `dit` | `dai` | DIT.ai | API key | [link](https://dit.ai) | Use your dit.ai API key in Authorization: Bearer . Fully OpenAI-compatible — a drop-in replacement, just change the base URL to https://api.dit.ai/v1. | -| `doubao` | `doubao` | Doubao | API key | [link](https://doubao.com) | Get API key at console.volcengine.com | -| `dxnt` | `dxnt` | DXNT / DX Token | API key, aggregator | [link](https://www.dxnt.com) | Free accounts are documented at 100 calls/day; the quota may increase through invitations and can vary by account. | -| `electronhub` | `electronhub` | Electron Hub | API key, aggregator | [link](https://www.electronhub.ai) | Free plan: 5 RPM, $0.25 weekly credits and 10 Neutrinos/day for :free models; family budgets also apply. | -| `empower` | `empower` | Empower | API key, aggregator | [link](https://docs.empower.dev) | Bearer API key for the Empower OpenAI-compatible endpoint. | -| `factory` | `factory` | Factory | API key | [link](https://factory.ai) | Bearer API key for the Factory OpenAI-compatible gateway. | -| `fal-ai` | `fal` | Fal.ai | API key, image | [link](https://fal.ai) | — | -| `fastrouter` | `fastrouter` | FastRouter | API key, aggregator | [link](https://fastrouter.ai) | Models with the :free suffix allow 10 requests/day per organization and model; availability may change. | -| `featherless-ai` | `featherless` | Featherless AI | API key | [link](https://featherless.ai) | Free tier available — no credit card required | -| `fenayai` | `fenayai` | FenayAI | API key, aggregator | [link](https://fenayai.com) | Bearer API key for the FenayAI OpenAI-compatible gateway. | -| `fireworks` | `fireworks` | Fireworks AI | API key | [link](https://fireworks.ai) | $1 free starter credits on signup for API testing | -| `free-ai` | `free-ai` | Free.ai | API key, aggregator | [link](https://free.ai) | 30,000 tokens/day cover self-hosted models after email verification. Usage beyond the pool can bill at raw cost, and premium external models are paid. | -| `freeaiapikey` | `faik` | FreeAIAPIKey | API key | [link](https://freeaiapikey.com) | — | -| `freebuff` | `freebuff` | Freebuff | API key | [link](https://freebuff.com) | Enter Freebuff / Codebuff Auth Token (obtained via CLI login or automated harvester). | -| `freeinference` | `freeinference` | FreeInference | API key, aggregator | [link](https://freeinference.org) | Free research access without a card; non-Harvard applicants require manual approval and no numeric quota is publicly guaranteed. | -| `freemodel-dev` | `fmd` | FreeModel.dev | API key | [link](https://freemodel.dev) | $300 free credits on signup — no credit card required. Access GPT-5.4 and GPT-5.5 (OpenAI's latest flagship models) through an OpenAI-compatible API. | -| `freetheai` | `fta` | FreeTheAi | API key, aggregator | [link](https://freetheai.xyz) | Join the FreeTheAi Discord to get your free API key. | -| `friendliai` | `friendli` | FriendliAI | API key | [link](https://friendli.ai) | Free tier for serverless inference — no credit card required | -| `g4f-gemini` | `g4fgem` | g4f.space — Gemini | API key, aggregator | [link](https://g4f.space) | No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits. | -| `g4f-groq` | `g4fgroq` | g4f.space — Groq | API key, aggregator | [link](https://g4f.space) | No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits. | -| `g4f-nvidia` | `g4fnv` | g4f.space — NVIDIA | API key, aggregator | [link](https://g4f.space) | No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits. | -| `g4f-ollama` | `g4foll` | g4f.space — Ollama | API key, aggregator | [link](https://g4f.space) | No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits. | -| `g4f-pollinations` | `g4fpol` | g4f.space — Pollinations | API key, aggregator | [link](https://g4f.space) | No auth required. Free tier is limited to 5 requests/minute — sign up at g4f.dev/members.html for higher limits. | -| `galadriel` | `galadriel` | Galadriel | API key | [link](https://galadriel.com) | ⚠️ **DEPRECATED.** api.galadriel.ai no longer resolves (sweep 2026-06-19); the inference API appears discontinued. | -| `gemini` | `gemini` | Gemini (Google AI Studio) | API key | [link](https://aistudio.google.com) | Free tier available through Google AI Studio; current per-model quotas and regional limits apply | -| `getgoapi` | `ggo` | GoAPI | API key, aggregator | [link](https://api.getgoapi.com) | — | -| `gigachat` | `gigachat` | GigaChat (Sber) | API key | [link](https://developers.sber.ru) | — | -| `gitlab` | `gitlab` | GitLab Duo PAT | API key | [link](https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/) | GitLab personal access token for the public Code Suggestions API. Configure a self-hosted base URL when not using gitlab.com. | -| `gitlawb` | `glb` | Gitlawb Opengateway (MiMo) | API key | [link](https://opengateway.gitlawb.com) | Free MiMo (xiaomi/mimo-v2.5) revoked 2026-05 — Opengateway is now a pay-as-you-go credit gateway; no recurring free model. | -| `gitlawb-gmi` | `glb-gmi` | Gitlawb Opengateway (GMI Cloud) | API key | [link](https://opengateway.gitlawb.com) | Free Nemotron promo ended 2026-06 — the GMI Cloud route is now pay-as-you-go credit only. | -| `glm` | `glm` | GLM Coding | API key | [link](https://z.ai/subscribe) | — | -| `glm-cn` | `glmcn` | GLM Coding (China) | API key | [link](https://open.bigmodel.cn) | — | -| `glmt` | `glmt` | GLM Thinking | API key | [link](https://open.bigmodel.cn) | — | -| `groq` | `groq` | Groq | API key | [link](https://groq.com) | Free tier: 30 RPM / 14.4K RPD — no credit card | -| `hackclub` | `hc` | Hackclub AI | API key, aggregator | [link](https://ai.hackclub.com) | Sign in with your Hack Club account at ai.hackclub.com. | -| `haiper` | `hp` | Haiper | API key, video | [link](https://haiper.ai) | Get API key at haiper.ai/haiper-api | -| `hcnsec` | `hcnsec` | Huancheng Public API | API key | [link](https://api.hcnsec.cn) | Get API key at api.hcnsec.cn | -| `helixmind` | `helixmind` | HelixMind | API key, aggregator | [link](https://helixmind.online) | Previously circulated 3 RPM/50 RPD and no-card claims were not confirmed during the 2026-08-02 audit; current quota and billing require account verification. | -| `helyxai` | `helyxai` | Helyx AI | API key, aggregator | [link](https://helyxai.space) | Operational Free plan documents 100,000 tokens/day; the site's separate 2M+ marketing claim conflicts and is not treated as a quota guarantee. | -| `heroku` | `heroku` | Heroku AI | API key, enterprise | [link](https://www.heroku.com) | — | -| `huggingface` | `hf` | HuggingFace | API key | [link](https://huggingface.co) | Free Inference API for thousands of models (Whisper, VITS, SDXL…) | -| `hyperbolic` | `hyp` | Hyperbolic | API key | [link](https://hyperbolic.xyz) | $1-5 trial credits on signup for serverless inference | -| `ideogram` | `ideo` | Ideogram | API key | [link](https://ideogram.ai) | Get API key at ideogram.ai/docs/api | -| `iflytek` | `iflytek` | iFlytek Spark | API key | [link](https://xinghuo.xfyun.cn) | Get API key at console.xfyun.cn | -| `inception` | `inception` | Inception | API key | [link](https://docs.inceptionlabs.ai) | 10M free tokens on signup, no credit card required. | -| `inference-net` | `inet` | Inference.net | API key | [link](https://inference.net) | $25 free credits on signup plus research grants available | -| `internlm` | `internlm` | InternLM (Intern-S1) | API key | [link](https://internlm.intern-ai.org.cn/) | Free monthly quota ~1M input / 3M output tokens (~10 RPM) | -| `jina-ai` | `jina` | Jina AI (Foundation API) | API key, embed/rerank | [link](https://jina.ai) | Bearer API key for api.jina.ai — embeddings, rerank, classify, segment, and search. Dashboard keys take precedence over JINA_AI_API_KEY. This is not the Reader / r.jina.ai card and does not fetch URLs. | -| `jina-reader` | `jr` | Jina Reader (r.jina.ai) | API key | [link](https://jina.ai/reader) | Bearer API key for r.jina.ai URL-to-markdown (/v1/web/fetch only). Does not serve /v1/embeddings or /v1/rerank. The same Jina token as Foundation API works; OmniRoute reuses a jina-ai dashboard key or JINA_AI_API_KEY when this card is empty. | -| `kenari` | `kenari` | Kenari | API key | [link](https://kenari.id) | Use your Kenari API key (kn-...) in Authorization: Bearer . 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 (Legacy Moonshot API) | API key | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `kimi-coding-apikey` | `kmca` | Kimi Code API Key | API key | [link](https://www.kimi.com/code?aff=omniroute) | — | -| `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 | -| `liquid` | `liquid` | Liquid AI | API key | [link](https://liquid.ai) | Get API key at liquid.ai | -| `literouter` | `literouter` | LiteRouter | API key, aggregator | [link](https://literouter.com) | Free model variants use the :free suffix; daily credit limits vary by model and free input is capped at 5,000 tokens. | -| `llamagate` | `llamagate` | LlamaGate | API key | [link](https://llamagate.ai) | — | -| `llm-kiwi` | `llmkiwi` | LLM.Kiwi | API key, aggregator | [link](https://llm.kiwi) | Free plan exposes auto and hrLLM; the published 40 requests/hour limit applies to hrLLM. | -| `llm7` | `llm7` | LLM7.io | API key | [link](https://llm7.io) | Use any non-empty key (for example 'unused'). If older built-in models return model_unavailable, use Available Models → Import from /models or Auto-Sync; verified live model: gemini-3.1-flash-lite. | -| `llmgateway` | `llmgateway` | LLM Gateway | API key, aggregator | [link](https://llmgateway.io) | Hosted Free plan: free-priced models are limited to 5 requests per 10 minutes when the account has no credits. | -| `logfare` | `logfare` | Logfare | API key, aggregator | [link](https://logfare.ai) | Create a free account at https://logfare.ai/register (username/password, no email verification) to get an instant API key, then paste it here as a Bearer token. | -| `longcat` | `lc` | LongCat AI | API key | [link](https://longcat.chat/platform/docs) | Free: one-time 10M-token grant after account signup + KYC verification (LongCat-2.0). One-time only — not a recurring daily/monthly allowance. | -| `magnific` | `freepik` | Magnific | API key, image | [link](https://www.magnific.com) | Get an API key at magnific.com/user/api-keys (header x-magnific-api-key). Legacy Freepik developer keys still work. | -| `maritalk` | `maritalk` | Maritalk | API key | [link](https://www.maritaca.ai) | — | -| `meganova-ai` | `meganova-ai` | MegaNova AI | API key, aggregator | [link](https://meganova.ai) | Free signup without a card. Published Tier 1 per-model quotas total 550 requests/day; they are not a shared global pool, and paid overage can apply if enabled. | -| `meta-llama` | `meta` | Meta Llama API | API key | [link](https://llama.developer.meta.com) | — | -| `minimax` | `minimax` | Minimax Coding | API key, video | [link](https://www.minimax.io) | — | -| `minimax-cn` | `minimax-cn` | Minimax (China) | API key | [link](https://www.minimaxi.com) | — | -| `mistral` | `mistral` | Mistral | API key | [link](https://mistral.ai) | Free Experiment tier: rate-limited access to all models, no credit card required | -| `mixedbread` | `mxbai` | Mixedbread AI | API key | [link](https://www.mixedbread.com) | Bearer API key for the Mixedbread embeddings API. | -| `mixlayer` | `mixlayer` | Mixlayer | API key, aggregator | [link](https://www.mixlayer.com) | The qwen/qwen3.5-4b-free model is free for prototyping and rate-limited; no fixed public RPM or daily quota is confirmed. | -| `mnn-ai` | `mnn-ai` | MNN AI | API key, aggregator | [link](https://mnnai.ru) | Free plan: $1 monthly credits, 10 RPM and access only to models marked Free. | -| `modal` | `mdl` | Modal | API key, enterprise | [link](https://modal.com/docs) | Use the bearer token that protects your Modal deployment, if enabled. Base URL should point to your OpenAI-compatible Modal app, for example https://--.modal.run/v1. | -| `modelscope` | `ms` | ModelScope | API key | [link](https://modelscope.cn) | Free tier via ModelScope API-Inference — Alibaba account required. | -| `monsterapi` | `monster` | MonsterAPI | API key | [link](https://monsterapi.ai) | ⚠️ **DEPRECATED.** Monster API shuttered operations on 2026-06-30. Use alternative OpenAI-compatible providers. | -| `moonshot` | `moonshot` | Kimi | API key | [link](https://platform.kimi.ai?aff=omniroute) | — | -| `morph` | `morph` | Morph | API key | [link](https://morphllm.com) | Free tier: 250K credits/month, $0 | -| `muse-code` | `mc` | Muse Code (Meta) | API key | [link](https://github.com/meta-llama/llama-stack) | Use your META_API_KEY env var as a Bearer token. Muse Code CLI uses the OpenAI Responses API wire format (POST /responses). | -| `naga-ac` | `naga` | Naga.ac | API key, aggregator | [link](https://naga.ac) | Get API key at naga.ac — Google/GitHub/Discord signup available. | -| `naga-ai` | `naga-ai` | Naga AI | API key, aggregator | [link](https://naga.ac) | Models marked :free are publicly listed, but no numeric quota is confirmed. Naga's policy warns that free-tier prompts and outputs may be collected or used for training. | -| `nanogpt` | `nanogpt` | NanoGPT | API key | [link](https://nano-gpt.com) | — | -| `nara` | `nara` | NaraRouter | API key | [link](https://bynara.id) | Get a free API key via NaraRouter's Telegram channel, then paste it here as a Bearer token. | -| `navy` | `navy` | NavyAI | API key | [link](https://api.navy) | Create a free API key from the NavyAI dashboard, then paste it here as a Bearer token. | -| `nebius` | `nebius` | Nebius AI | API key | [link](https://nebius.com) | ~$1 trial credits on signup for API testing | -| `nlpcloud` | `nlpc` | NLP Cloud | API key | [link](https://docs.nlpcloud.com) | Use your NLP Cloud API key in Authorization: Token . OmniRoute targets the chatbot endpoint on https://api.nlpcloud.io/v1/gpu//chatbot by default. | -| `nomic` | `nomic` | Nomic | API key | [link](https://nomic.ai) | Get API key at atlas.nomic.ai | -| `nous-research` | `nous` | Nous Research | API key | [link](https://portal.nousresearch.com/help) | Use your Nous Portal API key. OmniRoute targets the official OpenAI-compatible inference endpoint at https://inference-api.nousresearch.com/v1. | -| `novita` | `novita` | Novita AI | API key, video, aggregator | [link](https://novita.ai) | $0.50 trial credits on signup (valid about 1 year) | -| `nscale` | `nscale` | nScale | API key | [link](https://nscale.com) | $5 free credits on signup for inference testing | -| `nube` | `nube` | Nube.sh | API key | [link](https://nube.sh) | — | -| `nvidia` | `nvidia` | NVIDIA NIM | API key | [link](https://build.nvidia.com) | Free dev access: ~40 RPM, 70+ models (Kimi K2.5, GLM 4.7, DeepSeek V3.2...) | -| `oci` | `oci` | OCI Generative AI | API key, enterprise | [link](https://www.oracle.com/artificial-intelligence/generative-ai) | Use your OCI Generative AI API key or IAM bearer token. Base URL can be https://inference.generativeai..oci.oraclecloud.com/openai/v1/. | -| `ofoxai` | `ofoxai` | OfoxAI | API key, aggregator | [link](https://ofox.ai) | The current catalog advertises 10+ free models without a public numeric quota; review upstream provenance, retention and training terms before production use. | -| `ollama-cloud` | `ollamacloud` | Ollama Cloud | API key | [link](https://ollama.com/settings/keys) | — | -| `openadapter` | `oad` | OpenAdapter | API key | [link](https://openadapter.dev) | Use your OpenAdapter API key in Authorization: Bearer sk-cv-. Fully OpenAI-compatible. API base URL: https://api.openadapter.in/v1. | -| `openai` | `openai` | OpenAI | API key | [link](https://platform.openai.com) | — | -| `opencode-go` | `opencode-go` | OpenCode Go | API key | [link](https://opencode.ai/go) | — | -| `opencode-zen` | `opencode-zen` | OpenCode Zen | API key | [link](https://opencode.ai/zen) | — | -| `openference-api` | `ofa` | Openference API | API key | [link](https://openference.com) | Free plan: 3-day trial with open-source models — no credit card required | -| `openrouter` | `openrouter` | OpenRouter | API key, aggregator | [link](https://openrouter.ai) | Free models at $0/token with :free suffix - 20 RPM / 200 RPD | -| `openvecta` | `openvecta` | OpenVecta | API key | [link](https://openvecta.com) | Free credits on signup for OpenAI-compatible inference across LLMs, embeddings, and reasoning models | -| `orcarouter` | `orcarouter` | OrcaRouter | API key | [link](https://www.orcarouter.ai) | — | -| `ovhcloud` | `ovh` | OVHcloud AI | API key | [link](https://www.ovhcloud.com) | — | -| `perplexity` | `pplx` | Perplexity | API key | [link](https://www.perplexity.ai) | — | -| `piapi` | `pi` | PiAPI | API key, aggregator | [link](https://piapi.ai) | — | -| `pioneer` | `pn` | Pioneer AI | API key | [link](https://pioneer.ai) | $75 free usage credits — no credit card required | -| `plamo` | `plamo` | PLaMo | API key | [link](https://plamo.preferredai.jp/api) | — | -| `poe` | `poe` | Poe | API key, aggregator | [link](https://creator.poe.com/api-reference) | Bearer API key for the Poe OpenAI-compatible API. | -| `poixe-ai` | `poixe-ai` | Poixe AI | API key, aggregator | [link](https://poixe.com) | Current public free limits are small and model-group specific: 2 RPM/5 RPD for large-cup models and 20 RPM/50 RPD for small-cup models. | -| `pollinations` | `pol` | Pollinations AI | API key, video | [link](https://pollinations.ai) | Anonymous/keyless access to the documented free models is best-effort. Local v3.8.50 verification (2026-07-31) returned 401 via OmniRoute and Cloudflare 1010 on direct upstream probes from the same network. Premium models still require a Pollinations API key from enter.pollinations.ai. | -| `poolside` | `poolside` | Poolside | API key | [link](https://poolside.ai) | Laguna S 2.1 and XS 2.1 are free during Preview; no public numeric quota is published. | -| `predibase` | `predibase` | Predibase | API key | [link](https://predibase.com) | ⚠️ **DEPRECATED.** serving.app.predibase.com no longer resolves (sweep 2026-06-19); the managed serving API appears discontinued. | -| `publicai` | `publicai` | PublicAI | API key | [link](https://publicai.co) | Requires an API key — one-time signup credit, then paid | -| `qianfan` | `qianfan` | Baidu Qianfan | API key | [link](https://cloud.baidu.com/product-s/qianfan_home) | — | -| `qiniu` | `qiniu` | Qiniu | API key | [link](https://www.qiniu.com) | — | -| `qwen-cloud` | `qwc` | Qwen Cloud | API key | [link](https://www.qwencloud.com/) | — | -| `qwen-cloud-token-plan` | `qct` | Qwen Cloud Token Plan | API key | [link](https://www.qwencloud.com/pricing/token-plan) | — | -| `recraft` | `recraft` | Recraft | API key, image | [link](https://recraft.ai) | — | -| `regolo` | `regolo` | Regolo AI | API key | [link](https://regolo.ai) | Get your Regolo API key from regolo.ai, then paste it here as a Bearer token. | -| `reka` | `reka` | Reka | API key | [link](https://docs.reka.ai/chat/overview) | Use your Reka API key. OmniRoute supports the OpenAI-compatible base URL https://api.reka.ai/v1 and sends both Authorization and X-Api-Key headers for compatibility. | -| `requesty` | `requesty` | Requesty | API key | [link](https://requesty.ai) | Free tier ~200 requests/day - multi-model routing gateway (300+ models) | -| `routeway` | `routeway` | Routeway | API key | [link](https://routeway.ai) | Create a free API key at routeway.ai, then paste it here as a Bearer token. | -| `runwayml` | `runway` | Runway | API key, video | [link](https://docs.dev.runwayml.com) | Use your Runway API key in Authorization: Bearer . OmniRoute targets the current Runway API at https://api.dev.runwayml.com/v1 and sends the required X-Runway-Version header automatically. | -| `sambanova` | `samba` | SambaNova | API key | [link](https://sambanova.ai) | $5 free credits on signup (30-day validity), no credit card required | -| `sap` | `sap` | SAP Generative AI Hub | API key, enterprise | [link](https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core) | Use your SAP AI Core bearer token. Base URL can be your AI_API_URL root or a deploymentUrl from Generative AI Hub. | -| `sarvam` | `sarvam` | Sarvam AI | API key | [link](https://docs.sarvam.ai) | ₹1,000 in free signup credits — never expire | -| `scaleway` | `scw` | Scaleway AI | API key | [link](https://www.scaleway.com/en/docs/ai-data/generative-apis/) | 1M free tokens for new accounts — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B | -| `sealion` | `sealion` | SEA-LION | API key | [link](https://sea-lion.ai) | Sign in at sea-lion.ai with Google (no card, no region wall), create an API key, then paste it here. | -| `segmind` | `segmind` | Segmind | API key, image, video | [link](https://segmind.com) | Use your Segmind API key in the x-api-key header. OmniRoute targets https://api.segmind.com/v1/ and returns the generated image/video bytes directly. | -| `sensenova` | `sensenova` | SenseNova | API key | [link](https://platform.sensenova.cn) | Get API key at platform.sensenova.cn | -| `siliconflow` | `siliconflow` | SiliconFlow | API key | [link](https://cloud.siliconflow.com) | $1 free credits plus currently listed $0 models after identity verification; availability and limits may change | -| `snowflake` | `snowflake` | Snowflake Cortex | API key, enterprise | [link](https://www.snowflake.com) | — | -| `sparkdesk` | `sparkdesk` | SparkDesk | API key | [link](https://xinghuo.xfyun.cn) | Get API key at console.xfyun.cn | -| `speka` | `speka` | Speka AI | API key, aggregator | [link](https://speka.me) | Free plan: $1 monthly usage, 10 RPM, one API key and access to open models and the playground; no card required. | -| `stability-ai` | `stability` | Stability AI | API key, image | [link](https://stability.ai) | — | -| `stepfun` | `stepfun` | StepFun | API key | [link](https://stepfun.com) | Get API key at platform.stepfun.com | -| `sumopod` | `sumopod` | SumoPod | API key | [link](https://ai.sumopod.com) | Use your SumoPod API key (sk-...) in Authorization: Bearer . Fully OpenAI-compatible. API base URL: https://ai.sumopod.com/v1. | -| `suno` | `suno` | Suno | API key | [link](https://suno.ai) | Paste session cookie from suno.ai (Clerk auth) | -| `synthetic` | `synthetic` | Synthetic | API key, aggregator | [link](https://synthetic.new) | — | -| `tabitoken` | `tabitoken` | TabiToken | API key, aggregator | [link](https://tabitoken.com) | — | -| `tencent` | `tencent` | Tencent Hunyuan | API key | [link](https://hunyuan.tencent.com) | Get API key at console.cloud.tencent.com | -| `thebai` | `thebai` | TheB.AI | API key, aggregator | [link](https://theb.ai) | Bearer API key for the TheB.AI OpenAI-compatible gateway. | -| `tinyfish` | `tf` | TinyFish Fetch | API key | [link](https://docs.tinyfish.ai/fetch-api) | X-API-Key from agent.tinyfish.ai/api-keys | -| `together` | `together` | Together AI | API key, video | [link](https://www.together.ai) | — | -| `token-kiosk` | `tk` | Token Kiosk | API key | [link](https://agent-router.gaib.ai) | Use your Token Kiosk API key in Authorization: Bearer . Fully OpenAI-compatible gateway. API base URL: https://agent-router.gaib.ai/v1. | -| `tokenreply` | `tokenreply` | TokenReply | API key, aggregator | [link](https://www.tokenreply.com) | Free-tagged models have model- and campaign-specific daily limits; no fixed global free quota is published. | -| `tokenrouter` | `trk` | TokenRouter | API key | [link](https://tokenrouter.com) | Use your TokenRouter API key in Authorization: Bearer . Fully OpenAI-compatible. API base URL: https://api.tokenrouter.com/v1. | -| `topaz` | `topaz` | Topaz | API key, image | [link](https://topazlabs.com) | — | -| `typhoon` | `typhoon` | Typhoon | API key | [link](https://docs.opentyphoon.ai) | Free API key with a 5 req/s and 200 req/m rate limit. | -| `udio` | `udio` | Udio | API key | [link](https://udio.com) | Paste session cookie from udio.com (Supabase auth) | -| `uncloseai` | `unc` | UncloseAI | API key | [link](https://uncloseai.com) | No auth required. API accepts any non-empty string as key for identification. If older built-in models return 404, use Available Models → Import from /models or Auto-Sync; verified live model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | -| `unorouter` | `unorouter` | UnoRouter | API key, aggregator | [link](https://unorouter.ai) | Models with the :free suffix do not debit balance; limit is 1 request/minute per free model per user. | -| `upstage` | `upstage` | Upstage | API key | [link](https://www.upstage.ai) | — | -| `v0-vercel` | `v0` | v0 (Vercel) | API key | [link](https://v0.dev) | — | -| `venice` | `venice` | Venice.ai | API key | [link](https://venice.ai) | — | -| `vercel-ai-gateway` | `vag` | Vercel AI Gateway | API key, aggregator | [link](https://vercel.com/docs/ai-gateway) | — | -| `vertex` | `vertex` | Vertex AI | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide Service Account JSON or OAuth access_token | -| `vertex-partner` | `vp` | Vertex AI Partners | API key, enterprise | [link](https://cloud.google.com/vertex-ai) | Provide the same Service Account JSON used for Vertex AI partner models. | -| `void-ai` | `void-ai` | Void AI | API key, aggregator | [link](https://voidai.app) | The public model catalog marks some models with a free plan requirement, but access is conditional and no numeric quota is confirmed. | -| `volcengine` | `volcengine` | Volcengine | API key | [link](https://www.volcengine.com) | — | -| `voyage-ai` | `voyage` | Voyage AI | API key, embed/rerank | [link](https://www.voyageai.com) | Bearer API key for Voyage AI embeddings and rerank APIs. | -| `wafer` | `wafer` | Wafer AI | API key | [link](https://wafer.ai) | — | -| `wandb` | `wandb` | Weights & Biases Inference | API key | [link](https://wandb.ai) | — | -| `watsonx` | `watsonx` | IBM watsonx.ai Gateway | API key, enterprise | [link](https://www.ibm.com/products/watsonx-ai) | Use your watsonx bearer token. Base URL can be https://.ml.cloud.ibm.com/ml/gateway/v1/ or a self-managed /ml/gateway/v1 endpoint. | -| `writer` | `writer` | Writer | API key | [link](https://dev.writer.com) | — | -| `x5lab` | `x5lab` | X5Lab | API key | [link](https://x5lab.dev) | Use your X5Lab API key (x5-...) in Authorization: Bearer . Fully OpenAI-compatible. API base URL: https://api.x5lab.dev/v1. | -| `xai` | `xai` | xAI (Grok) | API key | [link](https://x.ai) | Use an official xAI API key, or sign in with xAI OAuth. Grok Build JWT sessions remain a separate provider. | -| `xiaomi-mimo` | `mimo` | Xiaomi MiMo | API key | [link](https://mimo.mi.com) | — | -| `xiaomi-mimo-token-plan` | `mimotp` | Xiaomi MiMo Token Plan | API key | [link](https://mimo.mi.com) | — | -| `yi` | `yi` | Yi (01.AI) | API key | [link](https://01.ai) | Get API key at platform.lingyiwanwu.com | -| `yolo-auto` | `yolo-auto` | Yolo-Auto | API key, aggregator | [link](https://yolo-auto.com) | Free API access is request-limited and intended for testing; no numeric daily quota is published and free access is not promised indefinitely. | -| `zai` | `zai` | Z.AI | API key | [link](https://open.bigmodel.cn) | — | -| `zenmux` | `zm` | ZenMux | API key | [link](https://zenmux.ai) | Use your ZenMux API key in Authorization: Bearer . ZenMux is fully OpenAI-compatible. Base URL: https://zenmux.ai/api/v1. | -| `zerolimitai` | `zerolimitai` | ZeroLimitAI | API key, aggregator | [link](https://www.zerolimitai.com) | Temporary free trial is advertised, but official pages conflict between 3 and 7 days; a 100-calls/day claim is not treated as permanent. | -| `zylo-api` | `zylo` | Zylo API | API key, aggregator | [link](https://zyloai.net) | Basic plan: 10 RPM, 7,200 requests/day and 200,000 tokens/day; limited to Basic text models. | - -## Local Providers (14) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `comfyui` | `comfyui` | ComfyUI | Local | [link](https://github.com/comfyanonymous/ComfyUI) | No API key required. Configure the local ComfyUI base URL (default: http://localhost:8188). | -| `docker-model-runner` | `dmr` | Docker Model Runner | Local, self-hosted | [link](https://docs.docker.com/ai/model-runner/) | API key optional. Configure the local Docker Model Runner OpenAI-compatible base URL (default: http://localhost:12434/v1). | -| `lemonade` | `lemonade` | Lemonade Server | Local, self-hosted | [link](https://lemonade-server.ai) | API key optional. Configure the local Lemonade OpenAI-compatible base URL (default: http://localhost:13305/api/v1). | -| `llama-cpp` | `llamacpp` | llama.cpp | Local, self-hosted | [link](https://github.com/ggml-org/llama.cpp) | API key optional (use any value, e.g. sk-no-key-required). Configure the llama-server OpenAI-compatible base URL (default: http://127.0.0.1:8080/v1). Note: if Llamafile is also installed, both default to port 8080 — run only one at a time or override the port. | -| `llamafile` | `llamafile` | Llamafile | Local, self-hosted | [link](https://github.com/Mozilla-Ocho/llamafile) | API key optional. Configure the local Llamafile OpenAI-compatible base URL (default: http://127.0.0.1:8080/v1). | -| `lm-studio` | `lmstudio` | LM Studio | Local, self-hosted | [link](https://lmstudio.ai) | API key optional. Configure the local LM Studio OpenAI-compatible base URL (default: http://localhost:1234/v1). | -| `mlx-gemma` | `mlx-gemma` | MLX Gemma 26B | Local, self-hosted | [link](https://github.com/ml-explore/mlx) | No API key required. Runs mlx-lm server locally on port 11435. Requires uv and mlx-lm installed. Model: mlx-community/gemma-4-26B-A4B-it-qat-q4_0-mlx-aligned (~15.9GB peak memory). | -| `mlx-qwen` | `mlx-qwen` | MLX Qwen 3.8 27B | Local, self-hosted | [link](https://github.com/ml-explore/mlx) | No API key required. Runs mlx-lm server locally on port 11436. Requires uv and mlx-lm installed. Model: maglun/Qwen3.8-27B-MLX-Mixed-3.80bpw (~13.1GB peak memory). | -| `ollama-local` | `ollama` | Ollama | Local, self-hosted | [link](https://ollama.com) | No API key required. Ollama runs locally — configure its OpenAI-compatible base URL (default: http://localhost:11434/v1) and make sure Ollama is running before connecting. | -| `oobabooga` | `ooba` | oobabooga | Local, self-hosted | [link](https://github.com/oobabooga/text-generation-webui) | API key optional. Configure the local oobabooga OpenAI-compatible base URL (default: http://localhost:5000/v1). | -| `sdwebui` | `sdwebui` | SD WebUI | Local | [link](https://github.com/AUTOMATIC1111/stable-diffusion-webui) | No API key required. Configure the local WebUI base URL (default: http://localhost:7860). | -| `triton` | `triton` | NVIDIA Triton | Local, self-hosted | [link](https://developer.nvidia.com/triton-inference-server) | API key optional. Configure the Triton OpenAI-compatible base URL (default: http://localhost:8000/v1). | -| `vllm` | `vllm` | vLLM | Local, self-hosted | [link](https://github.com/vllm-project/vllm) | API key optional. Configure the local vLLM OpenAI-compatible base URL (default: http://localhost:8000/v1). | -| `xinference` | `xinference` | XInference | Local, self-hosted | [link](https://inference.readthedocs.io) | API key optional. Configure the local XInference OpenAI-compatible base URL (default: http://localhost:9997/v1). | - -## Search Providers (13) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `brave-search` | `brave-search` | Brave Search | Search | [link](https://brave.com/search/api) | Subscription token from Brave Search API dashboard | -| `exa-search` | `exa-search` | Exa Search | Search | [link](https://exa.ai) | API key from dashboard.exa.ai | -| `firecrawl` | `fc` | Firecrawl | Search | [link](https://firecrawl.dev) | API key from firecrawl.dev/app/api-keys (or set your self-hosted Firecrawl base URL) | -| `google-pse-search` | `google-pse` | Google Programmable Search | Search | [link](https://developers.google.com/custom-search/v1/overview) | Requires a Google API key and your Programmable Search Engine ID (cx) | -| `linkup-search` | `linkup` | Linkup Search | Search | [link](https://docs.linkup.so) | Bearer API key from the Linkup dashboard | -| `ollama-search` | `ollama-search` | Ollama Search | Search | [link](https://ollama.com/settings/keys) | Same API key as Ollama Cloud (from ollama.com/settings/keys) | -| `perplexity-search` | `pplx-search` | Perplexity Search | Search | [link](https://docs.perplexity.ai/guides/search-quickstart) | Same API key as Perplexity (pplx-...) | -| `searchapi-search` | `searchapi` | SearchAPI | Search | [link](https://www.searchapi.io/docs/google) | API key from SearchAPI (query param or Bearer auth) | -| `searxng-search` | `searxng` | SearXNG Search | Search | [link](https://docs.searxng.org) | API key is optional. Set your SearXNG base URL. Some instances may require a bearer token for access. | -| `serper-search` | `serper-search` | Serper Search | Search | [link](https://serper.dev) | API key from serper.dev dashboard | -| `tavily-search` | `tavily-search` | Tavily Search | Search | [link](https://tavily.com) | API key from app.tavily.com (format: tvly-...) | -| `x-search` | `x_search` | X Search (Grok) | Search | [link](https://docs.x.ai/developers/tools/x-search) | SuperGrok OAuth (xai-oauth) or xAI API key. This is Grok X Search, not the X Developer MCP. | -| `youcom-search` | `youcom-search` | You.com Search | Search | [link](https://you.com/business/api/) | X-API-Key from the You.com platform dashboard | - -## Audio-only Providers (12) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `assemblyai` | `aai` | AssemblyAI | Audio | [link](https://assemblyai.com) | — | -| `aws-polly` | `polly` | AWS Polly | Audio | [link](https://aws.amazon.com/polly/) | Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region. | -| `cartesia` | `cartesia` | Cartesia | Audio | [link](https://cartesia.ai) | — | -| `deepgram` | `dg` | Deepgram | Audio | [link](https://deepgram.com) | — | -| `elevenlabs` | `el` | ElevenLabs | Audio | [link](https://elevenlabs.io) | — | -| `fishaudio` | `fishaudio` | Fish Audio | Audio | [link](https://fish.audio) | — | -| `gladia` | `gladia` | Gladia | Audio | [link](https://gladia.io) | — | -| `inworld` | `inworld` | Inworld | Audio | [link](https://inworld.ai) | — | -| `playht` | `playht` | PlayHT | Audio | [link](https://play.ht) | — | -| `rev-ai` | `revai` | Rev AI | Audio | [link](https://www.rev.ai) | — | -| `soniox` | `sx` | Soniox | Audio | [link](https://soniox.com) | — | -| `speechmatics` | `sm` | Speechmatics | Audio | [link](https://www.speechmatics.com) | Free tier — 8 hours/month, no credit card required. Batch (async) mode only. | - -## Upstream Proxy Providers (2) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `9router` | `nr` | 9router | Upstream proxy | [link](https://www.npmjs.com/package/9router) | — | -| `cliproxyapi` | `cpa` | CLIProxyAPI | Upstream proxy | [link](https://github.com/router-for-me/CLIProxyAPI) | — | - -## Cloud Agent Providers (3) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `codex-cloud` | `codex-cloud` | Codex Cloud | Cloud agent | [link](https://openai.com/codex) | OpenAI API key with Codex Cloud task access. | -| `devin` | `devin` | Devin | Cloud agent | [link](https://devin.ai) | Devin API key for cloud agent sessions. | -| `jules` | `jules` | Google Jules | Cloud agent | [link](https://jules.google) | Jules API key for creating and managing cloud coding tasks. | - -## System Providers (1) - -| ID | Alias | Name | Tags | Website | Notes | -|----|-------|------|------|---------|-------| -| `auto` | `auto` | Auto (Zero-Config) | System | — | — | - -## Sources of truth - -- Catalog: [`src/shared/constants/providers.ts`](../../src/shared/constants/providers.ts) -- Registry (per-model details): [`open-sse/config/providerRegistry.ts`](../../open-sse/config/providerRegistry.ts) -- Executors: [`open-sse/executors/`](../../open-sse/executors/) (106 implementations) -- Translators: [`open-sse/translator/`](../../open-sse/translator/) - -## See Also - -- [FREE_TIERS.md](./FREE_TIERS.md) — curated free-tier guide -- [USER_GUIDE.md](../guides/USER_GUIDE.md) — provider setup walkthrough -- [ARCHITECTURE.md](../architecture/ARCHITECTURE.md) — overall architecture diff --git a/README.md b/README.md index 373c1ef558..c55669e8f7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ # 🚀 OmniRoute — The Free AI Gateway -OmniRoute — Never stop coding. Every AI tool → 350 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. 350 AI providers · 90+ free tiers · ~1.51B free tokens/mo · 19 routing strategies · $0 to start. +OmniRoute — Never stop coding. Every AI tool → 346 providers — 90+ free — through one endpoint. Claude Code, Codex, Cursor, Cline, Copilot & Antigravity into FREE Claude / GPT / Gemini with automatic fallback while a healthy target is available. RTK + Caveman stacked compression saves 15–95% tokens on eligible workloads (~89% in the documented stacked example). 346 AI providers · 90+ free tiers · ~1.51B free tokens/mo · 19 routing strategies · $0 to start. @@ -17,9 +17,9 @@ -> 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 **42 provider pools / 495 models** into one honest number and shows it live on the dashboard (`/dashboard/free-tiers`). +> Stacking free tiers by hand is painful — dozens of SDKs, dozens of rate limits, and no idea how much you actually have. OmniRoute aggregates **38 documented recurring pools / 446 cataloged free-tier entries** into one honest number and shows it live on the dashboard (`/dashboard/free-tiers`). -OmniRoute free-tier budget card: ~1.51B free tokens per month steady, up to ~2.13B in the first month with signup credits, from the documented free tiers of 42 provider pools / 495 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 countable free pools with per-model grid (Mistral Large 3 1B, GPT-4o mini 150M, Gemini 2.5 Flash 60M … Claude Sonnet 4.5 25K), one-time first-month signup credits (vertex 300M, agentrouter 200M, predibase 25M, together 25M, glm-cn 20M, doubao 15M, ai21 10M, longcat 10M, deepseek 5M, hyperbolic 5M, nscale 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. +OmniRoute free-tier budget card: ~1.51B free tokens per month steady, up to ~2.13B in the first month with signup credits, from 38 documented recurring pools covering 446 cataloged free-tier entries behind one endpoint. Honest pool-deduped math — each shared pool counted once, including 20 recurring providers with a positive monthly token estimate; 13 providers are ToS-flagged so you decide. Budget bar includes Mistral 1B, LLM7 150M, Nara Free 150M, Gemini 60M and smaller pools, plus first-month signup credits and permanently-free no-token-cap providers 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)**. > @@ -61,14 +61,14 @@
-| | v3.8.49 | **v3.8.50** | `v3.8.51+` | -| ------------------------- | :-----: | :---------: | :---------: | -| 🌐 Providers | 290 | **342** | more queued | -| 🧠 Documented models | 1185 | **1202** | — | -| 🖼️ Modality Bridge | — | 🆕 vision | video | -| 📡 Radar free catalog | — | 🆕 opt-in | — | -| ⚖️ Quota-aware scheduling | — | — | 🔭 next | -| 📊 Quota telemetry | — | — | 🔭 next | +| | v3.8.49 | **v3.8.50** | `v3.8.51+` | +| ------------------------- | :-----: | :-----------------------: | :---------: | +| 🌐 Providers | 290 | **346** | more queued | +| 🧠 Unique chat model IDs | 1185 | **1271** | — | +| 🖼️ Modality Bridge | — | 🆕 vision + audio + video | — | +| 📡 Radar free catalog | — | 🆕 opt-in | — | +| ⚖️ Quota-aware scheduling | — | 🆕 Quota-Share | — | +| 📊 Quota telemetry | — | 🆕 live | — | **→ [Roadmap](ROADMAP.md) — riding the rail to `v3.9.0 LTS`** @@ -101,7 +101,7 @@ ⚙️ Features 🎯 Combos - 🌐 Providers + 🌐 Providers 🔌 CLI & MCP @@ -126,7 +126,7 @@ 📦 Project 🛠️ Tech Stack 📖 Docs - 👥 Contributors + 👥 Contributors @@ -189,7 +189,7 @@
-Works the second you install it — zero config. Three steps: 1. Install — npm i -g omniroute, server boots on localhost:20128. 2. Point your tool at http://localhost:20128/v1 — any OpenAI-compatible tool (Claude Code, Cursor, Cline). 3. It answers — call model auto for an instant reply, with no API key, no signup, no configuration. Keyless free providers OpenCode Free and Felo are pre-wired into the auto combo, so a fresh install responds out of the box. +Works the second you install it — zero config. Three steps: 1. Install — npm i -g omniroute, server boots on localhost:20128. 2. Point your tool at http://localhost:20128/v1 — any OpenAI-compatible tool (Claude Code, Cursor, Cline). 3. It answers — call model auto for an instant reply, with no API key, no signup, no configuration. OpenCode Free is the keyless provider currently allowlisted in the auto combo, so a fresh install responds out of the box. ```bash # Fresh install, zero credentials — `auto` already works: @@ -198,7 +198,7 @@ curl http://localhost:20128/v1/chat/completions \ -d '{"model":"auto","messages":[{"role":"user","content":"Hello!"}]}' ``` -Prefer a specific free backend? Call it directly, e.g. `oc/…` (OpenCode Free) or `felo/…` (Felo). Then graduate to `auto` and let OmniRoute pick. +Prefer a specific free backend? Call `oc/…` (OpenCode Free) directly. Then graduate to `auto` and let OmniRoute pick. 📦 Copy-paste quickstart scripts for **Python, Node.js, PHP, and cURL** → [`examples/quickstart/`](examples/quickstart/) @@ -210,7 +210,7 @@ curl http://localhost:20128/v1/chat/completions \ -The Promise — One endpoint. 350 providers. Never stop building — OmniRoute picks the cheapest one that works. Six pillars: Never hit limits (auto-fallback across 350 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, 56 free forever — no card needed) · Every tool works (33 coding agents through one config) · One endpoint (OpenAI ↔ Claude ↔ Gemini ↔ Responses API at /v1) · Production-grade (circuit breakers, TLS stealth, MCP 110 tools, A2A, memory, guardrails, evals — 25,000+ tests). +The Promise — One endpoint and 346 providers. Automatic fallback keeps routing while another healthy target is available. Six pillars: resilient fallback across 346 providers · up to 95% token savings on eligible workloads · $0 to start with 90+ free tiers and 54 recurring/keyless free-forever providers · 35 CLI/agent integrations through one config · OpenAI, Claude, Gemini and Responses API compatibility at /v1 · production controls including circuit breakers, TLS stealth, MCP 110 tools, A2A, memory, guardrails, evals and 36,000+ static test declarations.

@@ -225,7 +225,7 @@ curl http://localhost:20128/v1/chat/completions \
-OmniRoute request flow: your IDE or CLI (Claude Code, Cursor, Cline…) calls one local endpoint (http://localhost:20128/v1); the OmniRoute Smart Router (RTK + Caveman compression, 19 routing strategies, circuit breakers, TLS stealth, MCP, A2A, guardrails) auto-falls back across 4 provider tiers — Tier 1 Subscription (Claude Code, Codex, Copilot), quota out? Tier 2 API Key (DeepSeek, Groq, xAI), budget hit? Tier 3 Cheap (GLM $0.5, MiniMax $0.2), budget hit? Tier 4 Free (Kiro, Qoder, Pollinations) — always on. +OmniRoute request flow: your IDE or CLI (Claude Code, Cursor, Cline…) calls one local endpoint (http://localhost:20128/v1); the OmniRoute Smart Router (RTK + Caveman compression, 19 routing strategies, circuit breakers, TLS stealth, MCP, A2A, guardrails) can fall back across 4 provider tiers while an eligible healthy target remains — Tier 1 Subscription, Tier 2 API Key, Tier 3 Cheap and Tier 4 Free.
@@ -318,7 +318,7 @@ curl http://localhost:20128/v1/chat/completions \ All 19 combo routing strategies animated — one tile per strategy: priority, fill-first, weighted, round-robin, p2c, least-used, random, strict-random, cost-optimized, headroom, reset-window, reset-aware, context-relay, context-optimized, cache-optimized, lkgp, auto, fusion, pipeline. See the table above for what each one does. -> A **combo** is a chain of models OmniRoute routes across **automatically**. Quota runs out, a provider fails, or costs spike — the combo silently slides to the next model. **This is what makes OmniRoute unbreakable.** 🛡️ +> A **combo** is a chain of models OmniRoute routes across **automatically**. If quota runs out, a provider fails, or costs spike, the combo can move to the next eligible healthy model. 🛡️ ### ⚡ Zero-config — just use `auto` @@ -429,7 +429,7 @@ All **19** strategies — mix & match per combo step: 17 auto - 14-factor live scoring across every connection 🤖 + 15-factor live scoring across every connection 🤖 18 @@ -443,7 +443,7 @@ All **19** strategies — mix & match per combo step: -The Auto-Combo engine scores every candidate on **14 factors** (health, quota, cost, latency, success rate, freshness…) — see [`docs/routing/AUTO-COMBO.md`](docs/routing/AUTO-COMBO.md). +The Auto-Combo engine scores every candidate on **15 factors** (health, quota, cost, latency, task fit, quality, session availability…) — see [`docs/routing/AUTO-COMBO.md`](docs/routing/AUTO-COMBO.md). ## @@ -461,7 +461,7 @@ All **19** strategies — mix & match per combo step: -What sets OmniRoute apart — comparison table vs 9router, OpenRouter, CLIProxyAPI and LiteLLM across 13 capabilities. OmniRoute: 350 providers, 90+ free providers built-in, 19 routing strategies, 12-engine token compression, built-in MCP server with 110 tools, A2A agent protocol, persistent memory, guardrails, cloud agents, TLS fingerprint stealth, Desktop/Termux/PWA, 43 i18n UI locales, 100% MIT self-hosted. OmniRoute is the only one with the full set; competitors show a mix of checks, partials and crosses. Verified from each project's docs. +What sets OmniRoute apart — a dated feature snapshot vs 9router, OpenRouter, CLIProxyAPI and LiteLLM across 13 capabilities. OmniRoute: 346 providers, 90+ free tiers built in, 19 routing strategies, 12-engine token compression, built-in MCP server with 110 tools, A2A agent protocol, persistent memory, guardrails, cloud agents, TLS fingerprint stealth, Desktop/Termux/PWA and 43 i18n UI locales. OmniRoute is MIT-licensed and self-hostable. Competitor capabilities and counts may change; see the linked methodology. 📊 Full methodology & per-feature detail vs 9router, OpenRouter, CLIProxyAPI & LiteLLM → [`docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md`](docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md) @@ -517,9 +517,9 @@ Pix copia-e-cola: ## 📡 OmniRoute Radar -The main free-tier headline remains **~1.53B tokens/month** from the documented, +The main free-tier headline remains **~1.51B tokens/month** from the documented, pool-deduplicated catalog above. Temporary provider signup credits can separately lift the first -month to **~2.15B**. Radar is an optional, signed catalog overlay for people who want fresher +month to **~2.13B**. Radar is an optional, signed catalog overlay for people who want fresher free-model availability between OmniRoute releases; the community catalog and every existing free feature remain free. @@ -548,7 +548,7 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute - **🗜️ 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 a shared account's quota fairly across pooled keys, work-conserving so idle slices are lent out. → [Resilience Guide](docs/architecture/RESILIENCE_GUIDE.md) -- **🤖 One-command CLI/agent setup** — `setup-*` configures 12+ coding tools; `omniroute run` launches 7 CLIs (Claude Code, Codex, Aider, Goose, OpenCode, Qwen Code, Gemini CLI) with zero config written; `omniroute configure` is an interactive provider+model picker with per-context favorites. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md) +- **🤖 One-command CLI/agent setup** — 12 registered `setup-*` commands; `omniroute run` launches 7 CLIs (Claude Code, Codex, Aider, Goose, OpenCode, Qwen Code, Gemini CLI); `omniroute configure` supports 9 targets with an interactive provider+model picker and per-context favorites. → [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/:` combos, **Fusion** (model panel + judge), task-aware routing, per-request model / mode / USD-budget overrides. → [Auto-Combo](docs/routing/AUTO-COMBO.md) - **🗜️ Pluggable compression** — 12 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) @@ -557,11 +557,18 @@ the current catalog at **[radar.omniroute.online/planos](https://radar.omniroute - **🧠 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), opt-in credential-masking guardrail (redacts leaked API keys/secrets in both directions), free DuckDuckGo last-resort web search, and an optional OIDC login gate for the dashboard (password login always stays available). → [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) -- **🎨 Image / video / audio generation** — one API for media: xAI Grok Imagine & Novita AI video, ComfyUI, Freepik, Adobe Firefly, Microsoft Designer, Segmind, EdgeTTS. → [API Reference](docs/reference/API_REFERENCE.md) +- **🎨 Image / video / audio generation** — one API for media: xAI Grok Imagine & Novita AI video, ComfyUI, Freepik, Adobe Firefly, Segmind and ElevenLabs. → [API Reference](docs/reference/API_REFERENCE.md) - **🌍 Deployment & ops** — reverse-proxy `basePath`, browser-language auto-detect, per-key device tracking, root-less MITM trust, zh-TW localization. → [Environment](docs/reference/ENVIRONMENT.md) -- **🤝 More providers & agents** — Cursor Cloud Agent, Grok Build (xAI) with browser + OAuth login, Ollama first-class card, Claude Opus 5 & Sonnet 5, Kimi official partnership (Code/Web/Moonshot), Zed, Requesty, SenseNova, Yuanbao, Agnes AI… and a refreshed **350-provider catalog**. → [Providers](docs/reference/PROVIDER_REFERENCE.md) +- **🤝 More providers & agents** — Cursor Cloud Agent, Grok Build (xAI) with browser + OAuth login, Ollama first-class card, Claude Opus 5 & Sonnet 5, Kimi official partnership (Code/Web/Moonshot), Zed, Requesty, SenseNova, Yuanbao, Agnes AI… and a refreshed **346-provider catalog**. → [Providers](docs/reference/PROVIDER_REFERENCE.md) - **📡 Routing transparency** — every response carries an `X-OmniRoute-Decision` header naming the strategy/provider/latency that served it, a new `cache-optimized` combo strategy + Auto-Combo `cacheAffinity` factor route repeat requests back to the connection holding the cached prefix, and a read-only `/v1/auto-combo/{channel}/candidates` endpoint exposes an `auto/*` channel's live candidate pool. → [Auto-Combo](docs/routing/AUTO-COMBO.md) - **⚡ Local performance & infra** — one-click local Redis, Cloudflare Workers / Deno Deploy relay deployers, Bifrost & Mux as supervised embedded services. → [Embedded Services](docs/frameworks/EMBEDDED-SERVICES.md) +- **🔎 First-class search** — X Search and Firecrawl through `POST /v1/search` and MCP, with a credential-free DuckDuckGo fallback when no search provider is configured. → [API Reference](docs/reference/API_REFERENCE.md) +- **🧩 Safer plugin runtime** — checksum-verified marketplace installs, request-header context and streaming-completion lifecycle hooks. → [Plugin Guide](docs/frameworks/PLUGINS.md) +- **🖥️ Desktop & deployment** — Electron remote-server attach through `OMNIROUTE_REMOTE_URL`, plus systemd installation and autostart flows. → [Electron Guide](docs/guides/ELECTRON_GUIDE.md) +- **🎞️ Full modality routing** — vision and audio-to-text bridges, video passthrough, and combo/fallback routing for image generation. → [API Reference](docs/reference/API_REFERENCE.md) +- **🎛️ Exact model control** — provider-scoped durable aliases and enforced per-model context, input and output limits. → [API Reference](docs/reference/API_REFERENCE.md) +- **🆓 Faster free onboarding** — reviewable one-click connection of eligible no-auth providers. → [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) +- **🧠 Auditable routing** — optional encrypted reasoning replay, plus the Telegram Mini App chat bridge. → [Reasoning Replay](docs/routing/REASONING_REPLAY.md)
@@ -642,11 +649,11 @@ of your shell history. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md)
-## 🌐 349 AI Providers — 90+ Free +## 🌐 346 AI Providers — 153 Catalog-Marked Free
-> The most complete catalog of any open-source router: **350 providers**, **90+ with a free tier**, **56 free forever**. +> **346 providers**, including **153 registered providers carrying `hasFree: true` discovery metadata**, plus **446 per-model free-budget catalog rows** and **54 recurring/keyless free-forever providers**. The provider flag and per-model budget catalog are distinct denominators; definitions and pool-deduped calculations are documented in the [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) and [Free Tiers](docs/reference/FREE_TIERS.md).
@@ -679,7 +686,7 @@ of your shell history. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md) -…and 220+ more — every icon resolves live from the dashboard's provider catalog. 📖 [Provider Reference](docs/reference/PROVIDER_REFERENCE.md) +…and 328 more — every icon resolves live from the dashboard's provider catalog. 📖 [Provider Reference](docs/reference/PROVIDER_REFERENCE.md)
@@ -695,10 +702,10 @@ of your shell history. → [CLI Integrations](docs/guides/CLI-INTEGRATIONS.md) Baidu ERNIE
Baidu ERNIE
ERNIE 4.0
Free forever
- Qoder AI
Qoder AI
Qwen3-Max, Kimi-K2
Unlimited FREE
- Pollinations
Pollinations
GPT, Llama, Claude
No key needed
- Cloudflare AI
Cloudflare AI
50+ models
10K neurons/day
- NVIDIA NIM
NVIDIA NIM
GLM, MiniMax
~40 RPM free
+ Tencent Hunyuan
Tencent Hunyuan
Recurring uncapped
catalog entry
+ Pollinations
Pollinations
GPT, Qwen, DeepSeek
No key needed
+ Cloudflare AI
Cloudflare AI
9 cataloged models
10K neurons/day
+ Groq
Groq
Recurring free pool
15M tokens/month
Cerebras
Cerebras
GLM 4.7, GPT-OSS
1M tokens/day
OpenRouter
OpenRouter
:free models
+$10 → higher RPM
@@ -769,7 +776,7 @@ From inside the editor: open the **Extensions** view, search **"OmniRoute"**, cl
-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. +Private and local-first — OmniRoute's gateway and control plane run on your machine. Prompts are sent to the upstream provider selected for each request; OmniRoute adds no hosted prompt-processing hop and telemetry is disabled by default. Credentials are encrypted at rest with AES-256-GCM; controls include API-key scoping, IP filtering, rate limits, prompt-injection guards, upstream-header scrubbing, opt-in PII redaction, sanitized errors and a local SQLite audit trail. OmniRoute is MIT-licensed and self-hostable. 📖 [Authorization](docs/architecture/AUTHZ_GUIDE.md) · [Guardrails](docs/security/GUARDRAILS.md) · [Compliance](docs/security/COMPLIANCE.md) @@ -781,7 +788,7 @@ From inside the editor: open the **Extensions** view, search **"OmniRoute"**, cl -> Beyond the server, OmniRoute is a **full command-line cockpit** with **80+ commands**, plus open agent protocols so an AI agent can drive it **on its own**. +> Beyond the server, OmniRoute is a **full command-line cockpit** with **85 top-level commands**, plus open agent protocols so an AI agent can drive it **on its own**. ### ⌨️ A real CLI (not just `start`) @@ -810,7 +817,7 @@ Tokens are scoped `read` / `write` / `admin`; process-spawning routes stay loopb
-Animated terminal demoing the OmniRoute CLI — omniroute providers list, omniroute combo list, 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 … +Animated terminal demoing the OmniRoute CLI — omniroute providers list, omniroute combo list and omniroute health — cycling over the 85-command top-level 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 …
@@ -846,7 +853,7 @@ claude mcp add-server omniroute --type http --url http://localhost:20128/api/mcp ### 📖 How it works — pipeline, architecture & savings math -OmniRoute compression pipeline: a client request of 10,000 tokens passes through 12 stacked engines — Session-Dedup, CCR, Lite, RTK, Responses Tool Output, Headroom, Relevance, Caveman, Aggressive, LLMLingua-2, Ultra, OmniGlyph — and reaches the provider at about 1,080 tokens, up to 95% saved. Code, URLs and JSON are always preserved byte-perfect. +OmniRoute compression pipeline: an illustrative 10,000-token client request passes through 12 composable engines — Session-Dedup, CCR, Lite, RTK, Responses Tool Output, Headroom, Relevance, Caveman, Aggressive, LLMLingua-2, Ultra and OmniGlyph — and can reach the provider at about 1,080 tokens in the documented stacked example. Structured content is protected by preservation guards and per-step fidelity gates; explicit lossy or experimental modes may transform eligible content. Default stacked combo runs `RTK → Caveman`. When both act on the same tool/context payload, savings compound: @@ -856,9 +863,9 @@ average = 1 − (1 − 0.80) × (1 − 0.46) = 89.2% range = 78.4 – 94.6% ``` -Code blocks, URLs, JSON and structured data are **always protected** by the preservation engine. +Code blocks, URLs, JSON and structured data are **protected by default** through preservation guards and per-step fidelity checks; explicit lossy or experimental modes may transform eligible content. -> **Why use many tokens when few tokens do the trick?** Every request passes through OmniRoute's compression pipeline **transparently** — no client changes. It's now a **stack of 12 composable engines** that run in order and mix & match per routing combo — building on ideas from [RTK](https://github.com/rtk-ai/rtk), [Caveman](https://github.com/JuliusBrussee/caveman) (⭐ 90K+), [LLMLingua-2](https://github.com/microsoft/LLMLingua), and [Troglodita](https://github.com/leninejunior/troglodita) (PT-BR). +> **Why use many tokens when few tokens do the trick?** Every request passes through OmniRoute's compression pipeline **transparently** — no client changes. It's now a **stack of 12 composable engines** that run in order and mix & match per routing combo — building on ideas from [RTK](https://github.com/rtk-ai/rtk), [Caveman](https://github.com/JuliusBrussee/caveman) (⭐ 100K+), [LLMLingua-2](https://github.com/microsoft/LLMLingua), and [Troglodita](https://github.com/leninejunior/troglodita) (PT-BR). ### 🧱 The 12-engine stack @@ -880,7 +887,7 @@ Engines run in pipeline order; each is independently toggleable and configurable 12OmniGlyphExperimental context-as-image encoding for measured Claude Fable 5 on the direct Anthropic wire; GPT 5.6 transformers remain fail-closed pending provider receipts. Four compression profiles (aggressive default, balanced, coding-safe, passthrough) (most aggressive; opt-in) -Code blocks, URLs and structured data are **always preserved** byte-perfect. **One-click presets** combine the engines: +Code blocks, URLs and structured data are protected by preservation guards and fidelity checks. Explicit lossy or experimental modes may transform eligible content. **One-click presets** combine the engines: @@ -898,7 +905,7 @@ Code blocks, URLs and structured data are **always preserved** byte-perfect. **O > > **After (19 tokens):** _"New object ref each render. Inline object prop = new ref = re-render. Wrap in useMemo."_ > -> **Same answer. 72% fewer tokens. Zero accuracy loss.** ✅ +> **Same technical recommendation in this example. 72% fewer tokens.** ✅ **PT-BR example — [Troglodita](https://github.com/leninejunior/troglodita) mode:** @@ -906,7 +913,7 @@ Code blocks, URLs and structured data are **always preserved** byte-perfect. **O > > **Depois (12 tokens):** _"Re-render: ref nova cada ciclo (objeto inline recriado). Usar `useMemo`."_ > -> **Mesma resposta. ~70% menos tokens. Precisão técnica intacta.** ✅ +> **Mesma recomendação técnica neste exemplo. ~70% menos tokens.** ✅
@@ -1013,6 +1020,7 @@ Full table: [Docker Guide — runtime RAM](docs/guides/DOCKER_GUIDE.md#runtime-r **🥟 Bun** Standard `bun install` and global installation (`bun install -g omniroute`) are supported via Bun runtime detection: + - **Built-in `bun:sqlite`**: OmniRoute uses Bun's built-in `bun:sqlite` driver when running under Bun, falling back to `better-sqlite3` on Node.js or `sql.js`. - **Automatic Webpack bundler selection**: Development (`bun run dev`) and production builds (`bun run build`) automatically detect Bun and disable Turbopack in favor of Webpack to prevent native V8 binding incompatibilities. - **Dedicated Bun Dockerfile**: Multi-stage `Dockerfile.bun` for native Bun production deployments (`docker build -f Dockerfile.bun -t omniroute:bun .`). @@ -1105,7 +1113,7 @@ same process on one port, so there is no separate CLI-only package today.
-Dados de cobertura social em 2026-08-17 · YT: 741 | TT: 137 | IG: 124 · Frescor (dias): YT 0 · TT 14 · IG 15 +Dados do painel de cobertura, gerados em 2026-08-23 · YT: 809 | TT: 137 | IG: 124 · Frescor (dias): YT 0 · TT 20 · IG 21
ModeSavingsBest for
@@ -1116,33 +1124,33 @@ same process on one port, so there is no separate CLI-only package today. 🎬 #1 — Instagram
nick_saraev — 1,628,910 views - - + +
- - YouTube — Vaibhav Sisinty -
- 🎬 #2 — YouTube
- Vaibhav Sisinty — 373,084 views -
- - YouTube Shorts -
- 🎬 #3 — YouTube Shorts
- Nick Automates — 207,714 views -
- TikTok Thumbnail + TikTok — milesreevesai
- 🎬 #4 — TikTok
+ 🎬 #2 — TikTok
milesreevesai — 620,400 views
- - Valency Labs + + YouTube — Vaibhav Sisinty
- 🎬 #5 — YouTube
- Valency Labs — 135,974 views + 🎬 #3 — YouTube
+ Vaibhav Sisinty — 391,109 views +
+ + YouTube Shorts — Nick Automates +
+ 🎬 #4 — YouTube Shorts
+ Nick Automates — 218,174 views +
+ + TikTok — midudev +
+ 🎬 #5 — TikTok
+ midudev — 177,800 views
@@ -1153,13 +1161,13 @@ same process on one port, so there is no separate CLI-only package today. | #1 | #2 | #3 | #4 | #5 | | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -| [nick_saraev — Instagram](https://www.instagram.com/reel/Da8ZthUPK98/) — **1,628,910** | [milesreevesai — TikTok](https://www.tiktok.com/@milesreevesai/video/7667980059189366019) — **620,400** | [Vaibhav Sisinty — YouTube](https://www.youtube.com/watch?v=QucgvbO5gsM) — **373,084** | [Nick Automates — YouTube Shorts](https://www.youtube.com/shorts/fZIBK_4fKq8) — **207,714** | [midudev — TikTok](https://www.tiktok.com/@midudev/video/7664636453544152342) — **177,800** | +| [nick_saraev — Instagram](https://www.instagram.com/reel/Da8ZthUPK98/) — **1,628,910** | [milesreevesai — TikTok](https://www.tiktok.com/@milesreevesai/video/7667980059189366019) — **620,400** | [Vaibhav Sisinty — YouTube](https://www.youtube.com/watch?v=QucgvbO5gsM) — **391,109** | [Nick Automates — YouTube Shorts](https://www.youtube.com/shorts/fZIBK_4fKq8) — **218,174** | [midudev — TikTok](https://www.tiktok.com/@midudev/video/7664636453544152342) — **177,800** | -| #6 | #7 | #8 | #9 | #10 | -| ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -| [theopenstack — Instagram](https://www.instagram.com/reel/DaSs65mMrHk/) — **155,453** | [t.ghoush.ai — TikTok](https://www.tiktok.com/@t.ghoush.ai/video/7669497680527248656) — **152,800** | [Valency Labs — YouTube](https://www.youtube.com/watch?v=LkP6ocAoQkk) — **135,974** | [Asati — YouTube](https://www.youtube.com/watch?v=JjPtJcqwhqg) — **126,130** | [Vaibhav Sisinty — YouTube](https://www.youtube.com/watch?v=NuNDpeZYQ28) — **122,672** | +| #6 | #7 | #8 | #9 | #10 | +| ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| [theopenstack — Instagram](https://www.instagram.com/reel/DaSs65mMrHk/) — **155,453** | [t.ghoush.ai — TikTok](https://www.tiktok.com/@t.ghoush.ai/video/7669497680527248656) — **152,800** | [Vaibhav Sisinty — YouTube](https://www.youtube.com/watch?v=NuNDpeZYQ28) — **141,410** | [Valency Labs — YouTube](https://www.youtube.com/watch?v=LkP6ocAoQkk) — **137,404** | [Asati — YouTube](https://www.youtube.com/watch?v=JjPtJcqwhqg) — **127,076** | -Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações conhecidas · 595 perfis/canais · 13+ idiomas · 13+ criadores. +Métricas de validação: **1,070 vídeos rastreados** · no YouTube, 450 longos e 359 Shorts; 239 itens estão fora de playlists · **7,467,359 visualizações conhecidas** · **639 perfis/canais**. Nos últimos 7 dias: 81 vídeos; nos últimos 30 dias: 530 (YT 448 · TT 53 · IG 29). > 🎬 **Made a video about OmniRoute?** Open an [issue](https://github.com/diegosouzapw/OmniRoute/issues/new) or [discussion](https://github.com/diegosouzapw/OmniRoute/discussions) with the link — we'll feature it here. @@ -1199,9 +1207,9 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c - + - + @@ -1211,7 +1219,7 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c - + @@ -1256,15 +1264,15 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c
LayerTechnology
RuntimeNode.js 22.x / 24.x LTS — >=22.22.2 <23 || >=24.0.0 <27
LanguageTypeScript 6.0 — 100% TypeScript across src/ and open-sse/ (zero any in core since v2.0)
LanguageTypeScript 6.0 — TypeScript-first across src/ and open-sse/; new explicit any is blocked by the ESLint quality gate
FrameworkNext.js 16 + React 19 + Tailwind CSS 4
Databasebetter-sqlite3 (SQLite, WAL journaling) + LowDB (JSON legacy) — 120 domain modules, 159 migrations
Databasebetter-sqlite3 (SQLite, WAL journaling) + LowDB (JSON legacy) — 120 domain modules, 160 migrations
MemorySQLite FTS5 full-text + int8-quantized vector embeddings, typed decay
SchemasZod 4 — MCP tool I/O validation + API contracts
ProtocolsMCP (stdio / HTTP / SSE) + A2A v0.3 (JSON-RPC 2.0 + SSE)
Stealthwreq-js — JA3 / JA4 TLS fingerprint impersonation, 3-level proxy
ResilienceCircuit breaker, exponential backoff, anti-thundering-herd, auto-combo self-healing
Loggingpino — structured JSON logs with request context
TestingNode.js test runner + Vitest — 25,000+ test cases across 3,300+ files (unit, integration, E2E, security, ecosystem)
TestingNode.js test runner + Vitest — 36,000+ static test/it declarations across 5,085 tracked test/spec files (unit, integration, E2E, security, ecosystem)
PlatformsDesktop (Electron) · Android (Termux) · PWA (any browser)
CI/CDGitHub Actions — auto npm publish + Docker Hub on release
LinksWebsite · npm · Docker Hub
- + - + - +
DocumentDescription
ArchitectureSystem architecture, data flow, and internals
Compression Guide7-option pipeline: off / lite / standard / aggressive / ultra / RTK / stacked
Compression Guide9-mode pipeline: off / lite / standard / aggressive / ultra / RTK / Responses Tool Output / OmniGlyph / stacked
RTK CompressionCommand-output compression, filters, trust, verify, raw-output recovery
Compression EnginesCaveman, RTK, stacked pipelines, dashboard/API/MCP surfaces
Compression Rules FormatJSON rule-pack schemas for Caveman and RTK filters
Compression Language PacksLanguage detection and Caveman rule-pack authoring
Resilience GuideCircuit breakers, cooldowns, queue, anti-thundering herd, TLS spoofing
Auto-Combo Engine14-factor scoring, mode packs, self-healing
Auto-Combo Engine15-factor scoring, mode packs, self-healing
Proxy Guide3-level proxy system, 1proxy marketplace, registry CRUD
Free Tiers90+ free providers consolidated directory (42 documented token pools / 495 models)
Free TiersConsolidated directory: 38 documented recurring pools / 446 cataloged free-tier entries
Features GalleryVisual dashboard tour with screenshots
Codebase DocumentationBeginner-friendly codebase walkthrough
@@ -1275,7 +1283,7 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c DocumentDescription API ReferenceAll endpoints with examples OpenAPI SpecOpenAPI 3.0 specification - MCP Server109 MCP tools, IDE configs, Python/TS/Go clients + MCP Server110 MCP tools, IDE configs, Python/TS/Go clients MCP Server GuideMCP installation, transports, and tool reference A2A ServerJSON-RPC 2.0 protocol, skills, streaming, task mgmt A2A Server GuideA2A agent card, tasks, skills, and streaming @@ -1291,7 +1299,7 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c Security PolicyVulnerability reporting and security practices i18n Guide43-language support, translation workflow, RTL Release ChecklistPre-release validation steps - Coverage PlanTest coverage strategy and 25,000+ test suite + Coverage PlanTest coverage strategy for 36,000+ static test declarations
@@ -1305,90 +1313,89 @@ Métricas de validação: 1002 vídeos rastreados · 7,069,190 visualizações c + + + + + - - - -
- - oyi77
- oyi77 +
+ backryun
+ backryun

- 🥇 213 commits • +114K lines
- Analytics engine, SQL aggregations,
proxy marketplace, test coverage
+ 🥇 220 GitHub-attributed commits +
+ + Paijo
+ Paijo +

+ 🥈 219 GitHub-attributed commits
R.D. & Randi
R.D. & Randi

- 🥈 108 commits • +38K lines
- Endpoints page, tunnel integrations,
Docker workflows, A2A status, compression UI
+ 🥉 108 GitHub-attributed commits +
+ + Ravi Tharuma
+ Ravi Tharuma +

+ 🏅 74 GitHub-attributed commits
Chris Staley
Chris Staley

- 🥉 70 commits • +1.8K lines
- SSE stream hardening, Responses API,
Gemini pagination, test regression fixes
+ 🏅 70 GitHub-attributed commits
- - zenobit
- zenobit +
+ Markus Hartung
+ Markus Hartung

- 🏅 62 commits • +22K lines
- CI/CD pipeline, i18n for 33 languages,
Void Linux package, platform fixes
+ 🏅 67 GitHub-attributed commits +
+ + Dizzle
+ Dizzle +

+ 🏅 65 GitHub-attributed commits
Jan Leon
Jan Leon

- 🏅 58 commits • +22K lines
- Reasoning-effort routing, proxy controls,
quota visibility, Live Zone compression
-
- - backryun
- backryun -

- 🏅 53 commits • +70K lines
- Provider catalog curation — Perplexity, Kimi,
Cerebras, Copilot, LMArena refreshes
+ 🏅 64 GitHub-attributed commits
- - Chirag Singhal
- Chirag Singhal +
+ zenobit
+ zenobit

- 🏅 46 commits • +4.8K lines
- Error sanitization, MITM prefill fix,
fusion judge, breaker/429 correctness
+ 🏅 62 GitHub-attributed commits
- - kfiramar
- kfiramar +
+ Bob Hou
+ Bob Hou

- 🏅 38 commits • +1.7K lines
- Codex websocket + passthrough, auth/onboarding,
Electron hardening, DB migrations
+ 🏅 51 GitHub-attributed commits · tied #10
- - Benson K B
- Benson K B +
+ Xiangzhe
+ Xiangzhe

- 🏅 28 commits • +9.2K lines
- Electron desktop app, auto-updater,
release build workflows, cross-platform CI
-
- - Hernan J. Ardila
- Hernan J. Ardila -

- 🏅 25 commits • +174K lines
- Zero-latency combos, vision-bridge auto-routing,
catalog context-length, resilience 429 hints
+ 🏅 51 GitHub-attributed commits · tied #10
+Ranking snapshot: GitHub-attributed commits reported by the repository Contributors API for the v3.8.50 default branch on 2026-08-23. Bots, anonymous identities and the maintainer are excluded from this table; tied positions are retained. + > 🙏 These contributors' features, bug fixes, and infrastructure improvements are a **core part** of what makes OmniRoute reliable and feature-rich. Every pull request, every test case, and every i18n translation file matters. Open source is built by people like them. @@ -1419,11 +1426,34 @@ A heartfelt thank-you to the people who fund OmniRoute out of their own pocket
💛 Sponsor + + + drewbitt
+ drewbitt +

+ 💛 Sponsor + + + + psylligent
+ psylligent +

+ 💛 Sponsor + + + + pacocartones
+ pacocartones +

+ 💛 Sponsor + … and others who prefer to stay private 💛 +Public GitHub Sponsors revalidated on 2026-08-23; previously disclosed one-time donors remain listed, and private supporters stay anonymous. + 💖 Become a sponsor → — every dollar keeps OmniRoute free and independent. @@ -1432,11 +1462,13 @@ A heartfelt thank-you to the people who fund OmniRoute out of their own pocket
-## 👥 320+ Contributors +## 👥 600+ Contributors
-[![Contributors](https://contrib.rocks/image?repo=diegosouzapw/OmniRoute&max=400&columns=20&anon=1)](https://github.com/diegosouzapw/OmniRoute/graphs/contributors) +[![Contributors](https://contrib.rocks/image?repo=diegosouzapw/OmniRoute&max=632&columns=20&anon=1)](https://github.com/diegosouzapw/OmniRoute/graphs/contributors) + +Audited at v3.8.50 tip 8f390eff on 2026-08-23: 632 people — 399 identities appear as commit authors and another 233 appear only in explicit Co-authored-by trailers. Formula: all reachable commits; exact e-mail identities plus numeric/non-numeric GitHub noreply variants of the same handle are joined; bots, service accounts and placeholder identities are excluded. No .mailmap exists, and ambiguous same-name identities are deliberately not merged, so this is a conservative, reproducible Git-metadata count rather than a GitHub profile count. ### How to Contribute @@ -1453,7 +1485,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines. ```bash # Create a release — npm publish happens automatically -gh release create v3.8.2 --title "v3.8.2" --generate-notes +VERSION=x.y.z +gh release create "v${VERSION}" --title "v${VERSION}" --generate-notes ```
@@ -1495,54 +1528,61 @@ gh release create v3.8.2 --title "v3.8.2" --generate-notes OmniRoute stands on the shoulders of giants. It started as a fork of **[9router](https://github.com/decolua/9router)** and a TypeScript port of the Go project **[CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI)** — and from there, every subsystem below was inspired by an open-source project that got there first. Each one shaped a concrete piece of OmniRoute. This is our thank-you to all of them. 🙏 -> ⭐ star counts as of July 2026 — go give these projects a star. +> ⭐ star counts verified from GitHub's GraphQL API on August 23, 2026 — go give these projects a star. Counts are a dated snapshot and will naturally change. ### 🧬 Lineage & gateway - - - + + + + + + + +
ProjectHow it inspired OmniRoute
9router22.7kThe original project this fork is built on — extended here with multi-modal APIs and a full TypeScript rewrite.
CLIProxyAPI43.6kThe Go implementation that inspired this JavaScript / TypeScript port.
LiteLLM54.0kThe AI gateway whose public pricing dataset feeds our cost-tracking sync and whose provider-normalization model informed our routing.
9router26.1kThe original project this fork is built on — extended here with multi-modal APIs and a full TypeScript rewrite.
CLIProxyAPI48.4kThe Go implementation that inspired this JavaScript / TypeScript port.
LiteLLM57.1kThe AI gateway whose public pricing dataset feeds our cost-tracking sync and whose provider-normalization model informed our routing.
codex-chatgpt-web1.4kMIT source adapted into the vendored ChatGPT Web → Codex Responses bridge, including browser-session, response-framing, usage and web-search adapters.
free-claude-code47.7kPatterns ported into stream recovery, no-thinking aliases, fallback web search, sliding-window limits, log redaction and hardened launcher flows.
composer-api323Cursor Composer tool-choice, output-constraint and tool-commit patterns adapted into the native Cursor executor.
codex-multi-auth457Fresh-login and refresh-token rotation patterns ported into Codex OAuth reauthentication.
opencode-anthropic-auth510Claude Code-compatible transform defaults and billing-header behavior generalized into OmniRoute's config-driven bridge.
### 🗜️ Context & token compression — engines - - - - - - - + + + + + + + +
ProjectHow it inspired OmniRoute
Caveman90.8kThe viral "why use many token when few token do trick" project — its caveman-speak philosophy powers our standard compression mode and 30+ filler/condensation rules.
RTK – Rust Token Killer71.8kHigh-performance command-output compression — inspired our RTK engine, JSON filter DSL, raw-output recovery and the stacked RTK → Caveman pipeline.
headroom60.1kReversible context-compression (SmartCrusher) — inspired our headroom engine and the ccr retrieve-marker pattern.
LLMLingua6.5kPrompt-compression research (LLMLingua / LLMLingua-2) — inspired our async, code-safe, fail-open llmlingua engine.
llmlingua-2-js30The JS/ONNX port (MobileBERT / XLM-RoBERTa) used as the worker-thread backend for our LLMLingua engine.
Troglodita26PT-BR token compression — powers our pt-BR language pack: pleonasm reduction and filler removal tuned for Brazilian-Portuguese grammar.
ponytail86.0kThe viral "lazy senior dev" YAGNI-coder skill — inspired our less-code Output Style: smallest-working-change steering that cuts _generated_ code (the output-axis sibling to Caveman's terse prose).
Caveman100.5kThe viral "why use many token when few token do trick" project — its caveman-speak philosophy powers our standard compression mode and 30+ filler/condensation rules.
RTK – Rust Token Killer77.1kHigh-performance command-output compression — inspired our RTK engine, JSON filter DSL, raw-output recovery and the stacked RTK → Caveman pipeline.
headroom67.3kReversible context-compression (SmartCrusher) — inspired our headroom engine and the ccr retrieve-marker pattern.
LLMLingua6.6kPrompt-compression research (LLMLingua / LLMLingua-2) — inspired our async, code-safe, fail-open llmlingua engine.
llmlingua-2-js31The JS/ONNX port (MobileBERT / XLM-RoBERTa) used as the worker-thread backend for our LLMLingua engine.
Troglodita40PT-BR token compression — powers our pt-BR language pack: pleonasm reduction and filler removal tuned for Brazilian-Portuguese grammar.
ponytail108.6kThe viral "lazy senior dev" YAGNI-coder skill — inspired our less-code Output Style: smallest-working-change steering that cuts _generated_ code (the output-axis sibling to Caveman's terse prose).
i-have-adhd23.4kIts action-first, ADHD-friendly response style was adapted into OmniRoute's concise output style across five languages.
### 🧩 Compact formats, token research & code-aware tooling - - - + + + + - - - + + + - - + + - +
ProjectHow it inspired OmniRoute
TOON24.9kToken-Oriented Object Notation — its columnar, header-plus-rows model shaped our tabular compaction stage.
GCF – Graph Compact Format22First inspired our tabular compaction stage; now its zero-dependency, lossless generic-profile encoder is vendored directly as the Headroom codec (MIT, SPDX-marked), with later numeric-domain and count-mismatch correctness fixes.
token-optimizer-mcp444Brotli/SQLite cache + per-session context-delta — inspired our session-dedup engine.
TOON25.2kToken-Oriented Object Notation — its columnar, header-plus-rows model shaped our tabular compaction stage.
GCF – Graph Compact Format41Its compact graph format and generic-profile design informed OmniRoute's tabular compaction and Headroom codec format.
gcf-typescript4The MIT TypeScript implementation directly vendored and extended as the Headroom generic-profile codec.
token-optimizer-mcp494Brotli/SQLite cache + per-session context-delta — inspired our session-dedup engine.
token-savior1.1kBash-output compaction + MCP profiles — inspired our compression bail-out discipline and MCP tool-manifest reduction.
token-saver117Content-aware, per-file-type output compression with failure-aware bail-out — validated our per-type dispatch and minimum-gain skip.
token-optimizer1.7k"Find the ghost tokens" — its offload + recoverable-handle pattern informed our CCR offload thinking.
TokenMizer16A session-graph + cross-turn line-dedup blueprint that informed our session-dedup design.
token-saver138Content-aware, per-file-type output compression with failure-aware bail-out — validated our per-type dispatch and minimum-gain skip.
token-optimizer1.9k"Find the ghost tokens" — its offload + recoverable-handle pattern informed our CCR offload thinking.
TokenMizer27A session-graph + cross-turn line-dedup blueprint that informed our session-dedup design.
OmniCompress3Rust columnar-JSON + content-addressed retrieve + cross-message dedup — validated our headroom/ccr/session-dedup engine design and the cache-stable "compressed form is position-independent" invariant.
mcp-compressor98MCP tool-schema/description compression — informed our MCP tool-manifest cardinality reduction.
RepoMapper187Aider-style repo-map ranking — informed our repo-map / retrieval-ranking exploration.
mcp-compressor113MCP tool-schema/description compression — informed our MCP tool-manifest cardinality reduction.
RepoMapper197Aider-style repo-map ranking — informed our repo-map / retrieval-ranking exploration.
quiet-shell-mcp4Declarative shell-output reduction over MCP — validated our declarative bash-output compaction.
ts-morph6.1kTypeScript Compiler API toolkit — inspired our parser-based comment removal that preserves string, template and regex literals.
ts-morph6.2kTypeScript Compiler API toolkit — inspired our parser-based comment removal that preserves string, template and regex literals.
### 🧠 Memory & RAG - - + +
ProjectHow it inspired OmniRoute
Mem061.2kUniversal memory layer — its proxy-as-write/read-boundary model shaped our memory architecture.
Letta (MemGPT)23.9kStateful agents with tiered memory — inspired our Context Control & Recovery (CCR) tiered model.
Mem063.9kUniversal memory layer — its proxy-as-write/read-boundary model shaped our memory architecture.
Letta (MemGPT)24.4kStateful agents with tiered memory — inspired our Context Control & Recovery (CCR) tiered model.
WFGY1.8kThe ProblemMap taxonomy of 16 recurring RAG/LLM failure modes — the shared vocabulary in our troubleshooting guide.
@@ -1550,33 +1590,39 @@ OmniRoute stands on the shoulders of giants. It started as a fork of **[9router] - - + +
ProjectHow it inspired OmniRoute
llm-interceptor49MITM interception/analysis of coding-assistant ↔ LLM traffic — our Traffic Inspector ports its SSE merge, conversation normalization, host passthrough and secret masking (MIT).
ProxyBridge5.5kTransparent per-process proxy routing — inspired our crash-safe MITM teardown, socket idle-timeouts, /proc process attribution and TPROXY capture.
llm-interceptor66MITM interception/analysis of coding-assistant ↔ LLM traffic — our Traffic Inspector ports its SSE merge, conversation normalization, host passthrough and secret masking. The upstream's complete license text is still under provenance review.
ProxyBridge5.9kTransparent per-process proxy routing — inspired our crash-safe MITM teardown, socket idle-timeouts, /proc process attribution and TPROXY capture.
### 📚 Model data, observability & UI - - - - + + + + - + +
ProjectHow it inspired OmniRoute
models.dev6.0kOpen database of AI model specs, pricing and capabilities — synced natively into our model catalog.
React Flow / xyflow37.7kThe node-based graph library powering our real-time Compression Studio and Combo/Routing Studio.
LangGraph37.6kLangGraph Studio's live workflow-graph visualization inspired our Studios' real-time cascade view.
Langfuse31.4kIts trace → span → generation observability model shaped our Compression Studio waterfall.
models.dev6.5kOpen database of AI model specs, pricing and capabilities — synced natively into our model catalog.
React Flow / xyflow38.1kThe node-based graph library powering our real-time Compression Studio and Combo/Routing Studio.
LangGraph40.3kLangGraph Studio's live workflow-graph visualization inspired our Studios' real-time cascade view.
Langfuse33.6kIts trace → span → generation observability model shaped our Compression Studio waterfall.
Kiali3.6kIstio service-mesh observability — inspired our circuit-breaker badges and error-edge visuals in the Routing/Combo Studio.
lobe-icons2.2kAI/LLM brand logos that render the provider icons across our dashboard.
lobe-icons2.4kAI/LLM brand logos that render the provider icons across our dashboard.
flag-icons12.4kProvides the MIT-licensed SVG flags used by the README language selector.
### 🛡️ Security - +
ProjectHow it inspired OmniRoute
awesome-secure-defaults710A curated list of secure-by-default libraries that guides our security choices (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink).
awesome-secure-defaults721A curated list of secure-by-default libraries that guides our security choices (Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink).
### 🧭 Complementary tools + + + + +
ProjectHow it inspired OmniRoute
ClawRouter6.6kInspired request deduplication, emergency zero-cost fallback, pluggable Auto-Combo strategies and multilingual intent classification.
Antigravity-Manager30.6kIts account-aware model remapping, executable-path validation and plan-label behavior informed OmniRoute's Antigravity runtime.
vscode-antigravity-cockpit4.8kIts compact quota-reset countdown format inspired the corresponding provider-limit display in OmniRoute.
AionUi32.2kIts ACP integrations inspired OmniRoute's automatic detection of installed CLI agents.
CodexBar20.5kIdentified the Grok Build quota surface; OmniRoute then verified and corrected the live wire format independently.
## 📄 License @@ -1589,7 +1635,7 @@ MIT License - see [LICENSE](LICENSE) for details. **[⬆ Back to top](#-omniroute)** · Built with ❤️ for the open-source AI community. -OmniRoute v3.8.49 · Node ≥22.22.2 · MIT License · omniroute.online +OmniRoute v3.8.50 · Node ≥22.22.2 · MIT License · omniroute.online diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 45fcfed7bd..a454daa39a 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -24,3 +24,196 @@ NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPO NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## free-claude-code + +The launcher, search, stream-recovery, rate-limit, no-thinking, and log-redaction components listed +below adapt code and patterns from +[`Alishahryar1/free-claude-code`](https://github.com/Alishahryar1/free-claude-code) under the MIT +License: + +- `bin/cli/commands/launch.mjs` +- `bin/cli/commands/launch-codex.mjs` +- `open-sse/config/constants.ts` +- `open-sse/config/searchRegistry.ts` +- `open-sse/handlers/chatCore.ts` +- `open-sse/handlers/search.ts` +- `open-sse/services/freeWebSearch.ts` +- `open-sse/services/providerDefaultRateLimit.ts` +- `open-sse/services/slidingWindowLimiter.ts` +- `open-sse/services/streamRecovery.ts` +- `open-sse/utils/noThinkingAlias.ts` +- `src/lib/resilience/settings/types.ts` +- `src/shared/utils/logRedaction.ts` + +MIT License + +Copyright (c) 2026 Ali Khokhar + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## composer-api + +Parts of `open-sse/executors/cursor.ts` and `open-sse/executors/cursor/prompt.ts` are adapted from +[`standardagents/composer-api`](https://github.com/standardagents/composer-api) under the MIT +License. + +MIT License + +Copyright (c) 2026 Standard Agents + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## codex-multi-auth + +The Codex fresh-login and token-rotation components in the following files are adapted from +[`ndycode/codex-multi-auth`](https://github.com/ndycode/codex-multi-auth) under the MIT License: + +- `src/lib/oauth/constants/oauth.ts` +- `open-sse/services/tokenRefresh.ts` +- `open-sse/services/tokenRefresh/rotationMap.ts` +- `open-sse/services/tokenRefresh/providers/codex.ts` + +MIT License + +Copyright (c) 2026 ndycode + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## opencode-anthropic-auth + +Parts of `open-sse/services/ccBridgeTransforms.ts` and `open-sse/services/systemTransforms.ts` are +adapted from +[`ex-machina-co/opencode-anthropic-auth`](https://github.com/ex-machina-co/opencode-anthropic-auth) +under the MIT License. + +MIT License + +Copyright (c) 2026 Ex Machina + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## i-have-adhd + +The `i-have-adhd` output style in `open-sse/services/compression/outputStyles/catalog.ts` is adapted +from [`ayghri/i-have-adhd`](https://github.com/ayghri/i-have-adhd) under the MIT License. + +MIT License + +Copyright (c) 2026 Ayoub Ghriss + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## flag-icons + +The 38 SVG country flags in `docs/assets/flags/*.svg` are copied from +[`lipis/flag-icons`](https://github.com/lipis/flag-icons) under the MIT License. + +The MIT License (MIT) + +Copyright (c) 2013 Panayiotis Lipiridis + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## GCF TypeScript + +The generic-profile codec in `open-sse/services/compression/engines/headroom/gcf/` is adapted from +[`blackwell-systems/gcf-typescript`](https://github.com/blackwell-systems/gcf-typescript) under the +MIT License. + +MIT License + +Copyright (c) 2026 Dayna Blackwell + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/changelog.d/features/10039-combo-lane-awareness-wave-2.md b/changelog.d/features/10039-combo-lane-awareness-wave-2.md deleted file mode 100644 index 7c8cba55ba..0000000000 --- a/changelog.d/features/10039-combo-lane-awareness-wave-2.md +++ /dev/null @@ -1,2 +0,0 @@ -- **feat(admission):** add lane-aware admission probes for combo/fusion/chaos fan-out (fail-open, queueing disabled), an env-wins `OMNIROUTE_CHAT_VIRTUAL_LANES` activation flag applied at boot, and adaptive-lane visibility in the `omniroute_get_health` MCP tool (related to #9654) -- **docs(mcp):** complete the MCP server README tool reference so the `schemas/` catalog is fully covered (agent-skills, oneproxy, web, tool-search, combo/routing, pricing and DB-health tools were previously only discoverable via `omniroute_tool_search`) diff --git a/changelog.d/features/10057-docker-aware-auto-config.md b/changelog.d/features/10057-docker-aware-auto-config.md deleted file mode 100644 index d8718c5801..0000000000 --- a/changelog.d/features/10057-docker-aware-auto-config.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(cli):** container-aware auto-config — `setup-*`, `omniroute configure`, `omniroute config set` and the CLI-tool config APIs now refuse to write into a containerised OmniRoute's ephemeral home (CLI exits `2`, API returns `422` with `containerEphemeralTarget`) and point at the host-CLI or bind-mount setup instead; `--allow-container-write` / `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` opt back in. Also fixes `CLI_CONFIG_HOME` so the Compose `host` profile's `/host-home` bind mounts are honoured instead of silently falling back to the container home. (#10057) diff --git a/changelog.d/features/10273-dashboard-embed-csp.md b/changelog.d/features/10273-dashboard-embed-csp.md deleted file mode 100644 index 8627e0ddbe..0000000000 --- a/changelog.d/features/10273-dashboard-embed-csp.md +++ /dev/null @@ -1 +0,0 @@ -- feat(dashboard): opt-in `DASHBOARD_ALLOW_EMBED=vscode` relaxes CSP `frame-ancestors` to `'self' vscode-webview:` and drops `X-Frame-Options` for HTML pages only, so the dashboard renders inside the VS Code Simple Browser (OmniCopilot). Default posture unchanged — API routes stay unframable (#10273) diff --git a/changelog.d/features/10303-healthz-event-loop-lag.md b/changelog.d/features/10303-healthz-event-loop-lag.md deleted file mode 100644 index 991c123021..0000000000 --- a/changelog.d/features/10303-healthz-event-loop-lag.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(resilience):** warn when `/healthz` is served under event-loop lag ≥200ms so a slow 200 is visible as sick, not healthy ([#10303](https://github.com/diegosouzapw/OmniRoute/issues/10303)) diff --git a/changelog.d/features/10316-livez-endpoint.md b/changelog.d/features/10316-livez-endpoint.md deleted file mode 100644 index 01409d7b48..0000000000 --- a/changelog.d/features/10316-livez-endpoint.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(docker):** add `GET`/`HEAD` `/livez` as a process-alive probe, distinct from `/healthz` readiness ([#10316](https://github.com/diegosouzapw/OmniRoute/issues/10316)) diff --git a/changelog.d/features/10389-cloudflare-playground.md b/changelog.d/features/10389-cloudflare-playground.md deleted file mode 100644 index fb6bd80c0a..0000000000 --- a/changelog.d/features/10389-cloudflare-playground.md +++ /dev/null @@ -1 +0,0 @@ -- feat(providers): add **Cloudflare AI Playground** as a No Auth provider (`cloudflare-playground`, alias `cfp`) — free anonymous chat over the reverse-engineered `cf_agent` WebSocket protocol (PartySocket transport, no account/API key/cookies) with GLM 5.2, Kimi K2.7 Code, DeepSeek V4 Pro, gpt-oss-120B, Llama 3.3 70B, Qwen2.5 Coder 32B and 14 more curated models. The executor drives a headless Chromium via Playwright (the WS upgrade is TLS-fingerprint-gated), translates the `cf_agent` frame stream into OpenAI SSE, and surfaces upstream rate limits (3021) as HTTP 429. Fixes #10389 diff --git a/changelog.d/features/10542-aihorde-optional-key-image-catalog.md b/changelog.d/features/10542-aihorde-optional-key-image-catalog.md deleted file mode 100644 index 4a8f67b766..0000000000 --- a/changelog.d/features/10542-aihorde-optional-key-image-catalog.md +++ /dev/null @@ -1,2 +0,0 @@ -- **feat(providers):** AI Horde accepts an optional registered API key and advertises only live image models that currently have workers ([#10542](https://github.com/diegosouzapw/OmniRoute/pull/10542)) -- **fix(providers):** AI Horde Check validates keys via `/v2/find_user` instead of the unauthenticated OpenAI models list ([#10542](https://github.com/diegosouzapw/OmniRoute/pull/10542)) diff --git a/changelog.d/features/10581-jina-complete-provider.md b/changelog.d/features/10581-jina-complete-provider.md deleted file mode 100644 index d4fc0424a3..0000000000 --- a/changelog.d/features/10581-jina-complete-provider.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** complete Jina AI as one credential pool — dashboard `jina-ai` / `jina-reader` share a token, `JINA_AI_API_KEY` is a real fallback, Test probes `GET https://api.jina.ai/v1/models` (embeddings fallback hits `jina-embeddings-v5-omni-small`), embed/rerank logs keep `connection_id`, catalog adds `jina-reranker-v3.5`, Omni v5 multimodal `{text}`/`{image}`/`{content}` docs pass through intact, and OmniRoute proxies classify / segment / `jina-search` (`s.jina.ai`). Reader stays a separate `r.jina.ai` card with an explicit label. Gemini Embedding 2 (`gemini/gemini-embedding-2`, alias `google/gemini-embedding-2`) uses dashboard `gemini` keys (or `GEMINI_API_KEY` / `GOOGLE_API_KEY` only when none exist), forwards native multimodal parts, and maps N OpenAI `input` items to N `:batchEmbedContents` vectors instead of one aggregated `:embedContent`. ([#10581](https://github.com/diegosouzapw/OmniRoute/pull/10581)) diff --git a/changelog.d/features/10587-ogg-speech-alias.md b/changelog.d/features/10587-ogg-speech-alias.md deleted file mode 100644 index 118e2a7b48..0000000000 --- a/changelog.d/features/10587-ogg-speech-alias.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** accept `response_format=ogg` on `/v1/audio/speech` as an alias for the existing Opus/Ogg encoder ([#10587](https://github.com/diegosouzapw/OmniRoute/issues/10587)) diff --git a/changelog.d/features/10617-auto-disable-banned-scope.md b/changelog.d/features/10617-auto-disable-banned-scope.md deleted file mode 100644 index e1fc1705a8..0000000000 --- a/changelog.d/features/10617-auto-disable-banned-scope.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(settings):** add `autoDisableBannedScope` so permanent-ban auto-disable can target subscription/OAuth accounts only, leaving prepaid API keys in the routing pool ([#10617](https://github.com/diegosouzapw/OmniRoute/pull/10617)) diff --git a/changelog.d/features/10662-systemd-notify.md b/changelog.d/features/10662-systemd-notify.md deleted file mode 100644 index 5a02e7df25..0000000000 --- a/changelog.d/features/10662-systemd-notify.md +++ /dev/null @@ -1 +0,0 @@ -- feat(server): emit systemd sd_notify READY/WATCHDOG/STOPPING (generated unit becomes Type=notify with WatchdogSec=180) so a frozen server process is killed and restarted by systemd instead of lingering undetected diff --git a/changelog.d/features/10668-newapi-gateway-protocols.md b/changelog.d/features/10668-newapi-gateway-protocols.md deleted file mode 100644 index 1ec6e5f0b7..0000000000 --- a/changelog.d/features/10668-newapi-gateway-protocols.md +++ /dev/null @@ -1,2 +0,0 @@ -- **feat(providers):** add the TabiToken NewAPI gateway (`tabitoken`) and teach the existing HCNSec entry (`hcnsec`) the three further protocols it actually serves. TabiToken leaves the NewAPI pricing endpoint public, so its catalog is read from the host rather than guessed: four Claude models, each reporting the Anthropic and OpenAI protocols. HCNSec shipped OpenAI-only; probing the host showed `/v1/messages`, `/v1/responses` and the Gemini `/v1beta` path all reach its token layer, so each is now declared as an alternate format — with its default format, base URL, auth scheme and regional catalog classification untouched. ([#10668](https://github.com/diegosouzapw/OmniRoute/pull/10668)) — thanks @yawar-aquil -- **feat(sse):** allow an alternate protocol to build its own upstream URL. `AlternateFormat` gained an optional `urlBuilder`, because the Gemini protocol carries the model inside the path (`{base}/{model}:generateContent`) and the existing `chatPath`/`urlSuffix` fields are constants that cannot express it. The route builder is extracted as `buildGeminiGenerateContentUrl` and shared with the native `gemini` provider so the two consumers cannot drift on the `?alt=sse` streaming suffix. ([#10668](https://github.com/diegosouzapw/OmniRoute/pull/10668)) — thanks @yawar-aquil diff --git a/changelog.d/features/10670-call-logs-error-type.md b/changelog.d/features/10670-call-logs-error-type.md deleted file mode 100644 index 1ffd94bd22..0000000000 --- a/changelog.d/features/10670-call-logs-error-type.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(call_logs):** persist the per-call error family in `call_logs.error_type` and expose a failure breakdown (`errorBreakdown`) in the usage analytics endpoint, reusing the existing production classifier ([#10670](https://github.com/diegosouzapw/OmniRoute/issues/10670)) diff --git a/changelog.d/features/10677-egress-sharing-summary.md b/changelog.d/features/10677-egress-sharing-summary.md deleted file mode 100644 index 9e1f723a0d..0000000000 --- a/changelog.d/features/10677-egress-sharing-summary.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(proxy):** the proxy-health sweep and `GET /api/settings/proxies/egress` now report an anonymous summary of egress-IP sharing — how many rotation groups share an egress IP and the largest number of accounts behind one IP — computed from persisted `proxy_logs` over a 24h window. No IPs and no account identities by default; `PROXY_LOG_INCLUDE_IPS=true` restores raw details. ([#10677](https://github.com/diegosouzapw/OmniRoute/issues/10677)) diff --git a/changelog.d/features/10697-vscode-copilot-guide.md b/changelog.d/features/10697-vscode-copilot-guide.md deleted file mode 100644 index ec788c7183..0000000000 --- a/changelog.d/features/10697-vscode-copilot-guide.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(guides):** OmniRoute now serves VS Code's **native Copilot Chat model picker** through the [OmniCopilot](https://github.com/diegosouzapw/OmniCopilot) extension ([Marketplace](https://marketplace.visualstudio.com/items?itemName=diegosouzapw.omnicopilot) · [Open VSX](https://open-vsx.org/extension/diegosouzapw/omnicopilot) — Cursor, Windsurf, VSCodium, Theia…) — no Copilot subscription needed since VS Code 1.122. New [`docs/guides/VSCODE-COPILOT.md`](docs/guides/VSCODE-COPILOT.md) covers setup, how the picker collapses the `dual`-prefix catalog via `GET /v1/models?prefix=alias`, and the **build-time** `DASHBOARD_ALLOW_EMBED=vscode` flag that renders the dashboard in an editor tab ([#10697](https://github.com/diegosouzapw/OmniRoute/pull/10697)) diff --git a/changelog.d/features/10701-dockerfile-dashboard-embed-arg.md b/changelog.d/features/10701-dockerfile-dashboard-embed-arg.md deleted file mode 100644 index 552a873268..0000000000 --- a/changelog.d/features/10701-dockerfile-dashboard-embed-arg.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(docker):** `DASHBOARD_ALLOW_EMBED` is now a Docker build argument — `docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` produces an image whose dashboard renders inside the VS Code Simple Browser (OmniCopilot's `dashboardOpen: "editor"`). Previously the flag was only reachable from a source build: Docker silently drops a `--build-arg` with no matching `ARG`, so the operator got the default image and no error. Builder-stage only and empty by default — the runtime stages deliberately do not carry it, and the unframable default posture is unchanged ([#10701](https://github.com/diegosouzapw/OmniRoute/pull/10701)) diff --git a/changelog.d/features/10729-cursor-api-key-and-cli-passthrough.md b/changelog.d/features/10729-cursor-api-key-and-cli-passthrough.md deleted file mode 100644 index 96094ffff1..0000000000 --- a/changelog.d/features/10729-cursor-api-key-and-cli-passthrough.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** new `cursor-api` provider (card "Cursor API", alias `cua`): connect a Cursor user API key (`crsr_…`) and route `cursor-api/` through the existing Cursor agent executor (the key is exchanged for a 1h session token and cached), plus a `/api/cursor-cli/*` passthrough so the Cursor CLI itself runs through OmniRoute (`CURSOR_API_ENDPOINT=http:///api/cursor-cli`, `CURSOR_API_KEY=`) with every RPC attributed and logged. The IDE `cursor` provider is unchanged. (#10729) diff --git a/changelog.d/features/10771-health-root-endpoint.md b/changelog.d/features/10771-health-root-endpoint.md deleted file mode 100644 index a367bbce78..0000000000 --- a/changelog.d/features/10771-health-root-endpoint.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(api):** `GET /api/health` now answers `{ status, timestamp }` without a key. Until now the path had no route, so the management-auth boundary answered first with a 401 — indistinguishable from a wrong key or an unknown route, which left Docker HEALTHCHECKs and Kubernetes probes unable to tell "down" from "misconfigured". Kept deliberately minimal: version, uptime and memory stay behind the authenticated `/api/monitoring/health` ([#PRNUM](https://github.com/diegosouzapw/OmniRoute/pull/10771)). diff --git a/changelog.d/features/10783-task-routing-configurable-patterns.md b/changelog.d/features/10783-task-routing-configurable-patterns.md deleted file mode 100644 index e5c37c390a..0000000000 --- a/changelog.d/features/10783-task-routing-configurable-patterns.md +++ /dev/null @@ -1 +0,0 @@ -- feat(routing): make Task-Aware Smart Routing's detection patterns operator-configurable via `settings.taskRouting.patternOverrides` (`PUT /api/settings/task-routing`) — the built-in patterns are English-only, so a non-English dashboard had no recourse short of turning detection off entirely; an override now replaces the pattern list for one task type without touching the rest (#10783) diff --git a/changelog.d/features/10869-combo-patch-verb.md b/changelog.d/features/10869-combo-patch-verb.md deleted file mode 100644 index f11893d95c..0000000000 --- a/changelog.d/features/10869-combo-patch-verb.md +++ /dev/null @@ -1 +0,0 @@ -- feat(api): accept PATCH on /api/combos/[id], the verb the OpenAPI spec already documents (#10869) diff --git a/changelog.d/features/10896-glm-5.3.md b/changelog.d/features/10896-glm-5.3.md deleted file mode 100644 index 0edfc4a55b..0000000000 --- a/changelog.d/features/10896-glm-5.3.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(sse):** add GLM-5.3 support (`glm-5.3`, `glm-5.3-high`, `glm-5.3-low`) across the z.ai first-party providers, mapping the upstream `reasoning_effort` request parameter to the existing 5.2 tier UX ([#10896](https://github.com/diegosouzapw/OmniRoute/pull/10896)) — thanks @phuongddx diff --git a/changelog.d/features/10897-home-recent-requests.md b/changelog.d/features/10897-home-recent-requests.md deleted file mode 100644 index fd6bcc9abe..0000000000 --- a/changelog.d/features/10897-home-recent-requests.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(home):** add a live **Recent Requests** panel beside the home Provider Topology (polls `GET /api/usage/call-logs?excludeTests=1` every ~3s, gated by the topology appearance toggle + page visibility). `excludeTests` is now an allowlist of real provider inference (`/v1/%` or `/api/v1/%`), applied before `LIMIT`, so connection-test/model-sync/management rows can never leak into the feed ([#10897](https://github.com/diegosouzapw/OmniRoute/pull/10897), extracted from [#8450](https://github.com/diegosouzapw/OmniRoute/pull/8450)) — thanks @nguyenha935 diff --git a/changelog.d/features/10909-free-provider-rankings-reliability.md b/changelog.d/features/10909-free-provider-rankings-reliability.md deleted file mode 100644 index e5377885ef..0000000000 --- a/changelog.d/features/10909-free-provider-rankings-reliability.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(rankings):** free provider rankings now expose a `reliability` field (raw `testStatus`/`rateLimitedUntil` per connection plus a `healthy`/`degraded`/`down` state, reusing the `ProviderHealthState` vocabulary of the provider health matrix) when the configured/available filters are active — derived from already-loaded data, without touching the ranking order ([#10909](https://github.com/diegosouzapw/OmniRoute/pull/10909)) diff --git a/changelog.d/features/10920-egress-ip-lock.md b/changelog.d/features/10920-egress-ip-lock.md deleted file mode 100644 index af7308b62f..0000000000 --- a/changelog.d/features/10920-egress-ip-lock.md +++ /dev/null @@ -1,8 +0,0 @@ -- `feat(resilience)`: when an allowlisted provider (opencode family) answers - 429 classified `quota_exhausted` or `rate_limit_exceeded` and its free-tier - quota is bucketed by egress IP (#9611), every connection of that family - sharing the IP is cooled down together before the rotation tries them — one - guaranteed-failed upstream call per episode instead of N, on the combo path - as well. For the allowlisted family a 429 now cools the connection instead - of locking a single model. Exclusive allowlist, never terminal, best-effort - when the egress IP is unknown (#10920). diff --git a/changelog.d/features/10926-rankings-usage-reliability.md b/changelog.d/features/10926-rankings-usage-reliability.md deleted file mode 100644 index a79b92b4cf..0000000000 --- a/changelog.d/features/10926-rankings-usage-reliability.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(rankings):** free provider rankings can now report what each provider actually served — `reliability.usage` (requests, successes, success rate over a window) behind the opt-in `withUsage`/`usageRange` query parameters, so a provider that answers every call with an error is no longer described as healthy ([#10926](https://github.com/diegosouzapw/OmniRoute/pull/10926)) diff --git a/changelog.d/features/10987-logfare-free-provider.md b/changelog.d/features/10987-logfare-free-provider.md deleted file mode 100644 index 507a528411..0000000000 --- a/changelog.d/features/10987-logfare-free-provider.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** add Logfare as a free OpenAI-compatible provider — dashboard card with a Free badge and request-logging disclosure (every prompt/completion is logged for research; opt out at logfare.ai/consent), live model discovery from `https://logfare.ai/v1/models` (20 models, 11 chat-capable: kimi-k3, deepseek-v4-pro, glm-5.2, gpt-5.6-luna, minimax-m3…), full chat/streaming through the existing OpenAI-compatible path, the real Logfare logo on the card, and a listing in the free-tiers guide. ([#10987](https://github.com/diegosouzapw/OmniRoute/pull/10987)) diff --git a/changelog.d/features/11104-operator-error-rules.md b/changelog.d/features/11104-operator-error-rules.md deleted file mode 100644 index f31e78c01f..0000000000 --- a/changelog.d/features/11104-operator-error-rules.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** let operators declare per-provider error rules through `settings.providerErrorRules` instead of patching the catalog — an operator-supplied rule for a provider is consulted before the built-in `providerRuleRegistry`, receives the raw error text, and has its declared scope/cooldown/reason actually honored end to end, for any provider (declaring the rule is the opt-in — no extra allowlist entry needed). Matches are plain case-insensitive substrings (never RegExp) and bounded to 50 rules to keep the hot path safe ([#11104](https://github.com/diegosouzapw/OmniRoute/pull/11104)) diff --git a/changelog.d/features/11190-usage-command-json.md b/changelog.d/features/11190-usage-command-json.md deleted file mode 100644 index d7655f04c5..0000000000 --- a/changelog.d/features/11190-usage-command-json.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(api):** `/api/usage/om-usage` gains a structured form — `?format=json` returns the key's own usage as `ApiKeyUsageLimitStatus` + `UsageSnapshot` instead of `text/plain`. This is the surface a UI (the OmniCopilot panel) consumes to show a key holder their daily/weekly spend and quota reset. The route is self-service (the caller's own key, gated by `allowUsageCommand`), not the management surface; refusals come back as a discriminated `{ "allowed": false, "error": … }` so a UI can tell "not allowed" apart from "allowed but nothing cached yet". The endpoint was previously undocumented in `API_REFERENCE.md`; it now has a section ([#11190](https://github.com/diegosouzapw/OmniRoute/pull/11190)) diff --git a/changelog.d/features/11192-usage-command-providers-array.md b/changelog.d/features/11192-usage-command-providers-array.md deleted file mode 100644 index b7ef421109..0000000000 --- a/changelog.d/features/11192-usage-command-providers-array.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(api):** `/api/usage/om-usage?format=json` now returns `providers[]` — every connection's quota snapshot, not just the single selected one — so a panel can render Codex / Claude / OpenCode side by side. The collector already gathered all of them; the single-pick `provider` field (kept) is a terminal presentation choice. Closes the per-connection gap from OmniCopilot #8 ([#11192](https://github.com/diegosouzapw/OmniRoute/pull/11192)) diff --git a/changelog.d/features/8443-credential-health-per-connection-interval.md b/changelog.d/features/8443-credential-health-per-connection-interval.md deleted file mode 100644 index 1fd1d3e5a2..0000000000 --- a/changelog.d/features/8443-credential-health-per-connection-interval.md +++ /dev/null @@ -1,2 +0,0 @@ -- **feat(credential-health):** pace the credential health sweep per connection via `provider_connections.healthCheckInterval` (minutes, 0 = never), with `CREDENTIAL_HEALTH_CHECK_INTERVAL` as the global default ([#8443](https://github.com/diegosouzapw/OmniRoute/issues/8443)) -- **behavior change:** `healthCheckInterval` is a shared column — it paces both the OAuth token refresh and the credential health sweep, and `0` disables both. The connection editor defaults it to 60, so configured OAuth connections are now credential-checked at 60min instead of the previous ~10min (aligned with the probe-volume goal of #8443) diff --git a/changelog.d/features/9085-poolside-laguna-model-ids.md b/changelog.d/features/9085-poolside-laguna-model-ids.md deleted file mode 100644 index ed4c0229db..0000000000 --- a/changelog.d/features/9085-poolside-laguna-model-ids.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** publish Poolside's Laguna Preview catalog statically — `poolside/laguna-xs-2.1` and `poolside/laguna-s-2.1` (262144 context, 32768 max completion, tools + reasoning, text-only), so the models are routable and visible before a key is configured instead of only after live discovery. Pins the catalog form of the XS id against the `laguna-xs.2` variant carried by third-party listings. ([#9085](https://github.com/diegosouzapw/OmniRoute/issues/9085)) diff --git a/changelog.d/features/9760-video-bridge.md b/changelog.d/features/9760-video-bridge.md deleted file mode 100644 index cc2ceca74a..0000000000 --- a/changelog.d/features/9760-video-bridge.md +++ /dev/null @@ -1 +0,0 @@ -- feat(modality-bridge): bridge Chat and Responses video parts through a strict trusted-loopback, quota-bounded FFmpeg broker; enforce HTTPS redirects/SSRF plus format, protocol, stream, pixel, frame, 50 MiB broker/remote, 36 MiB inline, and 120-second limits; propagate caller aborts; preserve the actual successful fallback model through cache/meta/headers; expose sampled latency and honest success telemetry; and ship the localized Video settings UI (#9760) diff --git a/changelog.d/features/9830-radar-local-model-state.md b/changelog.d/features/9830-radar-local-model-state.md deleted file mode 100644 index a6df34c7e7..0000000000 --- a/changelog.d/features/9830-radar-local-model-state.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(radar):** Persist local model display-name/enabled overrides and hide/restore tombstones, with authenticated catalog controls and feed safety precedence ([#9830](https://github.com/diegosouzapw/OmniRoute/pull/9830)) diff --git a/changelog.d/features/9836-radar-guided-combos.md b/changelog.d/features/9836-radar-guided-combos.md deleted file mode 100644 index c813289b35..0000000000 --- a/changelog.d/features/9836-radar-guided-combos.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(radar):** add curated-family combo suggestions, a guided combo page, and the read-only Radar MCP catalog tool ([#9836](https://github.com/diegosouzapw/OmniRoute/pull/9836)) diff --git a/changelog.d/features/9912-radar-supporter-offers.md b/changelog.d/features/9912-radar-supporter-offers.md deleted file mode 100644 index a394c737e9..0000000000 --- a/changelog.d/features/9912-radar-supporter-offers.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(radar):** add a signed live offers feed and supporter offers dashboard ([#9912](https://github.com/diegosouzapw/OmniRoute/pull/9912)) diff --git a/changelog.d/features/9923-radar-intel.md b/changelog.d/features/9923-radar-intel.md deleted file mode 100644 index 033b3fc4b3..0000000000 --- a/changelog.d/features/9923-radar-intel.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(radar):** add signed Intel insights, supporter recognition, and local Radar CLI commands ([#9923](https://github.com/diegosouzapw/OmniRoute/pull/9923)) diff --git a/changelog.d/features/9926-radar-launch-news.md b/changelog.d/features/9926-radar-launch-news.md deleted file mode 100644 index 9ec56bebd0..0000000000 --- a/changelog.d/features/9926-radar-launch-news.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(radar):** add a localized public news feed and dismissible dashboard launch banner, with the Radar announcement staged inactive for a separately authorized launch ([#9926](https://github.com/diegosouzapw/OmniRoute/pull/9926)) diff --git a/changelog.d/features/command-code-reasoning-efforts.md b/changelog.d/features/command-code-reasoning-efforts.md deleted file mode 100644 index 3e9b172204..0000000000 --- a/changelog.d/features/command-code-reasoning-efforts.md +++ /dev/null @@ -1 +0,0 @@ -- feat(command-code): advertise low/medium/high/xhigh/max reasoning-effort suffixes for reasoning-capable models in the catalog and Combo Builder, with request-time resolution to reasoning_effort diff --git a/changelog.d/features/crofai-reasoning-efforts.md b/changelog.d/features/crofai-reasoning-efforts.md deleted file mode 100644 index 6a84017aba..0000000000 --- a/changelog.d/features/crofai-reasoning-efforts.md +++ /dev/null @@ -1 +0,0 @@ -- feat(crof): advertise reasoning-effort tiers (none/low/medium/high/max) for live-discovered and seed models, so the catalog, Playground, and Combo Builder surface - aliases and requests resolve max upstream diff --git a/changelog.d/features/cursor-agent-image-provider.md b/changelog.d/features/cursor-agent-image-provider.md deleted file mode 100644 index 84646dc44e..0000000000 --- a/changelog.d/features/cursor-agent-image-provider.md +++ /dev/null @@ -1 +0,0 @@ -- feat(sse): add Cursor plan image generation via Agent CLI (`IMAGE_PROVIDERS.cursor`, format `cursor-agent-image`), reusing the chat Cursor OAuth connection diff --git a/changelog.d/features/disable-context-window-checks.md b/changelog.d/features/disable-context-window-checks.md deleted file mode 100644 index 1cdd3cc0a8..0000000000 --- a/changelog.d/features/disable-context-window-checks.md +++ /dev/null @@ -1 +0,0 @@ -- feat(routing): add the default-off `DISABLE_CONTEXT_WINDOW_CHECKS` feature flag to let operators bypass OmniRoute's local context-window and max-input-token check for direct single-model requests, leaving upstream limits, prompt compression, and output-token caps intact. diff --git a/changelog.d/features/kimi-coding-extra-usage.md b/changelog.d/features/kimi-coding-extra-usage.md deleted file mode 100644 index 766ec1020c..0000000000 --- a/changelog.d/features/kimi-coding-extra-usage.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(usage):** show Kimi Coding's fixed-order Code 5-hour/7-day quota windows plus Extra Usage status, balance, monthly spend/limit, and the official Additional Credits link on Dashboard → Quota cards. diff --git a/changelog.d/features/m365-copilot-tool-calls.md b/changelog.d/features/m365-copilot-tool-calls.md deleted file mode 100644 index bfafe08033..0000000000 --- a/changelog.d/features/m365-copilot-tool-calls.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** copilot-m365-web now supports OpenAI tool calling — a router planning turn asks the substrate model (as a tool-selection assistant emitting `CALL_TOOL: name({...})` / `NO_TOOL_NEEDED` text, which bypasses its plugin-registry refusal) and validated decisions surface as `tool_calls` with `finish_reason: "tool_calls"` in both stream and non-stream modes; also flattens the full message history (assistant `tool_calls` + compacted tool results) so multi-turn agent loops keep context, replies to SignalR `type:6` keepalives, surfaces `type:3` error frames instead of a silent empty `stop`, and suppresses `writeAtCursor` text from tool-progress frames diff --git a/changelog.d/features/multimodal-embeddings-alias.md b/changelog.d/features/multimodal-embeddings-alias.md deleted file mode 100644 index b69c53ecb5..0000000000 --- a/changelog.d/features/multimodal-embeddings-alias.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(api):** add `GET`/`POST` `/v1/multimodal-embeddings` as an alias of `/v1/embeddings` so Jina-compatible clients do not receive HTTP 404 `unknown_route` — thanks @RaviTharuma diff --git a/changelog.d/features/opencode-go-muse-spark-efforts.md b/changelog.d/features/opencode-go-muse-spark-efforts.md deleted file mode 100644 index 25da8482a9..0000000000 --- a/changelog.d/features/opencode-go-muse-spark-efforts.md +++ /dev/null @@ -1 +0,0 @@ -- feat(opencode-go): expose Muse Spark 1.2 Contributor reasoning-effort aliases (minimal/low/medium/high/xhigh) in the Combo Builder diff --git a/changelog.d/features/per-connection-upstream-timeout.md b/changelog.d/features/per-connection-upstream-timeout.md deleted file mode 100644 index a5987ed485..0000000000 --- a/changelog.d/features/per-connection-upstream-timeout.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(providers):** restore the operator-owned upstream timeout tier per connection via `providerSpecificData.timeoutMs` (preempts the maintainer-only model/provider registry tiers and the global `FETCH_TIMEOUT_MS`), and make the combo per-target timeout ceiling follow the selected connection \ No newline at end of file diff --git a/changelog.d/features/unreleased-exclusive-managed-session-leases.md b/changelog.d/features/unreleased-exclusive-managed-session-leases.md deleted file mode 100644 index 9db23724ef..0000000000 --- a/changelog.d/features/unreleased-exclusive-managed-session-leases.md +++ /dev/null @@ -1 +0,0 @@ -- **feat(routing):** add client-, provider-, and model-neutral exclusive managed session connection leases with API-key-bound generation fencing, durable SQLite ownership, explicit allowlist policy, and bounded 429 capacity retry semantics. diff --git a/changelog.d/fixes/10017-sse-control-lines-leak-openai-clients.md b/changelog.d/fixes/10017-sse-control-lines-leak-openai-clients.md deleted file mode 100644 index 3c129442b4..0000000000 --- a/changelog.d/fixes/10017-sse-control-lines-leak-openai-clients.md +++ /dev/null @@ -1 +0,0 @@ -- **Passthrough streaming:** stop leaking upstream SSE control lines (`id:`/`event:`/`retry:`/`:` comments) to plain OpenAI Chat-Completions-format clients, while preserving `event:` framing for OpenAI Responses API and Claude Messages API passthrough ([#10017](https://github.com/diegosouzapw/OmniRoute/issues/10017)). diff --git a/changelog.d/fixes/10028-windows-instrumentation-hook.md b/changelog.d/fixes/10028-windows-instrumentation-hook.md deleted file mode 100644 index 9879e2f3f3..0000000000 --- a/changelog.d/fixes/10028-windows-instrumentation-hook.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): stop diagnosing every Next.js instrumentation-hook failure as the Android/Termux cache bug — only the Android "Unsupported platform: android" signal now triggers the Android hint, so a win32/desktop instrumentation error surfaces its real cause instead of a useless `mkdir -p ~/.cache` (#10028) \ No newline at end of file diff --git a/changelog.d/fixes/10071-g4f-space-anonymous-tier-proof-of-work.md b/changelog.d/fixes/10071-g4f-space-anonymous-tier-proof-of-work.md deleted file mode 100644 index 47f8de84fd..0000000000 --- a/changelog.d/fixes/10071-g4f-space-anonymous-tier-proof-of-work.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** the five g4f.space sub-providers (Groq, Gemini, Pollinations, Ollama, NVIDIA) no longer advertise a free tier — a keyless `POST /v1/chat/completions` now returns `402 insufficient_credits` behind a proof-of-work "cake" wall (re-verified live 2026-08-22), so `hasFree` is `false` and the notes point at `g4f.dev/members.html`. The gateway still works with a member key, so its registry wiring and `authType: "optional"` are unchanged ([#10071](https://github.com/diegosouzapw/OmniRoute/issues/10071)) — thanks @chirag127 diff --git a/changelog.d/fixes/10077-chatgpt-web-max-thinking-effort.md b/changelog.d/fixes/10077-chatgpt-web-max-thinking-effort.md deleted file mode 100644 index bf603f72d5..0000000000 --- a/changelog.d/fixes/10077-chatgpt-web-max-thinking-effort.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(chatgpt-web):** Preserve native `max` thinking effort through ChatGPT Web routing ([#10077](https://github.com/diegosouzapw/OmniRoute/pull/10077)) — thanks @zannen7 diff --git a/changelog.d/fixes/10078-agentrouter-quota-missing-dashboard.md b/changelog.d/fixes/10078-agentrouter-quota-missing-dashboard.md deleted file mode 100644 index b67fcc0f62..0000000000 --- a/changelog.d/fixes/10078-agentrouter-quota-missing-dashboard.md +++ /dev/null @@ -1,2 +0,0 @@ -- Fix: wire AgentRouter's existing console balance fetcher into the Dashboard Quota UI (visibility gate + provider-limits data path + background sync) so its wallet balance renders instead of falling back to "Usage API not implemented" (#10078) -- Fix: AgentRouter's dollar balance now renders as a currency-formatted "$X.XX" credits row in the Dashboard Quota UI instead of a bare percentage, and an exhausted wallet always shows exactly $0.00 (#10078) \ No newline at end of file diff --git a/changelog.d/fixes/10085-compatible-chat-credential-mismatch.md b/changelog.d/fixes/10085-compatible-chat-credential-mismatch.md deleted file mode 100644 index 773d4ed3cb..0000000000 --- a/changelog.d/fixes/10085-compatible-chat-credential-mismatch.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): bridge generic openai-compatible/anthropic-compatible provider type ids to their concrete uuid node id in credential lookup (#10085) diff --git a/changelog.d/fixes/10095-antigravity-multiaccount-quota-false-exhaustion.md b/changelog.d/fixes/10095-antigravity-multiaccount-quota-false-exhaustion.md deleted file mode 100644 index 579005e943..0000000000 --- a/changelog.d/fixes/10095-antigravity-multiaccount-quota-false-exhaustion.md +++ /dev/null @@ -1 +0,0 @@ -- fix(domain): stop treating an unreported Antigravity quota fraction (`fractionReported:false`) as 0% remaining in `quotaCache.ts`, which was falsely marking every fresh/newly-connected account as exhausted and blocking multi-account rotation (#10095) diff --git a/changelog.d/fixes/10096-kimi-coding-apikey-save.md b/changelog.d/fixes/10096-kimi-coding-apikey-save.md deleted file mode 100644 index 2b5f1bb8b6..0000000000 --- a/changelog.d/fixes/10096-kimi-coding-apikey-save.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): remap unified Kimi Code card API-key save to the admitted `kimi-coding-apikey` connection id, fixing 400 "Invalid provider" on Save (#10096) diff --git a/changelog.d/fixes/10104-antigravity-trailing-model-turn.md b/changelog.d/fixes/10104-antigravity-trailing-model-turn.md deleted file mode 100644 index 80af15279f..0000000000 --- a/changelog.d/fixes/10104-antigravity-trailing-model-turn.md +++ /dev/null @@ -1 +0,0 @@ -- fix(antigravity): strip trailing model turn for native Gemini requests too, not just Claude (#10104) diff --git a/changelog.d/fixes/10111-adaptive-admission-latency-collapse.md b/changelog.d/fixes/10111-adaptive-admission-latency-collapse.md deleted file mode 100644 index 1b806d53e6..0000000000 --- a/changelog.d/fixes/10111-adaptive-admission-latency-collapse.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(admission):** stop the adaptive latency-gradient collapse from permanently locking out ordinary requests — individually valid requests now make solo progress when the system is idle and normal pressure, and the collapsed limit actively recovers on sustained idle windows instead of being stuck; the critical-pressure fuse still wins over solo progress (#10111) \ No newline at end of file diff --git a/changelog.d/fixes/10119-claude-haiku-45-capability-flags.md b/changelog.d/fixes/10119-claude-haiku-45-capability-flags.md deleted file mode 100644 index 799486ffb0..0000000000 --- a/changelog.d/fixes/10119-claude-haiku-45-capability-flags.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): downgrade client-supplied `thinking:{type:"adaptive"}` to `enabled` and gate the `context-1m-2025-08-07` beta on model eligibility when a combo/fallback re-routes a request to a non-adaptive/non-1M model like claude-haiku-4-5 (avoids "adaptive thinking is not supported on this model" and "long context beta is not yet available" 400s, #10119) \ No newline at end of file diff --git a/changelog.d/fixes/10123-async-call-log-artifacts.md b/changelog.d/fixes/10123-async-call-log-artifacts.md deleted file mode 100644 index 60afcde1cc..0000000000 --- a/changelog.d/fixes/10123-async-call-log-artifacts.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(logging):** move call-log artifact serialization and filesystem writes to a bounded singleton worker to keep request handling responsive (#10123) diff --git a/changelog.d/fixes/10125-incremental-call-log-rotation.md b/changelog.d/fixes/10125-incremental-call-log-rotation.md deleted file mode 100644 index 50657fb19e..0000000000 --- a/changelog.d/fixes/10125-incremental-call-log-rotation.md +++ /dev/null @@ -1 +0,0 @@ -- **perf(logging):** bound each scheduled call-log rotation pass to incremental database and filesystem work (#10125) diff --git a/changelog.d/fixes/10127-early-sse-heartbeat.md b/changelog.d/fixes/10127-early-sse-heartbeat.md deleted file mode 100644 index 4ada9f43a4..0000000000 --- a/changelog.d/fixes/10127-early-sse-heartbeat.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(streaming):** start early SSE heartbeats when Responses or Messages requests opt into streaming through the request body (#10127) diff --git a/changelog.d/fixes/10136-combo-scoped-session-stickiness.md b/changelog.d/fixes/10136-combo-scoped-session-stickiness.md deleted file mode 100644 index 6cab4a2a7b..0000000000 --- a/changelog.d/fixes/10136-combo-scoped-session-stickiness.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(combo):** scope session-stickiness bindings to their owning Combo so identical first messages cannot carry a successful target into another priority chain and bypass its configured order (fixes #10136) diff --git a/changelog.d/fixes/10139-thinking-output-cap-provider-scope.md b/changelog.d/fixes/10139-thinking-output-cap-provider-scope.md deleted file mode 100644 index 6fc97e467a..0000000000 --- a/changelog.d/fixes/10139-thinking-output-cap-provider-scope.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(translator):** resolve the Claude thinking output cap with the routed provider so a provider-scoped-only `max_output_tokens` override is no longer invisible to `fitThinkingToMaxTokens()`, which previously let the synthesized `max_tokens` (caller room + thinking budget) go out unbounded and 400 upstream ([#10139](https://github.com/diegosouzapw/OmniRoute/issues/10139)) diff --git a/changelog.d/fixes/10140-conol-web-import-depth.md b/changelog.d/fixes/10140-conol-web-import-depth.md deleted file mode 100644 index 9d920035b6..0000000000 --- a/changelog.d/fixes/10140-conol-web-import-depth.md +++ /dev/null @@ -1,3 +0,0 @@ -- fix(providers): correct the conol-web registry fallback-models import depth, which pointed at a - non-existent `open-sse/config/services/` and made any suite loading the provider registry fail to - resolve (#10140) diff --git a/changelog.d/fixes/10144-claude-import-cli-user-id.md b/changelog.d/fixes/10144-claude-import-cli-user-id.md deleted file mode 100644 index 0c892de04b..0000000000 --- a/changelog.d/fixes/10144-claude-import-cli-user-id.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(oauth):** Claude connections created via `claude-auth/import` now send required CLI headers on the bootstrap identity call and persist a `cliUserID` device identity, fixing intermittent "Third-party apps now draw from your extra usage" 400s on otherwise valid imported subscription tokens ([#10144](https://github.com/diegosouzapw/OmniRoute/pull/10144), fixes [#10143](https://github.com/diegosouzapw/OmniRoute/issues/10143)) diff --git a/changelog.d/fixes/10156-responses-commentary-completed-snapshot.md b/changelog.d/fixes/10156-responses-commentary-completed-snapshot.md deleted file mode 100644 index 7a976ab85d..0000000000 --- a/changelog.d/fixes/10156-responses-commentary-completed-snapshot.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** Responses-passthrough `response.completed` snapshots now drop `phase:"commentary"` items the same way live SSE frames already do, so the terminal `response.output` array no longer echoes internal commentary text that was already suppressed from the stream (#10156). diff --git a/changelog.d/fixes/10158-local-proxy-subscription.md b/changelog.d/fixes/10158-local-proxy-subscription.md deleted file mode 100644 index 76194c6d49..0000000000 --- a/changelog.d/fixes/10158-local-proxy-subscription.md +++ /dev/null @@ -1 +0,0 @@ -- fix(proxy-subscriptions): allow local/loopback proxy-subscription fetch URLs (local-first, cloud-metadata still blocked) (#10158) diff --git a/changelog.d/fixes/10162-approximate-combo-context-advisory.md b/changelog.d/fixes/10162-approximate-combo-context-advisory.md deleted file mode 100644 index 3c1bc703a0..0000000000 --- a/changelog.d/fixes/10162-approximate-combo-context-advisory.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(routing):** keep approximate Combo context estimates advisory so requests reach concrete targets instead of returning a pre-dispatch 400 ([#10162](https://github.com/diegosouzapw/OmniRoute/pull/10162)) — thanks @xz-dev diff --git a/changelog.d/fixes/10169-thinking-budget-docs-i18n.md b/changelog.d/fixes/10169-thinking-budget-docs-i18n.md deleted file mode 100644 index 131288a49a..0000000000 --- a/changelog.d/fixes/10169-thinking-budget-docs-i18n.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(settings):** document Thinking Budget modes (passthrough vs auto-strip); fix dashboard i18n key collision that showed Auto Combo routing copy on the thinking tab; clarify independence from compression/cache ([#10169](https://github.com/diegosouzapw/OmniRoute/pull/10169)) diff --git a/changelog.d/fixes/10171-instrumentation-hook-boot-fatal-log.md b/changelog.d/fixes/10171-instrumentation-hook-boot-fatal-log.md deleted file mode 100644 index 3f2c0fb028..0000000000 --- a/changelog.d/fixes/10171-instrumentation-hook-boot-fatal-log.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): guarantee a non-empty `[STARTUP] Fatal:` log line for any instrumentation-hook boot throw, not just DB-driver init failures (#10171) diff --git a/changelog.d/fixes/10183-10268-admission-heap-conditional-shed.md b/changelog.d/fixes/10183-10268-admission-heap-conditional-shed.md deleted file mode 100644 index f99bba5035..0000000000 --- a/changelog.d/fixes/10183-10268-admission-heap-conditional-shed.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): gate structural chat admission shedding on real heap pressure instead of unconditional capacity, with a bounded headroom budget so a healthy heap can no longer bypass admission control indefinitely (#10183, #10268) diff --git a/changelog.d/fixes/10202-responses-vision-bridge.md b/changelog.d/fixes/10202-responses-vision-bridge.md deleted file mode 100644 index cb5ff02038..0000000000 --- a/changelog.d/fixes/10202-responses-vision-bridge.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(guardrails):** Vision Bridge handles OpenAI Responses `input`/`input_image` requests before combo vision filtering ([#10202](https://github.com/diegosouzapw/OmniRoute/pull/10202)) — thanks @Zartharas diff --git a/changelog.d/fixes/10215-cursor-kv-after-text-toolcalls.md b/changelog.d/fixes/10215-cursor-kv-after-text-toolcalls.md deleted file mode 100644 index db0ea1df9a..0000000000 --- a/changelog.d/fixes/10215-cursor-kv-after-text-toolcalls.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cursor):** Stop truncating pending tool calls on non-composer models when a KV checkpoint arrives after text but before the `exec_mcp` frame — the KV short-circuit is now gated to the composer family where it was verified ([#10215](https://github.com/diegosouzapw/OmniRoute/issues/10215)). \ No newline at end of file diff --git a/changelog.d/fixes/10223-deepseek-responses-sse-cjk-deltas.md b/changelog.d/fixes/10223-deepseek-responses-sse-cjk-deltas.md deleted file mode 100644 index 8f3c19bb20..0000000000 --- a/changelog.d/fixes/10223-deepseek-responses-sse-cjk-deltas.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(responses):** repair corrupted SSE deltas for non-ASCII streams by keeping a single stream-aware `TextDecoder` (`{ stream: true }`) across `transform()` calls instead of recreating it per chunk and decoding without the `stream` flag. When a multi-byte UTF-8 character (CJK/emoji) was split across two TCP chunks — common in Chinese streaming text — the per-chunk decoder truncated it to `U+FFFD`, corrupting every delta while the rebuilt `*.done` snapshot stayed internally identical ([#10223](https://github.com/diegosouzapw/OmniRoute/issues/10223)) \ No newline at end of file diff --git a/changelog.d/fixes/10225-combo-context-overflow-before-compression.md b/changelog.d/fixes/10225-combo-context-overflow-before-compression.md deleted file mode 100644 index 0a678180af..0000000000 --- a/changelog.d/fixes/10225-combo-context-overflow-before-compression.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(combo):** defer the known-context-overflow hard rejection for compressible requests so compression runs before the final context gate, instead of a raw-body estimate 400'ing generic Responses clients targeting a large model before OmniRoute can shrink it ([#10225](https://github.com/diegosouzapw/OmniRoute/issues/10225)) \ No newline at end of file diff --git a/changelog.d/fixes/10228-provider-model-delete-tombstones-synced-sibling.md b/changelog.d/fixes/10228-provider-model-delete-tombstones-synced-sibling.md deleted file mode 100644 index 10005b7419..0000000000 --- a/changelog.d/fixes/10228-provider-model-delete-tombstones-synced-sibling.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** deleting a manually-added custom model no longer tombstones a provider-synced model that shares its id. `DELETE /api/provider-models` is addressed by `provider` + `model` alone, so when both a custom row and a synced row existed for one id it removed both and wrote `isDeleted:true`. `replaceSyncedAvailableModelsForConnection` then filtered that id out of every subsequent re-import, so the provider could never resync — model sync kept reporting `added: N` while the catalog stayed empty and `/v1/models` never listed the model again, even though routing to it still worked. The custom row is now removed first and its presence is treated as the operator's intent, leaving the synced sibling importable; a synced-only delete still tombstones as before (#3199, #3782 unaffected) ([#10228](https://github.com/diegosouzapw/OmniRoute/pull/10228)) — thanks @Neuron-Mr-White diff --git a/changelog.d/fixes/10229-audio-bridge-multipart-runtime.md b/changelog.d/fixes/10229-audio-bridge-multipart-runtime.md deleted file mode 100644 index 6e74c302db..0000000000 --- a/changelog.d/fixes/10229-audio-bridge-multipart-runtime.md +++ /dev/null @@ -1 +0,0 @@ -- **Audio Bridge:** fix production transcription self-loop uploads so real audio reaches the configured STT provider instead of falling back to an unavailable-provider stub ([#10229](https://github.com/diegosouzapw/OmniRoute/pull/10229)). diff --git a/changelog.d/fixes/10230-deepseek-native-max-effort.md b/changelog.d/fixes/10230-deepseek-native-max-effort.md deleted file mode 100644 index 3a681d3190..0000000000 --- a/changelog.d/fixes/10230-deepseek-native-max-effort.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** DeepSeek V4's native `max` reasoning tier is now reachable. DeepSeek accepts `reasoning_effort` `low`/`high`/`max` and maps `medium`/`xhigh` down to `high`, while OmniRoute's canonical vocabulary collapses `max` onto `xhigh` — so `{"effort":"max"}` silently resolved to `high` and the catalog never advertised a `max` tier (or its `-max` variant). Following the existing `extendCodexGpt56EffortValues` precedent, the native tier is now preserved for `deepseek`/`ds` V4 models only; the global effort vocabulary is unchanged, routed namespaces (`openrouter/deepseek/…`, `tllm/deepseek_v4`, `oc/deepseek-v4-flash-free`) keep the canonical behavior, and an explicit client `reasoning_effort` still wins ([#10230](https://github.com/diegosouzapw/OmniRoute/pull/10230)) — thanks @Neuron-Mr-White diff --git a/changelog.d/fixes/10233-freeaiapikey-endpoint-moved.md b/changelog.d/fixes/10233-freeaiapikey-endpoint-moved.md deleted file mode 100644 index cd7abc5c32..0000000000 --- a/changelog.d/fixes/10233-freeaiapikey-endpoint-moved.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** FreeAIAPIKey now targets `api.freeaiapikey.com`, the host upstream names in its `410 endpoint_moved` response — every request through the provider was failing — and its catalog is resynced to the 10 models the live `/v1/models` actually serves ([#10233](https://github.com/diegosouzapw/OmniRoute/pull/10233)) diff --git a/changelog.d/fixes/10234-monsterapi-deprecation-inert.md b/changelog.d/fixes/10234-monsterapi-deprecation-inert.md deleted file mode 100644 index 62a95d78ab..0000000000 --- a/changelog.d/fixes/10234-monsterapi-deprecation-inert.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** MonsterAPI's deprecation now actually applies — the flag was written as `isDeprecated`, a key no consumer or schema reads, so the provider kept rendering as healthy in the dashboard, the onboarding wizard and the generated provider reference ([#10234](https://github.com/diegosouzapw/OmniRoute/pull/10234)) diff --git a/changelog.d/fixes/10244-cliproxy-installer-windows-platform-detection.md b/changelog.d/fixes/10244-cliproxy-installer-windows-platform-detection.md deleted file mode 100644 index bdc134b990..0000000000 --- a/changelog.d/fixes/10244-cliproxy-installer-windows-platform-detection.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cliproxy):** read platform/arch at runtime via `os.platform()`/`os.arch()` in `binaryManager` so the embedded installer selects the Windows/ARM assets even when the release bundle is built on a Linux runner (fixes #10244) \ No newline at end of file diff --git a/changelog.d/fixes/10247-provider-icon-data-url-save.md b/changelog.d/fixes/10247-provider-icon-data-url-save.md deleted file mode 100644 index 6ad4538b86..0000000000 --- a/changelog.d/fixes/10247-provider-icon-data-url-save.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** compatible/custom providers now save valid Data URL icons and show Add/Edit save failures instead of silently doing nothing ([#10247](https://github.com/diegosouzapw/OmniRoute/pull/10247)) — thanks @xz-dev diff --git a/changelog.d/fixes/10248-custom-model-overrides.md b/changelog.d/fixes/10248-custom-model-overrides.md deleted file mode 100644 index 711e48b9d5..0000000000 --- a/changelog.d/fixes/10248-custom-model-overrides.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(models):** custom model metadata and compatible-provider context overrides now take precedence over discovered metadata, while deleting a synced model no longer creates a permanent tombstone so a later provider sync can restore it ([#10248](https://github.com/diegosouzapw/OmniRoute/pull/10248)) — thanks @jackjinke diff --git a/changelog.d/fixes/10249-dedup-hash-collision.md b/changelog.d/fixes/10249-dedup-hash-collision.md deleted file mode 100644 index f118196dfe..0000000000 --- a/changelog.d/fixes/10249-dedup-hash-collision.md +++ /dev/null @@ -1 +0,0 @@ -- fix(open-sse): stop concurrent requests colliding on the same dedup hash for non-OpenAI target formats (#10249) diff --git a/changelog.d/fixes/10251-text-tool-call-parsing.md b/changelog.d/fixes/10251-text-tool-call-parsing.md deleted file mode 100644 index 9febe54687..0000000000 --- a/changelog.d/fixes/10251-text-tool-call-parsing.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(translator):** Text-format tool calls emitted inline by some models are now converted to proper `tool_use` blocks. Certain models (DeepSeek, Qwen) return tool invocations as `{"name":"Bash","arguments":{…}}` or `TOOL_CALL Read: {"file_path":"…"}` inside the text stream instead of the structured `tool_calls` field. Both formats leaked through the Claude translators as plain text, so Claude Code rendered the raw block and stalled instead of executing the tool. `extractXmlInvokeBlocks` (previously ``-only) now scans for all three shapes in a single pass and emits `content_block_start`/`input_json_delta`/`content_block_stop` events, in both `openai-to-claude` and `gemini-to-claude` (Antigravity) paths ([#10251](https://github.com/diegosouzapw/OmniRoute/pull/10251)) diff --git a/changelog.d/fixes/10261-provider-warning-badges.md b/changelog.d/fixes/10261-provider-warning-badges.md deleted file mode 100644 index 39720b4bf5..0000000000 --- a/changelog.d/fixes/10261-provider-warning-badges.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): make provider card warning indicators expose the interaction they advertise (#10261) diff --git a/changelog.d/fixes/10265-command-code-provider-api.md b/changelog.d/fixes/10265-command-code-provider-api.md deleted file mode 100644 index b38e4e9d2a..0000000000 --- a/changelog.d/fixes/10265-command-code-provider-api.md +++ /dev/null @@ -1 +0,0 @@ -- fix(command-code): route chat to the documented /provider/v1/chat/completions endpoint instead of the CLI-only /alpha/generate, which Command Code gates/blocks for external callers (#10265) \ No newline at end of file diff --git a/changelog.d/fixes/10272-provider-test-statuscode-propagation.md b/changelog.d/fixes/10272-provider-test-statuscode-propagation.md deleted file mode 100644 index 5102bf9c45..0000000000 --- a/changelog.d/fixes/10272-provider-test-statuscode-propagation.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** preserve validator HTTP status codes in API-key and web connection-test results so callers can distinguish authentication, rate-limit, and upstream failures ([#10272](https://github.com/diegosouzapw/OmniRoute/pull/10272)) — thanks @Zartharas diff --git a/changelog.d/fixes/10284-reasoning-probe-truncated-200.md b/changelog.d/fixes/10284-reasoning-probe-truncated-200.md deleted file mode 100644 index c3ddd311d2..0000000000 --- a/changelog.d/fixes/10284-reasoning-probe-truncated-200.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** tiny-budget reasoning probes (e.g. Claude Code's `/model` check sends `max_tokens: 1`) are answered with a valid truncated 200 instead of relaying the upstream 5xx "empty response content" — which previously also marked the connection unavailable and poisoned fallback/cooldown bookkeeping for a request that is only a probe ([#10281](https://github.com/diegosouzapw/OmniRoute/issues/10281)) — thanks @harkaranbrar7 diff --git a/changelog.d/fixes/10285-googleflow-video-wrong-path-auth.md b/changelog.d/fixes/10285-googleflow-video-wrong-path-auth.md deleted file mode 100644 index 8e2301cb7c..0000000000 --- a/changelog.d/fixes/10285-googleflow-video-wrong-path-auth.md +++ /dev/null @@ -1 +0,0 @@ -- fix(video): stop advertising the googleflow (Veo) video provider as working and fail fast with a clear diagnostic — its submit/poll endpoints 404 and no server-side OAuth transport can satisfy the working endpoint (#10285) diff --git a/changelog.d/fixes/10286-gemini-3-5-flash-thinking.md b/changelog.d/fixes/10286-gemini-3-5-flash-thinking.md deleted file mode 100644 index 30a3c44bcb..0000000000 --- a/changelog.d/fixes/10286-gemini-3-5-flash-thinking.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): mark gemini-3.5-flash as thinking-capable so reasoning_effort is no longer rejected with a spurious 400 (#10286) diff --git a/changelog.d/fixes/10293-windows-tailscale-branches.md b/changelog.d/fixes/10293-windows-tailscale-branches.md deleted file mode 100644 index 2ee9f0d1d8..0000000000 --- a/changelog.d/fixes/10293-windows-tailscale-branches.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(build):** stop Turbopack from dead-code-eliminating the Windows Tailscale branches of `src/lib/tailscaleTunnel.ts` in the published build (#10293). The release `dist` is bundled on a Linux runner, and the bundler constant-folds `process.platform`, pruning every non-Linux branch — the Windows installers shipped with no `where` lookup, an always-injected `--socket`, and a lost `net start Tailscale`/windows-default-binary path. The module now reads the platform at runtime via `os.platform()` (a function call a bundler cannot fold), so the Windows branches survive on any build machine; a vitest regression test mocking `os.platform()` → `win32` guards the anti-fold invariant (RED before, GREEN after). \ No newline at end of file diff --git a/changelog.d/fixes/10311-healthcheck-lifecycle-default.md b/changelog.d/fixes/10311-healthcheck-lifecycle-default.md deleted file mode 100644 index 8a27b45d5d..0000000000 --- a/changelog.d/fixes/10311-healthcheck-lifecycle-default.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(ops):** Docker HEALTHCHECK defaults to the lightweight `/healthz` lifecycle probe instead of the heavy `/api/monitoring/health` path, with an `OMNIROUTE_HEALTHCHECK_PATH` opt-in override ([#10311](https://github.com/diegosouzapw/OmniRoute/pull/10311)) \ No newline at end of file diff --git a/changelog.d/fixes/10313-catalog-cache-key-hash.md b/changelog.d/fixes/10313-catalog-cache-key-hash.md deleted file mode 100644 index 5c85689004..0000000000 --- a/changelog.d/fixes/10313-catalog-cache-key-hash.md +++ /dev/null @@ -1 +0,0 @@ -- fix(api): hash the API key before using it as the model-catalog cache Map key (no raw credentials in process heap) (#10313) diff --git a/changelog.d/fixes/10314-combo-error-aggregation.md b/changelog.d/fixes/10314-combo-error-aggregation.md deleted file mode 100644 index 7dd3ef6a60..0000000000 --- a/changelog.d/fixes/10314-combo-error-aggregation.md +++ /dev/null @@ -1 +0,0 @@ -- fix(resilience): keep combo quality and auth failure reasons separate and redact connection labels in terminal errors (#10314) diff --git a/changelog.d/fixes/10319-live-ws-heartbeat-ping.md b/changelog.d/fixes/10319-live-ws-heartbeat-ping.md deleted file mode 100644 index 91ed7b00c5..0000000000 --- a/changelog.d/fixes/10319-live-ws-heartbeat-ping.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): send periodic WS heartbeat pings so live dashboard connections stop dropping every ~35s (#10319) diff --git a/changelog.d/fixes/10322-process-wide-admission-budget.md b/changelog.d/fixes/10322-process-wide-admission-budget.md deleted file mode 100644 index defab2a7fe..0000000000 --- a/changelog.d/fixes/10322-process-wide-admission-budget.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(chat-body-admission):** restore a single process-wide admission budget — heavyweight leases and queued bytes are now bounded once for the whole process instead of per session, so one session can no longer mint extra capacity or starve others; per-session fairness is preserved via round-robin dispatch ([#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110)) diff --git a/changelog.d/fixes/10329-zai-web-auth-semantics.md b/changelog.d/fixes/10329-zai-web-auth-semantics.md deleted file mode 100644 index c4e6703112..0000000000 --- a/changelog.d/fixes/10329-zai-web-auth-semantics.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** validate Z.ai web Local Storage sessions against the authenticated user-settings endpoint and preserve exact upstream status codes ([#10329](https://github.com/diegosouzapw/OmniRoute/pull/10329)) — thanks @Zartharas diff --git a/changelog.d/fixes/10345-bare-combo-opencode-ids.md b/changelog.d/fixes/10345-bare-combo-opencode-ids.md deleted file mode 100644 index c3a6a499ec..0000000000 --- a/changelog.d/fixes/10345-bare-combo-opencode-ids.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(opencode-plugin):** publish bare combo model ids without the plugin provider prefix so OpenCode can select them ([#10345](https://github.com/diegosouzapw/OmniRoute/issues/10345)) diff --git a/changelog.d/fixes/10346-empty-pool-warn-once.md b/changelog.d/fixes/10346-empty-pool-warn-once.md deleted file mode 100644 index e4b50ef3ff..0000000000 --- a/changelog.d/fixes/10346-empty-pool-warn-once.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(backend):** log `auto/ matched no connected models` once per process per label instead of every minute ([#10346](https://github.com/diegosouzapw/OmniRoute/issues/10346)) diff --git a/changelog.d/fixes/10348-default-logs-redact-client.md b/changelog.d/fixes/10348-default-logs-redact-client.md deleted file mode 100644 index 4c3aa0a00f..0000000000 --- a/changelog.d/fixes/10348-default-logs-redact-client.md +++ /dev/null @@ -1 +0,0 @@ -- fix(backend): redact client IPs and account prefixes from default proxy logs (#10348) diff --git a/changelog.d/fixes/10353-memory-heap-conflict-warn.md b/changelog.d/fixes/10353-memory-heap-conflict-warn.md deleted file mode 100644 index c52b7cc15c..0000000000 --- a/changelog.d/fixes/10353-memory-heap-conflict-warn.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(docker):** warn at boot when `OMNIROUTE_MEMORY_MB` disagrees with `NODE_OPTIONS --max-old-space-size`, and document that the standalone/Docker launcher appends `OMNIROUTE_MEMORY_MB` last ([#10353](https://github.com/diegosouzapw/OmniRoute/issues/10353)) diff --git a/changelog.d/fixes/10365-gitlab-duo-401-fallback.md b/changelog.d/fixes/10365-gitlab-duo-401-fallback.md deleted file mode 100644 index cc05612a00..0000000000 --- a/changelog.d/fixes/10365-gitlab-duo-401-fallback.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): GitLab Duo falls back to the public Code Suggestions endpoint when direct_access returns 401 (#10365) \ No newline at end of file diff --git a/changelog.d/fixes/10372-debug-mode-default-false.md b/changelog.d/fixes/10372-debug-mode-default-false.md deleted file mode 100644 index c1a59b4fb3..0000000000 --- a/changelog.d/fixes/10372-debug-mode-default-false.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** `getSettings()` defaults `debugMode` to `false` — fresh installs no longer run in debug mode (persisted `debugMode: true` is preserved) ([#10372](https://github.com/diegosouzapw/OmniRoute/pull/10372) — thanks @lamchun1110) diff --git a/changelog.d/fixes/10374-claude-tool-name-casing-normalization.md b/changelog.d/fixes/10374-claude-tool-name-casing-normalization.md deleted file mode 100644 index 9acf0e08c7..0000000000 --- a/changelog.d/fixes/10374-claude-tool-name-casing-normalization.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(translator):** Consolidate tool-name casing normalization into a single `restoreClaudeToolName` helper reused across every response path (`openai-to-claude`, `gemini-to-claude`, `stream` passthrough, xAI and Antigravity handlers), replacing six hand-copied 7-entry casing maps. The shared helper resolves via the request-side `toolNameMap` first (preserving declared PascalCase and MCP/alias names), then the complete `TOOL_RENAME_MAP` (which already covers `glob`/`grep`/`task`/`todowrite`/`skill`/`askuserquestion`/etc.), then the `#7926` TitleCase→lowercase fallback for map-less clients. This closes the coverage gap that left `TodoWrite` and other tools failing with `Error: No such tool available: todowrite`, fixes a `ReferenceError` in `remapToolNamesInResponse`, and preserves the Gemini thought-signature persistence (`#8979`) and OpenAI→Claude `toolNameMap` restoration that must not regress ([#10374](https://github.com/diegosouzapw/OmniRoute/issues/10374)) diff --git a/changelog.d/fixes/10374-openai-compatible-responses-passthrough.md b/changelog.d/fixes/10374-openai-compatible-responses-passthrough.md deleted file mode 100644 index d735feed1c..0000000000 --- a/changelog.d/fixes/10374-openai-compatible-responses-passthrough.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(responses):** preserve native tool definitions for custom OpenAI-compatible providers when using the Responses API (`/v1/responses`). When `apiType` is set to `"responses"` (or `_omnirouteForceResponsesUpstream` is enabled), OmniRoute passes native tool shapes (`custom` with lark grammars, `namespace`, `local_shell`) directly upstream without running a lossy Responses→Chat→Responses conversion ([#10374](https://github.com/diegosouzapw/OmniRoute/issues/10374)) diff --git a/changelog.d/fixes/10381-free-tier-usage-history.md b/changelog.d/fixes/10381-free-tier-usage-history.md deleted file mode 100644 index 4009855cc0..0000000000 --- a/changelog.d/fixes/10381-free-tier-usage-history.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): Free Tier 'used this month' now includes live usage_history rows, not just the rolled-up daily summary (#10381) diff --git a/changelog.d/fixes/10393-opencode-rotate-network-throw.md b/changelog.d/fixes/10393-opencode-rotate-network-throw.md deleted file mode 100644 index b0d8e9fb1e..0000000000 --- a/changelog.d/fixes/10393-opencode-rotate-network-throw.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(executors):** OpencodeExecutor and MimocodeExecutor now rotate to the next account on network exceptions (timeout, connection refused/reset) when the failed account has a dedicated proxy, not only on 429 — a throw on one account no longer fails the whole request when other accounts remain. Accounts sharing the default egress (no proxy) fail fast instead of retrying the same outage against every account. The shared rotation mechanics (`pickAccount`/`markCooldown`/`markSuccess`) are now extracted into `accountRotation.ts`, fixing an identical unconditional-cooldown gap that pre-dated this PR in MimocodeExecutor ([#10393](https://github.com/diegosouzapw/OmniRoute/pull/10393)) diff --git a/changelog.d/fixes/10397-header-budget-warn-dedupe.md b/changelog.d/fixes/10397-header-budget-warn-dedupe.md deleted file mode 100644 index d4d117b913..0000000000 --- a/changelog.d/fixes/10397-header-budget-warn-dedupe.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** the header-budget drop warning fires once per unique dropped-header set instead of on every SSE response (warn-storm fix) ([#10397](https://github.com/diegosouzapw/OmniRoute/pull/10397) — thanks @lamchun1110) diff --git a/changelog.d/fixes/10404-streaming-terminated-empty-completion-failover.md b/changelog.d/fixes/10404-streaming-terminated-empty-completion-failover.md deleted file mode 100644 index d8441a21c1..0000000000 --- a/changelog.d/fixes/10404-streaming-terminated-empty-completion-failover.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): fail over combo streaming responses that reach `finish_reason` with zero content, reasoning, or tool_calls instead of forwarding a terminated-but-empty completion (#10404) diff --git a/changelog.d/fixes/10415-vision-bridge-combo-reroute.md b/changelog.d/fixes/10415-vision-bridge-combo-reroute.md deleted file mode 100644 index a3df3019c4..0000000000 --- a/changelog.d/fixes/10415-vision-bridge-combo-reroute.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(guardrails):** Vision Bridge now reroutes whole requests for named combos whose targets have zero vision-capable models (previously such image requests died with `capability_mismatch` when the describe path could not run), and when the fallback describe path also fails for every image the request degrades to explicit `(unavailable)` stub text instead of preserving images the combo cannot consume ([#10415](https://github.com/diegosouzapw/OmniRoute/pull/10415)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10420-antigravity-geoblock-resilience.md b/changelog.d/fixes/10420-antigravity-geoblock-resilience.md deleted file mode 100644 index cb465299b2..0000000000 --- a/changelog.d/fixes/10420-antigravity-geoblock-resilience.md +++ /dev/null @@ -1,2 +0,0 @@ -- **fix(antigravity):** geo-blocked egress (Google "User location is not supported") is now classified (scoped to the Google AI surfaces that emit it: Cloud Code/Gemini Code Assist, Gemini API, Vertex), cached as a 24h per-account exclusion so routing continues with other accounts, and surfaced with an actionable message; the dashboard connection test now probes the real `streamGenerateContent` model surface instead of the non-geo-restricted OAuth userinfo endpoint ([#10420](https://github.com/diegosouzapw/OmniRoute/pull/10420)) — thanks @rqzbeh -- **fix(antigravity):** strip competing-agent identity sentences from system prompts (e.g. "You are a Claude agent, built on Anthropic's Claude Agent SDK.") that Antigravity flags and answers with 429 RESOURCE_EXHAUSTED (port of decolua/9router b566b20) ([#10420](https://github.com/diegosouzapw/OmniRoute/pull/10420)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10424-antigravity-project-autocreate.md b/changelog.d/fixes/10424-antigravity-project-autocreate.md deleted file mode 100644 index 81fc6734c4..0000000000 --- a/changelog.d/fixes/10424-antigravity-project-autocreate.md +++ /dev/null @@ -1,2 +0,0 @@ -- **fix(antigravity):** accounts with an empty Cloud Code `projectId` now heal themselves — failed auto-onboarding (`onboardUser`) attempts are retried after a short backoff instead of being memoized forever, so the missing Google project is created without user action on a later request or token refresh ([#10424](https://github.com/diegosouzapw/OmniRoute/pull/10424)) — thanks @rqzbeh -- **fix(antigravity):** Google deprecated automatic project creation for standard-tier (personal) accounts — when `onboardUser` completes without a project id the account now fails fast with a clear `403 GCP_PROJECT_REQUIRED` message (no more generic 422 or delayed 429 RESOURCE_EXHAUSTED), and a manual GCP Project ID override is available in the connection editor so operators can enter their own project id ([#10424](https://github.com/diegosouzapw/OmniRoute/pull/10424)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10430-antigravity-usage-envelope.md b/changelog.d/fixes/10430-antigravity-usage-envelope.md deleted file mode 100644 index 645045e7ea..0000000000 --- a/changelog.d/fixes/10430-antigravity-usage-envelope.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(usage):** read Gemini `usageMetadata` out of the antigravity `{ response: {...} }` envelope so non-streaming requests log real token usage instead of `IN 0 | OUT 0` (port of decolua/9router#59d858b) ([#10430](https://github.com/diegosouzapw/OmniRoute/pull/10430)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10465-gemini-cached-tokens.md b/changelog.d/fixes/10465-gemini-cached-tokens.md deleted file mode 100644 index 0acd31720a..0000000000 --- a/changelog.d/fixes/10465-gemini-cached-tokens.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(usage):** surface Gemini `cachedContentTokenCount` into `cached_tokens` for non-streaming requests so cache-hit accounting matches the OpenAI/Claude/Responses branches and the streaming path (follow-up to the #10430 envelope fix) ([#10465](https://github.com/diegosouzapw/OmniRoute/pull/10465)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10470-antigravity-byop-account-rotation.md b/changelog.d/fixes/10470-antigravity-byop-account-rotation.md deleted file mode 100644 index 9ec58e152a..0000000000 --- a/changelog.d/fixes/10470-antigravity-byop-account-rotation.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(antigravity):** automatically rotate to a sibling account when one is BYOP (GCP Project ID required, `gcp_project_required` 422) — the account is excluded from selection for 24h and the request succeeds via another account instead of failing fast; the actionable 422 is surfaced only when no sibling exists (follow-up to the #10424 BYOP fast-fail) ([#10470](https://github.com/diegosouzapw/OmniRoute/pull/10470)) — thanks @rqzbeh diff --git a/changelog.d/fixes/10479-mitm-passthrough-misroutes-unknown-hosts.md b/changelog.d/fixes/10479-mitm-passthrough-misroutes-unknown-hosts.md deleted file mode 100644 index 64a6e3733e..0000000000 --- a/changelog.d/fixes/10479-mitm-passthrough-misroutes-unknown-hosts.md +++ /dev/null @@ -1 +0,0 @@ -- fix(mitm): forward passthrough traffic to the actual requested Host instead of misrouting every non-TARGET_HOSTS request to the hardcoded Antigravity sandbox host (#10479) diff --git a/changelog.d/fixes/10482-docker-images-and-basepath.md b/changelog.d/fixes/10482-docker-images-and-basepath.md deleted file mode 100644 index c85ae91937..0000000000 --- a/changelog.d/fixes/10482-docker-images-and-basepath.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(docker):** point the bifrost sidecar at the real `ghcr.io/maximhq/bifrost:v1.6.11` tag and the cliproxyapi sidecar at the official `docker.io/eceasy/cli-proxy-api:v6.9.7` image (the previously pinned tags never existed), and complete the runtime `OMNIROUTE_BASE_PATH` subpath patch for Next 16 standalone (assetPrefix + client env + baked asset URLs) so prebuilt images respect the webpath env var ([#10482](https://github.com/diegosouzapw/OmniRoute/pull/10482)) diff --git a/changelog.d/fixes/10484-hermes-obfuscate-zwj.md b/changelog.d/fixes/10484-hermes-obfuscate-zwj.md deleted file mode 100644 index 5e1dc60de1..0000000000 --- a/changelog.d/fixes/10484-hermes-obfuscate-zwj.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): stop ZWJ-obfuscating the substring "hermes" in user messages and hostnames (#10484) diff --git a/changelog.d/fixes/10489-qdrant-health-badge.md b/changelog.d/fixes/10489-qdrant-health-badge.md deleted file mode 100644 index f9c216e8a5..0000000000 --- a/changelog.d/fixes/10489-qdrant-health-badge.md +++ /dev/null @@ -1,2 +0,0 @@ -- **fix(memory):** auto-check Qdrant health on mount and stop the false-red status badge on `/dashboard/memory?tab=engine` — the badge treated "not yet checked" (`health === null`) as a failure, so a healthy Qdrant showed red after every page refresh until "Test connection" was clicked; settings changes now also invalidate the stale result and re-check after the save persists, so a health check racing the settings PUT can no longer keep the badge red until a manual re-test ([#10489](https://github.com/diegosouzapw/OmniRoute/pull/10489)) -- **test(compression):** align source-contract tests with the merged `release/v3.8.50` base (`aa912c42a`) — accept the multi-line `providerTransport` shape in `omniglyph-chatcore-plumbing` and give the pipeline-circuit-breaker fixture a `metadata.executionStages` (both structural changes landed in the base merge) ([#10489](https://github.com/diegosouzapw/OmniRoute/pull/10489)) diff --git a/changelog.d/fixes/10508-cli-readiness-localhost-dns-delay.md b/changelog.d/fixes/10508-cli-readiness-localhost-dns-delay.md deleted file mode 100644 index 6d469fefe2..0000000000 --- a/changelog.d/fixes/10508-cli-readiness-localhost-dns-delay.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): use 127.0.0.1 for the readiness health-check poll instead of localhost, avoiding Windows DNS-resolution delays that made a healthy server report as never-ready (#10508) diff --git a/changelog.d/fixes/10517-zed-hosted-oauth-callback-port.md b/changelog.d/fixes/10517-zed-hosted-oauth-callback-port.md deleted file mode 100644 index af2a0d6b4c..0000000000 --- a/changelog.d/fixes/10517-zed-hosted-oauth-callback-port.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** zed-hosted OAuth now redirects the browser back to the dashboard's own loopback port (auto-completing the login), and the manual paste path accepts Zed's user_id/access_token callback URL instead of erroring with "No authorization code found" ([#10517](https://github.com/diegosouzapw/OmniRoute/pull/10517)) - thanks @phatchau036 \ No newline at end of file diff --git a/changelog.d/fixes/10518-token-backed-web-session-update.md b/changelog.d/fixes/10518-token-backed-web-session-update.md deleted file mode 100644 index 78ca1793b8..0000000000 --- a/changelog.d/fixes/10518-token-backed-web-session-update.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** allow token-backed web sessions stored with `authType: "cookie"` to refresh their token through the provider update API ([#10518](https://github.com/diegosouzapw/OmniRoute/pull/10518)) — thanks @Zartharas diff --git a/changelog.d/fixes/10519-token-backed-web-session-test-dispatch.md b/changelog.d/fixes/10519-token-backed-web-session-test-dispatch.md deleted file mode 100644 index 009f0bd2e5..0000000000 --- a/changelog.d/fixes/10519-token-backed-web-session-test-dispatch.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** test token-backed web sessions through their provider validator instead of the OAuth path ([#10519](https://github.com/diegosouzapw/OmniRoute/pull/10519)) — thanks @Zartharas diff --git a/changelog.d/fixes/10521-audit-extra-api-keys-redaction.md b/changelog.d/fixes/10521-audit-extra-api-keys-redaction.md deleted file mode 100644 index 41222522de..0000000000 --- a/changelog.d/fixes/10521-audit-extra-api-keys-redaction.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(compliance):** redact additional provider API keys from audit-log payloads ([#10521](https://github.com/diegosouzapw/OmniRoute/pull/10521)) — thanks @Zartharas diff --git a/changelog.d/fixes/10522-firefly-cookie-validation-alias-miss.md b/changelog.d/fixes/10522-firefly-cookie-validation-alias-miss.md deleted file mode 100644 index 3545d77ebb..0000000000 --- a/changelog.d/fixes/10522-firefly-cookie-validation-alias-miss.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): register a real Firefly auth probe under both the `firefly` alias and the `adobe-firefly` canonical id, and normalize the provider id before the generic web-cookie fallback, so a Firefly connection stops always reporting "Provider validation not supported" (#10522) diff --git a/changelog.d/fixes/10523-servicesupervisor-port-flake.md b/changelog.d/fixes/10523-servicesupervisor-port-flake.md deleted file mode 100644 index 1a98ea7fa2..0000000000 --- a/changelog.d/fixes/10523-servicesupervisor-port-flake.md +++ /dev/null @@ -1 +0,0 @@ -- fix(services): isolate probeBeforeSpawn adoption tests on distinct ports to stop the order-dependent flake (#10523) \ No newline at end of file diff --git a/changelog.d/fixes/10527-deepseek-web-context-amnesia.md b/changelog.d/fixes/10527-deepseek-web-context-amnesia.md deleted file mode 100644 index 4eadc0040a..0000000000 --- a/changelog.d/fixes/10527-deepseek-web-context-amnesia.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): auto-replay a bounded multi-turn trajectory in the DeepSeek Web prompt builder for clients that never send `tools[]`, so agentic clients like Cline stop losing the original task after a couple of turns (#10527) diff --git a/changelog.d/fixes/10528-direct-dispatcher-response-start-timeout.md b/changelog.d/fixes/10528-direct-dispatcher-response-start-timeout.md deleted file mode 100644 index 9354b02822..0000000000 --- a/changelog.d/fixes/10528-direct-dispatcher-response-start-timeout.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(network):** direct (no-proxy) egress now bounds each attempt's response-start window (default 30s, `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`) and retries once on a fresh no-keep-alive socket, so a silently-dropped pooled keep-alive connection can no longer stall direct providers (opencode-go, command-code) until a service restart ([#10214](https://github.com/diegosouzapw/OmniRoute/issues/10214)) diff --git a/changelog.d/fixes/10530-codex-combo-context.md b/changelog.d/fixes/10530-codex-combo-context.md deleted file mode 100644 index 29ada2699a..0000000000 --- a/changelog.d/fixes/10530-codex-combo-context.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(models):** align Codex GPT-5.6 context limits with the Codex catalog and honor model context overrides when advertising combos ([#10530](https://github.com/diegosouzapw/OmniRoute/issues/10530)) diff --git a/changelog.d/fixes/10536-llmlingua-2-2.0.5-drop-tfjs.md b/changelog.d/fixes/10536-llmlingua-2-2.0.5-drop-tfjs.md deleted file mode 100644 index 11a1845715..0000000000 --- a/changelog.d/fixes/10536-llmlingua-2-2.0.5-drop-tfjs.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(deps):** upgrade `@atjsh/llmlingua-2` from 2.0.3 to 2.0.5 and remove `@tensorflow/tfjs` from the LLMLingua SLM stack — 2.0.5 adds official Transformers.js v4 support (peers `@huggingface/transformers` at `^3.5.2 || ^4.0.0`) and 2.0.4+ no longer requires TensorFlow.js, restoring compatibility with OmniRoute's Transformers.js v4 while dropping the largest single contributor to the optional runtime footprint ([#10536](https://github.com/diegosouzapw/OmniRoute/issues/10536)) diff --git a/changelog.d/fixes/10540-deepseek-v4-efforts.md b/changelog.d/fixes/10540-deepseek-v4-efforts.md deleted file mode 100644 index 339758ebcf..0000000000 --- a/changelog.d/fixes/10540-deepseek-v4-efforts.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(deepseek):** Advertise `none`, `low`, `high`, and `max` for V4 Pro and Flash, derive OpenCode Go effort aliases from base-model metadata, and route those models through native Responses ([#10540](https://github.com/diegosouzapw/OmniRoute/pull/10540)) — thanks @jackjinke diff --git a/changelog.d/fixes/10544-a2a-tasks-timing-safe.md b/changelog.d/fixes/10544-a2a-tasks-timing-safe.md deleted file mode 100644 index f68ac49e3d..0000000000 --- a/changelog.d/fixes/10544-a2a-tasks-timing-safe.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(a2a):** use a constant-time bearer compare in `/api/a2a/tasks` via `crypto.timingSafeEqual`, matching the `tokensMatch` helper already used in `src/app/a2a/route.ts` and removing the last non-constant secret comparison in the repo ([#10544](https://github.com/diegosouzapw/OmniRoute/pull/10544)) diff --git a/changelog.d/fixes/10550-responses-reasoning-transport.md b/changelog.d/fixes/10550-responses-reasoning-transport.md deleted file mode 100644 index e2b40cdb8c..0000000000 --- a/changelog.d/fixes/10550-responses-reasoning-transport.md +++ /dev/null @@ -1 +0,0 @@ -- Preserve portable plaintext reasoning by default across streaming and non-streaming Chat Completions and Responses routes while keeping provider-bound opaque state target-compatible. Direct requests drop incompatible continuation reasoning by default; combos can explicitly skip incompatible targets without mutating the request. Known providers no longer show redundant encrypted-reasoning controls. (#10550, #10959) diff --git a/changelog.d/fixes/10553-list-models-card-hardcoded-null.md b/changelog.d/fixes/10553-list-models-card-hardcoded-null.md deleted file mode 100644 index 9f30aa6346..0000000000 --- a/changelog.d/fixes/10553-list-models-card-hardcoded-null.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): show the real model count on the "List Models" endpoint card instead of a permanent "—" (#10553) diff --git a/changelog.d/fixes/10557-fedora-hostname-bind.md b/changelog.d/fixes/10557-fedora-hostname-bind.md deleted file mode 100644 index 30eb3c6d10..0000000000 --- a/changelog.d/fixes/10557-fedora-hostname-bind.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cli):** ignore the operating system `HOSTNAME` when choosing the server bind address on Linux and macOS, preventing startup failures when the shell hostname differs from `os.hostname()`; use `OMNIROUTE_SERVER_HOST` for explicit non-Windows configuration while preserving the legacy `HOSTNAME` fallback on Windows ([#10557](https://github.com/diegosouzapw/OmniRoute/pull/10557), closes [#10492](https://github.com/diegosouzapw/OmniRoute/issues/10492)) — thanks @redzrush101 diff --git a/changelog.d/fixes/10571-opencode-session-stability-free-tier-routing.md b/changelog.d/fixes/10571-opencode-session-stability-free-tier-routing.md deleted file mode 100644 index bdfe33165a..0000000000 --- a/changelog.d/fixes/10571-opencode-session-stability-free-tier-routing.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** OpenCode `x-opencode-session` now derives a stable, conversation-scoped fingerprint via `generateSessionId()` instead of a fresh random UUID per request, so upstream prompt caching can hit across requests in the same conversation; bare `big-pickle`/`*-free` model ids now keep routing to an active opencode-family connection even when its synced catalog is temporarily stale; and bare requests to no-auth catalog providers (e.g. `opencode`) now echo the listing-valid `/` form in `response.model` so clients validating against `/v1/models` don't warn ([#10571](https://github.com/diegosouzapw/OmniRoute/pull/10571)) diff --git a/changelog.d/fixes/10575-mcp-github-tool-search.md b/changelog.d/fixes/10575-mcp-github-tool-search.md deleted file mode 100644 index 108466845f..0000000000 --- a/changelog.d/fixes/10575-mcp-github-tool-search.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(mcp):** make GitHub skill tools discoverable through `omniroute_tool_search` diff --git a/changelog.d/fixes/10577-crof-stale-seed-catalog.md b/changelog.d/fixes/10577-crof-stale-seed-catalog.md deleted file mode 100644 index c4fa4da086..0000000000 --- a/changelog.d/fixes/10577-crof-stale-seed-catalog.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): remove 10 retired model ids from the crof seed catalog so /v1/models stops advertising models crof.ai no longer serves (#10577) diff --git a/changelog.d/fixes/10583-stt-nested-model-credential-fallback.md b/changelog.d/fixes/10583-stt-nested-model-credential-fallback.md deleted file mode 100644 index 601915df18..0000000000 --- a/changelog.d/fixes/10583-stt-nested-model-credential-fallback.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(audio):** when a prefix-matched STT provider has no credentials, retry gateways that list the same nested model id (e.g. `deepgram/nova-3` → `openrouter/deepgram/nova-3`) and mention those ids in the 400; stop documenting bare `deepgram/nova-3` as the default example ([#10583](https://github.com/diegosouzapw/OmniRoute/issues/10583)) diff --git a/changelog.d/fixes/10586-audio-alias-prefix-gap.md b/changelog.d/fixes/10586-audio-alias-prefix-gap.md deleted file mode 100644 index 845f00e7dd..0000000000 --- a/changelog.d/fixes/10586-audio-alias-prefix-gap.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): resolve the short provider-alias prefix (e.g. `el/`) advertised by GET /v1/models for audio speech, transcription and translation model ids (#10586) diff --git a/changelog.d/fixes/10589-elevenlabs-voice-mapping.md b/changelog.d/fixes/10589-elevenlabs-voice-mapping.md deleted file mode 100644 index 58efe3fd72..0000000000 --- a/changelog.d/fixes/10589-elevenlabs-voice-mapping.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): map OpenAI-compat voice names to real ElevenLabs voice_ids in direct TTS (#10589) diff --git a/changelog.d/fixes/10592-playground-chattab-endpoint-routing.md b/changelog.d/fixes/10592-playground-chattab-endpoint-routing.md deleted file mode 100644 index ca602b9122..0000000000 --- a/changelog.d/fixes/10592-playground-chattab-endpoint-routing.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): route the Playground's ChatTab "Send" through the endpoint actually selected in StudioConfigPane (`search`, `web.fetch`, etc.) instead of always POSTing to `/api/v1/chat/completions`, fixing the false "No active credentials for provider" 404 when testing search-only providers (#10592) diff --git a/changelog.d/fixes/10594-freepik-magnific-api.md b/changelog.d/fixes/10594-freepik-magnific-api.md deleted file mode 100644 index 4c1c59a701..0000000000 --- a/changelog.d/fixes/10594-freepik-magnific-api.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** Magnific Mystic is now the canonical provider (`/dashboard/providers/magnific`, `magnific/`). It uses the Magnific API (`api.magnific.com` + `x-magnific-api-key`), dashboard Test Connection validates keys without starting a paid generation, and the old `freepik` slug remains a legacy alias ([#10594](https://github.com/diegosouzapw/OmniRoute/pull/10594)) diff --git a/changelog.d/fixes/10597-combo-log-error-body.md b/changelog.d/fixes/10597-combo-log-error-body.md deleted file mode 100644 index ff6608947c..0000000000 --- a/changelog.d/fixes/10597-combo-log-error-body.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** Include the redacted upstream error body in the per-target COMBO failure log (`Model X failed, trying next`) so operators can triage a 400/500 without reproducing the request ([#10597](https://github.com/diegosouzapw/OmniRoute/issues/10597)) diff --git a/changelog.d/fixes/10601-xai-800-message-limit.md b/changelog.d/fixes/10601-xai-800-message-limit.md deleted file mode 100644 index 3dcd33ab8e..0000000000 --- a/changelog.d/fixes/10601-xai-800-message-limit.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(xai):** trim Chat Completions `messages` and Responses `input` to xAI's 800-item history cap before dispatch, so long tool loops no longer die on `413 Chat history exceeds the 800-message limit` ([#10601](https://github.com/diegosouzapw/OmniRoute/pull/10601)) diff --git a/changelog.d/fixes/10612-cli-token-machine-id-interop.md b/changelog.d/fixes/10612-cli-token-machine-id-interop.md deleted file mode 100644 index 48ec5b8e1d..0000000000 --- a/changelog.d/fixes/10612-cli-token-machine-id-interop.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cli):** derive the machine-id token correctly under plain Node — `await import("node-machine-id")` puts the CJS exports on `.default`, so the destructured `machineIdSync` was `undefined` and the catch blanked the token, sending every management request unauthenticated; `OMNIROUTE_CLI_SALT` rotation is now honored too ([#10612](https://github.com/diegosouzapw/OmniRoute/pull/10612)) diff --git a/changelog.d/fixes/10613-setup-provider-api-key-collision.md b/changelog.d/fixes/10613-setup-provider-api-key-collision.md deleted file mode 100644 index 0b8c3095f0..0000000000 --- a/changelog.d/fixes/10613-setup-provider-api-key-collision.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cli):** `omniroute setup --add-provider --api-key ` no longer aborts with "Provider API key is required" — Commander bound the value to the program-level `--api-key` (the OmniRoute server key), leaving the subcommand's own option undefined; `OMNIROUTE_API_KEY` now works as the error message advertised ([#10613](https://github.com/diegosouzapw/OmniRoute/pull/10613)) diff --git a/changelog.d/fixes/10615-api-models-v1-models-id-mismatch.md b/changelog.d/fixes/10615-api-models-v1-models-id-mismatch.md deleted file mode 100644 index 8cee943efa..0000000000 --- a/changelog.d/fixes/10615-api-models-v1-models-id-mismatch.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): make /api/models agree with /v1/models on synced-catalog coverage instead of reporting stale models as available (#10615) diff --git a/changelog.d/fixes/10686-combo-quota-token-limit-await.md b/changelog.d/fixes/10686-combo-quota-token-limit-await.md deleted file mode 100644 index a9e7b910e3..0000000000 --- a/changelog.d/fixes/10686-combo-quota-token-limit-await.md +++ /dev/null @@ -1 +0,0 @@ -- **Combo routing:** await each connection's token limit before reserving quota. The old lookup treated the `Promise` as a connection and dropped `rateLimitOverrides.tpm` ([#10686](https://github.com/diegosouzapw/OmniRoute/pull/10686)). diff --git a/changelog.d/fixes/10702-vision-bridge-alias-credential-mismatch.md b/changelog.d/fixes/10702-vision-bridge-alias-credential-mismatch.md deleted file mode 100644 index dcd1c488ae..0000000000 --- a/changelog.d/fixes/10702-vision-bridge-alias-credential-mismatch.md +++ /dev/null @@ -1 +0,0 @@ -- fix(guardrails): resolve the public provider alias before querying credentials in the Vision Bridge router, so command-code/opencode (and any alias!=id provider) are no longer reported as "unusable" despite active connections (#10702) diff --git a/changelog.d/fixes/10703-modality-bridge-vision-model-filter.md b/changelog.d/fixes/10703-modality-bridge-vision-model-filter.md deleted file mode 100644 index 1cefad69a5..0000000000 --- a/changelog.d/fixes/10703-modality-bridge-vision-model-filter.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): filter the Modality Bridge Vision model picker to vision-capable models, matching the sibling Video/Audio tabs (#10703) diff --git a/changelog.d/fixes/10705-zero-input-token-sanitization-bug.md b/changelog.d/fixes/10705-zero-input-token-sanitization-bug.md deleted file mode 100644 index aa22dbd64a..0000000000 --- a/changelog.d/fixes/10705-zero-input-token-sanitization-bug.md +++ /dev/null @@ -1 +0,0 @@ -- fix(usage): repair provider-reported input_tokens: 0 on non-trivial requests instead of passing it through unrepaired (#10705) diff --git a/changelog.d/fixes/10710-10711-cli-tools-timeout-hermes-keyid.md b/changelog.d/fixes/10710-10711-cli-tools-timeout-hermes-keyid.md deleted file mode 100644 index 4d9a6ba0b4..0000000000 --- a/changelog.d/fixes/10710-10711-cli-tools-timeout-hermes-keyid.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): distinguish a CLI-probe timeout from a genuinely absent binary in locateCommand, and resolve the Hermes Agent Apply flow's `keyId` server-side instead of writing the `YOUR_OMNIROUTE_API_KEY_HERE` placeholder (#10710, #10711) diff --git a/changelog.d/fixes/10713-runtime-repair-npm12-allow-scripts.md b/changelog.d/fixes/10713-runtime-repair-npm12-allow-scripts.md deleted file mode 100644 index 17c59d47c0..0000000000 --- a/changelog.d/fixes/10713-runtime-repair-npm12-allow-scripts.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): pass --allow-scripts for the runtime's own npm-installed dependencies, so npm 12+'s default install-scripts block no longer silently skips better-sqlite3's native build (#10713) diff --git a/changelog.d/fixes/10714-provider-metrics-ghost-deleted-provider.md b/changelog.d/fixes/10714-provider-metrics-ghost-deleted-provider.md deleted file mode 100644 index 050728ec08..0000000000 --- a/changelog.d/fixes/10714-provider-metrics-ghost-deleted-provider.md +++ /dev/null @@ -1 +0,0 @@ -- fix(db): filter `getProviderMetrics()` to providers with a live `provider_connections` row so a deleted provider stops permanently ghost-haunting the Home "Provider Topology" widget (#10714) diff --git a/changelog.d/fixes/10720-proxy-password-only-auth.md b/changelog.d/fixes/10720-proxy-password-only-auth.md deleted file mode 100644 index ca51ccba65..0000000000 --- a/changelog.d/fixes/10720-proxy-password-only-auth.md +++ /dev/null @@ -1 +0,0 @@ -- fix(proxy): keep password-only proxy credentials instead of dropping them when no username is set (#10720) diff --git a/changelog.d/fixes/10727-meta-ai-ws-timeout-diagnostics.md b/changelog.d/fixes/10727-meta-ai-ws-timeout-diagnostics.md deleted file mode 100644 index f204684baa..0000000000 --- a/changelog.d/fixes/10727-meta-ai-ws-timeout-diagnostics.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(executors):** the Meta AI (muse-spark-web) WebSocket send-message timeout now reports the socket's `readyState` at the moment it fires, so a "Meta AI WS timed out" failure can be told apart as either the connection never opening (`readyState=0`) or opening successfully and then going silent (`readyState=1`) — the exact ambiguity that made #10727 undiagnosable from logs alone (#10727). diff --git a/changelog.d/fixes/10732-copilot-m365-invocation-refresh.md b/changelog.d/fixes/10732-copilot-m365-invocation-refresh.md deleted file mode 100644 index acbfbbe693..0000000000 --- a/changelog.d/fixes/10732-copilot-m365-invocation-refresh.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** copilot-m365-web chat turns no longer surface as `(empty response)` — the type:4 invocation is aligned with the 2026-08 wire shape and now carries its type:1 Metrics follow-up in the same socket write, and the access token pre-flight-refreshes from a stored refresh_token instead of requiring a DevTools re-capture every ~75 minutes ([#10732](https://github.com/diegosouzapw/OmniRoute/pull/10732) — thanks @acc0mplish) diff --git a/changelog.d/fixes/10734-combo-context-generic-default.md b/changelog.d/fixes/10734-combo-context-generic-default.md deleted file mode 100644 index 988c435d4e..0000000000 --- a/changelog.d/fixes/10734-combo-context-generic-default.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(catalog):** stop counting `getTokenLimit()`'s generic 128k catch-all as a known combo window, so `/v1/models` advertises the min of sourced member contexts instead of collapsing a 500k combo to 128k ([#10734](https://github.com/diegosouzapw/OmniRoute/issues/10734)) diff --git a/changelog.d/fixes/10735-search-provider-named-errors.md b/changelog.d/fixes/10735-search-provider-named-errors.md deleted file mode 100644 index 0e82f36aa8..0000000000 --- a/changelog.d/fixes/10735-search-provider-named-errors.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(search):** name `/v1/search` 502s with provider id and sanitized Node cause code, without hostnames ([#10735](https://github.com/diegosouzapw/OmniRoute/issues/10735)) diff --git a/changelog.d/fixes/10736-corrupt-rotate-fence.md b/changelog.d/fixes/10736-corrupt-rotate-fence.md deleted file mode 100644 index dd2abc4fc4..0000000000 --- a/changelog.d/fixes/10736-corrupt-rotate-fence.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** pause call-log rotation and record SQLITE_CORRUPT on `/api/db/health` instead of retrying writes against a malformed pager ([#10736](https://github.com/diegosouzapw/OmniRoute/issues/10736)) diff --git a/changelog.d/fixes/10765-rtk-unconditional-stats-cpu.md b/changelog.d/fixes/10765-rtk-unconditional-stats-cpu.md deleted file mode 100644 index ff36462d47..0000000000 --- a/changelog.d/fixes/10765-rtk-unconditional-stats-cpu.md +++ /dev/null @@ -1 +0,0 @@ -- fix(compression): skip the expensive `createCompressionStats()` pass in RTK when no message was actually compressed, matching every sibling stacked engine (#10765) diff --git a/changelog.d/fixes/10769-cache-stats-real-cache.md b/changelog.d/fixes/10769-cache-stats-real-cache.md deleted file mode 100644 index baaacc660d..0000000000 --- a/changelog.d/fixes/10769-cache-stats-real-cache.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** `/api/cache/stats` reported the prompt-cache LRU, which no request path ever writes to — it answered `0 hit / 0 miss, size 0` while the semantic cache served real traffic, and the Health and Usage dashboards rendered that as fact. It now reports the semantic cache's in-memory entries, with the same response shape ([#PRNUM](https://github.com/diegosouzapw/OmniRoute/pull/10769)) — thanks @Poid-ZA, who first fixed this in #9446. diff --git a/changelog.d/fixes/10770-console-interceptor-message-fidelity.md b/changelog.d/fixes/10770-console-interceptor-message-fidelity.md deleted file mode 100644 index c35260f36a..0000000000 --- a/changelog.d/fixes/10770-console-interceptor-message-fidelity.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(logging):** the app log is filterable and readable again. Entries from the tagged logger (`[LEVEL] [TAG] message`) were filed under the level instead of the component, and printf format strings were never applied, so `%s`/`%d` stayed literal with the values trailing behind them unlabelled — including every LiveWS connection line, where the format is deliberate hardening against injected format specifiers ([#PRNUM](https://github.com/diegosouzapw/OmniRoute/pull/10770)). diff --git a/changelog.d/fixes/10774-claude-code-flat-rate.md b/changelog.d/fixes/10774-claude-code-flat-rate.md deleted file mode 100644 index ea09e2b208..0000000000 --- a/changelog.d/fixes/10774-claude-code-flat-rate.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(analytics):** Claude Code (`claude`/`cc`) is a flat-rate subscription, so cost analytics reports `$0` for it instead of estimating Anthropic list prices — the metered `anthropic` API keeps its real cost, and budget/quota/routing still estimate as before ([#10774](https://github.com/diegosouzapw/OmniRoute/pull/10774)) — thanks @electrumguy diff --git a/changelog.d/fixes/10781-wal-truncate-scheduler.md b/changelog.d/fixes/10781-wal-truncate-scheduler.md deleted file mode 100644 index 4eb13a271b..0000000000 --- a/changelog.d/fixes/10781-wal-truncate-scheduler.md +++ /dev/null @@ -1 +0,0 @@ -- fix(db): periodically run `wal_checkpoint(TRUNCATE)` so the SQLite WAL file shrinks on long-running servers (default 6h, override with `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`, `0` disables) (#10781) diff --git a/changelog.d/fixes/10782-ws-heartbeat-ping-pong.md b/changelog.d/fixes/10782-ws-heartbeat-ping-pong.md deleted file mode 100644 index 23aeaf3d3a..0000000000 --- a/changelog.d/fixes/10782-ws-heartbeat-ping-pong.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): replace LiveWS's application-only liveness check with a protocol-level `ws.ping()`/`pong` heartbeat (RFC 6455 §5.5.2) alongside the existing one, so a read-only dashboard subscriber that never sends anything survives the connection timeout — a socket that stops reading frames entirely is still reaped exactly as before (#10782) diff --git a/changelog.d/fixes/10788-ollama-cloud-effort-tiers.md b/changelog.d/fixes/10788-ollama-cloud-effort-tiers.md deleted file mode 100644 index 0437576d38..0000000000 --- a/changelog.d/fixes/10788-ollama-cloud-effort-tiers.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(open-sse):** declare `supportedThinkingEfforts` (`low`/`medium`/`high`/`max`) on Ollama Cloud's `glm-5.1`, `glm-5.2`, `deepseek-v4-pro` and `deepseek-v4-flash` registry entries so the catalog's `appendSyncedEffortVariants()` pass — which only synthesizes selectable `-low`/`-high`/`-max` model ids from an already-populated `capabilities.effort_tiers` — can expose an effort selector for these reasoning-capable models, matching what `gpt-oss:20b`/`gpt-oss:120b` already had (#10788) diff --git a/changelog.d/fixes/10792-double-transport-retry-scope.md b/changelog.d/fixes/10792-double-transport-retry-scope.md deleted file mode 100644 index 337b680add..0000000000 --- a/changelog.d/fixes/10792-double-transport-retry-scope.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(resilience):** scope the same-account transport retry (#9708) out of emergency-fallback and combo hops — it was retrying the free fallback model and combo targets too, doubling upstream calls and corrupting the terminal error status on those paths. diff --git a/changelog.d/fixes/10798-respect-log-level-provider-catalog.md b/changelog.d/fixes/10798-respect-log-level-provider-catalog.md deleted file mode 100644 index 3a11aab909..0000000000 --- a/changelog.d/fixes/10798-respect-log-level-provider-catalog.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(opencode-plugin):** respect log level in provider.models() catalog path so debug/info/warn messages are suppressed when `features.logLevel` is set to `"error"` ([#10798](https://github.com/diegosouzapw/OmniRoute/pull/10798)) — thanks @tientien17 diff --git a/changelog.d/fixes/10799-provider-health-inconclusive-probes.md b/changelog.d/fixes/10799-provider-health-inconclusive-probes.md deleted file mode 100644 index 72aacacee0..0000000000 --- a/changelog.d/fixes/10799-provider-health-inconclusive-probes.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** Keep NVIDIA timeout probes and generic Antigravity/AGY HTTP 400 probes from poisoning credential health while preserving explicit Google geo-block handling ([#10799](https://github.com/diegosouzapw/OmniRoute/pull/10799)) — thanks @Zartharas diff --git a/changelog.d/fixes/10815-kiro-oauth-profilearn-dedup.md b/changelog.d/fixes/10815-kiro-oauth-profilearn-dedup.md deleted file mode 100644 index 51768aab4c..0000000000 --- a/changelog.d/fixes/10815-kiro-oauth-profilearn-dedup.md +++ /dev/null @@ -1 +0,0 @@ -- fix(db): disambiguate `createProviderConnection()`'s OAuth email dedup by `providerSpecificData.profileArn` in addition to `username`, so adding a second Kiro/AWS profile with the same email creates a new connection instead of silently merging into the first (#10815) diff --git a/changelog.d/fixes/10832-unprefixed-dalle3.md b/changelog.d/fixes/10832-unprefixed-dalle3.md deleted file mode 100644 index 2dfd970b13..0000000000 --- a/changelog.d/fixes/10832-unprefixed-dalle3.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(images):** register OpenAI `dall-e-3` in the image registry so unprefixed `dall-e-3` (and `openai/dall-e-3`) route to OpenAI Images instead of Microsoft Designer Web, and so the chat catalog no longer lists `openai/dall-e-3` as a 128k chat model ([#10832](https://github.com/diegosouzapw/OmniRoute/issues/10832)) diff --git a/changelog.d/fixes/10843-outbound-guard-mapped-ipv4.md b/changelog.d/fixes/10843-outbound-guard-mapped-ipv4.md deleted file mode 100644 index 2894ff65b0..0000000000 --- a/changelog.d/fixes/10843-outbound-guard-mapped-ipv4.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(security):** Outbound URL guard now resolves IPv4-mapped IPv6 literals to their embedded address, so `[::ffff:169.254.169.254]` is refused by the unconditional cloud-metadata block like its dotted spelling; `[::]` is refused alongside `0.0.0.0` ([#10843](https://github.com/diegosouzapw/OmniRoute/pull/10843)) — thanks @ntdat812 diff --git a/changelog.d/fixes/10848-image-scan-cookie-bridge.md b/changelog.d/fixes/10848-image-scan-cookie-bridge.md deleted file mode 100644 index 07e0f20291..0000000000 --- a/changelog.d/fixes/10848-image-scan-cookie-bridge.md +++ /dev/null @@ -1 +0,0 @@ -- fix(config): exclude cookie-auth image bridges (chatgpt-web, gemini-web) from the unprefixed model scan so a bare id never silently binds to an unofficial web bridge (#10848) diff --git a/changelog.d/fixes/10849-search-provider-opaque-400.md b/changelog.d/fixes/10849-search-provider-opaque-400.md deleted file mode 100644 index a8982fb194..0000000000 --- a/changelog.d/fixes/10849-search-provider-opaque-400.md +++ /dev/null @@ -1 +0,0 @@ -- fix(api): POST /v1/search now replies with a named `Unknown search provider: ` error (and field-named validation messages) instead of an opaque `Invalid request` for unrecognized or short-alias provider ids like `brave`/`serper` (#10849) diff --git a/changelog.d/fixes/10850-readyz-alias.md b/changelog.d/fixes/10850-readyz-alias.md deleted file mode 100644 index 94e62739ba..0000000000 --- a/changelog.d/fixes/10850-readyz-alias.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** alias `GET`/`HEAD` `/readyz` to `/healthz` so Kubernetes readiness probes do not 404 ([#10850](https://github.com/diegosouzapw/OmniRoute/issues/10850)) diff --git a/changelog.d/fixes/10853-i18n-disabled-mistranslation.md b/changelog.d/fixes/10853-i18n-disabled-mistranslation.md deleted file mode 100644 index 836cc6491e..0000000000 --- a/changelog.d/fixes/10853-i18n-disabled-mistranslation.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(i18n):** The "Disabled" status no longer renders as the noun for a person with a disability in Japanese, Spanish, Hindi, Polish, Telugu, Urdu and both Chinese locales — 24 strings now use each catalog's existing wording (ja 無効, es Deshabilitado, hi अक्षम, pl Wyłączone, te నిలిపివేయబడింది, ur غیر فعال, zh-CN 已禁用, zh-TW 已停用) ([#10812](https://github.com/diegosouzapw/OmniRoute/issues/10812), [#10853](https://github.com/diegosouzapw/OmniRoute/pull/10853)) — thanks @ntdat812 diff --git a/changelog.d/fixes/10854-skills-marketplace-owner.md b/changelog.d/fixes/10854-skills-marketplace-owner.md deleted file mode 100644 index e80a109f77..0000000000 --- a/changelog.d/fixes/10854-skills-marketplace-owner.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(skills):** Marketplace-installed skills are available to API-key-scoped requests, including existing SkillsMP and skills.sh installs ([#10854](https://github.com/diegosouzapw/OmniRoute/pull/10854)) — thanks @kriptoburak diff --git a/changelog.d/fixes/10857-hide-auto-models-when-routing-disabled.md b/changelog.d/fixes/10857-hide-auto-models-when-routing-disabled.md deleted file mode 100644 index 39da596ee3..0000000000 --- a/changelog.d/fixes/10857-hide-auto-models-when-routing-disabled.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(catalog):** `/v1/models` no longer advertises the built-in `auto/*` ids while auto routing is disabled — they were listed but rejected at request time with `Auto routing is disabled` ([#10831](https://github.com/diegosouzapw/OmniRoute/issues/10831), [#10857](https://github.com/diegosouzapw/OmniRoute/pull/10857)) — thanks @ntdat812 diff --git a/changelog.d/fixes/10858-base64-file-token-estimate.md b/changelog.d/fixes/10858-base64-file-token-estimate.md deleted file mode 100644 index 18d8104b10..0000000000 --- a/changelog.d/fixes/10858-base64-file-token-estimate.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(context):** Base64 file payloads (OpenAI `file` parts, Responses `input_file`, Claude `document` blocks) are budgeted like the Gemini `inlineData` path instead of being counted as prompt text — a ~1MB PDF estimated at 350k tokens and was rejected on the context limit before reaching the provider's document pipeline ([#10840](https://github.com/diegosouzapw/OmniRoute/issues/10840), [#10858](https://github.com/diegosouzapw/OmniRoute/pull/10858)) — thanks @ntdat812 diff --git a/changelog.d/fixes/10860-mcp-upstream-fetch-timeout.md b/changelog.d/fixes/10860-mcp-upstream-fetch-timeout.md deleted file mode 100644 index a23aeed2a1..0000000000 --- a/changelog.d/fixes/10860-mcp-upstream-fetch-timeout.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(mcp):** MCP tool calls that wait on a model provider no longer abort after 10 seconds. `omniRouteFetch` applied a single hardcoded `AbortSignal.timeout(10000)` to every internal hop, and `omniroute_route_request` — which posts to `/v1/chat/completions` and waits on the upstream provider, plus auto-combo candidate probing before a provider is even chosen — passed no signal of its own, so it inherited it. Any route slower than 10s failed from the MCP side while the identical request succeeded through the REST API. `omniroute_web_search` and `omniroute_web_fetch` in the same file already carried an explicit 60s signal, so that value is now shared by all three provider-bound calls instead of being repeated as a literal, while management reads (health, resilience, rate limits, combos, quota, usage) keep their fast-fail 10s budget so a stalled local endpoint still cannot hold a tool call open. Both budgets are overridable through `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` and `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS`, replacing the reported workaround of patching the compiled `dist/.build/next/server/chunks/*.js`; a malformed or non-positive override falls back to the default rather than disabling the timeout diff --git a/changelog.d/fixes/10862-sync-models-degraded-cached-catalog.md b/changelog.d/fixes/10862-sync-models-degraded-cached-catalog.md deleted file mode 100644 index fd6f7d3f04..0000000000 --- a/changelog.d/fixes/10862-sync-models-degraded-cached-catalog.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** importing models with an expired API key now surfaces the credential error instead of reporting "No new models were added". The Import button posts to `/api/providers/{id}/sync-models`, which self-fetches the models route; that route does not fail on an upstream 401 but degrades to a catalog it already has, preferring the cache and using the local catalog only when there is no cache. A provider that imported successfully once therefore has a cache, so an expired key produced `{ source: "cache", warning: "Models probe failed (401) — using cached catalog" }` with HTTP 200 — and the #5460/#5465 degradation guard only recognised the `local_catalog` branch, so model-sync accepted it as a successful discovery, found every cached model already imported, and returned the empty-diff result. Retest does not go through this path, which is why it failed correctly and made the import look like a genuine "nothing to do". The existing rule — a degraded discovery must not be persisted as the synced catalog — is now applied to the branch it missed rather than special-casing 401/403, discriminating on the warning the fallback builder always attaches (an ordinary non-refresh cache hit attaches none, and model-sync always requests `refresh=true`). `isDegradedLocalCatalog` keeps its exact meaning and its existing tests diff --git a/changelog.d/fixes/10866-combo-empty-models.md b/changelog.d/fixes/10866-combo-empty-models.md deleted file mode 100644 index e71092d5d4..0000000000 --- a/changelog.d/fixes/10866-combo-empty-models.md +++ /dev/null @@ -1 +0,0 @@ -- fix(api): reject a combo update that removes every model, and store the copilot's combo targets where the router reads them (#10866) diff --git a/changelog.d/fixes/10868-proxy-echo-ipv4-fallback.md b/changelog.d/fixes/10868-proxy-echo-ipv4-fallback.md deleted file mode 100644 index 91f4e717e8..0000000000 --- a/changelog.d/fixes/10868-proxy-echo-ipv4-fallback.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(proxy):** proxy "Test connection" no longer reports an IPv4-only SOCKS5/SSH proxy as dead. #1255 moved every egress probe from `api.ipify.org` to `api64.ipify.org` so proxies with IPv6 egress could be tested, but `api64` is IPv6-first: a tunnel with no IPv6 route has nothing to connect to, so the probe hung until the caller's deadline and a proxy that was carrying live LLM traffic came back as a failure. Swapping the target to `api4` fixes that case and re-breaks the one #1255 fixed, so the probe now tries the targets in order instead — `api64` first, so a proxy with working IPv6 answers on the first attempt and keeps the exact behaviour #1255 introduced, including which of its addresses is reported (the egress IP is used as an identity to detect accounts of one rotation group sharing an address, so the attempts are sequential rather than raced). The attempts split the budget each call site already enforced, so no probe can take longer than it could before, and each attempt gets its own `AbortController` so exhausting the budget on an unreachable target does not abort the next one. `OMNIROUTE_PROXY_ECHO_URL` pins a single target — including a self-hosted echo — replacing the workaround of rewriting the compiled bundle after every upgrade. The relay branch of the test route still targets `api64` through `x-relay-target`, since that request egresses from the relay worker rather than the operator's tunnel diff --git a/changelog.d/fixes/10870-cli-env-collision.md b/changelog.d/fixes/10870-cli-env-collision.md deleted file mode 100644 index 95a428ba08..0000000000 --- a/changelog.d/fixes/10870-cli-env-collision.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): warn when a .env line never takes effect, and stop swallowing an unreadable .env (#10870) diff --git a/changelog.d/fixes/10873-mimocode-retirement-state-cleanup.md b/changelog.d/fixes/10873-mimocode-retirement-state-cleanup.md deleted file mode 100644 index 44443eac6c..0000000000 --- a/changelog.d/fixes/10873-mimocode-retirement-state-cleanup.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** Remove stale MiMoCode provider configuration, including the legacy `mcode` alias, left after provider retirement while preserving historical usage and call logs ([#10873](https://github.com/diegosouzapw/OmniRoute/pull/10873)) — thanks @Zartharas diff --git a/changelog.d/fixes/10877-quota-alias-fetcher-lookup-gap.md b/changelog.d/fixes/10877-quota-alias-fetcher-lookup-gap.md deleted file mode 100644 index 9501c6dad2..0000000000 --- a/changelog.d/fixes/10877-quota-alias-fetcher-lookup-gap.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** `getResetAwareProvider()` and the auto-combo quota lookup in `combo.ts` now canonicalize the provider id via `resolveProviderId()` before calling `getQuotaFetcher()`, so a fetcher registered under a provider's canonical id (e.g. `ollama-cloud`, `codex`) is found for combo targets stored under an alias spelling (e.g. `ollamacloud`, `cx`) instead of silently degrading reset-aware/reset-window/auto quota-aware routing to plain priority ordering (#10877) diff --git a/changelog.d/fixes/10878-unsupported-validation-probes-neutral.md b/changelog.d/fixes/10878-unsupported-validation-probes-neutral.md deleted file mode 100644 index 1fc7c01933..0000000000 --- a/changelog.d/fixes/10878-unsupported-validation-probes-neutral.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(provider-health):** Keep unsupported 404/405 validation probes neutral so they do not poison stored credential health or scheduler failure state, while still honoring per-connection health-check pacing ([#10878](https://github.com/diegosouzapw/OmniRoute/pull/10878)) — thanks @Zartharas diff --git a/changelog.d/fixes/10882-antigravity-gemini37-flash-tiers.md b/changelog.d/fixes/10882-antigravity-gemini37-flash-tiers.md deleted file mode 100644 index b1ff4bbf5a..0000000000 --- a/changelog.d/fixes/10882-antigravity-gemini37-flash-tiers.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(antigravity):** map Gemini 3.7 Flash tier ids (`gemini-3.7-flash-high/medium/low`, bare `gemini-3.7-flash`) to the upstream `gemini-3.7-flash-tiered` model id Google's Cloud Code endpoint expects, and configure per-tier thinking budgets ([#10882](https://github.com/diegosouzapw/OmniRoute/pull/10882)) — thanks @adevwithpurpose diff --git a/changelog.d/fixes/10887-memory-mcp-tools.md b/changelog.d/fixes/10887-memory-mcp-tools.md deleted file mode 100644 index 8dc02db1d9..0000000000 --- a/changelog.d/fixes/10887-memory-mcp-tools.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(memory):** enable agent memory save/update via MCP tools (`memory_save`/`update`/`search`/`delete` builtins with per-provider schemas, `apiKeyId` optional with caller-principal fallback) and gate server-side memory builtin injection to non-stream requests only ([#10887](https://github.com/diegosouzapw/OmniRoute/pull/10887)) — thanks @Egorich-print diff --git a/changelog.d/fixes/10902-pplx-search-hint-optin.md b/changelog.d/fixes/10902-pplx-search-hint-optin.md deleted file mode 100644 index 233fb61f19..0000000000 --- a/changelog.d/fixes/10902-pplx-search-hint-optin.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(perplexity-web):** make the built-in-search hint appended to every system message opt-in via `OMNIROUTE_PPLX_SEARCH_HINT` (off by default) — Perplexity's answer engine searches anyway, and the hint leaked into replies as meta-commentary for coding clients ([#10902](https://github.com/diegosouzapw/OmniRoute/pull/10902), extracted from [#8634](https://github.com/diegosouzapw/OmniRoute/pull/8634)) — thanks @danscMax diff --git a/changelog.d/fixes/10903-loopback-gate-memory-success.md b/changelog.d/fixes/10903-loopback-gate-memory-success.md deleted file mode 100644 index 25720ba1a8..0000000000 --- a/changelog.d/fixes/10903-loopback-gate-memory-success.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** the loopback readiness gate no longer memorizes a failed probe — the next caller after 30s starts a fresh probe, and a readiness failure is logged once per probe instead of once per caller ([#10903](https://github.com/diegosouzapw/OmniRoute/pull/10903)) diff --git a/changelog.d/fixes/10935-cloudflare-relay-path-guard.md b/changelog.d/fixes/10935-cloudflare-relay-path-guard.md deleted file mode 100644 index 0799cdc52d..0000000000 --- a/changelog.d/fixes/10935-cloudflare-relay-path-guard.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(relay):** the Cloudflare proxy-relay worker now resolves `x-relay-path` through the shared `resolveRelayTarget()` guard instead of concatenating it onto the validated target. PR #4643 and its follow-up applied that guard to the Deno and Vercel workers; the Cloudflare generator, ported separately from upstream `decolua/9router` PR #1360, kept `fetch(targetBase + relayPath)`. Validating `x-relay-target` and then concatenating is not sufficient — the path re-points the request past the host that was just checked, through userinfo (`/x@evil.com`), a backslash (`\evil.com`), or a protocol-relative path (`//evil.com/x`). The guard is embedded verbatim under a literal `const resolveRelayTarget =` binding so the hardcoded call site still resolves when the SWC-minified standalone build mangles the source function's own name (#6149), and the new regression test pins that property for this worker by renaming the embedded function and re-evaluating the emitted source. The auth check and the private/loopback target guard are unchanged diff --git a/changelog.d/fixes/10936-standalone-server-cjs-esm-scope.md b/changelog.d/fixes/10936-standalone-server-cjs-esm-scope.md deleted file mode 100644 index 824f7df647..0000000000 --- a/changelog.d/fixes/10936-standalone-server-cjs-esm-scope.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(build):** the `next` Docker image no longer crashes on boot with `ReferenceError: require is not defined in ES module scope`. The standalone `server.js` is CommonJS, but the `postbuild` colocate step was re-adding `"type":"module"` to the standalone root `package.json` (undoing `assembleStandalone`'s strip) to make its ESM worker bundles load. The `type:module` scope is now written per-worker-directory instead of on the root, so `server.js` stays CommonJS while the workers stay ESM ([#10936](https://github.com/diegosouzapw/OmniRoute/pull/10936), fixes [#10933](https://github.com/diegosouzapw/OmniRoute/issues/10933)) — thanks @arminanton diff --git a/changelog.d/fixes/10940-opencode-limit-output.md b/changelog.d/fixes/10940-opencode-limit-output.md deleted file mode 100644 index 9af54a2046..0000000000 --- a/changelog.d/fixes/10940-opencode-limit-output.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): always emit limit.output in generated OpenCode config so schema validation passes for metadata-less models (#10940) diff --git a/changelog.d/fixes/10941-relay-private-host-guard.md b/changelog.d/fixes/10941-relay-private-host-guard.md deleted file mode 100644 index 53d3aedeec..0000000000 --- a/changelog.d/fixes/10941-relay-private-host-guard.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(relay):** the private/loopback guard the three proxy-relay workers embed no longer misses four host spellings, and now lives in one place instead of three byte-identical inline copies. Driving `new URL(target).hostname` the way the workers do, the previous guard allowed `::` (the unspecified address, which reaches a service bound to the IPv6 loopback), `localhost.` (the FQDN root dot defeated the exact match and every `.localhost`/`.local`/`.internal` suffix rule, so `svc.internal.` slipped too), `::127.0.0.1` (the deprecated IPv4-compatible form — only `::ffff:` was checked), and `feb0::1` (link-local is `fe80::/10`, spanning `fe80`–`febf`, but only the literal `fe80:` spelling matched). The policy moved to `src/lib/proxyRelay/privateHostname.ts` and is embedded verbatim via `Function#toString` under a literal const name, the same mechanism `resolveRelayTarget` already uses for these workers, so a minified standalone build cannot break the call site (#6149). Nothing previously blocked is now allowed. Severity is low — reaching a worker needs the `x-relay-auth` secret and these are edge runtimes where loopback has nothing listening — but the suffix-rule bypass held regardless of runtime diff --git a/changelog.d/fixes/10945-least-used-rotation.md b/changelog.d/fixes/10945-least-used-rotation.md deleted file mode 100644 index 36b23951b2..0000000000 --- a/changelog.d/fixes/10945-least-used-rotation.md +++ /dev/null @@ -1 +0,0 @@ -- **Account rotation:** make `fallbackStrategy: "least-used"` actually rotate. The strategy sorts on `lastUsedAt` but never wrote it — only the round-robin branch committed — so on a pool where every `last_used_at` was still `NULL` the tie-break fell through to `priority` and returned the same connection on every dispatch ([#10945](https://github.com/diegosouzapw/OmniRoute/issues/10945)). diff --git a/changelog.d/fixes/10947-windows-updater-artifact-name.md b/changelog.d/fixes/10947-windows-updater-artifact-name.md deleted file mode 100644 index 10c90a216d..0000000000 --- a/changelog.d/fixes/10947-windows-updater-artifact-name.md +++ /dev/null @@ -1 +0,0 @@ -- **Desktop auto-update (Windows):** stop the in-app updater 404ing on every release. NSIS used electron-builder's default artifact name, whose spaces GitHub rewrites to `.` on upload while `latest.yml` keeps `-`, so the manifest pointed at `OmniRoute-Setup-X.Y.Z.exe` while the published asset was `OmniRoute.Setup.X.Y.Z.exe`. The name is now set explicitly to the dot form the asset already has, so nothing published changes name ([#10947](https://github.com/diegosouzapw/OmniRoute/issues/10947)). diff --git a/changelog.d/fixes/10949-mixed-reasoning-plaintext.md b/changelog.d/fixes/10949-mixed-reasoning-plaintext.md deleted file mode 100644 index 05a055ec53..0000000000 --- a/changelog.d/fixes/10949-mixed-reasoning-plaintext.md +++ /dev/null @@ -1 +0,0 @@ -- Preserve explicit plaintext reasoning when a Responses reasoning item also carries opaque provider state (rare OpenCode Go `deepseek-v4-flash` responses). Mixed plaintext + opaque input is projected onto the target transport: plaintext targets keep portable text, opaque targets keep provider state. Opaque-only reasoning is dropped when the selected target cannot replay it, allowing cross-model conversations to continue. (#10949, #10959) diff --git a/changelog.d/fixes/10953-preserve-provider-effort-tiers.md b/changelog.d/fixes/10953-preserve-provider-effort-tiers.md deleted file mode 100644 index d509aac61b..0000000000 --- a/changelog.d/fixes/10953-preserve-provider-effort-tiers.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(catalog):** preserve provider-declared reasoning effort tiers instead of replacing them with generic defaults ([#10953](https://github.com/diegosouzapw/OmniRoute/pull/10953)) — thanks @xz-dev diff --git a/changelog.d/fixes/10954-combo-create-models.md b/changelog.d/fixes/10954-combo-create-models.md deleted file mode 100644 index 0a0638bcea..0000000000 --- a/changelog.d/fixes/10954-combo-create-models.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): combo create accepts --models and no longer creates empty combos (#10954) diff --git a/changelog.d/fixes/10955-cli-ref-params.md b/changelog.d/fixes/10955-cli-ref-params.md deleted file mode 100644 index 9497b4129e..0000000000 --- a/changelog.d/fixes/10955-cli-ref-params.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): resolve $ref path params and add PATCH combos requestBody in generated API commands (#10955) diff --git a/changelog.d/fixes/10967-10966-combo-diag-recovery.md b/changelog.d/fixes/10967-10966-combo-diag-recovery.md deleted file mode 100644 index e962b14981..0000000000 --- a/changelog.d/fixes/10967-10966-combo-diag-recovery.md +++ /dev/null @@ -1,2 +0,0 @@ -- fix(sse): combo diagnostics no longer truncate `exhausted_connection` entries to a hardcoded `provider: "unknown"` with the provider prefix eaten by an 8-char slice — the real provider id is preserved and only the connection id is truncated (#10967) -- fix(sse): combo terminal failures caused entirely by quota/account-balance exhaustion (including a durable HTTP 403 `insufficient_quota` / `AUTHZ_INSUFFICIENT_BALANCE`) now stamp a stable `quota_exhausted` diagnostics reason with a `switch-combo` recovery hint instead of the misleading default `retry` action (#10966) diff --git a/changelog.d/fixes/10976-skip-default-searxng.md b/changelog.d/fixes/10976-skip-default-searxng.md deleted file mode 100644 index a317979b4a..0000000000 --- a/changelog.d/fixes/10976-skip-default-searxng.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(search):** skip catalog-default SearXNG `http://localhost:8888/search` so Docker/K8s search does not ECONNREFUSED then 502 into the next provider ([#10976](https://github.com/diegosouzapw/OmniRoute/issues/10976)) diff --git a/changelog.d/fixes/10986-reasoning-only-content.md b/changelog.d/fixes/10986-reasoning-only-content.md deleted file mode 100644 index 0d293482bd..0000000000 --- a/changelog.d/fixes/10986-reasoning-only-content.md +++ /dev/null @@ -1 +0,0 @@ -- fix(command-code): surface reasoning-only output as content when a model emits no text-delta (#10986) \ No newline at end of file diff --git a/changelog.d/fixes/10988-release-v3850-quality-gates.md b/changelog.d/fixes/10988-release-v3850-quality-gates.md deleted file mode 100644 index 283b30b836..0000000000 --- a/changelog.d/fixes/10988-release-v3850-quality-gates.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(ci):** clear inherited `release/v3.8.50` quality-gate reds on the X Search PR: drop the stale `copilot-m365-web.ts:330` public-creds allowlist, document six missing env vars, register four covering Stryker tap tests, prune leftover ESLint suppressions, replace the phantom `@/lib/db/connections` Utilization import with `getProviderConnectionById`, and fix open-sse/dashboard typecheck regressions in freebuff, browser-backed chat, auth, health matrix, and Monaco ([#10988](https://github.com/diegosouzapw/OmniRoute/pull/10988)). diff --git a/changelog.d/fixes/10988-release-v3850-unit-shards.md b/changelog.d/fixes/10988-release-v3850-unit-shards.md deleted file mode 100644 index 139266c990..0000000000 --- a/changelog.d/fixes/10988-release-v3850-unit-shards.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(ci):** clear remaining `release/v3.8.50` unit-shard reds on the X Search PR: pin `onnxruntime-node` to the transformers 1.24.3 copy, rebaseline OpenAPI coverage, sync goldens/i18n, honor eye-hidden no-auth models across provider aliases, await rejected-request call-log writes, absorb catalog event-loop shard contention in #9147, and align inherited tests with advisory context estimates, #10501 combo terminal-status aggregation, and current catalog/auth behavior ([#10988](https://github.com/diegosouzapw/OmniRoute/pull/10988)). diff --git a/changelog.d/fixes/10990-v0-vercel-web-static-catalog.md b/changelog.d/fixes/10990-v0-vercel-web-static-catalog.md deleted file mode 100644 index 9d56721208..0000000000 --- a/changelog.d/fixes/10990-v0-vercel-web-static-catalog.md +++ /dev/null @@ -1 +0,0 @@ -- **Static model catalog for v0-vercel-web:** seed a static catalog for the v0-vercel-web web-cookie provider (v0-1.0-md, v0-1.5-lg, v0-1.5-md) so its dashboard "Available Models" / "Import from /models" UI serves a usable list instead of falling through to the route's 400 "does not support models listing" ([#10990](https://github.com/diegosouzapw/OmniRoute/issues/10990)). \ No newline at end of file diff --git a/changelog.d/fixes/10997-blackbox-deprecation.md b/changelog.d/fixes/10997-blackbox-deprecation.md deleted file mode 100644 index 74ac191526..0000000000 --- a/changelog.d/fixes/10997-blackbox-deprecation.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): mark the blackbox provider deprecated — api.blackbox.ai returns HTTP 404 on every path variant (sweep 2026-08-21), so the public inference surface is dead and the catalog entry now carries a deprecation notice. ([#10997](https://github.com/diegosouzapw/OmniRoute/issues/10997)) \ No newline at end of file diff --git a/changelog.d/fixes/11002-dify-key-validation.md b/changelog.d/fixes/11002-dify-key-validation.md deleted file mode 100644 index 6574714c9b..0000000000 --- a/changelog.d/fixes/11002-dify-key-validation.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): validate Dify keys against its native /v1/chat-messages endpoint (#11002) \ No newline at end of file diff --git a/changelog.d/fixes/11008-account-rotation-eviction.md b/changelog.d/fixes/11008-account-rotation-eviction.md deleted file mode 100644 index 4855dde6f2..0000000000 --- a/changelog.d/fixes/11008-account-rotation-eviction.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(accounts):** `markCooldown` now carries the failure origin (`transient` vs `terminal`) — transient 429/network only cools down, repeated terminal failures evict and are skipped by `pickAccount` until a success or operator clear ([#11008](https://github.com/diegosouzapw/OmniRoute/pull/11008)) — thanks @maxmad64bis diff --git a/changelog.d/fixes/11009-terminal-status-origin.md b/changelog.d/fixes/11009-terminal-status-origin.md deleted file mode 100644 index f0ab24edaf..0000000000 --- a/changelog.d/fixes/11009-terminal-status-origin.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** route terminal `testStatus` writes (`banned`, `deactivated`, `credits_exhausted`) through a single origin-aware passage — probe failures are recorded but never deactivate the connection ([#11009](https://github.com/diegosouzapw/OmniRoute/pull/11009)) — thanks @maxmad64bis diff --git a/changelog.d/fixes/11014-codex-drop-default-on.md b/changelog.d/fixes/11014-codex-drop-default-on.md deleted file mode 100644 index 0e5a8f1129..0000000000 --- a/changelog.d/fixes/11014-codex-drop-default-on.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(codex):** drop non-standard `codex.*` SSE events by default so OpenAI SDK / Codex CLI `/v1/responses` clients are not 502'd by `event: codex.rate_limits` ([#11014](https://github.com/diegosouzapw/OmniRoute/issues/11014)) — thanks @RaviTharuma diff --git a/changelog.d/fixes/11015-shutdown-track-sse.md b/changelog.d/fixes/11015-shutdown-track-sse.md deleted file mode 100644 index 1ed99b3669..0000000000 --- a/changelog.d/fixes/11015-shutdown-track-sse.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(resilience):** count heavyweight `/v1` admission leases in the SIGTERM drain and send `Retry-After` on shutdown 503s so Recreate no longer looks like an empty 502 ([#11015](https://github.com/diegosouzapw/OmniRoute/issues/11015)) — thanks @RaviTharuma diff --git a/changelog.d/fixes/11016-cred-health-disable-log.md b/changelog.d/fixes/11016-cred-health-disable-log.md deleted file mode 100644 index 37a9715f41..0000000000 --- a/changelog.d/fixes/11016-cred-health-disable-log.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(startup):** log `Credential health scheduler disabled` when `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` is set instead of lying with `started` ([#11016](https://github.com/diegosouzapw/OmniRoute/issues/11016)) — thanks @RaviTharuma diff --git a/changelog.d/fixes/11017-rate-limit-docs.md b/changelog.d/fixes/11017-rate-limit-docs.md deleted file mode 100644 index fc92469bd6..0000000000 --- a/changelog.d/fixes/11017-rate-limit-docs.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(api-keys):** document that unset `DEFAULT_RATE_LIMIT_PER_DAY` is unlimited (#2289), not a hidden 1000/day cap ([#11017](https://github.com/diegosouzapw/OmniRoute/issues/11017)) — thanks @RaviTharuma diff --git a/changelog.d/fixes/11050-remove-ghost-webhook-events.md b/changelog.d/fixes/11050-remove-ghost-webhook-events.md deleted file mode 100644 index 6278ee6c0a..0000000000 --- a/changelog.d/fixes/11050-remove-ghost-webhook-events.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(webhooks):** remove 3 declared-but-never-emitted events (`provider.error`, `provider.recovered`, `combo.switched`) from `WebhookEvent` — catalog now `request.completed | request.failed | quota.exceeded | test.ping`; `POST /api/webhooks` and `PUT /api/webhooks/[id]` reject ghost values with 400; OpenAPI webhook description updated across 43 locales ([11050](https://github.com/diegosouzapw/OmniRoute/pull/11050)) diff --git a/changelog.d/fixes/11060-perplexity-filter.md b/changelog.d/fixes/11060-perplexity-filter.md deleted file mode 100644 index c221d3ccab..0000000000 --- a/changelog.d/fixes/11060-perplexity-filter.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): filter Perplexity model import to the Sonar family so Agent-API catalog ids stop surfacing as routable chat models (#11060) diff --git a/changelog.d/fixes/11085-claude-code-tool-name-casing.md b/changelog.d/fixes/11085-claude-code-tool-name-casing.md deleted file mode 100644 index 5ad424c141..0000000000 --- a/changelog.d/fixes/11085-claude-code-tool-name-casing.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(claude):** restore canonical tool names (`bash` → `Bash`, `croncreate` → `CronCreate`) on non-streaming OpenAI→Claude conversion and through identity-echo alias maps, so Claude Code stops rejecting tool calls with "No such tool available" ([#11085](https://github.com/diegosouzapw/OmniRoute/pull/11085)) — thanks @linhdmn diff --git a/changelog.d/fixes/11089-chat-routing-synced-inventory.md b/changelog.d/fixes/11089-chat-routing-synced-inventory.md deleted file mode 100644 index 922b96a659..0000000000 --- a/changelog.d/fixes/11089-chat-routing-synced-inventory.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(resilience):** filter chat connection selection by each connection's *synced* model inventory on multi-host self-hosted providers (`ollama-local`, `lm-studio`, `vllm`, …), so a request for a model only one host advertises is pinned to that host instead of failing over onto a host that never had it ([#11089](https://github.com/diegosouzapw/OmniRoute/issues/11089)) diff --git a/changelog.d/fixes/11095-termux-onnx.md b/changelog.d/fixes/11095-termux-onnx.md deleted file mode 100644 index 8c26803710..0000000000 --- a/changelog.d/fixes/11095-termux-onnx.md +++ /dev/null @@ -1 +0,0 @@ -- fix(install): make the ONNX dependency chain optional so Termux/Android installs succeed again (#11095) diff --git a/changelog.d/fixes/11101-reject-silent-validation.md b/changelog.d/fixes/11101-reject-silent-validation.md deleted file mode 100644 index 04b2a67d5a..0000000000 --- a/changelog.d/fixes/11101-reject-silent-validation.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** Reject silent validation degradation on provider connection patch — unknown `rateLimitOverrides` keys (e.g. a typo'd `tpm`) and empty/non-numeric values now return `400` with the rejected key list instead of being silently dropped ([#11101](https://github.com/diegosouzapw/OmniRoute/pull/11101)) diff --git a/changelog.d/fixes/11102-combo-suggestion-count.md b/changelog.d/fixes/11102-combo-suggestion-count.md deleted file mode 100644 index 3cbf6f11d3..0000000000 --- a/changelog.d/fixes/11102-combo-suggestion-count.md +++ /dev/null @@ -1 +0,0 @@ -- **Autopilot suggestion counter:** the combo health autopilot summary now reports `suggestionCount` (the real number of suggested actions across all issues) instead of conflating it with link counts, while keeping `actionableCount` as a deprecated alias for backward compatibility. The `run_combo_test` action now links to the dashboard with the combo id (`/dashboard/combos?test=`) rather than the read-only API route, so operators can actually trigger a test from the UI ([#11102](https://github.com/diegosouzapw/OmniRoute/pull/11102)). diff --git a/changelog.d/fixes/11103-persist-config-audit-log.md b/changelog.d/fixes/11103-persist-config-audit-log.md deleted file mode 100644 index aeb53b1781..0000000000 --- a/changelog.d/fixes/11103-persist-config-audit-log.md +++ /dev/null @@ -1 +0,0 @@ -- **Config audit persistence:** persist the configuration audit trail to SQLite (`config_audit_log`) instead of an in-memory buffer capped at 1000 volatile entries, and bound its growth with `cleanupConfigAudit()` driven by the `retention.configAudit` setting (default 30 days), wired into `runAutoCleanup` ([#11103](https://github.com/diegosouzapw/OmniRoute/pull/11103)). diff --git a/changelog.d/fixes/11109-stream-recovery-toolcall.md b/changelog.d/fixes/11109-stream-recovery-toolcall.md deleted file mode 100644 index 04a43382e4..0000000000 --- a/changelog.d/fixes/11109-stream-recovery-toolcall.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): resume mid-stream recovery after a _completed_ tool call — `finish_reason: "tool_calls"` is now tracked per-call instead of as a general terminal marker, so truncation of trailing prose after a fully-delivered tool call is recoverable while in-flight calls stay blocked ([#11109](https://github.com/diegosouzapw/OmniRoute/pull/11109)) diff --git a/changelog.d/fixes/11116-reasoning-effort-capability-discovery.md b/changelog.d/fixes/11116-reasoning-effort-capability-discovery.md deleted file mode 100644 index fbc4dfe694..0000000000 --- a/changelog.d/fixes/11116-reasoning-effort-capability-discovery.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** `reasoning_effort` now learns the accepted values from a provider's own 400/422 response and clamps to the highest one instead of forwarding an unsupported `xhigh`/`max` (or a hardcoded `"high"` fallback) — fixes custom OpenAI-compatible connections and registered providers with no reasoning metadata ([#11116](https://github.com/diegosouzapw/OmniRoute/pull/11116)) — thanks @maxmad64bis diff --git a/changelog.d/fixes/11144-responses-parallel-tool-calls-index.md b/changelog.d/fixes/11144-responses-parallel-tool-calls-index.md deleted file mode 100644 index 35ba19b279..0000000000 --- a/changelog.d/fixes/11144-responses-parallel-tool-calls-index.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** parallel `function_call` items in a Responses API stream (e.g. several tool calls dispatched in the same turn) now each get a stable, distinct `index`/`id` when translated to Chat Completions streaming deltas, instead of colliding on index 0 and tripping strict stream parsers with `Expected 'id' to be a string.` ([#11144](https://github.com/diegosouzapw/OmniRoute/pull/11144)) diff --git a/changelog.d/fixes/11149-opencode-go-flat-rate.md b/changelog.d/fixes/11149-opencode-go-flat-rate.md deleted file mode 100644 index 7aa63ad455..0000000000 --- a/changelog.d/fixes/11149-opencode-go-flat-rate.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(analytics):** `opencode-go` is now classified as a flat-rate subscription, so cost analytics shows $0 for it instead of billing every call at the underlying model’s metered rate — it resells GLM, Kimi, Grok, DeepSeek, MiniMax, Qwen and GPT-5.x under one flat monthly fee, which made the overstatement large rather than marginal ([#11149](https://github.com/diegosouzapw/OmniRoute/pull/11149)) — thanks @electrumguy diff --git a/changelog.d/fixes/11154-provider-registry-node-net-bundle.md b/changelog.d/fixes/11154-provider-registry-node-net-bundle.md deleted file mode 100644 index b30d9e1392..0000000000 --- a/changelog.d/fixes/11154-provider-registry-node-net-bundle.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): keep `open-sse/config/providerRegistry.ts` free of `node:net` so the provider detail client bundle builds again — the host classification moved to a platform-free `src/shared/network/privateHost.ts` with a pure-JS `isIP` equivalent, leaving the #11122 routing behaviour unchanged (#11154) diff --git a/changelog.d/fixes/11162-combo-create-requires-model.md b/changelog.d/fixes/11162-combo-create-requires-model.md deleted file mode 100644 index 228e6a9b20..0000000000 --- a/changelog.d/fixes/11162-combo-create-requires-model.md +++ /dev/null @@ -1 +0,0 @@ -- **Combo create:** creating a routing combo without any model is now refused (`400`) — the CLI requires `--models`/`--model` on `combo create`, matching the dashboard which already rejected empty combos. diff --git a/changelog.d/fixes/11165-shared-registry-passthrough-model-lockout.md b/changelog.d/fixes/11165-shared-registry-passthrough-model-lockout.md deleted file mode 100644 index eabe67cb09..0000000000 --- a/changelog.d/fixes/11165-shared-registry-passthrough-model-lockout.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(resilience):** a missing-model `404` on a provider that declares `passthroughModels: true` in the shared registry (novita, uncloseai, orcarouter and 37 others) now locks out only that model instead of cooling the entire connection — `hasPerModelQuota()` previously read only the open-sse registry and the local/self-hosted families ([#11165](https://github.com/diegosouzapw/OmniRoute/pull/11165)) — thanks @yourspraveen diff --git a/changelog.d/fixes/11180-keyless-custom-provider-auto-pool.md b/changelog.d/fixes/11180-keyless-custom-provider-auto-pool.md deleted file mode 100644 index c533feae54..0000000000 --- a/changelog.d/fixes/11180-keyless-custom-provider-auto-pool.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(routing):** a custom `openai-compatible-*` / `anthropic-compatible-*` connection pointing at a keyless self-hosted backend (llama.cpp, Ollama, vLLM started without an API key) now stays in the `auto/*` candidate pool instead of being silently dropped by the credential gate — for those IDs "no credential" is the normal configuration, not an unconfigured connection ([#11180](https://github.com/diegosouzapw/OmniRoute/pull/11180)) — thanks @marcs7 diff --git a/changelog.d/fixes/11181-lkgp-enabled-context.md b/changelog.d/fixes/11181-lkgp-enabled-context.md deleted file mode 100644 index d1c0cde5a3..0000000000 --- a/changelog.d/fixes/11181-lkgp-enabled-context.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(routing):** the Routing tab's "last known good provider" toggle now actually takes effect — `lkgpEnabled` was persisted and the `lkgp` strategy guarded on it, but the setting was never forwarded into the `RoutingContext` built in `resolveAutoStrategyOrder()`, so `context.lkgpEnabled` was always `undefined` and the off-switch was unreachable ([#11181](https://github.com/diegosouzapw/OmniRoute/issues/11181)) diff --git a/changelog.d/fixes/7346-electron-hollow-nested-package-repair.md b/changelog.d/fixes/7346-electron-hollow-nested-package-repair.md deleted file mode 100644 index fd7e61988b..0000000000 --- a/changelog.d/fixes/7346-electron-hollow-nested-package-repair.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): repair hollow externalized package dirs in the nested `/node_modules` bundle location too, not just the top-level one, fixing macOS/Linux Electron `ERR_MODULE_NOT_FOUND` on Turbopack-externalized packages (#7346) diff --git a/changelog.d/fixes/7592-electron-cold-restart-native-driver-check.md b/changelog.d/fixes/7592-electron-cold-restart-native-driver-check.md deleted file mode 100644 index e6458879cf..0000000000 --- a/changelog.d/fixes/7592-electron-cold-restart-native-driver-check.md +++ /dev/null @@ -1 +0,0 @@ -- **Electron packaged smoke test:** add a cold-restart mode (`ELECTRON_SMOKE_COLD_RESTART=1`, wired blocking on the Linux release leg) that relaunches the packaged app against its own persisted `DATA_DIR` and asserts a native SQLite driver was selected instead of the sql.js WASM fallback, closing the regression-test gap flagged in the stale-ABI `better-sqlite3` investigation ([#7592](https://github.com/diegosouzapw/OmniRoute/issues/7592)). diff --git a/changelog.d/fixes/8307-codex-image-account-fallback-retryable.md b/changelog.d/fixes/8307-codex-image-account-fallback-retryable.md deleted file mode 100644 index bd4a70a1ab..0000000000 --- a/changelog.d/fixes/8307-codex-image-account-fallback-retryable.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(images):** retry Codex image generation on a sibling ChatGPT account when the requested model isn't entitled on the current account, instead of failing the request outright ([#8307](https://github.com/diegosouzapw/OmniRoute/pull/8307)). diff --git a/changelog.d/fixes/8864-uncloseai-noauth.md b/changelog.d/fixes/8864-uncloseai-noauth.md deleted file mode 100644 index 8a38e6b836..0000000000 --- a/changelog.d/fixes/8864-uncloseai-noauth.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): treat UncloseAI as a no-auth provider so the connect form no longer forces a fake API key (#8864) diff --git a/changelog.d/fixes/9013-model-param-filter-save.md b/changelog.d/fixes/9013-model-param-filter-save.md deleted file mode 100644 index d81d7ab179..0000000000 --- a/changelog.d/fixes/9013-model-param-filter-save.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(dashboard):** model-level allowed/blocked param edits now persist when the compatibility popover is closed by clicking outside, and a failed save no longer clears the edit or reports success ([#9013](https://github.com/diegosouzapw/OmniRoute/pull/9013)) diff --git a/changelog.d/fixes/9123-search-provider-local-flag-guard-mismatch.md b/changelog.d/fixes/9123-search-provider-local-flag-guard-mismatch.md deleted file mode 100644 index bc51e12103..0000000000 --- a/changelog.d/fixes/9123-search-provider-local-flag-guard-mismatch.md +++ /dev/null @@ -1 +0,0 @@ -- fix(ssrf): make `getProviderOutboundGuard()` (used for search-provider connection validation, image generation and remote image fetch) honor the local-first default `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` the same way the chat validation guard already does, so a LAN-hosted SearXNG/Brave search provider works with only the LOCAL flag set instead of silently requiring `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` ([#9123](https://github.com/diegosouzapw/OmniRoute/issues/9123)). \ No newline at end of file diff --git a/changelog.d/fixes/9144-github-copilot-file-reference-compression-corruption.md b/changelog.d/fixes/9144-github-copilot-file-reference-compression-corruption.md deleted file mode 100644 index 6f48adeab5..0000000000 --- a/changelog.d/fixes/9144-github-copilot-file-reference-compression-corruption.md +++ /dev/null @@ -1 +0,0 @@ -- fix(compression): preserve unfenced raw code (e.g. Copilot #file references) from Caveman's prose recapitalization/whitespace cleanup, which was corrupting keyword casing and indentation (#9144) diff --git a/changelog.d/fixes/9147-catalog-eventloop-yield.md b/changelog.d/fixes/9147-catalog-eventloop-yield.md deleted file mode 100644 index 1f27c92b33..0000000000 --- a/changelog.d/fixes/9147-catalog-eventloop-yield.md +++ /dev/null @@ -1 +0,0 @@ -- fix(api): yield the event loop during catalog builds and bulk-load override/hidden-model tables (#9147) \ No newline at end of file diff --git a/changelog.d/fixes/9303-recovery-hint-all-targets-skipped.md b/changelog.d/fixes/9303-recovery-hint-all-targets-skipped.md deleted file mode 100644 index 78649d651f..0000000000 --- a/changelog.d/fixes/9303-recovery-hint-all-targets-skipped.md +++ /dev/null @@ -1 +0,0 @@ -- fix(combo): recovery hint for all_targets_skipped now points at provider quota/availability instead of 'transient, just retry' (#9303) diff --git a/changelog.d/fixes/9617-gemini-uniqueitems-strip.md b/changelog.d/fixes/9617-gemini-uniqueitems-strip.md deleted file mode 100644 index 8e01e17a28..0000000000 --- a/changelog.d/fixes/9617-gemini-uniqueitems-strip.md +++ /dev/null @@ -1 +0,0 @@ -- fix(providers): strip uniqueItems from Gemini tool schemas (Gemini rejects it with 400 'Unknown name uniqueItems') (#9617) diff --git a/changelog.d/fixes/9692-openai-to-claude-tool-images.md b/changelog.d/fixes/9692-openai-to-claude-tool-images.md deleted file mode 100644 index c082d0dbc3..0000000000 --- a/changelog.d/fixes/9692-openai-to-claude-tool-images.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(translator):** convert OpenAI `image_url` blocks nested in `role: "tool"` / `tool_result` content to Claude `image` source blocks so OpenAI-compatible clients (Kimi Code CLI `ReadMediaFile`, and any other tool that returns media) no longer 400 the next Claude-format upstream turn ([#9692](https://github.com/diegosouzapw/OmniRoute/issues/9692)) diff --git a/changelog.d/fixes/9708-codex-same-account-retry.md b/changelog.d/fixes/9708-codex-same-account-retry.md deleted file mode 100644 index 2ccb7fb97f..0000000000 --- a/changelog.d/fixes/9708-codex-same-account-retry.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(resilience):** retry a retryable Codex pre-output 502/503/504/507 once on the same account (2–3s jitter) before cooling the connection, and stop translating that mixed pool into an all-accounts quota `429` ([#9708](https://github.com/diegosouzapw/OmniRoute/issues/9708)) diff --git a/changelog.d/fixes/9763-ratelimit-mintime-floor.md b/changelog.d/fixes/9763-ratelimit-mintime-floor.md deleted file mode 100644 index 2b145f1e1a..0000000000 --- a/changelog.d/fixes/9763-ratelimit-mintime-floor.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(ratelimit):** respect operator `minTimeBetweenRequestsMs` floor when relaxing the limiter on headroom — the adaptive rate-limit learning no longer silently erases a configured minimum gap between requests when the upstream reports plenty of remaining capacity ([#9763](https://github.com/diegosouzapw/OmniRoute/issues/9763)). diff --git a/changelog.d/fixes/9821-mcp-pack-unit-stall.md b/changelog.d/fixes/9821-mcp-pack-unit-stall.md deleted file mode 100644 index c8f677535b..0000000000 --- a/changelog.d/fixes/9821-mcp-pack-unit-stall.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(test):** remove live `npm pack` from MCP files unit test (it stalled concurrent `test:unit` via prepare→husky + monorepo pack walk); keep the static #3578 `files` allowlist + negation guards in unit and fold #3821 pack assertions into `check:pack-artifact` / `check:pack-policy` (already `--ignore-scripts`). diff --git a/changelog.d/fixes/9935-media-playground-masked-bearer.md b/changelog.d/fixes/9935-media-playground-masked-bearer.md deleted file mode 100644 index 2fd123d801..0000000000 --- a/changelog.d/fixes/9935-media-playground-masked-bearer.md +++ /dev/null @@ -1 +0,0 @@ -- fix(dashboard): media mini-playgrounds authenticate via session instead of sending the masked API key as Bearer, fixing 401s under REQUIRE_API_KEY (#9935) diff --git a/changelog.d/fixes/9970-credential-health-search-provider-exclusion.md b/changelog.d/fixes/9970-credential-health-search-provider-exclusion.md deleted file mode 100644 index 04aef65204..0000000000 --- a/changelog.d/fixes/9970-credential-health-search-provider-exclusion.md +++ /dev/null @@ -1 +0,0 @@ -- fix(sse): exclude search providers from credential-health scheduler sweep to stop burning billed API queries (#9970) diff --git a/changelog.d/fixes/PENDING-electron-window-hidden-hostname-bind.md b/changelog.d/fixes/PENDING-electron-window-hidden-hostname-bind.md deleted file mode 100644 index 6a88ba926a..0000000000 --- a/changelog.d/fixes/PENDING-electron-window-hidden-hostname-bind.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(electron):** desktop window stays hidden on Windows because the embedded Next.js server binds to the machine hostname instead of loopback ([#PENDING](https://github.com/diegosouzapw/OmniRoute/pull/PENDING)) diff --git a/changelog.d/fixes/api-manager-empty-combo-allowlist.md b/changelog.d/fixes/api-manager-empty-combo-allowlist.md deleted file mode 100644 index 7180578281..0000000000 --- a/changelog.d/fixes/api-manager-empty-combo-allowlist.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api-manager):** Allowed Combos can now be restricted to zero entries: **All** is stored explicitly as `combo/*`, while **Restrict** with no selection saves an empty allowlist that denies Combo routes without blocking direct models. Existing keys are migrated to preserve their previous allow-all behavior. diff --git a/changelog.d/fixes/assemble-standalone-cpsync-race.md b/changelog.d/fixes/assemble-standalone-cpsync-race.md deleted file mode 100644 index 82fabbcad6..0000000000 --- a/changelog.d/fixes/assemble-standalone-cpsync-race.md +++ /dev/null @@ -1 +0,0 @@ -- fix(build): tolerate a same-realpath symlink or stale-typed dest in the standalone bundle assembler, fixing non-deterministic `ERR_FS_CP_EINVAL`/`ERR_FS_CP_DIR_TO_NON_DIR` crashes under heavy concurrent build I/O diff --git a/changelog.d/fixes/auto-empty-pool-log-once.md b/changelog.d/fixes/auto-empty-pool-log-once.md deleted file mode 100644 index 90d92ed82f..0000000000 --- a/changelog.d/fixes/auto-empty-pool-log-once.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(auto):** rate-limit `auto/ matched no connected models` warnings to once per minute per label (`open-sse/services/autoCombo/virtualFactory.ts`) diff --git a/changelog.d/fixes/basered-deadcode-opencode-config-dir.md b/changelog.d/fixes/basered-deadcode-opencode-config-dir.md deleted file mode 100644 index 0055420d4f..0000000000 --- a/changelog.d/fixes/basered-deadcode-opencode-config-dir.md +++ /dev/null @@ -1 +0,0 @@ -- fix(cli): drop the orphaned `resolveOpencodeConfigDir` re-export from `cliRuntime` — it lost its last consumer in #10246 and diverged from the canonical resolver by one directory level (#9985) diff --git a/changelog.d/fixes/build-advisory-hosted-runner.md b/changelog.d/fixes/build-advisory-hosted-runner.md deleted file mode 100644 index 4bc5ef5469..0000000000 --- a/changelog.d/fixes/build-advisory-hosted-runner.md +++ /dev/null @@ -1 +0,0 @@ -- fix(ci): make `Build (advisory)` produce a signal again — pinned to a hosted runner with the swap/heap provisioning `Fast Production Build` proves sufficient, and scoped to fork PRs, which are the only ones `build.yml` cannot cover (72 of the last 100 PRs into `release/**`) diff --git a/changelog.d/fixes/catalog-cache-hash-apikey.md b/changelog.d/fixes/catalog-cache-hash-apikey.md deleted file mode 100644 index e815ab1fec..0000000000 --- a/changelog.d/fixes/catalog-cache-hash-apikey.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** hash API keys in the `/v1/models` catalog cache Map key so heap dumps cannot leak bearer tokens (`src/app/api/v1/models/catalogCache.ts`) diff --git a/changelog.d/fixes/catalog-openrouter-gemini-embedding-2.md b/changelog.d/fixes/catalog-openrouter-gemini-embedding-2.md deleted file mode 100644 index 21fd9808e3..0000000000 --- a/changelog.d/fixes/catalog-openrouter-gemini-embedding-2.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** register live OpenRouter Gemini Embedding 2 ids (`google/gemini-embedding-2` and `google/gemini-embedding-2-preview`, 3072-d) in the curated embeddings catalog so `GET /v1/models` and `GET /v1/embeddings` list the ids that already serve — thanks @RaviTharuma diff --git a/changelog.d/fixes/claude-to-gemini-consecutive-roles.md b/changelog.d/fixes/claude-to-gemini-consecutive-roles.md deleted file mode 100644 index 17483dce52..0000000000 --- a/changelog.d/fixes/claude-to-gemini-consecutive-roles.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(translator):** merge consecutive same-role contents in direct Claude to Gemini request translation to prevent upstream HTTP 400 errors diff --git a/changelog.d/fixes/cline-task-id-passthrough.md b/changelog.d/fixes/cline-task-id-passthrough.md deleted file mode 100644 index a6d2ecec57..0000000000 --- a/changelog.d/fixes/cline-task-id-passthrough.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cline):** Preserve client-supplied Cline task IDs and omit the header when clients provide none, preventing request-scoped proxy IDs from being reported as tasks. diff --git a/changelog.d/fixes/combo-connection-scoped-reasoning-efforts.md b/changelog.d/fixes/combo-connection-scoped-reasoning-efforts.md deleted file mode 100644 index 3a53f1323a..0000000000 --- a/changelog.d/fixes/combo-connection-scoped-reasoning-efforts.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(catalog):** derive combo reasoning-effort tiers from the exact runtime-selectable connection scope, intersecting dynamic, pinned, allowlisted, and compatible provider-node evidence while failing closed on unknown capabilities. diff --git a/changelog.d/fixes/combo-sticky-pin-clear-on-disable.md b/changelog.d/fixes/combo-sticky-pin-clear-on-disable.md deleted file mode 100644 index 17abffb7f7..0000000000 --- a/changelog.d/fixes/combo-sticky-pin-clear-on-disable.md +++ /dev/null @@ -1 +0,0 @@ -- fix(combo): evict in-memory session-stickiness bindings when a combo disables stickiness, so stale pins stop overriding the declared priority order until TTL/restart diff --git a/changelog.d/fixes/command-code-effort-capabilities.md b/changelog.d/fixes/command-code-effort-capabilities.md deleted file mode 100644 index 38057107ef..0000000000 --- a/changelog.d/fixes/command-code-effort-capabilities.md +++ /dev/null @@ -1 +0,0 @@ -- fix(combo): resolve effort-suffixed command-code variants (e.g. `deepseek-v4-flash-max`) to their base model for capability lookups, so tool-bearing combo requests keep the declared priority order instead of reordering behind models with confirmed capabilities diff --git a/changelog.d/fixes/compression-run-telemetry-retention-ms.md b/changelog.d/fixes/compression-run-telemetry-retention-ms.md deleted file mode 100644 index cbaedbe25e..0000000000 --- a/changelog.d/fixes/compression-run-telemetry-retention-ms.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** the `compression_run_telemetry` retention sweep now actually deletes expired rows. Its cutoff was computed in epoch seconds while the column stores epoch milliseconds, so `WHERE timestamp < cutoff` never matched and the table added by #6848 to bound `storage.sqlite` growth was unbounded in practice. Same unit mismatch as #9625, which corrected the sibling `domain_cost_history` sweep and missed this call site diff --git a/changelog.d/fixes/dbstat-optional-vtab.md b/changelog.d/fixes/dbstat-optional-vtab.md deleted file mode 100644 index 5d56e93d1a..0000000000 --- a/changelog.d/fixes/dbstat-optional-vtab.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** database settings API no longer returns HTTP 500 on SQLite builds compiled without the optional `dbstat` virtual table (sql.js/WASM); per-table sizes degrade to 0 instead of failing the whole stats call diff --git a/changelog.d/fixes/discovery-metadata-effort-tiers.md b/changelog.d/fixes/discovery-metadata-effort-tiers.md deleted file mode 100644 index 3744a2063f..0000000000 --- a/changelog.d/fixes/discovery-metadata-effort-tiers.md +++ /dev/null @@ -1 +0,0 @@ -- fix(discovery): parse upstream reasoning tiers nested under metadata.reasoning.supported_efforts (neuralwatt /v1/models shape) so synced openai-compatible models advertise effort aliases diff --git a/changelog.d/fixes/docker-healthcheck-use-healthz.md b/changelog.d/fixes/docker-healthcheck-use-healthz.md deleted file mode 100644 index a139e2dd4c..0000000000 --- a/changelog.d/fixes/docker-healthcheck-use-healthz.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(ops):** Docker HEALTHCHECK probes lightweight `/healthz` instead of `/api/monitoring/health` so a busy event loop does not mark the container Unhealthy (`scripts/dev/healthcheck.mjs`) diff --git a/changelog.d/fixes/embed-gemini-missing-creds-hint.md b/changelog.d/fixes/embed-gemini-missing-creds-hint.md deleted file mode 100644 index 41b61713f7..0000000000 --- a/changelog.d/fixes/embed-gemini-missing-creds-hint.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(api):** `/v1/embeddings` 400s for native `gemini-embedding-2` now name the working OpenRouter ids (`openrouter/google/gemini-embedding-2` and the preview alias) instead of only `No credentials for embedding provider: gemini` — thanks @RaviTharuma diff --git a/changelog.d/fixes/forward-codex-quota-headers.md b/changelog.d/fixes/forward-codex-quota-headers.md deleted file mode 100644 index 86aa1e7df4..0000000000 --- a/changelog.d/fixes/forward-codex-quota-headers.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** keep Codex/Anthropic quota headers under the upstream forwarding budget; drop `x-codex-turn-state` and raise the 768-byte cap (`open-sse/handlers/chatCore/responseHeaders.ts`) diff --git a/changelog.d/fixes/minimax-music-generation-dispatch.md b/changelog.d/fixes/minimax-music-generation-dispatch.md deleted file mode 100644 index e0cf2114ca..0000000000 --- a/changelog.d/fixes/minimax-music-generation-dispatch.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(sse):** MiniMax music models now generate audio instead of failing with `Unsupported music format: minimax-music` — the provider entry was registered in the music registry (and advertised by `/v1/models`), but `handleMusicGeneration` had no branch for its format, so every `minimax/*` music request fell through the dispatch chain to a 400. Adds the missing dispatch: a single synchronous POST with the `base_resp` envelope check (a non-zero `status_code` arrives on HTTP 200 too), `data.status` handling (an unfinished generation is reported instead of polled — the operation has no task id and no query endpoint), `url` and `hex` output formats (hex normalized to base64), `mp3`/`wav`/`pcm` containers via `audio_setting`, and the regional endpoint through the per-connection base-URL override, which is also the only host that accepts `aigc_watermark`. The registry entry gains the generation and cover model ids it was missing and drops a query URL that does not exist for this operation. Regression guard: `tests/unit/minimax-music-generation.test.ts` (9 tests). diff --git a/changelog.d/fixes/models-dev-sync-env-killswitch.md b/changelog.d/fixes/models-dev-sync-env-killswitch.md deleted file mode 100644 index 0724f52356..0000000000 --- a/changelog.d/fixes/models-dev-sync-env-killswitch.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(models):** honor `MODELS_DEV_SYNC_ENABLED=0` as a hard kill switch over the dashboard setting so a wedged `/healthz` / UI can be recovered without HTTP (`src/lib/modelsDevSync.ts`) diff --git a/changelog.d/fixes/opencode-force-cli-ua.md b/changelog.d/fixes/opencode-force-cli-ua.md deleted file mode 100644 index f8a194a90b..0000000000 --- a/changelog.d/fixes/opencode-force-cli-ua.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** when `OPENCODE_SYNTHESIZE_CLI_HEADERS=true`, a non-CLI client User-Agent (e.g. `curl/8.5.0`, SDKs) on opencode-go/opencode-zen/opencode-free requests is now REPLACED with the synthesized `opencode-cli/1.0.0` instead of being honored — opencode.ai's free tier (`/zen/v1`) returns `FreeUsageLimitError` 429 for generic client UAs egressing from datacenter IPs, which made the #5997 CLI-identity synthesis ineffective for non-CLI clients. Client UAs already matching `opencode-cli/…` are preserved (the real CLI's versioned identity stays intact); all other client-supplied `x-opencode-*` headers keep client-wins. Regression guard: `tests/unit/opencode-cli-headers-synthesis-5997.test.ts` (7, incl. non-CLI UA replaced + CLI UA preserved). (#5997 follow-up) diff --git a/changelog.d/fixes/opencode-merge-provider-guard.md b/changelog.d/fixes/opencode-merge-provider-guard.md deleted file mode 100644 index aa1f02e63b..0000000000 --- a/changelog.d/fixes/opencode-merge-provider-guard.md +++ /dev/null @@ -1 +0,0 @@ -- **OpenCode config merge:** stop `mergeOpenCodeConfig` splaying a malformed `provider` block into index keys. The root was already guarded against a non-object; the `provider` branch it spreads one level down was not, so an existing `"provider": ["a", "b"]` merged to `{"0": "a", "1": "b", …}`. Its sibling `mergeOpenCodeConfigText` already refuses the same input. diff --git a/changelog.d/fixes/openrouter-synced-model-context-window-and-default-effort.md b/changelog.d/fixes/openrouter-synced-model-context-window-and-default-effort.md deleted file mode 100644 index b26e1c2086..0000000000 --- a/changelog.d/fixes/openrouter-synced-model-context-window-and-default-effort.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(models):** a model synced from a provider's own `/models` discovery is now enforced at its real context window immediately, instead of waiting up to 24h for the Feature 5004 reconciler's next tick. The request-time token-limit chain resolves the window from `auto:discovery` overrides, which previously were only written at startup and on a 24h interval — so any model synced mid-cycle (models.dev not indexing it yet, no static registry entry) fell through to the provider's static `defaultContextLength` (128K for OpenRouter) while `/v1/models` simultaneously advertised the real window from the same discovery data. Measured: `openrouter/stealth/ox-alpha` advertised `context_length: 1048576` but rejected requests over 128K with `context_length_exceeded` for a full day after its sync. The reconcile now also runs opportunistically (debounced, fire-and-forget) right after a synced catalog write changes. Companion fix: discovery now captures the vendor-declared `reasoning.default_effort` (e.g. OpenRouter `stealth/ox-alpha` declares `max`, normalized to `xhigh`) as `defaultThinkingEffort`, and the OpenAI dispatch path injects it when a request carries no reasoning field of any shape — the lowest-priority default behind a `-{effort}` suffix alias and a static `ModelSpec.defaultReasoningEffort` — so a reasoning model that returns an empty response without an explicit effort gets the vendor default instead of `upstream_empty_response`. diff --git a/changelog.d/fixes/pending-cc-cache-control-ttl-default.md b/changelog.d/fixes/pending-cc-cache-control-ttl-default.md deleted file mode 100644 index 0d89bee475..0000000000 --- a/changelog.d/fixes/pending-cc-cache-control-ttl-default.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(providers):** Claude Code / CC-protocol-compatible clients sending `cache_control` with no `ttl` on the native Claude OAuth path (`claude`/`cc`) now default to the 1h extended cache TTL instead of silently falling back to Anthropic's 5-minute default, even though the 1h beta is always negotiated on this path — thanks @jeff-alves diff --git a/changelog.d/fixes/pending-opencode-empty-rejection-rotation.md b/changelog.d/fixes/pending-opencode-empty-rejection-rotation.md deleted file mode 100644 index 82a88c5905..0000000000 --- a/changelog.d/fixes/pending-opencode-empty-rejection-rotation.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(executors):** OpencodeExecutor rotates (or retries once on a single-account direct path) on upstream 400 empty-body rejections — malformed completion envelopes with no error field were propagated as success and killed client sessions. Bounded +1 attempt per request; body reads are conditioned on status 400 so successful/streaming responses are never buffered. 400s carrying an error field keep propagating immediately. diff --git a/changelog.d/fixes/pending-opencode-jsonc-config.md b/changelog.d/fixes/pending-opencode-jsonc-config.md deleted file mode 100644 index 0951ae78f2..0000000000 --- a/changelog.d/fixes/pending-opencode-jsonc-config.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(cli):** recognize native `opencode.jsonc` files in OpenCode detection, generated-provider setup, and dashboard save/apply flows; preserve unrelated JSONC comments and provider settings, write updates back to the selected file, and refuse to overwrite invalid config ([#10227](https://github.com/diegosouzapw/OmniRoute/issues/10227)) — thanks @tito13kfm diff --git a/changelog.d/fixes/release-v3850-basereds-tests-i18n.md b/changelog.d/fixes/release-v3850-basereds-tests-i18n.md deleted file mode 100644 index 3a6dee61b9..0000000000 --- a/changelog.d/fixes/release-v3850-basereds-tests-i18n.md +++ /dev/null @@ -1 +0,0 @@ -- fix(i18n): complete Vietnamese translations for recently added UI strings (#9985) diff --git a/changelog.d/fixes/release-v3850-basereds.md b/changelog.d/fixes/release-v3850-basereds.md deleted file mode 100644 index 30444ba706..0000000000 --- a/changelog.d/fixes/release-v3850-basereds.md +++ /dev/null @@ -1,3 +0,0 @@ -- fix(api): repair broken `@/lib/db/connections` import in the usage utilization route that failed the production build (#10939 follow-up) -- chore(docs): regenerate PROVIDER_REFERENCE and refresh README diagram SVGs to the real provider count (347) -- chore(lint): prune ESLint suppressions orphaned on the release branch diff --git a/changelog.d/fixes/release-v3850-turbopack-build-red.md b/changelog.d/fixes/release-v3850-turbopack-build-red.md deleted file mode 100644 index 44f69203e3..0000000000 --- a/changelog.d/fixes/release-v3850-turbopack-build-red.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(build):** repair the broken Turbopack production build, the red lint gate and a runtime crash on `release/v3.8.50`. Six independent module-level defects, each from a different PR, had accumulated because the `Build` CI job is advisory rather than blocking: a lost closing brace in `modelSelectModalHelpers.ts` that swallowed `PROVIDER_TEST_CHUNK_SIZE` into a function body (#9011); `handleFalVideoGeneration` imported twice in `videoGeneration.ts` after the provider-neutral Fal module superseded the standalone handler (#9982 over #9969); `catalog.ts` still re-exporting and calling the injectable stale-while-revalidate policy that #9199 deliberately replaced with a fixed 30 s bound when it landed on top of #8728 — the consumer and the #8728 test suite were never realigned; two dangling statements left in `catalogCache.ts::scheduleBackgroundRefresh` referencing undeclared `inFlight`/`promise`, which made **every** stale-while-revalidate read throw a `ReferenceError` at runtime (a defect the build never caught, surfaced here by the realigned test); a generated wasm-bindgen sidecar URL in `tinycmsSigner.ts` that Turbopack resolves at build time even though the WASM module ships inlined as base64 (#8736/#10087); `conolDiscovery.ts` importing `getProviderOutboundGuard` from `outboundUrlGuard` instead of the sibling `outboundUrlGuardPolicy` module that actually exports it (#8974) — fixed on the consumer side, since re-exporting it would put a `@/`-aliased import into the module the packaged CLI loads without a tsconfig (#7682); and an unbalanced brace in `tests/unit/db-adapters/driverFactory.test.ts` where a new case was inserted between the preceding test's `finally` block and its `});`, so the whole file stopped parsing and the SQLite driver-cascade coverage silently stopped running since 2026-08-11 (#9173). diff --git a/changelog.d/fixes/sqljs-atomic-persist.md b/changelog.d/fixes/sqljs-atomic-persist.md deleted file mode 100644 index db50495f4d..0000000000 --- a/changelog.d/fixes/sqljs-atomic-persist.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(db):** the sql.js fallback now publishes the database atomically — temp file in the same directory, `fsync`, then `rename()` — instead of rewriting it in place with `writeFileSync`. sql.js has no incremental write path, so every save rewrote the whole image through an `O_TRUNC` open: for the duration of the write the on-disk database was 0 bytes and then partial, a window that scales with database size and recurs on every save. Unlike better-sqlite3 / node:sqlite, that window is not covered by SQLite's locking protocol, so it was visible to every OTHER process reading the same file (a backup job, a metrics exporter, an operator running `sqlite3`), which got `SQLITE_CORRUPT` — "database disk image is malformed" — while `PRAGMA integrity_check` passed moments later. It also closes a total-loss window: a crash mid-write used to leave the real database truncated, and now only leaves a stale temp file diff --git a/changelog.d/maintenance/10297-k8s-probe-recommendations.md b/changelog.d/maintenance/10297-k8s-probe-recommendations.md deleted file mode 100644 index adc9d4491e..0000000000 --- a/changelog.d/maintenance/10297-k8s-probe-recommendations.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(ops):** document Kubernetes probe recommendations — TCP (or soft HTTP) liveness, HTTP `/healthz` readiness, avoid `/api/monitoring/health` as kubelet liveness ([#10297](https://github.com/diegosouzapw/OmniRoute/pull/10297)) — thanks @RaviTharuma diff --git a/changelog.d/maintenance/10317-latest-tracks-highest-stable.md b/changelog.d/maintenance/10317-latest-tracks-highest-stable.md deleted file mode 100644 index 9fdb4d2c81..0000000000 --- a/changelog.d/maintenance/10317-latest-tracks-highest-stable.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(docker):** spell out that `:latest` tracks the highest **published** stable SemVer (not git `main`), and that GitOps should pin `X.Y.Z` ([#10317](https://github.com/diegosouzapw/OmniRoute/issues/10317)) diff --git a/changelog.d/maintenance/10349-optional-work-event-loop.md b/changelog.d/maintenance/10349-optional-work-event-loop.md deleted file mode 100644 index 0cd695e4a7..0000000000 --- a/changelog.d/maintenance/10349-optional-work-event-loop.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(backend):** document that memory extraction, skills injection, and token refresh share the request event loop, plus dashboard kill switches ([#10349](https://github.com/diegosouzapw/OmniRoute/issues/10349)) diff --git a/changelog.d/maintenance/10350-sqlite-single-replica-ha.md b/changelog.d/maintenance/10350-sqlite-single-replica-ha.md deleted file mode 100644 index 9b158d5787..0000000000 --- a/changelog.d/maintenance/10350-sqlite-single-replica-ha.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(docker):** document default SQLite as single-replica / HA-unsupported, including Recreate and HEALTHCHECK session blast radius ([#10350](https://github.com/diegosouzapw/OmniRoute/issues/10350)) diff --git a/changelog.d/maintenance/10351-pre-write-backup-throttle.md b/changelog.d/maintenance/10351-pre-write-backup-throttle.md deleted file mode 100644 index f6141d30ea..0000000000 --- a/changelog.d/maintenance/10351-pre-write-backup-throttle.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(backend):** document that pre-write SQLite backups (including models.dev pricing) are throttled to once per 60 minutes and can be disabled with `DISABLE_SQLITE_AUTO_BACKUP` ([#10351](https://github.com/diegosouzapw/OmniRoute/issues/10351)) diff --git a/changelog.d/maintenance/10704-basereds-sse-comments-vi-parity.md b/changelog.d/maintenance/10704-basereds-sse-comments-vi-parity.md deleted file mode 100644 index e2874a2be4..0000000000 --- a/changelog.d/maintenance/10704-basereds-sse-comments-vi-parity.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(tests):** drain three base-reds on the release branch — the Vietnamese locale regained parity with English (6 keys added), the chatCore SSE test now asserts the comment-free default that #10539 introduced instead of the trailer it replaced, and the Antigravity cloudcode test asserts the missing-messages guard it is named for instead of a `/ok/` regex that only ever matched the "ok" inside `: x-omniroute-tokens-in` ([#10704](https://github.com/diegosouzapw/OmniRoute/pull/10704)) diff --git a/changelog.d/maintenance/10775-remove-dead-enforce-secrets.md b/changelog.d/maintenance/10775-remove-dead-enforce-secrets.md deleted file mode 100644 index 4f44473360..0000000000 --- a/changelog.d/maintenance/10775-remove-dead-enforce-secrets.md +++ /dev/null @@ -1 +0,0 @@ -- chore(security): remove the unused `enforceSecrets()` duplicate of the boot secret check and pin the live `enforceWebRuntimeEnv()` wiring with a regression test (#10775) diff --git a/changelog.d/maintenance/10778-grokbuild-suppression-fix.md b/changelog.d/maintenance/10778-grokbuild-suppression-fix.md deleted file mode 100644 index 15c5df7ef7..0000000000 --- a/changelog.d/maintenance/10778-grokbuild-suppression-fix.md +++ /dev/null @@ -1 +0,0 @@ -- fix(quality): register GrokBuildToolCard.tsx react-hooks/set-state-in-effect suppression (dropped in #10778's uncommitted fix) diff --git a/changelog.d/maintenance/10779-combo-invocation-docs.md b/changelog.d/maintenance/10779-combo-invocation-docs.md deleted file mode 100644 index 00138a3a65..0000000000 --- a/changelog.d/maintenance/10779-combo-invocation-docs.md +++ /dev/null @@ -1 +0,0 @@ -- **docs:** Custom combos are only invoked by their exact name in the `model` field — `auto` remains a separate zero-config router, and `openrouter/auto` is a paid OpenRouter product, not an alias ([#10779](https://github.com/diegosouzapw/OmniRoute/pull/10779)) — thanks @maxmad64bis diff --git a/changelog.d/maintenance/10780-server-init-dead-code.md b/changelog.d/maintenance/10780-server-init-dead-code.md deleted file mode 100644 index ffe204a233..0000000000 --- a/changelog.d/maintenance/10780-server-init-dead-code.md +++ /dev/null @@ -1 +0,0 @@ -- chore(startup): remove `src/server-init.ts` (183 lines, never imported — the boot path is `src/instrumentation-node.ts`) and correct four `"called from server-init.ts"` comments left pointing at the dead entry point (#10780) diff --git a/changelog.d/maintenance/10859-filesize-baseline-fix.md b/changelog.d/maintenance/10859-filesize-baseline-fix.md deleted file mode 100644 index aed0a3fab5..0000000000 --- a/changelog.d/maintenance/10859-filesize-baseline-fix.md +++ /dev/null @@ -1 +0,0 @@ -- fix(quality): rebaseline file-size for #10859's own modelCapabilities.ts/commandCode.ts growth (missed at merge time) diff --git a/changelog.d/maintenance/10875-combos-id-verb-coverage.md b/changelog.d/maintenance/10875-combos-id-verb-coverage.md deleted file mode 100644 index 5610a7ea41..0000000000 --- a/changelog.d/maintenance/10875-combos-id-verb-coverage.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(openapi):** document the `GET` and `PUT` operations on `/api/combos/{id}`, and add an operation-level coverage floor so a missing verb can no longer hide behind a path that already counts as covered ([#10875](https://github.com/diegosouzapw/OmniRoute/pull/10875)) diff --git a/changelog.d/maintenance/10889-feature-flag-count-fix.md b/changelog.d/maintenance/10889-feature-flag-count-fix.md deleted file mode 100644 index fd93221987..0000000000 --- a/changelog.d/maintenance/10889-feature-flag-count-fix.md +++ /dev/null @@ -1 +0,0 @@ -- fix(quality): bump EXPECTED_FEATURE_FLAG_COUNT to 52 for #10889's own new flag (missed at merge time) diff --git a/changelog.d/maintenance/10906-critical-db-state-assertions.md b/changelog.d/maintenance/10906-critical-db-state-assertions.md deleted file mode 100644 index c63f5f0039..0000000000 --- a/changelog.d/maintenance/10906-critical-db-state-assertions.md +++ /dev/null @@ -1 +0,0 @@ -- **test(db):** replace three empty `test.skip` placeholders in the critical DB-state suite with real assertions — `resetDbInstance` must swap the singleton while the on-disk row survives, the on-disk DB must open in WAL journal mode, and `db_meta` must hold the seeded `schema_version` — so a regression in any of those invariants can no longer pass as silently green ([#10906](https://github.com/diegosouzapw/OmniRoute/pull/10906)) diff --git a/changelog.d/maintenance/10982-runtime-ram-coding-agents.md b/changelog.d/maintenance/10982-runtime-ram-coding-agents.md deleted file mode 100644 index 3c0985c68f..0000000000 --- a/changelog.d/maintenance/10982-runtime-ram-coding-agents.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(docker):** document runtime RAM for coding-agent `/v1/responses` (image default 1 GiB heap is dashboard-only; 8–12 GiB heap for agents) ([#10982](https://github.com/diegosouzapw/OmniRoute/issues/10982)) diff --git a/changelog.d/maintenance/11024-n-instance-scale-out.md b/changelog.d/maintenance/11024-n-instance-scale-out.md deleted file mode 100644 index 82adafe480..0000000000 --- a/changelog.d/maintenance/11024-n-instance-scale-out.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(docker):** document N independent `DATA_DIR`s as the supported large `/v1/responses` scale-out (one V8 heap ≠ host RAM; do not `replicas>1` on one SQLite file) ([#11024](https://github.com/diegosouzapw/OmniRoute/issues/11024)) — thanks @RaviTharuma diff --git a/changelog.d/maintenance/11038-filesize-baseline-fix.md b/changelog.d/maintenance/11038-filesize-baseline-fix.md deleted file mode 100644 index aebc2b9e23..0000000000 --- a/changelog.d/maintenance/11038-filesize-baseline-fix.md +++ /dev/null @@ -1 +0,0 @@ -- fix(quality): rebaseline file-size for modelCapabilities.ts (1016->1072) drift from merged tip fixes (#11034 et al) diff --git a/changelog.d/maintenance/11053-stryker-oauth-autoimport-registration.md b/changelog.d/maintenance/11053-stryker-oauth-autoimport-registration.md deleted file mode 100644 index b2e2141900..0000000000 --- a/changelog.d/maintenance/11053-stryker-oauth-autoimport-registration.md +++ /dev/null @@ -1 +0,0 @@ -- fix(quality): register `tests/unit/authz/oauth-autoimport-local-only.test.ts` in stryker `tap.testFiles` (residual of #11053) diff --git a/changelog.d/maintenance/11160-drain-v3850-basereds-docs-counts-orphan-test.md b/changelog.d/maintenance/11160-drain-v3850-basereds-docs-counts-orphan-test.md deleted file mode 100644 index e695a2b8fc..0000000000 --- a/changelog.d/maintenance/11160-drain-v3850-basereds-docs-counts-orphan-test.md +++ /dev/null @@ -1 +0,0 @@ -- chore(quality): drain two `release/v3.8.50` base-reds — refresh the drifted doc counts (159 migrations, 56 free-forever providers, 40 free-tier pools, incl. the 42 `llm.txt` locale mirrors) and move `uncloseai-noauth.test.ts` to a collected path so the UncloseAI no-auth regression guard actually runs (#11160) diff --git a/changelog.d/maintenance/7786-management-auth-guide.md b/changelog.d/maintenance/7786-management-auth-guide.md deleted file mode 100644 index 54f84a79b9..0000000000 --- a/changelog.d/maintenance/7786-management-auth-guide.md +++ /dev/null @@ -1 +0,0 @@ -- **docs(auth):** distinguish dashboard sessions, `oma_live_…` Access Tokens, manage-scoped API keys, and inference keys ([#7786](https://github.com/diegosouzapw/OmniRoute/issues/7786)) diff --git a/changelog.d/maintenance/embeddings-client-runbook.md b/changelog.d/maintenance/embeddings-client-runbook.md deleted file mode 100644 index da47b8d261..0000000000 --- a/changelog.d/maintenance/embeddings-client-runbook.md +++ /dev/null @@ -1 +0,0 @@ -- **docs:** add an embeddings client runbook with live-verified working/broken model ids and Hindsight 0.9.1 / Memorix 1.6.0 notes — thanks @RaviTharuma diff --git a/changelog.d/maintenance/env-doc-sync-adhoc-bot.md b/changelog.d/maintenance/env-doc-sync-adhoc-bot.md deleted file mode 100644 index dbd759be29..0000000000 --- a/changelog.d/maintenance/env-doc-sync-adhoc-bot.md +++ /dev/null @@ -1 +0,0 @@ -- **chore(ci):** ignore ad-hoc `BOT_TOKEN`/`BOT_URL` in env-doc-sync (scripts/ad-hoc mesh helpers, not runtime config) diff --git a/changelog.d/maintenance/regen-translate-path-golden-freebuff.md b/changelog.d/maintenance/regen-translate-path-golden-freebuff.md deleted file mode 100644 index 7822df2283..0000000000 --- a/changelog.d/maintenance/regen-translate-path-golden-freebuff.md +++ /dev/null @@ -1 +0,0 @@ -- chore(test): regenerate the provider/translate-path golden snapshot to reflect freebuff (#10531), fixing a base-red left by that merge (freebuff/freeinference key ordering only, no value changes). diff --git a/changelog.d/maintenance/release-v3850-base-reds-20260817.md b/changelog.d/maintenance/release-v3850-base-reds-20260817.md deleted file mode 100644 index d435b50096..0000000000 --- a/changelog.d/maintenance/release-v3850-base-reds-20260817.md +++ /dev/null @@ -1 +0,0 @@ -- **chore(release):** resync the v3.8.50 provider and CLI catalogs, register the existing ChatCore mutation-coverage test, and document the local ZCode handshake identifier so the release quality gates reflect the current tree without changing ratchet baselines. diff --git a/changelog.d/maintenance/release-v3850-basereds-error-helper-20260819.md b/changelog.d/maintenance/release-v3850-basereds-error-helper-20260819.md deleted file mode 100644 index e89d53ab49..0000000000 --- a/changelog.d/maintenance/release-v3850-basereds-error-helper-20260819.md +++ /dev/null @@ -1,3 +0,0 @@ -- **fix(ci):** route `open-sse/handlers/imageGeneration/providers/geminiWeb.ts`'s b64_json - download-failure message through `sanitizeErrorMessage()` instead of embedding a raw - `err.message`, clearing the `check:error-helper` base-red on `release/v3.8.50` (#9985). diff --git a/changelog.d/maintenance/release-v3850-basereds-eslint-deadcode-vitest-20260819.md b/changelog.d/maintenance/release-v3850-basereds-eslint-deadcode-vitest-20260819.md deleted file mode 100644 index 905d338575..0000000000 --- a/changelog.d/maintenance/release-v3850-basereds-eslint-deadcode-vitest-20260819.md +++ /dev/null @@ -1,20 +0,0 @@ -- **fix(ci):** drain three more base-reds on `release/v3.8.50` (#9985). ESLint was reporting - 219 errors locally (vs. 25 in the last CI run) — all from `react-hooks/set-state-in-effect`, - `react-hooks/preserve-manual-memoization`, `react-hooks/immutability`, - `react-hooks/static-components`, `react-hooks/refs` and `react-hooks/purity`, six React - Compiler lint rules that `eslint-plugin-react-hooks` v7 turns on by default and that were - never frozen in `config/quality/eslint-suppressions.json` after the dependency bump. Froze - the pre-existing violations for those six rules via ESLint's native - `--suppress-rule`/`--suppressions-location` mechanism (the same pattern already used for - `@next/next/no-location-assign-relative-destination`) — no application code changed, no rule - disabled, only genuinely-new violations stay blocking. `check:dead-code` was at 418 against a - 415 baseline: removed the unused `src/lib/quota/providerCapabilities.ts` file and the unused - `ProviderQuotaMonitor` interface in `providerQuotaTelemetry.ts` (both dead since PR #10148, - 2026-08-18, confirmed via `grep`/knip cross-reference), landing at 416; the residual +1 could - not be attributed to a single recent commit after checking every dead-list entry touched - since the 2026-08-14 baseline measurement, so it is rebaselined with the investigation - recorded in `quality-baseline.json`. `tests/unit/autoCombo/tieredRotation.test.ts`'s - "rotates across all 43 Cerebras connection IDs" case was hitting vitest's 5000ms default - timeout on a 200-iteration synchronous `selectProvider()` loop under shared-devbox - contention (load average 40-60+ observed) — widened its explicit timeout to 20000ms; the - assertion itself is unchanged. diff --git a/changelog.d/maintenance/release-v3850-basereds-glm-family-20260819.md b/changelog.d/maintenance/release-v3850-basereds-glm-family-20260819.md deleted file mode 100644 index 04985623c0..0000000000 --- a/changelog.d/maintenance/release-v3850-basereds-glm-family-20260819.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(tests):** drain two base-reds on the release branch — `auto/glm` now expects the Cloudflare AI Playground backend (its registry advertises `zai-org/glm-5.2` and `zai-org/glm-4.7-flash`, so it belongs in the family pool by the same rule already documented for `auggie`, `devin-cli-agentic` and `zcode`), and the ESLint gate is green again after the GitLab executor test dropped its five `as any` casts for a declared response shape and the CLI OAuth suppression count caught up with the two casts #10491 added. diff --git a/changelog.d/maintenance/release-v3850-basereds-stream-utils-20260820.md b/changelog.d/maintenance/release-v3850-basereds-stream-utils-20260820.md deleted file mode 100644 index 98b62cd448..0000000000 --- a/changelog.d/maintenance/release-v3850-basereds-stream-utils-20260820.md +++ /dev/null @@ -1 +0,0 @@ -- **fix(tests):** realign the two `stream-utils` passthrough cases that still asserted the pre-#10017 SSE framing — the event-boundary case declares the OpenAI Responses client format it actually exercises, and the metadata case now pins that surviving lines stay inside one event instead of expecting the `:`/`id:` control lines that #10473 stopped forwarding to every client format. diff --git a/changelog.d/maintenance/release-v3850-basereds-testdrift-20260819.md b/changelog.d/maintenance/release-v3850-basereds-testdrift-20260819.md deleted file mode 100644 index f4deae6aae..0000000000 --- a/changelog.d/maintenance/release-v3850-basereds-testdrift-20260819.md +++ /dev/null @@ -1,12 +0,0 @@ -- **fix(tests):** drain several base-reds on `release/v3.8.50` (#9985) that were all instances - of the same pattern — a legitimate product change landed without updating the test that - asserted the old behavior: `tests/unit/glm-provider-model-import-route.test.ts` (12 tests) - and `tests/unit/model-sync-route.test.ts` (2 tests) predate #10603's "upstream model sync is - opt-in and manual overrides are preserved" change; `tests/unit/antigravity-model-aliases.test.ts` - predated #10537 retiring the collapsed `gemini-3.7-flash` alias in favor of its three tiered - ids. Also fixes a real data drift in `open-sse/config/freeModelCatalog.data.ts` (the `qwen-web` - free-catalog entry still pointed at the retired `qwen3.8-max-preview` id instead of the - current `qwen3.8-max`), corrects the zh-TW `providers.autoFetchModelsTooltip` string to the - glossary-canonical 快取 instead of 緩存, and removes an unused default export from - `src/lib/oauth/providers/zed-hosted.ts` (the named export already covers every consumer) to - shave one symbol off the `check:dead-code` ratchet regression. diff --git a/changelog.d/maintenance/release-v3850-docs-env-basereds-20260817.md b/changelog.d/maintenance/release-v3850-docs-env-basereds-20260817.md deleted file mode 100644 index d2ec7afbd4..0000000000 --- a/changelog.d/maintenance/release-v3850-docs-env-basereds-20260817.md +++ /dev/null @@ -1 +0,0 @@ -- **chore(release):** synchronize migration-count documentation and document the opt-in `PROXY_LOG_INCLUDE_IPS` logging flag so the v3.8.50 quality gates match the release tree. diff --git a/changelog.d/maintenance/vi-harimport-parity.md b/changelog.d/maintenance/vi-harimport-parity.md deleted file mode 100644 index b08b8dc92f..0000000000 --- a/changelog.d/maintenance/vi-harimport-parity.md +++ /dev/null @@ -1 +0,0 @@ -- fix(i18n): translate the 14 `providers.harImport*` keys into Vietnamese (parity gap left by #11069) diff --git a/config/quality/eslint-suppressions.json b/config/quality/eslint-suppressions.json index d873a51adb..7db2e6b531 100644 --- a/config/quality/eslint-suppressions.json +++ b/config/quality/eslint-suppressions.json @@ -898,11 +898,43 @@ }, "react-hooks/exhaustive-deps": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 2 } }, "src/app/(dashboard)/dashboard/a2a/page.tsx": { "@typescript-eslint/no-unused-vars": { "count": 6 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/acp-agents/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/activity/ActivityFeedClient.tsx": { + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/analytics/CacheHealthTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/analytics/CompressionAnalyticsTab.tsx": { @@ -910,9 +942,48 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/analytics/ProviderUtilizationTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, "src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/immutability": { + "count": 4 + }, + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/audit/A2aAuditTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/audit/ComplianceTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/audit/McpAuditTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/batch/components/wizard/CostEstimateStep.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/batch/components/wizard/InputStep.tsx": { @@ -920,6 +991,34 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/batch/components/wizard/JsonlValidationStep.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/batch/files/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cache/components/ReasoningCacheTab.tsx": { + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cache/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx": { "no-restricted-syntax": { "count": 4 @@ -931,11 +1030,54 @@ }, "react-hooks/exhaustive-deps": { "count": 1 + }, + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/ClaudeClassifierCompatToggle.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/ClaudeToolCard.tsx": { + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/CliProfileAutoSyncToggles.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/cli-code/components/ClineToolCard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/CliproxyapiToolCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx": { + "react-hooks/immutability": { + "count": 4 + }, + "react-hooks/set-state-in-effect": { + "count": 2 } }, "src/app/(dashboard)/dashboard/cli-code/components/CopilotToolCard.tsx": { @@ -943,19 +1085,81 @@ "count": 3 } }, + "src/app/(dashboard)/dashboard/cli-code/components/DroidToolCard.tsx": { + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/GrokBuildToolCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, "src/app/(dashboard)/dashboard/cli-code/components/HermesAgentToolCard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 2 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/cli-code/components/KiloToolCard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 2 + }, + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/cli-code/components/OpenClawToolCard.tsx": { + "react-hooks/immutability": { + "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/combos/ComboControlCenterClient.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/combos/page.tsx": { "@typescript-eslint/no-unused-vars": { "count": 9 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 7 + } + }, + "src/app/(dashboard)/dashboard/conductor/ConductorPageClient.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/conductor/FaroChat.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/conversations/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 } }, "src/app/(dashboard)/dashboard/costs/CostOverviewTab.tsx": { @@ -963,6 +1167,11 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/costs/components/ApiKeyUsageLimitCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/costs/costExplorerUtils.ts": { "no-restricted-syntax": { "count": 1 @@ -976,11 +1185,77 @@ "src/app/(dashboard)/dashboard/costs/quota-share/components/PoolWizard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 3 + } + }, + "src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePoolUsage.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePools.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/costs/useApiKeyUsageLimits.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/discovery/DiscoveryPageClient.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx": { + "react-hooks/immutability": { + "count": 3 + } + }, + "src/app/(dashboard)/dashboard/endpoint/components/A2ADashboard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/endpoint/components/MCPDashboard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/endpoint/components/NotionSourceCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/endpoint/components/ObsidianSourceCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/free-provider-rankings/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/health/ProviderHealthAutopilotCard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/health/ProviderHealthMatrixCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/health/TelemetryCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/health/page.tsx": { @@ -991,6 +1266,34 @@ "src/app/(dashboard)/dashboard/mcp/page.tsx": { "@typescript-eslint/no-unused-vars": { "count": 2 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/memory/components/EditMemoryModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/memory/components/QdrantConfigCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/memory/components/tabs/MemoriesTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/memory/hooks/useEngineStatus.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/memory/hooks/useMemorySettings.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/onboarding/page.tsx": { @@ -1008,6 +1311,24 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/plugins/[name]/config/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/plugins/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/provider-stats/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + }, + "react-hooks/static-components": { + "count": 7 + } + }, "src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx": { "@typescript-eslint/no-unused-vars": { "count": 2 @@ -1038,21 +1359,59 @@ "count": 3 } }, + "src/app/(dashboard)/dashboard/providers/[id]/components/CustomModelsSection.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/providers/[id]/components/EmptyConnectionsPlaceholder.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 } }, + "src/app/(dashboard)/dashboard/providers/[id]/components/ModelCompatPopover.tsx": { + "react-hooks/refs": { + "count": 4 + }, + "react-hooks/set-state-in-effect": { + "count": 3 + } + }, "src/app/(dashboard)/dashboard/providers/[id]/components/PassthroughModelsSection.tsx": { "@typescript-eslint/no-unused-vars": { "count": 3 } }, + "src/app/(dashboard)/dashboard/providers/[id]/components/ProviderCcAliasSection.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/[id]/components/ProviderInterceptionSection.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/[id]/components/ProviderParamFilterSection.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/providers/[id]/components/__tests__/CursorAgentNudge.test.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 } }, + "src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditCompatibleNodeModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditConnectionModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportCodexAuthModal.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1071,11 +1430,52 @@ "src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderConnections.ts": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderSettings.ts": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/providers/components/AddCompatibleProviderModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/hooks/useProviderModels.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/hooks/useProviderUrlFilters.ts": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/providers/hooks/useRiskAcknowledged.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/providers/page.tsx": { "@typescript-eslint/no-unused-vars": { "count": 4 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/providers/services/components/NinerouterModelList.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/providers/utils/buildCurl.ts": { @@ -1083,6 +1483,34 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/radar/RadarCatalogTable.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/radar/intel/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/radar/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/app/(dashboard)/dashboard/radar/setup/page.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/relay/RelayProxyClient.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/resilience/connections/components/ConnectionDetail.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1093,6 +1521,19 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/resilience/connections/components/ResilienceConnectionsClient.tsx": { + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/runtime/components/ModelCooldownsCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/search-tools/components/SearchHistory.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1108,6 +1549,11 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/settings/components/AccessTokensTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx": { "@next/next/no-img-element": { "count": 4 @@ -1116,6 +1562,9 @@ "src/app/(dashboard)/dashboard/settings/components/AuthzSection.tsx": { "no-restricted-syntax": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/settings/components/CliproxyapiSettingsTab.tsx": { @@ -1133,9 +1582,22 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/settings/components/FallbackChainsEditor.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/IPFilterSection.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/settings/components/MitmProxyTab.tsx": { "@next/next/no-html-link-for-pages": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/settings/components/ModelAliasesTab.tsx": { @@ -1146,6 +1608,9 @@ "src/app/(dashboard)/dashboard/settings/components/ModelCapabilityOverridesTab.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/settings/components/ModelLockoutCard.tsx": { @@ -1153,9 +1618,37 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/settings/components/ModelsDevSyncTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/PayloadRulesTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/PoliciesPanel.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/PricingTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, "src/app/(dashboard)/dashboard/settings/components/ProviderAccountRoutingCard.tsx": { "react-hooks/exhaustive-deps": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx": { @@ -1163,11 +1656,21 @@ "count": 3 } }, + "src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 7 + } + }, "src/app/(dashboard)/dashboard/settings/components/ResponsesStatePolicyTab.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 } }, + "src/app/(dashboard)/dashboard/settings/components/RoutingStrategyCard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1181,6 +1684,19 @@ "src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/proxy/GlobalConfigTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/settings/components/proxy/SubscriptionTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/settings/components/useProxyPoolModal.ts": { @@ -1193,6 +1709,21 @@ "count": 3 } }, + "src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelSelectorModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/tools/agent-bridge/components/SetupWizard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/tools/traffic-inspector/components/CustomHostsManager.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/tools/traffic-inspector/components/RequestStreamingList.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1203,6 +1734,11 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/translator/components/MonitorTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/dashboard/translator/components/ResultNarrated.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1218,6 +1754,11 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx": { + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, "src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.tsx": { "@typescript-eslint/no-unused-vars": { "count": 3 @@ -1228,6 +1769,11 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useCodexResetCreditRedemption.ts": { + "react-hooks/immutability": { + "count": 2 + } + }, "src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -1236,11 +1782,22 @@ "src/app/(dashboard)/dashboard/usage/components/RateLimitStatus.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/usage/components/SessionsTab.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/webhooks/WebhooksPageClient.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/app/(dashboard)/dashboard/webhooks/__tests__/webhook-wizard.test.tsx": { @@ -1248,6 +1805,27 @@ "count": 1 } }, + "src/app/(dashboard)/dashboard/webhooks/components/AddWebhookWizard.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/dashboard/webhooks/components/WebhookDeliveriesPanel.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/app/(dashboard)/home/ProviderQuotaWidget.tsx": { + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/(dashboard)/home/page.tsx": { "no-restricted-imports": { "count": 1 @@ -2091,11 +2669,21 @@ "count": 1 } }, + "src/app/global-error.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/app/login/page.tsx": { "@typescript-eslint/no-unused-vars": { "count": 3 } }, + "src/app/status/page.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/domain/assessment/assessor.ts": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -2843,6 +3431,9 @@ "src/shared/components/KiroAuthModal.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/shared/components/LanguageSelector.tsx": { @@ -2850,6 +3441,11 @@ "count": 1 } }, + "src/shared/components/ModelSelectModal.tsx": { + "react-hooks/set-state-in-effect": { + "count": 4 + } + }, "src/shared/components/NotificationToast.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -2858,16 +3454,28 @@ "src/shared/components/OAuthModal.tsx": { "@typescript-eslint/no-unused-vars": { "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 4 } }, "src/shared/components/PricingModal.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 + }, + "react-hooks/immutability": { + "count": 1 } }, "src/shared/components/ProxyConfigModal.tsx": { "react-hooks/exhaustive-deps": { "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/shared/components/ProxyLogDetail.tsx": { @@ -2875,6 +3483,16 @@ "count": 1 } }, + "src/shared/components/ReasoningRoutingRules.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/shared/components/RequestLoggerDetail.sections.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/shared/components/RequestLoggerV2.tsx": { "@typescript-eslint/no-unused-vars": { "count": 3 @@ -2894,6 +3512,17 @@ }, "@typescript-eslint/no-unused-vars": { "count": 2 + }, + "react-hooks/set-state-in-effect": { + "count": 2 + } + }, + "src/shared/components/UsageStats.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/shared/components/analytics/charts.tsx": { @@ -2906,6 +3535,16 @@ "count": 1 } }, + "src/shared/components/analytics/useProviderDailyUsage.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/shared/components/compression/ComboCompressionModeSelect.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/shared/components/docs/CodeBlock.tsx": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -2941,6 +3580,11 @@ "count": 1 } }, + "src/shared/hooks/cli/useToolBatchStatuses.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/shared/hooks/useTheme.ts": { "@typescript-eslint/no-unused-vars": { "count": 1 @@ -4993,11 +5637,6 @@ "count": 4 } }, - "tests/unit/executor-qwen-web.test.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 40 - } - }, "tests/unit/fetch-timeout.test.ts": { "@typescript-eslint/no-explicit-any": { "count": 7 @@ -5615,11 +6254,6 @@ "count": 6 } }, - "tests/unit/provider-validation-qwen-web-5855.test.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, "tests/unit/provider-validation-specialty.test.ts": { "@typescript-eslint/no-unused-vars": { "count": 4 @@ -5774,11 +6408,6 @@ "count": 1 } }, - "tests/unit/qwen-web-cookie-validation-3958.test.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, "tests/unit/radar-api-routes.test.ts": { "@typescript-eslint/no-unused-vars": { "count": 2 diff --git a/config/quality/test-masking-allowlist.json b/config/quality/test-masking-allowlist.json index e15040cb47..b2e2026c21 100644 --- a/config/quality/test-masking-allowlist.json +++ b/config/quality/test-masking-allowlist.json @@ -11,7 +11,6 @@ "tests/unit/chatgpt-web.test.ts": "v3.8.43 #5549: fix(chatgpt-web) restore dot-form Pro model ids — dois assert.equal separados (base Pro slug + pass-through slug) consolidados num único assert.equal(body.model, expectedSlugById[omniId], ...) orientado por tabela de mapeamento (281→280). Asserts consolidados, não enfraquecidos. Verificado legítimo. Prune após v3.8.43 mergear para main.", "tests/unit/chatcore-sanitization.test.ts": "v3.8.43 #5805: fix(translator) strip orphaned tool results — orphaned tool_result blocks (no matching tool_use) are now removed by stripOrphanedToolResults BEFORE content normalization, so the 3 positive `[Tool Result: …]`-text asserts were replaced by removal asserts (no tool_result block, no text), net 65→64. Behavior aligned to the merged #5805 contract; the sibling 'preserves Claude passthrough tool_result' assert (matching tool_use) is untouched. Verified legitimate, not masking. Prune after v3.8.43 merges to main.", "src/app/(dashboard)/dashboard/providers/[id]/__tests__/useModelVisibilityHandlers.test.tsx": "v3.8.43 #5856: fix(dashboard) unify CSRF origin fallback — the model-visibility handler no longer issues a separate `/api/auth/csrf` fetch, so the two asserts pinning the 2nd fetch + its CSRF header were removed and the fetch-count assert updated 2→1 (7→5). Asserts follow the reduced fetch behavior, not weakened. Verified legitimate. Prune after v3.8.43 merges to main.", - "tests/unit/provider-validation-specialty.test.ts": "v3.8.43 #5855: fix(qwen-web) unblock validator (retired endpoint) — the old `chat.qwen.ai/api/v2/user` probe asserts (exact URL / Authorization / source / Cookie / WAF-error) no longer apply after the endpoint migration and were replaced by new chathub-path behavior asserts (valid/error/warning), net 406→400. Asserts migrated to the new API surface (#5855/#5432), not weakened. Verified legitimate. Prune after v3.8.43 merges to main.", "tests/unit/chatcore-translation-paths.test.ts": "v3.8.44 #5958: fix(cc-compatible) send SSE accept for streamed requests — o assert do header Accept mudou de application/json para text/event-stream e dois asserts (stream + context_management) foram consolidados num único assert.deepEqual de tupla (297→296). Asserts consolidados/atualizados ao novo contrato, não enfraquecidos. Verificado legítimo. Prune após v3.8.44 mergear para main.", "tests/unit/combo-context-window-filter.test.ts": "v3.8.44 #6088: fix(combo) prefer known context capacity over unknown — a semântica do filtro mudou (unknown-context só sobrevive como fallback), o arquivo foi reescrito: 18 asserts pequenos (length/didFallback/ok) viraram 4 assert.deepEqual na LISTA ORDENADA completa de sobreviventes por caso (mais forte por caso). Asserts migrados ao novo contrato, não enfraquecidos. Verificado legítimo. Prune após v3.8.44 mergear para main.", "tests/unit/qoder-executor.test.ts": "v3.8.44 #5816: feat(qoder) drive PAT auth via qodercli — o executor migrou de chamadas HTTP diretas (api.qoder.com/api1.qoder.sh, headers Cosy-*) para o contrato stdio qodercli://; os asserts que pinavam URLs/headers da superfície aposentada foram substituídos por asserts do novo contrato (73→65). Asserts migrados à nova superfície, não enfraquecidos. Verificado legítimo. Prune após v3.8.44 mergear para main.", @@ -107,7 +106,6 @@ "tests/unit/translator-openai-to-kiro.test.ts": "v3.8.49 #8565: auto-kiro passou a ser REJEITADO com erro (KIRO_REMOVED_AUTO_ALIAS_MESSAGE, \"not a real Kiro upstream model\") em vez de mapeado silenciosamente para \"auto\"; o teste do comportamento antigo foi removido porque hoje ele asseriria o comportamento errado. A rejeição está coberta em kiro-model-aliases.test.ts (assert.throws /not a real Kiro/) e kiro-available-models.test.ts. Net 119→118. Verificado legítimo. Prune após v3.8.49 mergear para main.", "tests/unit/usage-providers.test.ts": "v3.8.49 #7866: o case \"qwen\" saiu de getUsageForProvider (não há mais case \"qwen\" no switch de open-sse/services/usage.ts); o teste cobria esse ramo extinto (net 20→19). Verificado legítimo. Prune após v3.8.49 mergear para main.", "tests/unit/usage-service-hardening.test.ts": "v3.8.49 #7866/#8565/#8013: qwen removido (−3 asserts); o Kimi/Kiro builder-id (uso profileless) passou a ter SUCESSO real em vez de erro de ARN — supportsProfilelessKiroUsage(\"builder-id\") retorna true —, trocando 1 assert de regex de erro por 3 asserts de valor; e os ids de bucket de quota do Antigravity foram atualizados para o catálogo atual. Rodado no HEAD: 23/23 passam. Net 210→209. Verificado legítimo. Prune após v3.8.49 mergear para main.", - "tests/unit/virtual-auto-combo.test.ts": "v3.8.49 #7928/#8183: o pooling de contas passou a agrupar conexões web-session do mesmo provider numa entrada lógica com allowedConnectionIds (campo confirmado em open-sse/services/autoCombo/virtualFactory.ts), e o pool no-auth virou uma allowlist fixa (AUTO_COMBO_NOAUTH_ALLOWLIST = opencode, felo-web) — os testes antigos esperavam duplicatas e a inclusão de duckduckgo-web/theoldllm/chipotle, que hoje são corretamente excluídos. Guard dedicado em noauth-autocombo-allowlist.test.ts. Rodado no HEAD: 10/10 passam. Net 39→31. Verificado legítimo. Prune após v3.8.49 mergear para main.", "open-sse/services/__tests__/tierResolver.test.ts": "v3.8.49 #7866: refactor(qwen) remove o provider OAuth legado — o teste \"classifies Qwen as free\" e a entrada de qwen na lista do batch saíram junto com o provider, e os índices do batch desceram de 10 para 9 elementos (net 61→59). Superfície extinta, não enfraquecimento. Verificado legítimo. Prune após v3.8.49 mergear para main.", "tests/unit/plugins-welcome-banner-e2e.test.ts": "v3.8.50 #9126 (commit 8fac6bcd48): o teste único 'BUILTIN_EVENTS has all 14 events' (13 asserts .ok/.equal) foi reestruturado em 3 testes mais específicos — 'contains only emitted/public events' (assert.deepEqual da lista completa), 'does not advertise dead events' (7 asserts .equal(false) para eventos sem emissor real: onModelSelect/onComboResolve/onRateLimit/onQuotaExhaust/onProviderError/onStreamStart/onStreamEnd) e 'lifecycle events remain represented' (4 asserts .ok). Contrato mais forte (agora também nega presença dos eventos mortos), não mais fraco — a contagem líquida cai (73→61) porque o assert.deepEqual único substitui múltiplos assert.ok redundantes com a mesma cobertura. Asserts restruturados, não removidos sem substituição. Verificado legítimo.", "tests/unit/web-tools-translation-2820.test.ts": "v3.8.50 #9343 (commit d969555417): fix(security) exige envelope explicito — JSON puro NAO deve mais ser promovido a tool_calls. Os 5 testes foram REESCRITOS para o contrato oposto (antes: 'promove e valida name/arguments'; agora: 'toolCalls === null e content preservado'), o que naturalmente usa menos asserts: verificar a NAO-promocao custa 2 asserts, verificar o objeto promovido custava 4. Contrato mais restritivo, nao mais fraco (39->35). Verificado legitimo — a inversao esta explicita nos proprios nomes dos testes ('does NOT promote ... (#9343)').", diff --git a/docs/architecture/ARCHITECTURE.md b/docs/architecture/ARCHITECTURE.md index 790cf35de7..3ea88b6ff6 100644 --- a/docs/architecture/ARCHITECTURE.md +++ b/docs/architecture/ARCHITECTURE.md @@ -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 (349 providers, 107 executors) +- OpenAI-compatible API surface for CLI/tools (349 providers, 102 executors) - Request/response translation across provider formats - Model combo fallback (multi-model sequence) - Structured combo steps (`provider + model + connection`) with runtime ordering by `compositeTiers` @@ -980,7 +980,7 @@ All other providers (including custom compatible nodes) use the `DefaultExecutor | KIE | openai | API Key | ✅ | ✅ | ❌ | ❌ | | Devin Desktop | openai | Imported API key | ✅ (Connect→SSE) | ✅ | ❌ | ⚠️ Per request | | GitLab Duo | openai | OAuth (GitLab) | ✅ | ✅ | ✅ | ❌ | -| Devin CLI | openai | Local CLI login | ✅ | ✅ | ❌ | ✅ Task API | +| Devin CLI | openai | Local CLI login | ✅ | ✅ | ❌ | ✅ Task API | | Codex Cloud | openai-responses | OAuth | ✅ | ❌ | ✅ | ✅ Rate limits | | Jules | openai | OAuth | ✅ | ✅ | ✅ | ✅ Task API | | AgentRouter | openai | API Key | ✅ | ✅ | ❌ | ❌ | diff --git a/docs/architecture/CODEBASE_DOCUMENTATION.md b/docs/architecture/CODEBASE_DOCUMENTATION.md index a0d9ff603e..7805f927c2 100644 --- a/docs/architecture/CODEBASE_DOCUMENTATION.md +++ b/docs/architecture/CODEBASE_DOCUMENTATION.md @@ -292,7 +292,7 @@ table groups the actual directories and notable top-level files. | `jobs/` | Background jobs (`autoUpdate.ts`, …) | | `memory/` | Persistent memory: `store.ts`, `cache.ts`, `retrieval.ts`, `summarization.ts`, `extraction.ts`, `injection.ts`, `qdrant.ts`, `settings.ts`, `verify.ts`, `schemas.ts`, `types.ts` | | `monitoring/` | `observability.ts` | -| `oauth/` | OAuth/import provider modules (22): `agy`, `antigravity`, `claude`, `cline`, `codebuddy-cn`, `codex`, `cursor`, `devin-desktop`, `ghe-copilot`, `github`, `gitlab-duo`, `grok-cli-oauth`, `grok-cli`, `kilocode`, `kimi-coding`, `kiro`, `qoder`, `raycast`, `trae`, `xai-oauth`, `zed-hosted`, `zed`, plus `services/`, `utils/`, and `constants/oauth.ts` | +| `oauth/` | OAuth/import provider modules (22): `agy`, `antigravity`, `claude`, `cline`, `codebuddy-cn`, `codex`, `cursor`, `devin-desktop`, `ghe-copilot`, `github`, `gitlab-duo`, `grok-cli-oauth`, `grok-cli`, `kilocode`, `kimi-coding`, `kiro`, `qoder`, `raycast`, `trae`, `xai-oauth`, `zed-hosted`, `zed`, plus `services/`, `utils/`, and `constants/oauth.ts` | | `plugins/` | Plugin loader (`index.ts`) | | `promptCache/` | `prefixAnalyzer.ts`, `index.ts` | | `providerModels/` | Managed model lifecycle: `modelDiscovery.ts`, `managedModelImport.ts`, `managedAvailableModels.ts`, `cursorAgent.ts` | @@ -451,7 +451,7 @@ open-sse/ ├── types.d.ts ├── config/ Provider registries, header profiles, identity, … ├── handlers/ Request handlers (chat, embeddings, audio, image, …) -├── executors/ 107 provider-specific HTTP executors +├── executors/ 102 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, …) @@ -481,7 +481,7 @@ open-sse/ ### 4.2 `open-sse/executors/` -101 provider executors, each extending `BaseExecutor` (`base.ts`): +102 provider executors, each extending `BaseExecutor` (`base.ts`): `antigravity`, `azure-openai`, `blackbox-web`, `chatgpt-web`, `cliproxyapi`, `cloudflare-ai`, `codex`, `commandCode`, `cursor`, `default`, `devin-cli`, diff --git a/docs/diagrams/auto-combo-12factor.mmd b/docs/diagrams/auto-combo-12factor.mmd index 3c7f967534..0a51289670 100644 --- a/docs/diagrams/auto-combo-12factor.mmd +++ b/docs/diagrams/auto-combo-12factor.mmd @@ -1,24 +1,24 @@ -%% Auto-Combo 13-factor scoring +%% Auto-Combo 15-factor scoring %% Reflects: open-sse/services/autoCombo/scoring.ts (DEFAULT_WEIGHTS, sum = 1.0) -%% v3.8.49 +%% v3.8.50 flowchart TB Request["Incoming request"] --> Candidates["Eligible candidates
(provider × model × account)"] Candidates --> Score["Compute composite score
per candidate"] - subgraph Factors["13-factor scoring weights (sum = 1.0)"] - f1["health (0.20)"] - f2["quota (0.15)"] - f3["costInv (0.15)"] - f4["latencyInv (0.12)"] - f5["taskFit (0.08)"] - f6["stability (0.05)"] - f7["tierPriority (0.05)"] - f8["tierAffinity (0.05)"] - f9["specificityMatch (0.05)"] - f10["contextAffinity (0.05)"] - f11["connectionDensity (0.05)"] - f12["cacheAffinity (0.00)"] - f13["resetWindowAffinity (0.00)"] + subgraph Factors["15-factor scoring weights (sum = 1.0)"] + direction TB + subgraph Primary["Primary signals"] + direction TB + f1["quota (0.1429)"] ~~~ f2["health (0.1605)"] ~~~ f3["costInv (0.1429)"] ~~~ f4["latencyInv (0.1143)"] ~~~ f5["taskFit (0.0762)"] + end + subgraph Affinity["Affinity and placement"] + direction TB + f6["stability (0.0476)"] ~~~ f7["tierPriority (0.0476)"] ~~~ f8["tierAffinity (0.0476)"] ~~~ f9["specificityMatch (0.0476)"] ~~~ f10["contextAffinity (0.0476)"] + end + subgraph Runtime["Runtime state and feedback"] + direction TB + f11["cacheAffinity (0.00)"] ~~~ f12["sessionAvailability (0.0476)"] ~~~ f13["resetWindowAffinity (0.00)"] ~~~ f14["connectionDensity (0.0476)"] ~~~ f15["quality (0.03)"] + end end Score --> Factors diff --git a/docs/diagrams/cli-terminal.svg b/docs/diagrams/cli-terminal.svg index 3a8d056e5c..2cb7d465fc 100644 --- a/docs/diagrams/cli-terminal.svg +++ b/docs/diagrams/cli-terminal.svg @@ -1,12 +1,12 @@ - + 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. -omniroute — 80+ commands -omniroute providers listOmniRoute Providers1f3a9c2e  anthropic   Claude Max 20x    active8c2d5b1a  codex       Codex Pro (team)  activef4e0a97b  glm         GLM Coding Plan   active03bd6e5f  kimi        Kimi K2 free      active… 334 more providers +omniroute — 85 top-level commands +omniroute providers listOmniRoute Providers1f3a9c2e  anthropic   Claude Max 20x    active8c2d5b1a  codex       Codex Pro (team)  activef4e0a97b  glm         GLM Coding Plan   active03bd6e5f  kimi        Kimi K2 free      active… 342 more providers $ omniroute providers list @@ -14,7 +14,7 @@ -OmniRoute Providers1f3a9c2e  anthropic   Claude Max 20x    active8c2d5b1a  codex       Codex Pro (team)  activef4e0a97b  glm         GLM Coding Plan   active03bd6e5f  kimi        Kimi K2 free      active… 334 more providers +OmniRoute Providers1f3a9c2e  anthropic   Claude Max 20x    active8c2d5b1a  codex       Codex Pro (team)  activef4e0a97b  glm         GLM Coding Plan   active03bd6e5f  kimi        Kimi K2 free      active… 342 more providers $ @@ -32,11 +32,11 @@ -OmniRoute Health  Status: healthy   Uptime: 4d 12h 33m  Requests (24h): 18,412   p95: 412ms  Breakers: ● 24 closed  ◒ 1 half-open  ○ 0 open  Providers: 338 registered   90+ free tiers… live: /dashboard · omniroute status +OmniRoute Health  Status: healthy   Uptime: 4d 12h 33m  Requests (24h): 18,412   p95: 412ms  Breakers: ● 24 closed  ◒ 1 half-open  ○ 0 open  Providers: 346 registered   90+ free tiers… live: /dashboard · omniroute status 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 …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 … - \ No newline at end of file + diff --git a/docs/diagrams/comparison-table.svg b/docs/diagrams/comparison-table.svg index 24018c7fed..55dbfd1fb0 100644 --- a/docs/diagrams/comparison-table.svg +++ b/docs/diagrams/comparison-table.svg @@ -1,4 +1,4 @@ - + Static-header comparison table where each capability row fades in top to bottom; the OmniRoute column is highlighted and shows a check or a leading value in every row, while competitors show a mix of checks, partials and crosses. @@ -23,7 +23,7 @@ Providers - 338 + 346 40+ 400+* ~5 @@ -57,7 +57,7 @@ Built-in MCP server (own tools) - 109 + 110 diff --git a/docs/diagrams/compression-pipeline.svg b/docs/diagrams/compression-pipeline.svg index 3b3c311972..d5bd20abc9 100644 --- a/docs/diagrams/compression-pipeline.svg +++ b/docs/diagrams/compression-pipeline.svg @@ -1,4 +1,5 @@ - + + Animated compression funnel showing tokens moving through twelve engines while preservation guards and round-trip fidelity gates protect structured content. @@ -197,7 +198,7 @@ default stack: RTK → Caveman - { } code · URLs · JSON — always preserved byte-perfect + { } code · URLs · JSON — protected by fidelity gates diff --git a/docs/diagrams/exported/auto-combo-12factor.svg b/docs/diagrams/exported/auto-combo-12factor.svg index d0f2e00d7c..6bfe16e0a0 100644 --- a/docs/diagrams/exported/auto-combo-12factor.svg +++ b/docs/diagrams/exported/auto-combo-12factor.svg @@ -1 +1 @@ -

13-factor scoring weights (sum = 1.0)

health (0.20)

quota (0.15)

costInv (0.15)

latencyInv (0.12)

taskFit (0.08)

stability (0.05)

tierPriority (0.05)

tierAffinity (0.05)

specificityMatch (0.05)

contextAffinity (0.05)

connectionDensity (0.05)

cacheAffinity (0.00)

resetWindowAffinity (0.00)

Incoming request

Eligible candidates
(provider × model × account)

Compute composite score
per candidate

Sort by score
(desc)

Pick top-N targets

Dispatch sequentially
(short-circuit on success)

\ No newline at end of file +Auto-Combo 15-factor scoringIncoming requests are scored across 15 normalized factors before OmniRoute ranks candidates, picks the top targets and dispatches with fallback.

15-factor scoring weights (sum = 1.0)

Runtime state and feedback

cacheAffinity (0.00)

sessionAvailability (0.0476)

resetWindowAffinity (0.00)

connectionDensity (0.0476)

quality (0.03)

Affinity and placement

stability (0.0476)

tierPriority (0.0476)

tierAffinity (0.0476)

specificityMatch (0.0476)

contextAffinity (0.0476)

Primary signals

quota (0.1429)

health (0.1605)

costInv (0.1429)

latencyInv (0.1143)

taskFit (0.0762)

Incoming request

Eligible candidates
(provider × model × account)

Compute composite score
per candidate

Sort by score
(desc)

Pick top-N targets

Dispatch sequentially
(short-circuit on success)

diff --git a/docs/diagrams/free-tier-budget.svg b/docs/diagrams/free-tier-budget.svg index 393ee00594..e4c3da1ae9 100644 --- a/docs/diagrams/free-tier-budget.svg +++ b/docs/diagrams/free-tier-budget.svg @@ -1,4 +1,5 @@ - + + Animated, pool-deduped free-token budget showing the 20 positive recurring pools, first-month credits, uncapped providers and deposit-unlock boost as separate quantities. @@ -63,7 +64,7 @@ ~1.51B FREE TOKENS / MONTH · STEADY up to ~2.13B in your first month — signup credits - documented free tiers · 40 provider pools · 495 models · one endpoint + documented free tiers · 38 provider pools · 446 free models · one endpoint @@ -77,32 +78,33 @@ ~1.51B each shared free pool counted once ✓ - 15 providers ToS-flagged — we flag it · you decide + ToS verdicts surfaced per model — inspect before routing - - WHERE IT COMES FROM · 19 COUNTABLE FREE POOLS + + WHERE IT COMES FROM · 20 COUNTABLE FREE POOLS - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -111,27 +113,28 @@ each segment = one free pool · widths floored so every provider shows · honest numbers below - + Mistral Large 3 1.00B GPT-4o mini 150M - Gemini 2.5 Flash 60M - GLM 4.7 30M - Llama 3.3 70B 30M - Grok-3 24M - DeepSeek V4 Pro 20M - GPT-4.1 18M + Nara free pool 150M + Gemini 2.5 Flash 60M + GLM 4.7 30M + Llama 3.3 70B 30M + Grok-3 24M + DeepSeek V4 Pro 20M Llama 4 Scout 15M - GPT-4o 7M + GPT-4o 7.2M MiniMax-M2.7 6M - Arcee Trinity Large Prev 5M - Auto Free 4M - Auto 1M - Command A Reasoning 800K - ERNIE 4.5 VL 424B 500K - morph-v3-large 400K - Llama 3.1 8B 200K - Claude Sonnet 4.5 25K + Arcee Trinity Large 4.8M + NavyAI free pool 4.5M + Auto Free 3.6M + OpenRouter Auto 1.2M + Command A Reasoning 800K + ERNIE 4.5 VL 424B 500K + morph-v3-large 400K + Llama 3.1 8B 200K + Claude Sonnet 4.5 25K diff --git a/docs/diagrams/promise-pillars.svg b/docs/diagrams/promise-pillars.svg index f0d30f74a3..69689b0c0c 100644 --- a/docs/diagrams/promise-pillars.svg +++ b/docs/diagrams/promise-pillars.svg @@ -1,4 +1,4 @@ - + Animated promise card: six pillar tiles fade in in reading order, then a soft colored border highlight sweeps from tile to tile in a continuous cycle. @@ -21,7 +21,7 @@
- One endpoint. 350 providers. Never stop building — OmniRoute picks the cheapest one that works. + One endpoint. 346 providers. Never stop building — OmniRoute picks the cheapest one that works. @@ -38,7 +38,7 @@ Never hit limits - Auto-fallback across 350 providers in + Auto-fallback across 346 providers in milliseconds. Quota out? The next provider takes over — zero downtime.
@@ -73,7 +73,7 @@ $0 to start - 90+ providers with a free tier, 56 free + 90+ providers with a free tier, 54 free forever — Qoder, Pollinations, Cloudflare, SiliconFlow… No card needed. @@ -91,7 +91,7 @@ Every tool works - 33 coding agents — Claude Code, Codex, + 35 integrations — Claude Code, Codex, Cursor, Cline, Copilot, Antigravity — through one config. @@ -127,7 +127,7 @@ Production-grade Circuit breakers, TLS stealth, MCP (110 tools), A2A, memory, guardrails, evals — - 25,000+ tests. + 36,000+ static test declarations. diff --git a/docs/diagrams/readme-hero.svg b/docs/diagrams/readme-hero.svg index e3faa34758..f48e529a6b 100644 --- a/docs/diagrams/readme-hero.svg +++ b/docs/diagrams/readme-hero.svg @@ -1,4 +1,4 @@ - + Animated hero card: a pulse travels the divider line and a compression bar demo repeatedly shrinks a prompt by up to 95 percent; all headline content is static and readable on the first frame. @@ -28,7 +28,7 @@ Never stop coding. - Every AI tool → 350 providers90+ free — through one endpoint. + Every AI tool → 346 providers90+ free — through one endpoint. Claude Code · Codex · Cursor · Cline · Copilot · Antigravity  →  FREE Claude / GPT / Gemini · auto-fallback @@ -66,7 +66,7 @@ - 338 + 346 AI PROVIDERS 90+ diff --git a/docs/diagrams/resilience-layers.svg b/docs/diagrams/resilience-layers.svg index 022e35f365..cb7fa3838f 100644 --- a/docs/diagrams/resilience-layers.svg +++ b/docs/diagrams/resilience-layers.svg @@ -17,6 +17,6 @@ The right layer for the right failure — never kill more than what actually broke. PROVIDERCONNECTION / KEYMODEL - LAYER 1 · SCOPE: WHOLE PROVIDERProvider circuit breakerisolate a provider failing upstream —reroute now, auto-probe to recovertrips only on 408 · 500 · 502 · 503 · 504threshold — oauth 3× · api-key 5× · local 2×reset — 60s · 30s · 15s → HALF-OPEN probelazy recovery — reads refresh expired staterouterprovider Afails ×15provider B ← nextCLOSEDOPENHALF-OPENLAYER 2 · SCOPE: ONE KEY / ACCOUNTConnection cooldownskip one rate-limited key while theother keys keep serving the providerbase cooldown — oauth 5s · api-key 3srepeat fails — backoff ×2 (anti-herd guard)429 honors Retry-After / reset headerssuccess → clearAccountError() resets allprovider · 3 keyskey-1429key-2key-3cooling ×2ⁿLAYER 3 · SCOPE: ONE MODELModel lockoutquarantine a single model — never killthe whole connection for one 429scope — provider + connection + modelper-model 429 · local 404 · mode denialslocked model ≠ dead keyother models keep serving instantlykey-1model-amodel-bmodel-c + LAYER 1 · SCOPE: WHOLE PROVIDERProvider circuit breakerisolate a provider failing upstream —reroute now, auto-probe to recovertrips only on 408 · 500 · 502 · 503 · 504threshold — oauth 10× · api-key 15× · local 2×reset — 60s · 30s · 15s → HALF-OPEN probelazy recovery — reads refresh expired staterouterprovider Afails ×15provider B ← nextCLOSEDOPENHALF-OPENLAYER 2 · SCOPE: ONE KEY / ACCOUNTConnection cooldownskip one rate-limited key while theother keys keep serving the providerbase cooldown — oauth 5s · api-key 3srepeat fails — backoff ×2 (anti-herd guard)429 honors Retry-After / reset headerssuccess → clearAccountError() resets allprovider · 3 keyskey-1429key-2key-3cooling ×2ⁿLAYER 3 · SCOPE: ONE MODELModel lockoutquarantine a single model — never killthe whole connection for one 429scope — provider + connection + modelper-model 429 · local 404 · mode denialslocked model ≠ dead keyother models keep serving instantlykey-1model-amodel-bmodel-c which failure trips what → 5xx / 408 : breaker · key 429 / 401 : cooldown · one-model 429 / 404 : lockout · banned / expired / credits : terminal (operator) - \ No newline at end of file + diff --git a/docs/diagrams/strategies-grid.svg b/docs/diagrams/strategies-grid.svg index d518f85d06..1706f36e7e 100644 --- a/docs/diagrams/strategies-grid.svg +++ b/docs/diagrams/strategies-grid.svg @@ -95,7 +95,7 @@ auto 72916455 -live 13-factor scoring +live 15-factor scoring fusion diff --git a/docs/guides/TROUBLESHOOTING.md b/docs/guides/TROUBLESHOOTING.md index 75c8e4b601..cb3ff05fe6 100644 --- a/docs/guides/TROUBLESHOOTING.md +++ b/docs/guides/TROUBLESHOOTING.md @@ -1,7 +1,7 @@ --- title: "Troubleshooting" -version: 3.8.49 -lastUpdated: 2026-07-15 +version: 3.8.50 +lastUpdated: 2026-08-23 --- # Troubleshooting @@ -40,11 +40,15 @@ Common problems and solutions for OmniRoute. ### Rate Limiting on Free Providers (429 / 400 / 401) -**Symptom**: When using `model: "auto"` with free/no-auth providers (opencode, felo-web, auggie, etc.), you intermittently get `HTTP 429`, `400`, or `401` instead of answers. The requests succeed when retrying the same prompt moments later, but automation (cron jobs, agents, scripts) breaks on the first failure. +**Symptom**: When using `model: "auto"` with free/no-auth providers (for example, +`opencode`, `duckduckgo-web`, or `uncloseai`), you intermittently get `HTTP 429`, `400`, +or `401` instead of answers. The requests succeed when retrying the same prompt moments later, +but automation (cron jobs, agents, scripts) breaks on the first failure. **Root cause**: Three independent failure modes stack up: -1. **Provider rate-limit (`429`)**: Free tiers (notably `felo/felo-chat`) enforce a per-window quota. A burst of parallel calls exhausts it, so the next request is refused until the window resets. +1. **Provider rate-limit (`429`)**: Free tiers can enforce an upstream per-window quota. A + burst of parallel calls exhausts it, so the next request is refused until the window resets. 2. **Broken model in passthrough (`400`/`401`)**: `auto/*` pools can include passthrough models from `opencode` that are registered in the catalog but have no live credentials (e.g. `oc/north-mini-code-free` → `401`). The auto-router tries one, fails, and the error propagates before fallback kicks in. 3. **Concurrency amplification (`429` under load)**: When multiple agent/cron sessions hit `auto` at once, the aggregate request rate exceeds what free providers tolerate, so legitimate calls get flagged as abusive. @@ -62,7 +66,7 @@ Set these in the OmniRoute process environment (the daemon, e.g. via the LaunchA **How to verify it worked**: run your agent/cron twice in quick succession and confirm both succeed. Before the fix, the second run typically throws `429`/`401`. After the fix, failures (if any) are retried transparently and the call completes. You can also `curl /monitoring/health` and watch the `rateLimitedUntil` field on the provider connections and the `circuitBreakers.providerBreakers[].state` for the affected providers — the state is one of `CLOSED`, `DEGRADED`, `OPEN`, or `HALF_OPEN` (see `src/shared/utils/circuitBreaker.ts`), and a provider that keeps failing will flip `CLOSED → DEGRADED → OPEN` before the reset window lets a probe through (`HALF_OPEN`). -**If you still see 429**: the active account for that provider has genuinely exhausted its *quota* (not just rate). Add a second account for the same provider in the OmniRoute dashboard → Providers → Accounts, or mix in another free provider (e.g. `routeway`, `auggie`). Rotation only helps with transient rate/400/401; a hard quota exhaustion requires a second credential or a different provider. +**If you still see 429**: the active account for that provider has genuinely exhausted its _quota_ (not just rate). Add a second account for the same provider in the OmniRoute dashboard → Providers → Accounts, or mix in another free provider (e.g. `routeway`, `auggie`). Rotation only helps with transient rate/400/401; a hard quota exhaustion requires a second credential or a different provider. **If you see 403 on vision models (`auto/vision`, `bazaarlink/*`)**: the connected account lacks a paid plan that includes vision, or the API key has insufficient permissions. Verify in the provider dashboard that the key scope includes vision/multimodal, or connect a paid tier account and keep it as the vision target. diff --git a/docs/guides/USER_GUIDE.md b/docs/guides/USER_GUIDE.md index 9f5c79ee4a..aedcd30650 100644 --- a/docs/guides/USER_GUIDE.md +++ b/docs/guides/USER_GUIDE.md @@ -1027,7 +1027,6 @@ If only OpenRouter is configured, use `openrouter/deepgram/nova-3`. - `kie/` - `aws-polly/` - `xiaomi-mimo/` -- `edgetts/` (Microsoft Edge "Read Aloud" — free, no API key; unofficial/reverse-engineered endpoint) - `coqui/`, `tortoise/` - `qwen/` diff --git a/docs/i18n/ar/llm.txt b/docs/i18n/ar/llm.txt index d808b999f8..1a6c9f8e1b 100644 --- a/docs/i18n/ar/llm.txt +++ b/docs/i18n/ar/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/az/llm.txt b/docs/i18n/az/llm.txt index 1a868b5c60..868e51e55f 100644 --- a/docs/i18n/az/llm.txt +++ b/docs/i18n/az/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/bg/llm.txt b/docs/i18n/bg/llm.txt index 1a868b5c60..868e51e55f 100644 --- a/docs/i18n/bg/llm.txt +++ b/docs/i18n/bg/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/bn/llm.txt b/docs/i18n/bn/llm.txt index 8ab68736ef..8eec7ad2f2 100644 --- a/docs/i18n/bn/llm.txt +++ b/docs/i18n/bn/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/cs/llm.txt b/docs/i18n/cs/llm.txt index 0d74bb4482..ac76edda45 100644 --- a/docs/i18n/cs/llm.txt +++ b/docs/i18n/cs/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/da/llm.txt b/docs/i18n/da/llm.txt index c5265e9be3..429f6b9c54 100644 --- a/docs/i18n/da/llm.txt +++ b/docs/i18n/da/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/de/llm.txt b/docs/i18n/de/llm.txt index 2aedeaa9f7..086f6db3d6 100644 --- a/docs/i18n/de/llm.txt +++ b/docs/i18n/de/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/es/llm.txt b/docs/i18n/es/llm.txt index 44a1a12781..5fe833a68c 100644 --- a/docs/i18n/es/llm.txt +++ b/docs/i18n/es/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/fa/llm.txt b/docs/i18n/fa/llm.txt index 6bb6906d53..a5bd652b89 100644 --- a/docs/i18n/fa/llm.txt +++ b/docs/i18n/fa/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/fi/llm.txt b/docs/i18n/fi/llm.txt index c866207a48..335a8381ea 100644 --- a/docs/i18n/fi/llm.txt +++ b/docs/i18n/fi/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/fr/llm.txt b/docs/i18n/fr/llm.txt index d7c00c7f60..0f508384b4 100644 --- a/docs/i18n/fr/llm.txt +++ b/docs/i18n/fr/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/gu/llm.txt b/docs/i18n/gu/llm.txt index 82307592c6..05924b01a9 100644 --- a/docs/i18n/gu/llm.txt +++ b/docs/i18n/gu/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/he/llm.txt b/docs/i18n/he/llm.txt index 79c7155494..5d9e0ad96c 100644 --- a/docs/i18n/he/llm.txt +++ b/docs/i18n/he/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/hi/llm.txt b/docs/i18n/hi/llm.txt index 554cb918b7..219dea2e83 100644 --- a/docs/i18n/hi/llm.txt +++ b/docs/i18n/hi/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/hu/llm.txt b/docs/i18n/hu/llm.txt index ec244518d9..03e43c102e 100644 --- a/docs/i18n/hu/llm.txt +++ b/docs/i18n/hu/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/id/llm.txt b/docs/i18n/id/llm.txt index e38b51c992..d975b021dd 100644 --- a/docs/i18n/id/llm.txt +++ b/docs/i18n/id/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/in/llm.txt b/docs/i18n/in/llm.txt index 3a4090d47a..87487052fb 100644 --- a/docs/i18n/in/llm.txt +++ b/docs/i18n/in/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/it/llm.txt b/docs/i18n/it/llm.txt index 4cb65487fe..788f32ecfc 100644 --- a/docs/i18n/it/llm.txt +++ b/docs/i18n/it/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ja/llm.txt b/docs/i18n/ja/llm.txt index d115f0c317..7f3a82d7e0 100644 --- a/docs/i18n/ja/llm.txt +++ b/docs/i18n/ja/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ko/llm.txt b/docs/i18n/ko/llm.txt index e56525c28d..95cb43a44c 100644 --- a/docs/i18n/ko/llm.txt +++ b/docs/i18n/ko/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/mr/llm.txt b/docs/i18n/mr/llm.txt index cbc729864f..449734e9e5 100644 --- a/docs/i18n/mr/llm.txt +++ b/docs/i18n/mr/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ms/llm.txt b/docs/i18n/ms/llm.txt index 1840e8e763..6bd9548514 100644 --- a/docs/i18n/ms/llm.txt +++ b/docs/i18n/ms/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/nl/llm.txt b/docs/i18n/nl/llm.txt index 4d7d2e6bb8..f1151c2ff1 100644 --- a/docs/i18n/nl/llm.txt +++ b/docs/i18n/nl/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/no/llm.txt b/docs/i18n/no/llm.txt index fb1b2f64ae..81185e0c41 100644 --- a/docs/i18n/no/llm.txt +++ b/docs/i18n/no/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/phi/llm.txt b/docs/i18n/phi/llm.txt index 07e949eb9b..b4a314219d 100644 --- a/docs/i18n/phi/llm.txt +++ b/docs/i18n/phi/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/pl/docs/guides/USER_GUIDE.md b/docs/i18n/pl/docs/guides/USER_GUIDE.md index 147d7b82a9..0dac525ddb 100644 --- a/docs/i18n/pl/docs/guides/USER_GUIDE.md +++ b/docs/i18n/pl/docs/guides/USER_GUIDE.md @@ -973,7 +973,6 @@ curl -X POST http://localhost:20128/v1/audio/transcriptions \ - `kie/` - `aws-polly/` - `xiaomi-mimo/` -- `edgetts/` (Microsoft Edge „Read Aloud” — darmowe, bez klucza API; nieoficjalny/reverse-engineered endpoint) - `coqui/`, `tortoise/` - `qwen/` diff --git a/docs/i18n/pl/llm.txt b/docs/i18n/pl/llm.txt index 06caf81a28..3d0d9c911c 100644 --- a/docs/i18n/pl/llm.txt +++ b/docs/i18n/pl/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/pt-BR/llm.txt b/docs/i18n/pt-BR/llm.txt index aa04decbe7..a7a881aef2 100644 --- a/docs/i18n/pt-BR/llm.txt +++ b/docs/i18n/pt-BR/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/pt/llm.txt b/docs/i18n/pt/llm.txt index 25e3602087..d83278fd0b 100644 --- a/docs/i18n/pt/llm.txt +++ b/docs/i18n/pt/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ro/llm.txt b/docs/i18n/ro/llm.txt index bac029ee6d..4803d13e58 100644 --- a/docs/i18n/ro/llm.txt +++ b/docs/i18n/ro/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ru/llm.txt b/docs/i18n/ru/llm.txt index e0daa73d49..5a150b7003 100644 --- a/docs/i18n/ru/llm.txt +++ b/docs/i18n/ru/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/sk/llm.txt b/docs/i18n/sk/llm.txt index 9440f1427e..8c9769f0ce 100644 --- a/docs/i18n/sk/llm.txt +++ b/docs/i18n/sk/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/sv/llm.txt b/docs/i18n/sv/llm.txt index 5fe7f96126..b7cde00215 100644 --- a/docs/i18n/sv/llm.txt +++ b/docs/i18n/sv/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/sw/llm.txt b/docs/i18n/sw/llm.txt index 244c29b4ef..561a6eefd5 100644 --- a/docs/i18n/sw/llm.txt +++ b/docs/i18n/sw/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ta/llm.txt b/docs/i18n/ta/llm.txt index 7f84e1b192..ffda1df491 100644 --- a/docs/i18n/ta/llm.txt +++ b/docs/i18n/ta/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/te/llm.txt b/docs/i18n/te/llm.txt index a85c227bce..895dd8eaa1 100644 --- a/docs/i18n/te/llm.txt +++ b/docs/i18n/te/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/th/llm.txt b/docs/i18n/th/llm.txt index d0adfc7a57..d503279594 100644 --- a/docs/i18n/th/llm.txt +++ b/docs/i18n/th/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/tr/llm.txt b/docs/i18n/tr/llm.txt index 1b08ddc2fe..682570e048 100644 --- a/docs/i18n/tr/llm.txt +++ b/docs/i18n/tr/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/uk-UA/llm.txt b/docs/i18n/uk-UA/llm.txt index 29030ea7df..5e45384a9d 100644 --- a/docs/i18n/uk-UA/llm.txt +++ b/docs/i18n/uk-UA/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/ur/llm.txt b/docs/i18n/ur/llm.txt index 95d9fb2228..d60195acbd 100644 --- a/docs/i18n/ur/llm.txt +++ b/docs/i18n/ur/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/vi/llm.txt b/docs/i18n/vi/llm.txt index c35f8cab70..7e1b9ee074 100644 --- a/docs/i18n/vi/llm.txt +++ b/docs/i18n/vi/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/zh-CN/llm.txt b/docs/i18n/zh-CN/llm.txt index b9539db6e7..fe1ebdde1b 100644 --- a/docs/i18n/zh-CN/llm.txt +++ b/docs/i18n/zh-CN/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md b/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md index 0a579e6e54..26725bb477 100644 --- a/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md +++ b/docs/i18n/zh-TW/docs/guides/USER_GUIDE.md @@ -973,7 +973,6 @@ curl -X POST http://localhost:20128/v1/audio/transcriptions \ - `kie/` - `aws-polly/` - `xiaomi-mimo/` -- `edgetts/`(Microsoft Edge「朗讀功能」— 免費,無需 API 金鑰;非官方/逆向工程端點) - `coqui/`, `tortoise/` - `qwen/` diff --git a/docs/i18n/zh-TW/llm.txt b/docs/i18n/zh-TW/llm.txt index abf7d405fe..335b511c61 100644 --- a/docs/i18n/zh-TW/llm.txt +++ b/docs/i18n/zh-TW/llm.txt @@ -4,7 +4,7 @@ --- -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -18,7 +18,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -61,7 +61,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -106,7 +106,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -128,7 +128,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -169,7 +169,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -186,7 +186,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -199,7 +199,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -219,7 +219,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -227,7 +227,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -242,7 +242,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -250,24 +250,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -281,12 +281,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -295,7 +295,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -324,8 +324,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -345,35 +345,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -388,13 +395,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -438,7 +445,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -446,7 +453,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -466,7 +473,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -479,11 +486,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/docs/reference/ENVIRONMENT.md b/docs/reference/ENVIRONMENT.md index 2681ba5478..9b3fcd27d4 100644 --- a/docs/reference/ENVIRONMENT.md +++ b/docs/reference/ENVIRONMENT.md @@ -1,7 +1,7 @@ --- title: "Environment Variables Reference" version: 3.8.50 -lastUpdated: 2026-08-18 +lastUpdated: 2026-08-23 --- # Environment Variables Reference @@ -592,11 +592,6 @@ Built-in credentials for **localhost development**. For remote deployments, regi | `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend `tk` token to send as `validated` on `/api/chat`. Required when Blackbox enforces token matching; otherwise OmniRoute falls back to a random UUID. See issue #2252. | | `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | OpenAI-compatible base URL for non-Anthropic vision-bridge calls. Defaults to the legacy OpenAI URL env or api.openai.com. Point at OmniRoute's `/v1` self-loop or any OpenAI-compat endpoint (Gemini OpenAI-compat, OpenRouter). Issue #2232. When the URL is OmniRoute's own `/v1`, the describe sub-request sends `x-omniroute-admission-bypass: internal` and authenticates with the resolved self-loop credential (`sk_omniroute` sentinel in local mode, or `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) so `REQUIRE_API_KEY=true` deployments work. | | `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | API key for the URL above. Overrides per-provider OpenAI / Google env vars for non-Anthropic vision-bridge calls. Anthropic models keep their dedicated Anthropic key path. Issue #2232. | -| `RAYCAST_BEARER_TOKEN` | Raycast Pro | Optional manual override for the Raycast access token (normally captured via macOS Auto-Import). No OAuth client_id/secret — reverse-engineered, local/personal use only. | -| `RAYCAST_DEVICE_ID` | Raycast Pro | Optional manual override for the Raycast device ID used to sign requests. | -| `RAYCAST_AID` | Raycast Pro | Optional manual override for the Raycast account/app ID; falls back to the device ID when unset. | -| `RAYCAST_SIG_SECRET` | Raycast Pro | Optional override for the request-signing HMAC secret. Defaults to a community-extracted value in `open-sse/services/raycast.ts`. | - > [!WARNING] > > 1. Go to [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) @@ -1018,8 +1013,6 @@ desktop install. | `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Include display-friendly `name` fields in `/v1/models` responses. Disable for clients that expect IDs only. | | `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Max wait for NanoBanana image generation jobs. | | `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | NanoBanana job polling frequency. | -| `DESIGNER_WEB_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | Max wait for microsoft-designer-web image generation jobs. | -| `DESIGNER_WEB_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | microsoft-designer-web job polling frequency. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Base delay for the Adobe Firefly upscale submit-retry exponential backoff. | | `AWS_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Region used to construct AWS Bedrock endpoints (Kiro, audio). | | `AWS_DEFAULT_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Fallback when `AWS_REGION` is not set. | diff --git a/docs/reference/FREE_TIERS.md b/docs/reference/FREE_TIERS.md index 927dccf720..2717653698 100644 --- a/docs/reference/FREE_TIERS.md +++ b/docs/reference/FREE_TIERS.md @@ -1,37 +1,41 @@ --- title: "Free Tiers & Free-Token Budget" -version: 3.8.40 -lastUpdated: 2026-07-31 +version: 3.8.50 +lastUpdated: 2026-08-23 --- # Free Tiers & Free-Token Budget > **For Users**: Looking for a simple guide? See the [Free Tiers Guide](../getting-started/FREE-TIERS-GUIDE.md) for step-by-step instructions on getting free AI. -> **Last researched:** 2026-06-17 — per-provider web research (official docs + last-7-days news, 50-agent pass with adversarial verification) refreshing every free-tier quota + ToS. +> **Catalog snapshot:** 2026-08-23 — measured from `computeFreeModelTotals()` at the v3.8.50 release tip: 446 catalog entries, 38 recurring pools, 20 pools with a positive published token budget, ~1.51B steady tokens, and ~2.13B in the first month. +> **Quota research basis:** 2026-06-17 — per-provider web research (official docs + last-7-days news, 50-agent pass with adversarial verification) refreshing every free-tier quota + ToS. > **Source of truth (catalog):** `open-sse/config/freeModelCatalog.ts` (per-MODEL budgets, pool-deduped). The token-budget numbers below come from live web research and are an **approximation** — see [Methodology & caveats](#methodology--caveats). ## TL;DR — how much free inference does OmniRoute actually aggregate? -| Metric | Tokens / month | Meaning | -| ------------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **Documented recurring grant (steady)** | **~1.51B** | Free-tier **pools** (per-model catalog), each shared pool counted **once**. The live source behind `/api/free-tier/summary` and the dashboard's Free-Tier Budget page. **Use this number.** | -| **+ first month with signup credits** | **~2.13B** | Steady + one-time signup credits (Together $25, Z.AI 20M, DeepSeek 5M, …), deduped per account. **First month only** — does not recur. | -| **+ permanently free, no published cap** | _un-quantifiable_ | `siliconflow`, `glm-cn` (GLM-4-Flash), `tencent`, `baidu`, `kilo-gateway`, `opencode-zen` — real recurring access, rate/concurrency-limited, **no token cap to count**. Listed, never summed (counting them at `RPM×24/7` is the inflation we reject). | -| **+ deposit-unlock boost** | **+~24M** | A one-time **$10** OpenRouter top-up raises its free pool from 50 → 1000 req/day. Reported separately so it never inflates the steady number. | -| Theoretical ceiling (all rate limits, 24/7) | ~10B | Sum of every provider rate limit extrapolated to non-stop use. **Not a guarantee** — do not headline this. | +| Metric | Tokens / month | Meaning | +| ------------------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Documented recurring grant (steady)** | **~1.51B** | Free-tier **pools** (per-model catalog), each shared pool counted **once**. The live source behind `/api/free-tier/summary` and the dashboard's Free-Tier Budget page. **Use this number.** | +| **+ first month with signup credits** | **~2.13B** | Steady + one-time signup credits (Together $25, Z.AI 20M, DeepSeek 5M, …), deduped per account. **First month only** — does not recur. | +| **+ permanently free, no published cap** | _un-quantifiable_ | 14 providers (`agnes`, `ainative`, `aion`, `baidu`, `chatgpt-web`, `glm`, `glm-cn`, `kilo-gateway`, `opencode-zen`, `requesty`, `routeway`, `sealion`, `siliconflow`, `tencent`) — real recurring access, rate/concurrency-limited, **no token cap to count**. Listed, never summed. | +| **+ deposit-unlock boost** | **+~24M** | A one-time **$10** OpenRouter top-up raises its free pool from 50 → 1000 req/day. Reported separately so it never inflates the steady number. | +| Theoretical ceiling (all rate limits, 24/7) | ~10B | Sum of every provider rate limit extrapolated to non-stop use. **Not a guarantee** — do not headline this. | -**Honest headline:** _OmniRoute aggregates **~1.51B documented free tokens per month** (up to ~2.13B in your first month with signup credits) across 42 free-tier pools — plus a long tail of permanently-free, no-cap providers — and RTK + Caveman compression (15–95% token savings) stretches that further._ +**Honest headline:** _OmniRoute aggregates **~1.51B documented free tokens per month** (up to ~2.13B in your first month with signup credits) across 38 recurring free-tier pools and 446 catalog entries — plus a long tail of permanently-free, no-cap providers — and RTK + Caveman compression (15–95% token savings) stretches that further._ > **Why this dropped from the previous ~1.94B.** The 2026-06-17 refresh is an honesty correction, not a loss: `gemini` is now pool-deduped (was inflated by counting each Flash variant separately, 462M → 60M), `cloudflare-ai` corrected to its real 10k-Neurons/day (122M → 30M), `doubao` reclassified as a one-time signup credit (not recurring), and shut-down tiers removed (`chutes`/`phind`/`kluster` discontinued). Partly offset by `llm7` (correct 5M/day → 150M) and new free providers (Kilo, OpenCode Zen, Z.AI GLM-Flash). > > **Further corrected to ~1.37B in v3.8.42:** `longcat` was reclassified from a 150M/mo recurring grant to a one-time 10M signup credit after its free preview ended. Same honesty rule — no provider was dropped by mistake. > -> **Updated to ~1.51B after removing a retired provider:** the pool count is now 42 after mapping free tiers that were documented upstream but missing from the catalog (`requesty`, `ovhcloud`, `agnes`, `glm`) plus new providers `navy` and `aihorde` (#7840). This is the live, CI-gated number (`check:docs-counts` fails the build if this drifts from `computeFreeModelTotals()`). +> **v3.8.50 catalog snapshot:** the pool count is now 38 after the catalog reconciliation, including the `nara-free` shared pool (150M/month). Of those 38 recurring pools, 20 currently carry a positive published token budget; the others remain cataloged without inventing a token cap. This is the live, CI-gated number (`check:docs-counts` fails the build if this drifts from `computeFreeModelTotals()`). -Biggest **documented** contributors: `mistral` 1.00B, `llm7` 150M, `groq` 117M, `gemini` 60M, `cerebras` 30M, `cloudflare-ai` 30M, `sambanova` 30M. (`longcat` is excluded — its 10M LongCat-2.0 grant is a one-time, KYC-gated signup credit, not a recurring monthly budget.) +Biggest **documented** contributors: `mistral` 1.00B, `llm7` 150M, `nara` 150M, `gemini` 60M, `cerebras` 30M, `cloudflare-ai` 30M, and `api-airforce` 24M. (`longcat` is excluded — its 10M LongCat-2.0 grant is a one-time, KYC-gated signup credit, not a recurring monthly budget.) -> ⚠️ The theoretical ceiling (~10B) is inflated by rate-limit-only providers with **no published token cap** (`tencent`, `siliconflow`, `nvidia`, `baidu`, `glm-cn`, `sparkdesk`) whose figures would be `RPM/TPM × 24/7 × 30d` — a theoretical maximum no single account will sustain. They are **excluded** from the defensible number (shown in the "permanently free, no cap" row instead). This is the same inflation that makes competitors' multi-billion claims unreliable. +> ⚠️ The theoretical ceiling (~10B) is inflated by extrapolating rate limits as +> `RPM/TPM × 24/7 × 30d` for providers that publish no monthly token cap — a theoretical +> maximum no single account will sustain. Those providers are **excluded** from the defensible +> number and listed in the "permanently free, no cap" row instead. --- @@ -45,7 +49,9 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve - **New free providers discovered:** ⭐ **Kilo Code** (`kilo-gateway` — rotating "Auto Free" set: NVIDIA Nemotron 3 family, StepFun, Poolside, Nex-N2-Pro), ⭐ **OpenCode Zen** (`opencode-zen` — 6 rotating free coding models), ⭐ **Z.AI / Zhipu** (`glm-cn` — GLM-4-Flash / 4.5-Flash / 4.7-Flash permanently free + 20M signup bonus), and `arcee-ai` Trinity Large Preview. - **New honest tiers** (see Methodology): a _permanently-free-but-uncapped_ category (real recurring access, no token cap to count) and a _deposit-unlock boost_ (OpenRouter $10 → +24M/mo), both surfaced **separately** so they never inflate the headline. -> The detailed per-provider table further down is the **2026-06-05 snapshot**; the deltas above supersede it. The live, canonical source is the per-model catalog `open-sse/config/freeModelCatalog.ts`. +> The explanatory research and change notes in this section remain a dated 2026-06 snapshot. +> The per-provider table further down is regenerated from the 2026-08-23 catalog; the live, +> canonical source is `open-sse/config/freeModelCatalog.ts`. --- @@ -54,20 +60,28 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve - Numbers are **upper-bound estimates** from each provider's documented free-tier limits as of **2026-06-17**, gathered by web research (confidence tagged per row). Free tiers change constantly — re-verify before relying on a figure. - `estMonthlyFreeTokens` = recurring monthly tokens only. **One-time signup credits do not recur** and count as 0. Discontinued tiers are also 0. - Daily token cap → `monthly = daily × 30`. Only RPD documented → `RPD × ~800 output tokens × 30`. Only RPM/TPM (no daily cap) → **uncapped** (see below). -- **Permanently free, but no published token cap** (`siliconflow`, `glm-cn`, `tencent`, `baidu`, `kilo-gateway`, `opencode-zen`): these are real recurring free access, rate/concurrency-limited. We classify them `recurring-uncapped` and **never sum them** — multiplying `RPM × 24/7 × 30d` would produce a fantasy ceiling (the inflation we reject). They are listed so you know they exist. +- **Permanently free, but no published token cap**: the current 14-provider set is listed in the + TL;DR table and derived from `computeFreeModelTotals().uncappedProviders`. These are real + recurring free access, rate/concurrency-limited. We classify them `recurring-uncapped` and + **never sum them** — multiplying `RPM × 24/7 × 30d` would produce a fantasy ceiling. - **Deposit-unlock boost:** a one-time small top-up that permanently raises a free quota (OpenRouter: $10 → 1000 req/day ≈ +24M/mo). Reported as a separate figure, kept out of the steady headline. --- ## ToS attention table -> **ToS flag is advisory, not a routing gate.** Providers marked `tos` are still included in routing and combo/fallback by default; the flag only surfaces on `/dashboard/free-tiers` and `/api/free-tier/summary`. The `excludeTosAvoid` query parameter affects the summary view only, not global routing. The verdict lives in `open-sse/config/freeTierCatalog.ts` (informational, not read by routing engines). +> **ToS flag is advisory, not a routing gate.** For providers present in the current catalog, +> `tos` is surfaced on `/dashboard/free-tiers` and `/api/free-tier/summary`; routing and +> combo/fallback include it by default. The `excludeTosAvoid` query parameter affects the +> summary view only, not global routing. Live verdicts are catalog metadata; the explanatory +> tables below are the dated research ledger and can mention providers that were later retired. > A quick read on each provider's terms for a self-hosted, single-user personal proxy. `caution` = a personal-use or proxy clause worth checking; `ambiguous` = unclear; `ok` = explicitly permitted. Informational, not legal advice — you decide. -### ⚠️ Caution — personal-use / proxy clauses worth checking (19) +### ⚠️ Caution — personal-use / proxy clauses worth checking (16) -> Their free access is real and OmniRoute can route to them; the clauses below are just worth knowing. The OAuth/keyless ones aren't token-quantifiable, so they're not in the headline number (not because they're unusable). +> These are the caution findings from the dated research pass. Use the generated catalog table +> below—not this ledger—to determine whether a provider is present in v3.8.50. | Provider | Note | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -86,7 +100,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve | `muse-spark-web` | Meta ToS explicitly prohibits automated access without prior permission, reverse engineering without written permission, and circumventing technologi… | | `nlpcloud` | ToS explicitly prohibits "setting up a proxy or other device that allows others to access the Service through it" and grants only a non-transferable,… | | `opencode` | ToS (Anomaly Innovations, Inc.) explicitly restricts use to "your own internal use, and not on behalf of or for the benefit of any third party" — ope… | -| `qwen-web` | No ToS permits a self-hosted proxy using session tokens against chat.qwen.ai; automated/programmatic access remains high-risk. | | `t3-web` | ToS explicitly restricts accounts to personal use only, prohibits credential sharing with third parties, and bans automated/bot/scraping access — a s… | ### ✅ Generally permissive — caution / ambiguous / ok (the rest) @@ -167,78 +180,94 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve --- -## Per-provider free-tier (refreshed 2026-06-17) +## Per-provider free-tier (catalog snapshot 2026-08-23) -> Regenerated from the per-model catalog (`open-sse/config/freeModelCatalog.ts`), pool-deduped. Sorted by recurring steady tokens/mo. `uncapped*` = permanently free but no published token cap (rate/concurrency-limited) — real access, **not** summed into the headline. `—` = credit-only / keyless / not token-quantifiable. +> Generated from the live per-model catalog (`open-sse/config/freeModelCatalog.ts`) at +> the v3.8.50 release tip. The free-type values below are the literal catalog enum values. +> Recurring tokens and credits are pool-deduped within each provider. `uncapped*` means +> permanently free with no published token cap: real access, but never summed into the +> headline. ToS verdicts are current catalog metadata; the explanatory research above +> remains dated 2026-06-17. -| Provider | Free type | Steady tokens/mo | First-month credit | ToS | Models | -| ---------------- | ------------- | ---------------- | ------------------ | --------- | ------ | -| `mistral` | recurring | ~1.00B | — | caution | 5 | -| `llm7` | recurring | ~150M | — | caution | 4 | -| `longcat` | one-time | — | 10M | caution | 1 | -| `gemini` | recurring | ~60M | — | caution | 6 | -| `cerebras` | recurring | ~30M | — | caution | 2 | -| `cloudflare-ai` | recurring | ~30M | — | caution | 6 | -| `api-airforce` | recurring | ~24M | — | caution | 7 | -| `ollama-cloud` | recurring | ~20M | — | ambiguous | 8 | -| `groq` | recurring | ~15M | — | caution | 5 | -| `bluesminds` | recurring | ~7M | — | ambiguous | 22 | -| `sambanova` | recurring | ~6M | — | caution | 5 | -| `arcee-ai` | recurring | ~5M | — | caution | 1 | -| `bazaarlink` | recurring | ~4M | — | caution | 32 | -| `openrouter` | recurring | ~1M | — | caution | 1 | -| `cohere` | recurring | ~800K | — | caution | 6 | -| `huggingchat` | recurring | ~500K | — | caution | 4 | -| `morph` | recurring | ~400K | — | ok | 2 | -| `huggingface` | recurring | ~200K | — | caution | 6 | -| `kiro` | recurring | ~25K | — | avoid | 12 | -| `glm-cn` | uncapped | uncapped\* | ~20M | ok | 4 | -| `baidu` | uncapped | uncapped\* | — | caution | 1 | -| `kilo-gateway` | uncapped | uncapped\* | — | caution | 7 | -| `opencode-zen` | uncapped | uncapped\* | — | caution | 6 | -| `siliconflow` | uncapped | uncapped\* | — | caution | 10 | -| `tencent` | uncapped | uncapped\* | — | caution | 1 | -| `vertex` | signup credit | — | ~300M | caution | 10 | -| `agentrouter` | signup credit | — | ~200M | caution | 4 | -| `predibase` | signup credit | — | ~25M | caution | 1 | -| `together` | signup credit | — | ~25M | caution | 1 | -| `doubao` | signup credit | — | ~15M | ambiguous | 1 | -| `ai21` | signup credit | — | ~10M | avoid | 2 | -| `deepseek` | signup credit | — | ~5M | ok | 2 | -| `hyperbolic` | signup credit | — | ~5M | ok | 8 | -| `nscale` | signup credit | — | ~5M | caution | 6 | -| `bytez` | signup credit | — | ~1M | ambiguous | 3 | -| `deepinfra` | signup credit | — | ~1M | caution | 22 | -| `fireworks` | signup credit | — | ~1M | avoid | 10 | -| `nebius` | signup credit | — | ~1M | caution | 1 | -| `qoder` | signup credit | — | ~1M | caution | 14 | -| `scaleway` | signup credit | — | ~1M | ok | 6 | -| `novita` | signup credit | — | ~500K | caution | 1 | -| `agy` | keyless | — | — | avoid | 16 | -| `baichuan` | keyless | — | — | ambiguous | 1 | -| `blackbox` | keyless | — | — | avoid | 6 | -| `coze` | keyless | — | — | avoid | 1 | -| `duckduckgo-web` | keyless | — | — | avoid | 6 | -| `freemodel-dev` | keyless | — | — | unknown | 4 | -| `friendliai` | keyless | — | — | avoid | 2 | -| `iflytek` | keyless | — | — | avoid | 1 | -| `inference-net` | keyless | — | — | caution | 3 | -| `liquid` | keyless | — | — | unknown | 1 | -| `monsterapi` | keyless | — | — | ambiguous | 1 | -| `muse-spark-web` | keyless | — | — | avoid | 3 | -| `nlpcloud` | keyless | — | — | avoid | 1 | -| `nous-research` | keyless | — | — | ambiguous | 2 | -| `nvidia` | keyless | — | — | caution | 13 | -| `opencode` | keyless | — | — | avoid | 7 | -| `pollinations` | keyless | — | — | caution | 31 | -| `publicai` | keyless | — | — | caution | 3 | -| `qwen-web` | keyless | — | — | avoid | 3 | -| `reka` | keyless | — | — | caution | 2 | -| `sensenova` | keyless | — | — | caution | 1 | -| `sparkdesk` | keyless | — | — | caution | 1 | -| `stepfun` | keyless | — | — | ok | 1 | -| `t3-web` | keyless | — | — | avoid | 23 | -| `uncloseai` | keyless | — | — | caution | 3 | +| Provider | Free type(s) | Published recurring tokens/mo | Published credit | ToS | Models | +| ---------------- | ------------------------------------------ | ----------------------------- | ---------------- | --------- | ------ | +| `mistral` | `recurring-monthly` | ~1.00B | — | caution | 5 | +| `llm7` | `recurring-daily` | ~150M | — | caution | 4 | +| `nara` | `recurring-daily` | ~150M | — | caution | 3 | +| `gemini` | `recurring-daily` | ~60M | — | caution | 4 | +| `cerebras` | `recurring-daily` | ~30M | — | caution | 2 | +| `cloudflare-ai` | `recurring-daily` | ~30M | — | caution | 9 | +| `api-airforce` | `recurring-daily` | ~24M | — | caution | 7 | +| `ollama-cloud` | `recurring-monthly` | ~20M | — | ambiguous | 8 | +| `groq` | `recurring-daily` | ~15M | — | caution | 5 | +| `bluesminds` | `recurring-daily` | ~7.2M | — | ambiguous | 22 | +| `sambanova` | `recurring-daily` | ~6M | — | caution | 5 | +| `arcee-ai` | `recurring-daily` | ~4.8M | — | caution | 1 | +| `navy` | `recurring-daily` | ~4.5M | — | ok | 1 | +| `bazaarlink` | `recurring-daily` | ~3.6M | — | caution | 32 | +| `openrouter` | `recurring-daily` | ~1.2M | — | caution | 1 | +| `cohere` | `recurring-monthly` | ~800K | — | caution | 6 | +| `huggingchat` | `recurring-monthly` | ~500K | — | caution | 24 | +| `morph` | `recurring-monthly` | ~400K | — | ok | 2 | +| `huggingface` | `recurring-monthly` | ~200K | — | caution | 6 | +| `kiro` | `recurring-monthly` | ~25K | — | avoid | 7 | +| `vertex` | `one-time-initial` | — | ~300M | caution | 10 | +| `agentrouter` | `one-time-initial` | — | ~200M | caution | 3 | +| `predibase` | `one-time-initial` | — | ~25M | caution | 1 | +| `together` | `one-time-initial` | — | ~25M | caution | 1 | +| `glm-cn` | `one-time-initial`

`recurring-uncapped` | uncapped* | ~20M | ok | 4 | +| `doubao` | `one-time-initial` | — | ~15M | ambiguous | 1 | +| `ai21` | `one-time-initial` | — | ~10M | avoid | 2 | +| `longcat` | `one-time-initial` | — | ~10M | caution | 1 | +| `deepseek` | `one-time-initial` | — | ~5M | ok | 2 | +| `hyperbolic` | `one-time-initial` | — | ~5M | ok | 8 | +| `nscale` | `one-time-initial` | — | ~5M | caution | 6 | +| `bytez` | `recurring-credit` | — | ~1M | ambiguous | 3 | +| `deepinfra` | `one-time-initial` | — | ~1M | caution | 22 | +| `fireworks` | `one-time-initial` | — | ~1M | avoid | 10 | +| `nebius` | `one-time-initial` | — | ~1M | caution | 1 | +| `qoder` | `one-time-initial` | — | ~1M | caution | 9 | +| `scaleway` | `one-time-initial` | — | ~1M | ok | 6 | +| `novita` | `one-time-initial` | — | ~500K | caution | 1 | +| `agnes` | `recurring-uncapped` | uncapped* | — | ok | 3 | +| `agy` | `keyless` | — | — | avoid | 9 | +| `aihorde` | `keyless` | — | — | ok | 3 | +| `ainative` | `recurring-uncapped` | uncapped* | — | caution | 9 | +| `aion` | `recurring-uncapped` | uncapped* | — | ok | 5 | +| `baichuan` | `one-time-initial` | — | — | ambiguous | 1 | +| `baidu` | `recurring-uncapped` | uncapped* | — | caution | 1 | +| `blackbox` | `keyless` | — | — | avoid | 6 | +| `chatgpt-web` | `recurring-uncapped` | uncapped* | — | caution | 2 | +| `coze` | `recurring-daily` | — | — | avoid | 1 | +| `duckduckgo-web` | `keyless` | — | — | avoid | 6 | +| `freemodel-dev` | `one-time-initial` | — | — | unknown | 4 | +| `friendliai` | `keyless` | — | — | avoid | 2 | +| `glm` | `recurring-uncapped` | uncapped* | — | ok | 2 | +| `iflytek` | `keyless` | — | — | avoid | 1 | +| `inference-net` | `recurring-monthly` | — | — | caution | 3 | +| `kilo-gateway` | `recurring-uncapped` | uncapped* | — | caution | 13 | +| `liquid` | `keyless` | — | — | unknown | 1 | +| `monsterapi` | `one-time-initial` | — | — | ambiguous | 1 | +| `muse-spark-web` | `keyless` | — | — | avoid | 3 | +| `nlpcloud` | `recurring-monthly` | — | — | avoid | 1 | +| `nous-research` | `recurring-credit` | — | — | ambiguous | 2 | +| `nvidia` | `one-time-initial` | — | — | caution | 12 | +| `opencode` | `keyless` | — | — | avoid | 7 | +| `opencode-zen` | `recurring-uncapped` | uncapped* | — | caution | 6 | +| `ovhcloud` | `keyless` | — | — | ok | 5 | +| `pollinations` | `discontinued`
`keyless` | — | — | caution | 31 | +| `publicai` | `one-time-initial` | — | — | caution | 3 | +| `reka` | `recurring-monthly` | — | — | caution | 2 | +| `requesty` | `recurring-uncapped` | uncapped* | — | ok | 3 | +| `routeway` | `recurring-uncapped` | uncapped* | — | caution | 8 | +| `sealion` | `recurring-uncapped` | uncapped* | — | ok | 5 | +| `sensenova` | `one-time-initial` | — | — | caution | 1 | +| `siliconflow` | `recurring-uncapped` | uncapped* | — | caution | 10 | +| `sparkdesk` | `keyless` | — | — | caution | 1 | +| `stepfun` | `one-time-initial` | — | — | ok | 1 | +| `t3-web` | `recurring-daily` | — | — | avoid | 23 | +| `tencent` | `recurring-uncapped` | uncapped* | — | caution | 1 | +| `uncloseai` | `keyless` | — | — | caution | 3 | --- @@ -303,7 +332,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve - **`publicai`** — The shipped freeNote ("Free community inference tier") is broadly accurate but understates the specificity: the 20 RPM rate limit is now documented. No major tightening found; the service remains fre… - **`puter`** — **Fully removed** from the catalog (registry, executor, free-model catalog and API-key entry) at the request of Puter's owner (Nariman Jelveh) — see the dead-service-removal precedent above (`phind`). - **`qoder`** — Our catalog ships freeNote "(none)", but Qoder does have a free tier: a Community Edition with unlimited basic-model completions (daily-capped, unspecified limit) plus a one-time 14-day/300-credit Pr… -- **`qwen-web`** — Session-token access against chat.qwen.ai is not a dependable free-provider path and may be rejected upstream. - **`sambanova`** — Our shipped note only described the one-time $5 credit (30-day validity). The current reality includes a permanent recurring free tier with documented rate limits (20 RPM, 20 RPD, 200k TPD) that pers… - **`sensenova`** — Our shipped freeNote says "Free SenseTime models" which is vague but directionally correct — free access does exist. However, reality is more nuanced: free access is a time-limited public beta (Token… - **`serper-search`** — The shipped freeNote says "(none)" which is partially accurate — there is no recurring free plan — but Serper does offer 2,500 one-time trial credits on signup. The catalog note could be more precise… diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md index 731d53d83f..c2b0155ff4 100644 --- a/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/reference/PROVIDER_REFERENCE.md @@ -10,7 +10,7 @@ lastUpdated: 2026-08-23 > Regenerate with: `npm run gen:provider-reference` > **Last generated:** 2026-08-23 -Total providers: **350**. See category breakdown below. +Total providers: **346**. See category breakdown below. ## Categories @@ -34,7 +34,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each --- -## No-auth Providers (no key required) (13) +## No-auth Providers (no key required) (12) | ID | Alias | Name | Tags | Website | Notes | Tool calling | |----|-------|------|------|---------|-------|--------------| @@ -45,14 +45,13 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `codex-app-server` | `cxa` | OpenAI Codex (App-Server) | No-auth | [link](https://developers.openai.com/codex/cli) | No token stored by OmniRoute. The Codex CLI app-server manages its own ChatGPT sign-in (~/.codex/auth.json, auto-refreshed). Use “Sign in with ChatGPT” if the CLI is not yet authenticated. | — | | `devin-cli-agentic` | `dva` | Devin CLI Agentic Bridge | No-auth | [link](https://docs.devin.ai/work-with-devin/devin-cli) | Authentication is owned by the official Devin CLI in its isolated bridge volume. | emulated | | `duckduckgo-web` | `ddgw` | DuckDuckGo AI Chat | No-auth | [link](https://duckduckgo.com/duckchat) | No credentials required — DuckDuckGo AI Chat is anonymous and free. | emulated | -| `felo-web` | `felo` | Felo | No-auth | [link](https://felo.ai) | No credentials required — Felo is a free, no-signup chat/search aggregator. | — | | `opencode` | `oc` | OpenCode Free | No-auth | [link](https://opencode.ai) | No API key required — uses OpenCode's public free endpoint. | — | | `theoldllm` | `tllm` | The Old LLM (Free) | No-auth | [link](https://theoldllm.vercel.app) | No credentials required. The executor auto-generates access tokens via an embedded Playwright browser instance. | — | | `uncloseai` | `unc` | UncloseAI | No-auth | [link](https://uncloseai.com) | No auth required. API accepts any non-empty string as key for identification. If older built-in models return 404, use Available Models → Import from /models or Auto-Sync; verified live model: solidrust/Hermes-3-Llama-3.1-8B-AWQ. | — | | `veoaifree-web` | `veo-free` | Veo AI Free | No-auth, video | [link](https://veoaifree.com) | No auth required. Rate limited to 6 requests/hour per IP. | — | | `zcode` | `zc` | ZCode (GLM Coding Plan) | No-auth | [link](https://zcode.z.ai) | No API key stored by OmniRoute. The local ZCode app-server uses the existing builtin:zai-coding-plan login. | — | -## OAuth Providers (25) +## OAuth Providers (24) | ID | Alias | Name | Tags | Website | Notes | |----|-------|------|------|---------|-------| @@ -76,13 +75,12 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `kiro` | `kr` | Kiro AI | OAuth | — | Free tier: 50 credits/month (~25K–100K tokens). ⚠️ Kiro ToS prohibits third-party proxy/harness use. | | `openference` | `of` | Openference | OAuth | [link](https://openference.com) | Sign in with your Openference account to route requests through api.openference.com. An active plan is required for inference — OAuth may authenticate but return 402 without one. | | `qoder` | `if` | Qoder | OAuth | — | — | -| `raycast` | `rc` | Raycast Pro AI | OAuth | [link](https://raycast.com/ai) | Unofficial integration — uses your Raycast Pro subscription via credentials from the macOS app (Auto-Import or manual capture). May break on Raycast updates. Not for redistribution; personal use only. | | `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 ', ~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. | | `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. | -## Web Cookie Providers (35) +## Web Cookie Providers (32) | ID | Alias | Name | Tags | Website | Notes | Tool calling | |----|-------|------|------|---------|-------|--------------| @@ -100,19 +98,16 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `gemini-business` | `gembiz` | Gemini Business (Enterprise) | Web cookie | [link](https://business.gemini.google) | From your enterprise account: open business.gemini.google/home/cid/{your-cid}, then copy __Secure-1PSID and __Secure-1PSIDTS cookies from DevTools → Application → Cookies. Paste as a cookie header below. | — | | `gemini-web` | `gweb` | Gemini Web (Free) | Web cookie | [link](https://gemini.google.com) | Paste your __Secure-1PSID cookie value from gemini.google.com. Optionally add __Secure-1PSIDTS separated by semicolon. | emulated | | `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. | — | -| `hailuo-web` | `hailuo-web` | Hailuo Web (MiniMax) | Web cookie | [link](https://chat.minimax.io) | Open hailuo.ai, log in, then open DevTools → Application → Local Storage → copy the "_token" value. device_id/uuid fingerprint fields are derived automatically; if requests fail, re-capture _token (sessions can expire). | — | | `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. | — | | `hyperagent` | `ha` | HyperAgent (Unofficial/Experimental) | Web cookie | [link](https://hyperagent.com) | Paste the full Cookie header from hyperagent.com (DevTools → Network → any request → Request Headers → Cookie). Session cookies power chat + billing usage. | — | | `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 | emulated | | `kimi-web` | `kimi-web` | Kimi Web | Web cookie | [link](https://www.kimi.ai) | Paste access_token from www.kimi.ai 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 cookie AND the ecto1:... WS auth token from meta.ai. Capture the ecto1: token in DevTools → Network → WS → the clippy request's Authorization query param. Example: ecto_1_sess=4240a308...NVDg0; ecto1:ABCD... | emulated | | `notion-web` | `nw` | Notion AI Web (Unofficial/Experimental) | Web cookie | [link](https://www.notion.so) | Paste only the token_v2 cookie VALUE from app.notion.com (DevTools → Application → Cookies → token_v2). Do not paste token_v2= or the full Cookie header. Workspace is auto-detected; space_id / notion_user_id are optional. | — | | `perplexity-web` | `pplx-web` | Perplexity Web (Pro/Max) | Web cookie | [link](https://www.perplexity.ai) | Paste your __Secure-next-auth.session-token cookie value from perplexity.ai | emulated | | `poe-web` | `poe` | Poe Web (Subscription) | Web cookie | [link](https://poe.com) | Paste your p-b cookie value from poe.com (DevTools → Application → Cookies → p-b) | — | | `promptql` | `pql` | PromptQL (Unofficial/Experimental) | Web cookie | [link](https://prompt.ql.app) | Paste the Bearer JWT from prompt.ql.app DevTools → Network → graphql → Authorization (token only). Optional projectId + session Cookie for refresh. | — | -| `qwen-web` | `qwen-web` | Qwen Web (Free) | Web cookie | [link](https://chat.qwen.ai) | Open chat.qwen.ai, log in, then open DevTools → Application → Local Storage → copy the "token" value (or use tongyi_sso_ticket cookie as Bearer token). | emulated | | `t3-web` | `t3chat` | t3.chat (Pro/Free) | Web cookie | [link](https://t3.chat) | Open t3.chat in your browser, log in, then open DevTools → Application → Local Storage → https://t3.chat. Copy the value of 'convex-session-id'. Also open DevTools → Network, copy the Cookie header from any request. Paste both values here. See provider setup docs for a step-by-step guide. | emulated | | `tencent-aistudio-web` | `tasw` | Tencent AI Studio (Free) | Web cookie | [link](https://aistudio.tencent.ai) | Log in to aistudio.tencent.ai, open DevTools -> Network, copy any request Cookie header containing session tokens. | — | | `tinycms-web` | `tcw` | TinyCMS Web (Free/Sub) | Web cookie | [link](https://site.tinycms.xyz) | Go to site.tinycms.xyz, open DevTools → Application → Local Storage, copy the value of 'app-config-uuid' (starts with 'R'), and paste it here. | — | @@ -122,7 +117,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `zai-web` | `zw` | Z.ai Web | Web cookie | [link](https://chat.z.ai) | Copy the "token" value from chat.z.ai → DevTools → Application → Local Storage. Do not copy cookies; OmniRoute handles the per-request CAPTCHA through its browser transport. | — | | `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) (231) +## API Key Providers (paid / paid-with-free-credits) (232) | ID | Alias | Name | Tags | Website | Notes | |----|-------|------|------|---------|-------| @@ -215,6 +210,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `glm-cn` | `glmcn` | GLM Coding (China) | API key | [link](https://open.bigmodel.cn) | — | | `glmt` | `glmt` | GLM Thinking | API key | [link](https://open.bigmodel.cn) | — | | `groq` | `groq` | Groq | API key | [link](https://groq.com) | Free tier: 30 RPM / 14.4K RPD — no credit card | +| `hackclub` | `hc` | Hackclub AI | API key | [link](https://ai.hackclub.com) | Sign in with your Hack Club account at ai.hackclub.com. | | `haiper` | `hp` | Haiper | API key, video | [link](https://haiper.ai) | Get API key at haiper.ai/haiper-api | | `hcnsec` | `hcnsec` | Huancheng Public API | API key | [link](https://api.hcnsec.cn) | Get API key at api.hcnsec.cn | | `helixmind` | `helixmind` | HelixMind | API key, aggregator | [link](https://helixmind.online) | Previously circulated 3 RPM/50 RPD and no-card claims were not confirmed during the 2026-08-02 audit; current quota and billing require account verification. | @@ -438,7 +434,7 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each - Catalog: [`src/shared/constants/providers.ts`](../../src/shared/constants/providers.ts) - Registry (per-model details): [`open-sse/config/providerRegistry.ts`](../../open-sse/config/providerRegistry.ts) -- Executors: [`open-sse/executors/`](../../open-sse/executors/) (108 implementations) +- Executors: [`open-sse/executors/`](../../open-sse/executors/) (102 implementations) - Translators: [`open-sse/translator/`](../../open-sse/translator/) ## See Also diff --git a/docs/routing/AUTO-COMBO.md b/docs/routing/AUTO-COMBO.md index bad9aa43dd..d363199069 100644 --- a/docs/routing/AUTO-COMBO.md +++ b/docs/routing/AUTO-COMBO.md @@ -183,30 +183,31 @@ See [#7992](https://github.com/diegosouzapw/OmniRoute/issues/7992) and [#7111](h ## How It Works (Persisted Auto-Combos) -The Auto-Combo Engine dynamically selects the best provider/model for each request using a **14-factor scoring function** (defined in `open-sse/services/autoCombo/scoring.ts` → `DEFAULT_WEIGHTS`). Weights form a normalized distribution (custom weights are renormalized by `normalizeScoringWeights()`). +The Auto-Combo Engine dynamically selects the best provider/model for each request using a **15-factor scoring function** (defined in `open-sse/services/autoCombo/scoring.ts` → `DEFAULT_WEIGHTS`). The defaults sum to exactly `1.0`; custom weights are renormalized by `normalizeScoringWeights()`. -![Auto-Combo 14-factor scoring](../diagrams/exported/auto-combo-12factor.svg) +![Auto-Combo 15-factor scoring](../diagrams/exported/auto-combo-12factor.svg) -> Source: [diagrams/auto-combo-12factor.mmd](../diagrams/auto-combo-12factor.mmd) (regenerate via `npm run docs:render-diagrams`). The filename predates the current factor set; the diagram shows 13 of the 14 factors (missing `sessionAvailability`). +> Source: [diagrams/auto-combo-12factor.mmd](../diagrams/auto-combo-12factor.mmd) (regenerate via `npm run docs:render-diagrams`). The historical filename predates the current factor set; the diagram itself contains all 15 factors. | Factor | Default Weight | Description | | :-------------------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `health` | 0.20 | Health score from circuit breaker (CLOSED=1.0, HALF_OPEN=0.5, OPEN=0.0) | -| `quota` | 0.15 | Remaining quota / rate-limit headroom [0..1] | -| `costInv` | 0.15 | Inverse **blended** cost (60% input + 40% output token price, normalized) — cheaper = higher score | -| `latencyInv` | 0.12 | Inverse p95 latency normalized to pool — faster = higher score | -| `taskFit` | 0.08 | Task-type fitness (coding, review, planning, analysis, debugging, docs) | -| `stability` | 0.05 | Variance-based stability (low latency stdDev / error rate) | -| `tierPriority` | 0.05 | Account-tier priority — Ultra=1.0, Pro=0.67, Standard=0.33, Free=0.0 | -| `tierAffinity` | 0.05 | Affinity between the candidate's tier and the manifest-recommended tier | -| `specificityMatch` | 0.05 | Match between request specificity (manifest hint) and model tier | -| `contextAffinity` | 0.05 | Affinity between the request's context-window need and the model's context window | -| `sessionAvailability` | 0.05 | OAuth session availability of the candidate connection for this session (`getOAuthSessionAvailability()`; non-OAuth connections score 1.0) | -| `connectionDensity` | 0.05 | Spreads load across connections of the same provider (anti-concentration) | +| `quota` | 0.1429 | Remaining quota / rate-limit headroom [0..1] | +| `health` | 0.1605 | Health score from circuit breaker (CLOSED=1.0, HALF_OPEN=0.5, OPEN=0.0) | +| `costInv` | 0.1429 | Inverse **blended** cost (60% input + 40% output token price, normalized) — cheaper = higher score | +| `latencyInv` | 0.1143 | Inverse p95 latency normalized to pool — faster = higher score | +| `taskFit` | 0.0762 | Task-type fitness (coding, review, planning, analysis, debugging, docs) | +| `stability` | 0.0476 | Variance-based stability (low latency stdDev / error rate) | +| `tierPriority` | 0.0476 | Account-tier priority — Ultra=1.0, Pro=0.67, Standard=0.33, Free=0.0 | +| `tierAffinity` | 0.0476 | Affinity between the candidate's tier and the manifest-recommended tier | +| `specificityMatch` | 0.0476 | Match between request specificity (manifest hint) and model tier | +| `contextAffinity` | 0.0476 | Affinity between the request's context-window need and the model's context window | | `cacheAffinity` | 0.00 | Rendezvous-hash affinity toward the connection likeliest to already hold this request's prompt-cache prefix (`open-sse/services/combo/promptCacheAffinity.ts`); disabled by default (#8008) | +| `sessionAvailability` | 0.0476 | OAuth session availability of the candidate connection for this session (`getOAuthSessionAvailability()`; non-OAuth connections score 1.0) | | `resetWindowAffinity` | 0.00 | Bias toward connections whose quota reset window is favorable (disabled by default) | +| `connectionDensity` | 0.0476 | Spreads load across connections of the same provider (anti-concentration) | +| `quality` | 0.03 | Feedback-driven observed output quality; candidates without observations use the neutral scoring fallback | -**Sum:** `0.20 + 0.15 + 0.15 + 0.12 + 0.08 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.05 + 0.00 + 0.00 = 1.05` as literally declared in `DEFAULT_WEIGHTS`; user-configured weights are renormalized into a distribution by `normalizeScoringWeights()` before scoring. +**Sum:** `0.1429 + 0.1605 + 0.1429 + 0.1143 + 0.0762 + (7 × 0.0476) + 0.00 + 0.00 + 0.03 = 1.00`, matching `DEFAULT_WEIGHTS`. User-configured weights are renormalized into a distribution by `normalizeScoringWeights()` before scoring. ## Mode Packs @@ -278,7 +279,7 @@ OmniRoute's combo engine supports **19 routing strategies** (declared in `src/sh | `reset-window` | Prefer targets whose quota window resets soonest | | `headroom` | Pick the target with the most remaining quota headroom | | `strict-random` | Random without deduplication of repeats | -| `auto` | Use Auto Combo scoring (9-factor) — **recommended** | +| `auto` | Use Auto Combo scoring (15-factor) — **recommended** | | `lkgp` | Last-Known-Good Path (sticky route to last successful target) | | `context-optimized` | Pick target with best fit for current context size | | `cache-optimized` | Reorder targets by prompt-cache affinity — the connection likeliest to already hold this request's cached prefix is tried first (`open-sse/services/combo/promptCacheAffinity.ts`, #8008) | @@ -367,7 +368,7 @@ The Auto Combo engine doesn't require pre-defined combos. Instead, `open-sse/ser 3. Cross-references with `getProviderRegistry()` for model availability + pricing 4. For each tuple `(provider, model, connection)`, builds a `VirtualAutoComboCandidate` 5. Picks `connection.defaultModel` (or the registry's first model) as the dispatch target -6. Scores each candidate using the 9-factor `scorePool()` and the variant's weight pack +6. Scores each candidate using the 15-factor `scorePool()` and the variant's weight pack 7. Returns the resulting in-memory `AutoComboConfig` for `handleComboChat()` — never persisted to DB This means **adding a new provider with `auto/*` enabled automatically expands the candidate pool** — no manual combo editing needed. The virtual combo is rebuilt per request, so newly-added or newly-healthy connections are picked up immediately. @@ -677,8 +678,8 @@ Including the bare `auto` (default) plus the 6 `AutoVariant` values declared in ## How tiers fit Auto-Combo -The 14-factor scoring function (`open-sse/services/autoCombo/scoring.ts`) treats tier -membership as two signals: `tierPriority` (0.05) and `tierAffinity` (0.05). See the +The 15-factor scoring function (`open-sse/services/autoCombo/scoring.ts`) treats tier +membership as two signals: `tierPriority` (0.0476) and `tierAffinity` (0.0476). See the canonical [scoring factor table](#how-it-works-persisted-auto-combos) above for the full `DEFAULT_WEIGHTS` set — the per-pack overrides (ship-fast/cost-saver/quality-first/ offline-friendly) are listed in the "Weight profiles per pack" table. @@ -732,7 +733,7 @@ intentionally excluded from CI because they require live credentials and VPS acc | File | Purpose | | :-------------------------------------------------------- | :------------------------------------------------------------------------- | -| `open-sse/services/autoCombo/scoring.ts` | 9-factor scoring function, `DEFAULT_WEIGHTS`, pool norm | +| `open-sse/services/autoCombo/scoring.ts` | 15-factor scoring function, `DEFAULT_WEIGHTS`, pool norm | | `open-sse/services/autoCombo/taskFitness.ts` | Model × task fitness lookup | | `open-sse/services/autoCombo/engine.ts` | Selection logic, bandit, budget cap | | `open-sse/services/autoCombo/selfHealing.ts` | Exclusion, probes, incident mode | diff --git a/docs/routing/STRICT_ZERO_COST.md b/docs/routing/STRICT_ZERO_COST.md index 50f15778b6..6939957e35 100644 --- a/docs/routing/STRICT_ZERO_COST.md +++ b/docs/routing/STRICT_ZERO_COST.md @@ -1,7 +1,7 @@ --- title: "STRICT_ZERO_COST" version: 3.8.50 -lastUpdated: 2026-08-20 +lastUpdated: 2026-08-23 --- # STRICT_ZERO_COST @@ -116,24 +116,25 @@ no waiting out the TTL after a 402/403/quota-exhausted response. `freeAccessPolicy`: a candidate can be economically `SAFE` and still excluded here for contractual reasons, or left in when this guard is off even with `freeAccessPolicy: "strict"` on. -## What passes today +## Current catalog eligibility Run `npx tsx scripts/ad-hoc/dry-run-strict-zero-cost.ts` against a live instance's -`GET /v1/auto-combo/{channel}/candidates` output for a real before/after — the script now reads -each candidate's real `connectionId`, so it also proves the connection-safety fix live, not just -in unit tests. As of 2026-08-20, only `freeType: "keyless"` candidates pass in practice (7 of 29 -live candidates on this instance: `opencode/big-pickle`, `opencode/deepseek-v4-flash-free`, and -5 `felo-web` models — all confirmed arriving with the genuine no-auth `connectionId`, never a -real connection) — no currently-catalogued `recurring-*` provider both has a usage adapter -registered in `USAGE_FETCHER_PROVIDERS` **and** `hardStopGuaranteed: true` declared (e.g. `groq` -has neither the adapter registered here nor is fetched offline in this dry run; `kiro` lacks -`hardStopGuaranteed`). This is not a bug: it's the honest state of two independently-curated -metadata sets that happen not to overlap yet, not a limitation of the filter itself. +`GET /v1/auto-combo/{channel}/candidates` output for a real before/after. The script reads each +candidate's actual `connectionId`, so it verifies connection safety rather than inferring it +from the static catalog. -With `excludeTosAvoid: true` added on top of the same live pool, the count drops from 7 to 0 — -every one of the 7 surviving candidates is curated `tos: "avoid"` today (`felo-web`, `opencode`). -This is a real, expected trade-off of turning the ToS guard on, not a bug: the guard is -`false` by default for exactly this reason (see "ToS guard" above). +The v3.8.50 catalog snapshot on 2026-08-23 contains **19 `keyless` model entries** whose provider +also has a no-auth catalog path: `aihorde` (3), `duckduckgo-web` (6), `opencode` (7), and +`uncloseai` (3). This is a static eligibility ceiling, **not** a claim that all 19 will appear or +pass on a particular installation: health, model discovery, candidate construction, and the +synthetic no-auth `connectionId` are still checked at runtime. No current quota-based entry can +bypass the independent usage-adapter, hard-stop, freshness, and remaining-allowance checks +described above. + +With `excludeTosAvoid: true`, the static no-auth/keyless ceiling becomes **6 entries**: the three +`aihorde` models (`tos: "ok"`) and three `uncloseai` models (`tos: "caution"`). The 13 +`duckduckgo-web`/`opencode` entries are curated `tos: "avoid"`. The guard remains `false` by +default because economic safety and contractual policy are intentionally independent. ## Enabling diff --git a/llm.txt b/llm.txt index 9c5259a17b..28265bc2ee 100644 --- a/llm.txt +++ b/llm.txt @@ -1,6 +1,6 @@ # OmniRoute -> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 350 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. +> OmniRoute is a free, open-source AI Gateway that acts as a universal API proxy for multi-provider LLMs. It provides smart routing, automatic fallback, load balancing, and format translation across 346 AI providers — all through a single OpenAI-compatible endpoint. Includes a built-in MCP Server (110 tools), A2A v0.3 protocol, Memory/Skills systems, Cloud Agents (codex, cursor, devin, jules), Guardrails framework, and an Electron desktop app. ## Overview @@ -14,7 +14,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Runtime:** Node.js `>=22.0.0 <23 || >=24.0.0 <27`, ES Modules (`"type": "module"`) - **Framework:** Next.js 16 (App Router) with TypeScript 6 -- **Database:** SQLite via better-sqlite3 (local, zero-config, 159 migrations) +- **Database:** SQLite via better-sqlite3 (local, zero-config, 160 migrations) - **State management:** Zustand (client), SQLite (server persistence) - **UI:** React 19, Tailwind CSS 4, Recharts for analytics, @lobehub/icons for 130+ provider SVG icons - **Auth:** OAuth 2.0 (PKCE) for providers, bcrypt for local user auth @@ -57,7 +57,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── skills/ # Skills system dashboard │ │ │ ├── translator/ # Format translator + debug tools │ │ │ └── usage/ # Usage history -│ │ ├── api/ # REST API endpoints (51 route directories) +│ │ ├── api/ # REST API endpoints (675 route handler files) │ │ │ ├── v1/ # OpenAI-compatible API (chat, completions, models, embeddings, │ │ │ │ # images, audio, videos, music, moderations, rerank, search, │ │ │ │ # responses, messages, registered-keys, quotas, accounts) @@ -102,7 +102,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ └── streaming.ts # SSE streaming for A2A │ │ ├── acp/ # Agent Communication Protocol registry and manager │ │ ├── compliance/ # Compliance policy engine -│ │ ├── db/ # SQLite database layer (117 modules + migrations) +│ │ ├── db/ # SQLite database layer (121 top-level TS modules + migrations) │ │ │ ├── core.ts # Database initialization, connection, schema │ │ │ ├── providers.ts # Provider connection CRUD │ │ │ ├── models.ts # Model catalog management @@ -124,7 +124,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ │ ├── secrets.ts # Secrets management │ │ │ ├── stateReset.ts # State reset utilities │ │ │ ├── migrationRunner.ts # Schema migration runner -│ │ │ └── migrations/ # 149 versioned SQL migration files +│ │ │ └── migrations/ # 160 versioned SQL migration files │ │ ├── evals/ # Eval runner and scheduler │ │ ├── memory/ # Persistent conversational memory │ │ │ ├── extraction.ts # Memory extraction from conversations @@ -165,7 +165,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── manager.ts # MITM proxy manager │ ├── shared/ # Shared utilities, components, and constants │ │ ├── components/ # Reusable UI components (Card, Badge, Button, Modal, Sidebar, ProviderIcon, etc.) -│ │ ├── constants/ # Provider definitions (349), model lists, pricing, routing strategies, MCP scopes +│ │ ├── constants/ # Provider definitions (346), model lists, pricing, routing strategies, MCP scopes │ │ ├── contracts/ # Shared API contracts │ │ ├── hooks/ # React hooks │ │ ├── middleware/ # Shared middleware utilities @@ -182,7 +182,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ├── open-sse/ # Standalone SSE server (npm workspace) │ ├── config/ # Model registries (providerRegistry, embedding, image, audio, video, │ │ # music, rerank, moderation, search, CLI fingerprints, Ollama models) -│ ├── executors/ # Provider-specific request executors (101 executor modules) +│ ├── executors/ # Provider-specific request executors (102 executor modules) │ │ ├── base.ts # Base executor with shared logic │ │ ├── default.ts # Default OpenAI-compatible executor │ │ ├── cursor.ts # Cursor IDE (protobuf + checksum) @@ -195,7 +195,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── cloudflare-ai.ts # Cloudflare Workers AI │ │ ├── opencode.ts # OpenCode Zen/Go │ │ └── pollinations.ts # Pollinations AI -│ ├── handlers/ # Request handlers per API type (11 handlers) +│ ├── handlers/ # Request handlers per API type (25 top-level modules) │ │ ├── chatCore.ts # Main chat completions handler │ │ ├── responsesHandler.ts # OpenAI Responses API handler │ │ ├── embeddings.ts # Embedding generation @@ -215,7 +215,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── audit.ts # Tool call audit logging │ │ ├── runtimeHeartbeat.ts # MCP runtime heartbeat │ │ └── httpTransport.ts # HTTP transport handler -│ ├── services/ # 140+ service modules +│ ├── services/ # 219 top-level service modules │ │ ├── combo.ts # Core routing engine │ │ ├── usage.ts # Usage tracking │ │ ├── tokenRefresh.ts # OAuth token refresh @@ -223,7 +223,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── accountFallback.ts # Multi-account fallback │ │ ├── sessionManager.ts # Session management │ │ ├── wildcardRouter.ts # Wildcard model routing -│ │ ├── autoCombo/ # Auto-combo engine (14-factor scoring, bandit exploration) +│ │ ├── autoCombo/ # Auto-combo engine (15-factor scoring, bandit exploration) │ │ ├── intentClassifier.ts # Request intent classification │ │ ├── taskAwareRouter.ts # Task-aware routing │ │ ├── thinkingBudget.ts # Thinking budget management @@ -238,7 +238,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── volumeDetector.ts # Request volume detection │ │ ├── contextHandoff.ts # Context relay handoff generation and injection │ │ ├── codexQuotaFetcher.ts # Codex quota fetching for context-relay -│ │ └── ... # Additional services (14 more modules) +│ │ └── ... # Additional service modules │ ├── transformer/ # Responses API transformer │ │ └── responsesTransformer.ts │ ├── translator/ # Format translators (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama ↔ DeepSeek) @@ -246,24 +246,24 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── response/ # Response translators per provider │ │ ├── helpers/ # Translation helpers │ │ └── image/ # Image format translation -│ └── utils/ # 22 utility modules (stream, TLS, proxy, logging, etc.) +│ └── utils/ # 102 top-level utility modules (stream, TLS, proxy, logging, etc.) ├── electron/ # Electron desktop app (cross-platform) │ ├── main.js # Electron main process │ ├── preload.js # Preload script (IPC bridge) │ └── assets/ # App icons and assets ├── tests/ # Test suites -│ ├── unit/ # 2,700+ unit test files +│ ├── unit/ # 4,785 unit test files │ ├── integration/ # Integration tests │ ├── e2e/ # Playwright E2E tests │ ├── security/ # Security tests │ ├── translator/ # Translator-specific tests │ └── load/ # Load tests ├── docs/ # Documentation -│ ├── i18n/ # 43-language translated docs +│ ├── i18n/ # 42 localized documentation mirrors (plus root English) │ ├── architecture/ # ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, REPOSITORY_MAP.md, AUTHZ_GUIDE.md, RESILIENCE_GUIDE.md, QUALITY_GATES.md │ ├── reference/ # API_REFERENCE.md, PROVIDER_REFERENCE.md, CLI-TOOLS.md │ ├── frameworks/ # MCP-SERVER.md (110 tools), A2A-SERVER.md, SKILLS.md, MEMORY.md, CLOUD_AGENT.md, EVALS.md, WEBHOOKS.md -│ ├── routing/ # AUTO-COMBO.md (14-factor scoring), REASONING_REPLAY.md +│ ├── routing/ # AUTO-COMBO.md (15-factor scoring), REASONING_REPLAY.md │ ├── security/ # GUARDRAILS.md, COMPLIANCE.md, STEALTH_GUIDE.md, PUBLIC_CREDS.md, ERROR_SANITIZATION.md │ ├── guides/ # USER_GUIDE.md, TROUBLESHOOTING.md, ELECTRON_GUIDE.md, I18N.md │ ├── ops/ # RELEASE_CHECKLIST.md, TUNNELS_GUIDE.md, VM deployment @@ -277,12 +277,12 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo ## Key Features (v3.8.50) ### Core Proxy -- **350 AI providers** with automatic format translation -- **Provider categories**: Free (90+ free tiers), OAuth, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) -- **18 routing strategies**: priority, weighted, round-robin, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, context-relay, fusion, pipeline +- **346 AI providers** with automatic format translation +- **Provider categories**: 54 free-forever providers, OAuth, Web Cookie, API Key, Self-Hosted, Custom (OpenAI/Anthropic-compatible) +- **19 routing strategies**: priority, weighted, round-robin, context-relay, fill-first, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, fusion, pipeline - **4-tier fallback**: Subscription → API Key → Cheap → Free - **Context Relay strategy**: Session handoff summaries on account rotation for continuity -- **Auto-combo engine**: Self-healing routing optimization with **14-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown +- **Auto-combo engine**: Self-healing routing optimization with **15-factor scoring** (see `docs/routing/AUTO-COMBO.md`), bandit exploration, progressive cooldown - **Semantic caching** with cache hit/miss headers - **Idempotency** with configurable dedup window - **3-layer resilience**: Provider Circuit Breaker / Connection Cooldown / Model Lockout @@ -291,7 +291,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Registered Keys API**: Auto-provision API keys via `POST /api/v1/registered-keys` with quota enforcement - **Memory System**: Persistent conversational memory with extraction, injection, retrieval, and summarization - **Skills System**: Extensible skill framework with registry, executor, sandbox, built-in and custom skills -- **Cloud Agents**: Codex Cloud, Devin, Jules — autonomous coding agents with task lifecycle management +- **Cloud Agents**: Codex Cloud, Cursor, Devin, Jules — autonomous coding agents with task lifecycle management - **Guardrails Framework**: Hot-reloadable registry with vision-bridge, pii-masker, prompt-injection (priority-ordered) - **MITM Proxy**: Certificate management, DNS handling, and target routing - **Cloudflare Tunnels**: Managed tunnel creation for remote access @@ -320,8 +320,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Costs** — Cost tracking per provider/model - **Limits** — Rate limit monitoring - **Cache** — Semantic cache statistics and management -- **CLI Tools** — One-click configuration for 10+ AI CLI tools -- **CLI Agents** — Grid of 14+ built-in agents with ProviderIcon and install detection + custom agent registration +- **CLI Tools** — One-click configuration for 35 AI CLI tools +- **CLI Agents** — Grid of 15 built-in agents with ProviderIcon and install detection + custom agent registration - **Playground** — Test any model with Monaco editor, streaming responses - **Media** — Image/video/music generation (GPT-Image, FLUX, etc.) + audio transcription (up to 2GB files) - **Search Tools** — Search provider configuration and testing @@ -341,35 +341,42 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Gemini** — `/v1beta/models`, `/v1beta/models/{...path}` - **Ollama** — `/v1/api/chat`, `/api/tags` - **Search** — `/v1/search` (Perplexity, Serper, Brave, Exa, Tavily) -- **MCP** — 105-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) +- **MCP** — 110-tool MCP server with scope-based auth (3 transports: stdio, SSE, streamable HTTP) - **A2A** — Agent-to-Agent v0.3 protocol (JSON-RPC 2.0, 6 skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities) - **ACP** — Agent Communication Protocol registry and manager -### MCP Server (109 Tools) +### MCP Server (110 Tools) -110 tools across modules: **44 canonical** (health, combos, quotas, routing, cost, models, cache, +110 tools across modules: **45 canonical** (health, combos, quotas, routing, cost, models, cache, diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool**, **notion**, **obsidian**, **localCorpus**, **gamification**, and **plugin** modules. Full per-tool inventory: `docs/frameworks/MCP-SERVER.md`. -**MCP Auth Scopes (32):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, +**MCP Auth Scopes (33):** e.g. `read:health`, `read:combos`, `write:combos`, `read:quota`, `read:usage`, `read:models`, `execute:completions`, `execute:search`, `write:budget`, `write:resilience`, plus memory/skills/pool/plugin scopes — full list in `docs/frameworks/MCP-SERVER.md`. ### Provider Categories -**Free Providers (3):** Qoder AI, Kiro AI, Windsurf +**Global catalog (346):** 12 no-auth, 24 OAuth, 32 Web Cookie, 232 API Key, 14 local, +14 search, 12 audio-only, 2 upstream proxy, 3 cloud-agent, and 1 system provider. These +categories are disjoint in the current static catalog. -**OAuth Providers (13):** Claude Code, Antigravity, OpenAI Codex, GitHub Copilot, Cursor IDE, Kimi Coding, Kilo Code, Cline, Kiro, Qoder, Gemini, Windsurf, GitLab Duo +**Core model registry:** 264 provider entries, 2,502 provider-model registrations, and 1,271 +distinct unqualified model IDs. These are static-code counts and exclude live upstream discovery, +custom providers, dynamic provider nodes, and database overrides. -**API Key Providers (48+):** OpenAI, Anthropic, Gemini (Google AI Studio), DeepSeek, Groq, xAI (Grok), Mistral, Perplexity, Together AI, Fireworks AI, Cerebras, Cohere, NVIDIA NIM, Nebius AI, SiliconFlow, Hyperbolic, HuggingFace, OpenRouter, Vertex AI, Cloudflare Workers AI, Scaleway AI, AI/ML API, Pollinations AI, LongCat AI, Alibaba, Alibaba (China), Kimi, Kimi Coding (API Key), Minimax, Minimax (China), Blackbox AI, Synthetic, Kilo Gateway, Z.AI, GLM Coding, Deepgram, AssemblyAI, ElevenLabs, Cartesia, PlayHT, Inworld, NanoBanana, SD WebUI, ComfyUI, Ollama Cloud, Perplexity Search, Serper Search, Brave Search, Exa Search, Tavily Search, OpenCode Zen, OpenCode Go, Alibaba Coding Plan +**Media registries:** 41 image providers / 239 public image catalog entries; 18 STT providers / +45 STT provider-model pairs; 23 TTS providers / 49 TTS provider-model pairs; and 2 translation +providers / 2 translation pairs. The combined static STT+TTS catalog exposes 94 entries across +30 distinct providers. Audio-only catalog cards are a narrower denominator than audio capability. **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization - 43 languages for UI (all dashboard pages) -- 40 translated documentation sets in docs/i18n/ +- 42 localized documentation sets in docs/i18n/ (plus root English) - Language switcher in documentation ## Key Architectural Decisions @@ -384,13 +391,13 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 5. **SSE proxy pipeline:** The proxy pipeline is middleware-based: request → auth resolution → rate limiting → circuit breaker → format translation → upstream call → response translation → SSE streaming back to client. -6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) stored in a single SQLite database via 99 domain-specific modules. All DB operations go through `src/lib/db/` modules, never raw SQL in routes. +6. **SQLite for persistence:** All state (providers, combos, logs, settings, API keys, memory, skills) is stored in a single SQLite database. The physical `src/lib/db/` layer has 121 top-level TypeScript modules; all DB operations go through those modules, never raw SQL in routes. 7. **OAuth with PKCE:** OAuth flows use PKCE for security. Token refresh handled by background job (`tokenHealthCheck.ts`). 8. **ProviderIcon component:** Unified icon system using `@lobehub/icons` (130+ SVG) with PNG fallback and generic icon fallback chain. Used on providers, dashboard, and agents pages. -9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 117 `src/lib/db/` modules with 149 SQL migrations. +9. **DB architecture:** `localDb.ts` is a re-export layer only — real logic lives in 121 top-level `src/lib/db/` TypeScript modules with 160 SQL migrations. 10. **Upstream headers:** Custom headers merged in executors after default auth; same header name replaces executor value. Forbidden header names in `src/shared/constants/upstreamHeaders.ts`. @@ -434,7 +441,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 4. **Environment variables:** All configuration is in `.env` (from `.env.example`). Key vars: `PORT`, `NEXT_PUBLIC_BASE_URL`, `API_KEY`, `ADMIN_PASSWORD`. -5. **Database layer:** Operations go through `src/lib/db/` modules (120 domain-specific files, 159 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. +5. **Database layer:** Operations go through `src/lib/db/` modules (121 top-level TypeScript files, 160 migrations). `localDb.ts` is re-exports only — add new functions to the proper `db/*.ts` module. 6. **Tests** use Node.js built-in test runner + Vitest. Run `npm test`. Vitest for MCP/autoCombo (`npm run test:vitest`). Playwright for E2E (`npm run test:e2e`). Coverage gate: ratchet vs `quality-baseline.json`, absolute floor 60% statements/lines/functions/branches. @@ -442,7 +449,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 8. **ACP agents** are in `src/lib/acp/registry.ts` with detection cache. Custom agents stored via settings DB. -9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **14-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. +9. **Auto-combo engine** in `open-sse/services/autoCombo/` — **15-factor scoring** (weights and factors in `docs/routing/AUTO-COMBO.md`), 4 mode packs, bandit exploration, progressive cooldown. 10. **Docker:** Dockerfile has two targets: `runner-base` and `runner-cli`. `docker-compose.yml` for dev (3 profiles), `docker-compose.prod.yml` for production (port 20130). @@ -462,7 +469,7 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool 18. **Node.js 24+ compatibility**: The login page (`/api/settings/require-login`) detects the Node.js version and sends `nodeVersion`/`nodeCompatible` fields. The login UI renders a warning banner when `nodeCompatible` is false. -19. **Cloud Agents** in `src/lib/cloudAgent/` — three external autonomous coding agents (Codex Cloud, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. +19. **Cloud Agents** in `src/lib/cloudAgent/` — four external autonomous coding agents (Codex Cloud, Cursor, Devin, Jules) with task lifecycle endpoints under `/api/v1/agents/tasks/`. Require management auth, not client auth. 20. **Guardrails framework** in `src/lib/guardrails/` — hot-reloadable registry. Built-ins (priority-ordered): `vision-bridge` (5) → `pii-masker` (10) → `prompt-injection` (20). Fail-open model: exceptions never block traffic. Per-request opt-out via `x-omniroute-disabled-guardrails` header. @@ -475,11 +482,11 @@ diagnostics) plus **memory**, **skill**, **agentSkill**, **githubSkill**, **pool ## v3.8.x Highlights -- **350-provider catalog** with 90+ free tiers, one-click account imports, and bulk key add +- **346-provider catalog** with 54 free-forever providers, one-click account imports, and bulk key add - **19 routing strategies** — including `fusion` (parallel panel + judge synthesis), `pipeline`, `reset-aware`, `reset-window`, `headroom`, and `context-relay` -- **14-factor Auto-Combo scoring** with bandit exploration and progressive cooldown +- **15-factor Auto-Combo scoring** with bandit exploration and progressive cooldown - **MCP server expanded to 110 tools / 33 scopes** (canonical + memory/skill/agentSkill/githubSkill/pool/notion/obsidian/localCorpus/gamification/plugin modules) -- **Cloud Agents** (Codex Cloud, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks +- **Cloud Agents** (Codex Cloud, Cursor, Devin, Jules), **Guardrails**, **Evals**, **Webhooks**, **Compliance** frameworks - **Embedded services** manager (install/start/stop bundled services from the dashboard) - **Prompt compression** (RTK + Caveman codecs) saving up to ~95% tokens on eligible traffic - Full changelog: `CHANGELOG.md` diff --git a/open-sse/config/audioRegistry.ts b/open-sse/config/audioRegistry.ts index aaa727fc46..a421750e85 100644 --- a/open-sse/config/audioRegistry.ts +++ b/open-sse/config/audioRegistry.ts @@ -531,31 +531,6 @@ export const AUDIO_SPEECH_PROVIDERS: Record = { ], }, - edgetts: { - id: "edgetts", - // Microsoft Edge "Read Aloud" — reverse-engineered, no API key required. - // WebSocket transport (unlike every other entry here) — handled by - // open-sse/executors/edgeTts.ts, dispatched via the "edgetts" format. - baseUrl: "wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1", - authType: "none", - authHeader: "none", - format: "edgetts", - supportedFormats: ["mp3"], - models: [ - { id: "en-US-AriaNeural", name: "Aria (EN-US, Female)" }, - { id: "en-US-GuyNeural", name: "Guy (EN-US, Male)" }, - { id: "en-GB-SoniaNeural", name: "Sonia (EN-GB, Female)" }, - { id: "en-GB-RyanNeural", name: "Ryan (EN-GB, Male)" }, - { id: "es-ES-ElviraNeural", name: "Elvira (ES-ES, Female)" }, - { id: "pt-BR-FranciscaNeural", name: "Francisca (PT-BR, Female)" }, - { id: "pt-BR-AntonioNeural", name: "Antonio (PT-BR, Male)" }, - { id: "fr-FR-DeniseNeural", name: "Denise (FR-FR, Female)" }, - { id: "de-DE-KatjaNeural", name: "Katja (DE-DE, Female)" }, - { id: "ja-JP-NanamiNeural", name: "Nanami (JA-JP, Female)" }, - { id: "zh-CN-XiaoxiaoNeural", name: "Xiaoxiao (ZH-CN, Female)" }, - ], - }, - gtts: { id: "gtts", // Google Translate TTS — reverse-engineered, no API key required. diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index 38c17abf2d..9249169bad 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -16,7 +16,7 @@ import type { FreeModelBudget } from "./freeModelCatalog.ts"; * rewrites file timestamps on every deploy, which would report a months-old * catalog as "updated today". Bump this whenever the entries below change. */ -export const FREE_CATALOG_CURATED_AT = "2026-08-18"; +export const FREE_CATALOG_CURATED_AT = "2026-08-23"; export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "chatgpt-web", modelId: "gpt-5.6-luna-free", displayName: "GPT-5.6 Luna (Free)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "chatgpt-web-free", tos: "caution" }, @@ -159,11 +159,6 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "duckduckgo-web", modelId: "mistral-small-2603", displayName: "Mistral Small 4", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "duckduckgo-web", tos: "avoid" }, { provider: "duckduckgo-web", modelId: "tinfoil/gpt-oss-120b", displayName: "gpt-oss 120B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "duckduckgo-web", tos: "avoid" }, { provider: "duckduckgo-web", modelId: "tinfoil/gemma4-31b", displayName: "Gemma 4 31B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "duckduckgo-web", tos: "avoid" }, - { provider: "felo-web", modelId: "felo-chat", displayName: "Felo Chat", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "felo-web", tos: "avoid" }, - { provider: "felo-web", modelId: "felo-search", displayName: "Felo Search", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "felo-web", tos: "avoid" }, - { provider: "felo-web", modelId: "felo-scholar", displayName: "Felo Scholar", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "felo-web", tos: "avoid" }, - { provider: "felo-web", modelId: "felo-social", displayName: "Felo Social", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "felo-web", tos: "avoid" }, - { provider: "felo-web", modelId: "felo-document", displayName: "Felo Document", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "felo-web", tos: "avoid" }, { provider: "fireworks", modelId: "deepseek-v4-flash", displayName: "DeepSeek V4 Flash", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "fireworks", tos: "avoid" }, { provider: "fireworks", modelId: "deepseek-v4-pro", displayName: "DeepSeek V4 Pro", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "fireworks", tos: "avoid" }, { provider: "fireworks", modelId: "glm-5p1", displayName: "GLM 5.1", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "fireworks", tos: "avoid" }, @@ -362,10 +357,6 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "qoder", modelId: "deepseek-v4-pro", displayName: "DeepSeek-V4-Pro", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "qoder", tos: "caution" }, { provider: "qoder", modelId: "deepseek-v4-flash", displayName: "DeepSeek-V4-Flash", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "qoder", tos: "caution" }, { provider: "qoder", modelId: "minimax-m3", displayName: "MiniMax-M3", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "qoder", tos: "caution" }, - { provider: "qwen-web", modelId: "qwen3.8-max", displayName: "Qwen3.8 Max", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "qwen-web", tos: "avoid" }, - { provider: "qwen-web", modelId: "qwen3.7-max", displayName: "Qwen3.7 Max", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "qwen-web", tos: "avoid" }, - { provider: "qwen-web", modelId: "qwen3.7-plus", displayName: "Qwen3.7 Plus", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "qwen-web", tos: "avoid" }, - { provider: "qwen-web", modelId: "qwen3.6-plus", displayName: "Qwen3.6 Plus", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "qwen-web", tos: "avoid" }, { provider: "reka", modelId: "reka-flash-3", displayName: "Reka Flash 3", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-monthly", poolKey: "reka", tos: "caution" }, { provider: "reka", modelId: "reka-edge-2603", displayName: "Reka Edge 2603", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-monthly", poolKey: "reka", tos: "caution" }, { provider: "sambanova", modelId: "MiniMax-M2.7", displayName: "MiniMax-M2.7", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, diff --git a/open-sse/config/freeTierCatalog.ts b/open-sse/config/freeTierCatalog.ts index cfc2836b98..339f01a100 100644 --- a/open-sse/config/freeTierCatalog.ts +++ b/open-sse/config/freeTierCatalog.ts @@ -40,13 +40,11 @@ export const FREE_TIER_BUDGETS: Record = { export const FREE_TIER_TOS: Record = { opencode: "avoid", "duckduckgo-web": "avoid", - "felo-web": "avoid", agy: "avoid", kiro: "avoid", "amazon-q": "avoid", "muse-spark-web": "avoid", "t3-web": "avoid", - "qwen-web": "avoid", modal: "avoid", nlpcloud: "avoid", blackbox: "avoid", diff --git a/open-sse/config/imageRegistry.ts b/open-sse/config/imageRegistry.ts index 02019dc4a0..cd0fcd0bac 100644 --- a/open-sse/config/imageRegistry.ts +++ b/open-sse/config/imageRegistry.ts @@ -248,26 +248,6 @@ export const IMAGE_PROVIDERS: Record = { supportedSizes: ["1024x1024", "1024x1536", "1536x1024"], }, - // #10466: Gemini Web session image generation (Nano Banana). Same - // web-cookie transport as the gemini-web chat provider — the handler - // drives the session executor in image mode and extracts the generated - // asset URLs from the StreamGenerate frames. - "gemini-web": { - id: "gemini-web", - alias: "gweb", - baseUrl: "https://gemini.google.com/app", - authType: "apikey", - authHeader: "cookie", - format: "gemini-web", - // `-web` suffix on purpose: the bare `nano-banana` id is owned by - // adobe-firefly (operator decision 2026-07-31, pinned by the - // cheaperinference-image-models guard). parseImageModel's bare-model scan - // walks providers in insertion order, so a bare `nano-banana` here would - // steal that resolution. Keep this id distinct. - models: [{ id: "nano-banana-web", name: "Nano Banana (Gemini Web Image)" }], - supportedSizes: ["1024x1024", "1024x1536", "1536x1024"], - }, - // Cursor plan image generation via the Agent CLI native `generateImage` tool. // Reuses the same OAuth/API-key connection as chat (`provider: "cursor"`). // Requires the `agent` binary (CURSOR_AGENT_BIN) — see cursorAgentImage handler. @@ -287,18 +267,6 @@ export const IMAGE_PROVIDERS: Record = { supportedSizes: ["1024x1024", "1024x1792", "1792x1024", "1024x1536", "1536x1024"], }, - "microsoft-designer-web": { - id: "microsoft-designer-web", - alias: "msdesigner", - baseUrl: - "https://designerapp.officeapps.live.com/designerapp/DallE.ashx?action=GetDallEImagesCogSci", - authType: "apikey", - authHeader: "bearer", - format: "designer-web", - models: [{ id: "dall-e-3", name: "DALL-E 3 (Microsoft Designer Web)" }], - supportedSizes: ["1024x1024", "1792x1024", "1024x1792"], - }, - xai: { id: "xai", baseUrl: "https://api.x.ai/v1/images/generations", @@ -925,7 +893,10 @@ export function parseImageModel(modelStr) { // No provider prefix — try to find the model in every provider, excluding cookie-auth (web) bridges for (const [providerId, config] of Object.entries(IMAGE_PROVIDERS)) { - if (config.authHeader !== "cookie" && (config.routingAliases?.includes(modelStr) || config.models.some((m) => m.id === modelStr))) { + if ( + config.authHeader !== "cookie" && + (config.routingAliases?.includes(modelStr) || config.models.some((m) => m.id === modelStr)) + ) { return { provider: providerId, model: modelStr }; } } diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts index 9c557003be..909844a2de 100644 --- a/open-sse/config/providers/index.ts +++ b/open-sse/config/providers/index.ts @@ -24,7 +24,6 @@ import { glmProvider } from "./registry/glm/index.ts"; import { glmtProvider } from "./registry/glm/t/index.ts"; import { glm_cnProvider } from "./registry/glm/cn/index.ts"; import { traeProvider } from "./registry/trae/index.ts"; -import { raycastProvider } from "./registry/raycast/index.ts"; import { muse_spark_webProvider } from "./registry/muse-spark-web/index.ts"; import { lmarenaProvider } from "./registry/lmarena/index.ts"; import { kilocodeProvider } from "./registry/kilocode/index.ts"; @@ -88,7 +87,6 @@ import { snowflakeProvider } from "./registry/snowflake/index.ts"; import { huggingfaceProvider } from "./registry/huggingface/index.ts"; import { chipotleProvider } from "./registry/chipotle/index.ts"; import { freeaiapikeyProvider } from "./registry/freeaiapikey/index.ts"; -import { qwen_webProvider } from "./registry/qwen/web/index.ts"; import { qwen_cloudProvider } from "./registry/qwen-cloud/index.ts"; import { qwen_cloud_token_planProvider } from "./registry/qwen-cloud-token-plan/index.ts"; import { zai_webProvider } from "./registry/zai-web/index.ts"; @@ -113,7 +111,6 @@ import { perplexityProvider } from "./registry/perplexity/index.ts"; import { perplexity_webProvider } from "./registry/perplexity/web/index.ts"; import { minimaxProvider } from "./registry/minimax/index.ts"; import { minimax_cnProvider } from "./registry/minimax/cn/index.ts"; -import { hailuo_webProvider } from "./registry/minimax/web/index.ts"; import { haiperProvider } from "./registry/haiper/index.ts"; import { bytezProvider } from "./registry/bytez/index.ts"; import { blackboxProvider } from "./registry/blackbox/index.ts"; @@ -146,7 +143,6 @@ import { longcatProvider } from "./registry/longcat/index.ts"; import { vertex_partnerProvider } from "./registry/vertex/partner/index.ts"; import { vertexProvider } from "./registry/vertex/index.ts"; import { duckduckgo_webProvider } from "./registry/duckduckgo-web/index.ts"; -import { felo_webProvider } from "./registry/felo-web/index.ts"; import { xaiProvider, xai_oauthProvider } from "./registry/xai/index.ts"; import { morphProvider } from "./registry/morph/index.ts"; import { siliconflowProvider } from "./registry/siliconflow/index.ts"; @@ -290,7 +286,6 @@ export const REGISTRY: Record = { glmt: glmtProvider, "glm-cn": glm_cnProvider, trae: traeProvider, - raycast: raycastProvider, "muse-spark-web": muse_spark_webProvider, lmarena: lmarenaProvider, kilocode: kilocodeProvider, @@ -354,7 +349,6 @@ export const REGISTRY: Record = { huggingface: huggingfaceProvider, chipotle: chipotleProvider, freeaiapikey: freeaiapikeyProvider, - "qwen-web": qwen_webProvider, "qwen-cloud": qwen_cloudProvider, "qwen-cloud-token-plan": qwen_cloud_token_planProvider, "zai-web": zai_webProvider, @@ -379,7 +373,6 @@ export const REGISTRY: Record = { "perplexity-web": perplexity_webProvider, minimax: minimaxProvider, "minimax-cn": minimax_cnProvider, - "hailuo-web": hailuo_webProvider, haiper: haiperProvider, bytez: bytezProvider, blackbox: blackboxProvider, @@ -412,7 +405,6 @@ export const REGISTRY: Record = { "vertex-partner": vertex_partnerProvider, vertex: vertexProvider, "duckduckgo-web": duckduckgo_webProvider, - "felo-web": felo_webProvider, xai: xaiProvider, "xai-oauth": xai_oauthProvider, morph: morphProvider, diff --git a/open-sse/config/providers/registry/felo-web/index.ts b/open-sse/config/providers/registry/felo-web/index.ts deleted file mode 100644 index 58f1605d1d..0000000000 --- a/open-sse/config/providers/registry/felo-web/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { RegistryEntry } from "../../shared.ts"; - -export const felo_webProvider: RegistryEntry = { - id: "felo-web", - alias: "felo", - format: "openai", - executor: "felo-web", - baseUrl: "https://felo.ai/api-proxy/main/search/threads", - authType: "none", - authHeader: "none", - models: [ - { id: "felo-chat", name: "Felo Chat", toolCalling: false }, - { id: "felo-search", name: "Felo Search", toolCalling: false }, - { id: "felo-scholar", name: "Felo Scholar", toolCalling: false }, - { id: "felo-social", name: "Felo Social", toolCalling: false }, - { id: "felo-document", name: "Felo Document", toolCalling: false }, - ], -}; diff --git a/open-sse/config/providers/registry/minimax/web/index.ts b/open-sse/config/providers/registry/minimax/web/index.ts deleted file mode 100644 index 6c2addc043..0000000000 --- a/open-sse/config/providers/registry/minimax/web/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RegistryEntry } from "../../../shared.ts"; - -export const HAILUO_WEB_STATIC_MODELS = [ - // The Hailuo web client does not expose a model selector in its chat API — - // one default assistant persona (characterID) handles every request. See - // open-sse/executors/hailuo-web.ts for the ported g4f protocol details. - { id: "hailuo", name: "Hailuo (MiniMax)" }, -]; - -export const hailuo_webProvider: RegistryEntry = { - id: "hailuo-web", - // Distinct alias: the paid API-key "minimax"/"minimax-cn" providers - // (../../minimax/index.ts) keep their own short alias; this free web/cookie - // variant is addressed by its own id, per the established kimi-web/qwen-web - // secondary-variant convention (tests/unit/provider-alias-uniqueness.test.ts). - alias: "hailuo-web", - format: "openai", - executor: "hailuo-web", - baseUrl: "https://chat.minimax.io", - authType: "apikey", - authHeader: "bearer", - models: HAILUO_WEB_STATIC_MODELS, -}; diff --git a/open-sse/config/providers/registry/qwen/web/index.ts b/open-sse/config/providers/registry/qwen/web/index.ts deleted file mode 100644 index 531c4bf1e1..0000000000 --- a/open-sse/config/providers/registry/qwen/web/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { RegistryEntry } from "../../../shared.ts"; - -export const qwen_webProvider: RegistryEntry = { - id: "qwen-web", - // The web/cookie variant is addressed by its own id. - alias: "qwen-web", - format: "openai", - executor: "qwen-web", - // v2 API (the legacy /api/chat/completions endpoint was retired upstream). - // Restored after the registry modularization (#3993) regressed this to v1 with - // a retired catalog. Source of truth: pre-#3993 providerRegistry.ts (commit 1ed01dd90^). - baseUrl: "https://chat.qwen.ai/api/v2/chat/completions", - authType: "apikey", - authHeader: "bearer", - // Current upstream catalog (GET https://chat.qwen.ai/api/models). Legacy - // ids (qwen-plus, qwen3-max, ...) still resolve via the executor's - // MODEL_ALIASES map for backward compatibility. - models: [ - { - id: "qwen3.8-max", - name: "Qwen3.8 Max", - toolCalling: false, - supportsReasoning: true, - supportsVision: true, - contextLength: 1_000_000, - maxOutputTokens: 131_072, - }, - { - id: "qwen3.7-max", - name: "Qwen3.7 Max", - toolCalling: false, - supportsReasoning: true, - supportsVision: false, - contextLength: 1_000_000, - maxOutputTokens: 65_536, - }, - { - id: "qwen3.7-plus", - name: "Qwen3.7 Plus", - toolCalling: false, - supportsReasoning: true, - supportsVision: true, - contextLength: 1_000_000, - maxOutputTokens: 65_536, - }, - { - id: "qwen3.6-plus", - name: "Qwen3.6 Plus", - toolCalling: false, - supportsReasoning: true, - supportsVision: true, - contextLength: 1_000_000, - maxOutputTokens: 65_536, - }, - ], -}; diff --git a/open-sse/config/providers/registry/raycast/index.ts b/open-sse/config/providers/registry/raycast/index.ts deleted file mode 100644 index aca286a6d1..0000000000 --- a/open-sse/config/providers/registry/raycast/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file index.ts - * @description Raycast Pro AI provider registry entry (reverse-engineered, unofficial API). - * - * @changes - * - [2026-07-28] [Composer] - Initial Raycast provider registry module - */ - -import type { RegistryEntry } from "../../shared.ts"; - -/** Seed catalog — full list synced from Raycast /api/v1/ai/models on connect/import. */ -export const raycastProvider: RegistryEntry = { - id: "raycast", - alias: "rc", - format: "openai", - executor: "raycast", - baseUrl: "https://backend.raycast.com/api/v1/ai", - authType: "oauth", - authHeader: "bearer", - defaultContextLength: 128000, - models: [ - //GPT - { id: "openai-gpt-5.6-sol", name: "GPT-5.6 Sol" }, - { id: "openai-gpt-5.6-terra", name: "GPT-5.6 Terra" }, - { id: "openai-gpt-5.6-luna", name: "GPT-5.6 Luna" }, - //Claude - { id: "anthropic-claude-opus-5", name: "Claude Opus 5" }, - { id: "anthropic-claude-sonnet-5", name: "Claude Sonnet 5" }, - { id: "anthropic-claude-4-5-haiku-reasoning", name: "Claude 4.5 Haiku Reasoning" }, - { id: "anthropic-claude-4-5-haiku", name: "Claude 4.5 Haiku" }, - //Gemini - { id: "google-gemini-3.1-pro", name: "Gemini 3.1 Pro" }, - { id: "google-gemini-3.7-flash", name: "Gemini 3.7 Flash" }, - { id: "google-gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite" }, - //Perplexity - { id: "perplexity-sonar-reasoning-pro", name: "Sonar Reasoning Pro" }, - { id: "perplexity-sonar-pro", name: "Sonar Pro" }, - { id: "perplexity-sonar", name: "Sonar" }, - //Mistral - { id: "mistral-mistral-large-latest", name: "Mistral Large" }, - { id: "mistral-mistral-medium-latest", name: "Mistral Medium" }, - { id: "mistral-mistral-small-latest", name: "Mistral Small" }, - { id: "mistral-codestral-latest", name: "Codestral" }, - { id: "mistral-open-mistral-nemo", name: "Mistral Nemo" }, - //Grok - { id: "xai-grok-4.6", name: "Grok 4.6" }, - //Opensource - { id: "gateway-alibaba/qwen3.8-max", name: "Qwen 3.8 Max" }, - { id: "gateway-moonshotai/kimi-k3", name: "Kimi K3" }, - { id: "baseten-deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro" }, - { id: "gateway-deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash" }, - { id: "baseten-zai-org/GLM-5.2", name: "GLM 5.2" }, - { id: "gateway-thinkingmachines/inkling-1.0", name: "Inkling 1.0" }, - { id: "gateway-google/gemma-4-31b-it", name: "Gemma 4 31B" }, - { id: "groq-openai/gpt-oss-120b", name: "GPT-OSS 120B" }, - { id: "groq-openai/gpt-oss-20b", name: "GPT-OSS 20B" }, - { id: "groq-qwen/qwen3-32b", name: "Qwen 3 32B" }, - { id: "groq-llama-3.3-70b-versatile", name: "LLaMA 3.3 70B" }, - { id: "groq-llama-3.1-8b-instant", name: "LLaMA 3.1 8B" }, - ], -}; diff --git a/open-sse/executors/awsPollyTts.ts b/open-sse/executors/awsPollyTts.ts index 311b2148dd..ad2612ef4e 100644 --- a/open-sse/executors/awsPollyTts.ts +++ b/open-sse/executors/awsPollyTts.ts @@ -1,10 +1,9 @@ /** * AWS Polly TTS handler. * - * Extracted out of `open-sse/handlers/audioSpeech.ts` (frozen at its - * file-size ratchet baseline — config/quality/file-size-baseline.json) to - * make room for the new EdgeTTS WebSocket branch (#6668). Pure provider - * adapter, no behavior change vs. the original inline implementation. + * Extracted out of `open-sse/handlers/audioSpeech.ts` to keep this provider + * adapter isolated and the handler within its file-size ratchet baseline. + * No behavior changed from the original inline implementation. * * POST /v1/speech signed with AWS SigV4. The configured apiKey stores AWS * Secret Access Key; providerSpecificData.accessKeyId stores AWS Access Key diff --git a/open-sse/executors/chatgpt-web.ts b/open-sse/executors/chatgpt-web.ts index 438565b45c..4354078583 100644 --- a/open-sse/executors/chatgpt-web.ts +++ b/open-sse/executors/chatgpt-web.ts @@ -2343,8 +2343,9 @@ async function imageUrlToCachedImageUrl( async function registerWebSocket(ctx: ResolverContext): Promise { // chatgpt.com migrated from POST /backend-api/register-websocket to a // GET-only endpoint under /backend-api/celsius/ws/user. The response shape - // also changed from `{ wss_url }` → `{ websocket_url }`. Newer codebases - // (g4f, etc.) all hit the celsius path; the legacy path now 404s. + // also changed from `{ wss_url }` → `{ websocket_url }`. The live browser + // flow captured for this integration uses the celsius path; the legacy path + // now returns 404. // Keep the legacy path as a fallback for older deployments. const candidates = [ { url: `${CHATGPT_BASE}/backend-api/celsius/ws/user`, method: "GET" as const }, diff --git a/open-sse/executors/edgeTts.ts b/open-sse/executors/edgeTts.ts deleted file mode 100644 index 18a9f144e9..0000000000 --- a/open-sse/executors/edgeTts.ts +++ /dev/null @@ -1,352 +0,0 @@ -/** - * EdgeTTS — Microsoft Edge "Read Aloud" text-to-speech (#6668). - * - * Reverse-engineered, unofficial, undocumented endpoint (not a published - * Microsoft public API) — the same class of integration this codebase - * already accepts for other "-web" style providers (chatgpt-web.ts, - * copilot-web.ts). No user account/API key is required; Microsoft gates - * abuse with a `Sec-MS-GEC` header computed from a public "trusted client - * token" (see `open-sse/utils/publicCreds.ts::edgetts_token` — Hard Rule - * #11, this is a constant hardcoded in every Edge browser build and every - * open-source edge-tts reimplementation, not a per-user secret). - * - * Protocol (verified against rany2/edge-tts + msedge-tts + edge-tts-universal): - * 1. WS connect to - * wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1 - * with `TrustedClientToken`, `Sec-MS-GEC`, `Sec-MS-GEC-Version` query params. - * 2. Send a `speech.config` text frame (output format, metadata options). - * 3. Send an `ssml` text frame carrying the SSML payload to synthesize. - * 4. Receive interleaved text frames (turn.start / audio.metadata / turn.end) - * and binary frames — each binary frame is a 2-byte big-endian header - * length, followed by ASCII headers, followed by raw audio bytes. - * 5. `turn.end` (or WS close) marks the end of the stream; concatenated - * audio chunks are the final MP3. - * - * All parsing above (Sec-MS-GEC HMAC input, message framing, binary chunk - * demux) is implemented as pure functions so it can be unit-tested without a - * live upstream connection — only `synthesizeEdgeTts()` itself touches the - * network, and it accepts an injectable WebSocket constructor for tests. - */ -import { createHash, randomBytes } from "node:crypto"; -import { resolvePublicCred } from "../utils/publicCreds.ts"; -import { errorResponse } from "../utils/error.ts"; -import { SlidingWindowLimiter } from "../services/slidingWindowLimiter.ts"; - -const EDGE_TTS_WS_URL = - "wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1"; -const EDGE_TTS_GEC_VERSION = "1-138.0.0.0"; -const WIN_EPOCH_OFFSET_SECONDS = 11644473600; -const SEC_MS_GEC_ROUND_SECONDS = 300; // 5 minutes -const DEFAULT_VOICE = "en-US-AriaNeural"; -const DEFAULT_OUTPUT_FORMAT = "audio-24khz-48kbitrate-mono-mp3"; -const CONNECT_TIMEOUT_MS = 10_000; -const SYNTH_TIMEOUT_MS = 30_000; - -// Per-client-IP throttle — EdgeTTS has no per-user key, so every OmniRoute -// deployment shares the same trusted-token identity upstream. A single -// abusive caller could get the shared token rate-limited/blocked for -// everyone, so we cap requests per source IP before we ever open a socket. -const EDGE_TTS_RATE_WINDOW = { requests: 20, windowMs: 60_000 }; -const edgeTtsLimiter = new SlidingWindowLimiter(); - -export interface EdgeTtsSynthInput { - text: string; - voice?: string; - rate?: string; - pitch?: string; - volume?: string; -} - -export interface EdgeTtsSynthResult { - audio: Buffer; - contentType: string; -} - -/** - * A minimal shape of the subset of the `ws`/DOM WebSocket API this module - * needs — lets tests inject a fake implementation without touching the real - * network or the `ws` package. - */ -export interface MinimalWebSocket { - on(event: "open" | "message" | "close" | "error", listener: (...args: unknown[]) => void): void; - send(data: string): void; - close(): void; -} - -export type WebSocketCtor = new (url: string, opts?: unknown) => MinimalWebSocket; - -// ─── Pure helpers (unit-testable, no I/O) ────────────────────────────────── - -/** - * Compute the `Sec-MS-GEC` anti-abuse token Microsoft's Read Aloud endpoint - * requires. `nowMs` is injectable so the function is deterministic in tests. - * Algorithm ported from rany2/edge-tts `drm.py::generate_sec_ms_gec()`. - */ -export function computeSecMsGec(nowMs: number = Date.now()): string { - let ticks = nowMs / 1000 + WIN_EPOCH_OFFSET_SECONDS; - ticks -= ticks % SEC_MS_GEC_ROUND_SECONDS; - ticks *= 1e7; // seconds -> 100-nanosecond Windows file-time ticks - const strToHash = `${Math.floor(ticks)}${resolvePublicCred("edgetts_token")}`; - return createHash("sha256").update(strToHash, "ascii").digest("hex").toUpperCase(); -} - -/** Random 32-hex-char connection id (no dashes), as the protocol expects. */ -export function buildConnectionId(): string { - return randomBytes(16).toString("hex"); -} - -function toIsoTimestamp(): string { - // Edge's protocol wants a JS-Date-toString-like timestamp; ISO is accepted - // by every reference implementation and is trivially deterministic/testable. - return new Date().toUTCString(); -} - -/** Build the `speech.config` WS text frame sent right after connecting. */ -export function buildSpeechConfigMessage(timestamp: string = toIsoTimestamp()): string { - const config = { - context: { - synthesis: { - audio: { - metadataoptions: { - sentenceBoundaryEnabled: "false", - wordBoundaryEnabled: "false", - }, - outputFormat: DEFAULT_OUTPUT_FORMAT, - }, - }, - }, - }; - return ( - `X-Timestamp:${timestamp}\r\n` + - `Content-Type:application/json; charset=utf-8\r\n` + - `Path:speech.config\r\n\r\n` + - `${JSON.stringify(config)}` - ); -} - -/** Escape user text for safe embedding inside an SSML `` element. */ -export function escapeSsmlText(text: string): string { - return String(text ?? "") - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -} - -/** Normalize a caller-supplied voice name, falling back to the default voice. */ -export function normalizeEdgeVoice(voice: unknown): string { - const value = typeof voice === "string" ? voice.trim() : ""; - // Edge voice names are e.g. "en-US-AriaNeural" — locale-Name-Neural. - return /^[A-Za-z]{2,3}-[A-Za-z]{2,3}-[A-Za-z0-9]+Neural$/.test(value) ? value : DEFAULT_VOICE; -} - -function clampProsodyValue(value: unknown, fallback: string): string { - const str = typeof value === "string" ? value.trim() : ""; - // Accept "+10%", "-20%", "default", or a bare number — reject anything else - // to keep this untrusted-input path from injecting SSML markup. - return /^(default|[+-]?\d{1,3}%|[+-]?\d{1,3}(\.\d+)?)$/.test(str) ? str : fallback; -} - -/** Build the full SSML payload for one synthesis request. */ -export function buildSsml(input: EdgeTtsSynthInput): string { - const voice = normalizeEdgeVoice(input.voice); - const rate = clampProsodyValue(input.rate, "default"); - const pitch = clampProsodyValue(input.pitch, "default"); - const volume = clampProsodyValue(input.volume, "default"); - const text = escapeSsmlText(input.text); - return ( - `` + - `` + - `${text}` + - `` - ); -} - -/** Build the `ssml` WS text frame carrying the synthesis payload. */ -export function buildSsmlMessage( - requestId: string, - ssml: string, - timestamp: string = toIsoTimestamp() -): string { - return ( - `X-RequestId:${requestId}\r\n` + - `Content-Type:application/ssml+xml\r\n` + - `X-Timestamp:${timestamp}\r\n` + - `Path:ssml\r\n\r\n` + - `${ssml}` - ); -} - -/** True when a received text frame marks the end of the synthesis turn. */ -export function isTurnEndMessage(message: string): boolean { - return typeof message === "string" && message.includes("Path:turn.end"); -} - -/** - * Demux one binary WS frame into its header block and raw audio payload. - * Frame shape: 2-byte big-endian header length, then that many bytes of - * ASCII headers, then the remaining bytes are audio data. Returns `null` - * for a frame too short to contain a valid header-length prefix. - */ -export function demuxAudioChunk(frame: Buffer): { headers: string; audio: Buffer } | null { - if (!Buffer.isBuffer(frame) || frame.length < 2) return null; - const headerLength = frame.readUInt16BE(0); - if (2 + headerLength > frame.length) return null; - const headers = frame.subarray(2, 2 + headerLength).toString("ascii"); - const audio = frame.subarray(2 + headerLength); - return { headers, audio }; -} - -/** Build the WS connection URL, including the freshly-computed Sec-MS-GEC token. */ -export function buildEdgeTtsWsUrl(nowMs: number = Date.now()): string { - const params = new URLSearchParams({ - TrustedClientToken: resolvePublicCred("edgetts_token"), - "Sec-MS-GEC": computeSecMsGec(nowMs), - "Sec-MS-GEC-Version": EDGE_TTS_GEC_VERSION, - ConnectionId: buildConnectionId(), - }); - return `${EDGE_TTS_WS_URL}?${params.toString()}`; -} - -// ─── Network I/O ──────────────────────────────────────────────────────────── - -/** - * Open a WS connection to Edge's Read Aloud service and synthesize `input`. - * `WebSocketCtor` is injectable for tests; production callers omit it and - * this lazily imports the `ws` package (mirrors the pattern used in - * copilot-web.ts / chipotle.ts — keeps `ws` out of the esbuild CJS bundle's - * top-level graph). - */ -export async function synthesizeEdgeTts( - input: EdgeTtsSynthInput, - WebSocketCtor?: WebSocketCtor -): Promise { - const Ctor = WebSocketCtor ?? ((await import("ws")).default as unknown as WebSocketCtor); - const url = buildEdgeTtsWsUrl(); - const ssml = buildSsml(input); - const requestId = buildConnectionId(); - - return new Promise((resolve, reject) => { - const chunks: Buffer[] = []; - let settled = false; - let contentType = "audio/mpeg"; - - const finish = (fn: () => void) => { - if (settled) return; - settled = true; - clearTimeout(timer); - fn(); - }; - - const timer = setTimeout(() => { - finish(() => { - try { - ws.close(); - } catch { - // best-effort close on timeout - } - reject(new Error("EdgeTTS synthesis timed out")); - }); - }, SYNTH_TIMEOUT_MS); - - let ws: MinimalWebSocket; - try { - ws = new Ctor(url, { handshakeTimeout: CONNECT_TIMEOUT_MS }); - } catch (err) { - clearTimeout(timer); - reject(err instanceof Error ? err : new Error(String(err))); - return; - } - - ws.on("open", () => { - ws.send(buildSpeechConfigMessage()); - ws.send(buildSsmlMessage(requestId, ssml)); - }); - - ws.on("message", (data: unknown, isBinary?: unknown) => { - const binary = isBinary === true || Buffer.isBuffer(data); - if (binary) { - const buf = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer); - const demuxed = demuxAudioChunk(buf); - if (demuxed) { - const typeMatch = /Content-Type:\s*([^\r\n]+)/i.exec(demuxed.headers); - if (typeMatch) contentType = typeMatch[1].trim(); - if (demuxed.audio.length > 0) chunks.push(demuxed.audio); - } - return; - } - const text = String(data); - if (isTurnEndMessage(text)) { - finish(() => { - try { - ws.close(); - } catch { - // best-effort close - } - resolve({ audio: Buffer.concat(chunks), contentType }); - }); - } - }); - - ws.on("error", (err: unknown) => { - finish(() => reject(err instanceof Error ? err : new Error(String(err)))); - }); - - ws.on("close", () => { - finish(() => { - if (chunks.length > 0) { - resolve({ audio: Buffer.concat(chunks), contentType }); - } else { - reject(new Error("EdgeTTS connection closed before receiving audio")); - } - }); - }); - }); -} - -// ─── Handler entrypoint (called from audioSpeech.ts) ─────────────────────── - -/** - * Handle an EdgeTTS `/v1/audio/speech` request. `clientIp` is optional — when - * provided, this enforces the per-IP sliding-window throttle described above. - */ -export async function handleEdgeTtsSpeech( - body: { input?: unknown; voice?: unknown }, - clientIp?: string | null, - WebSocketCtor?: WebSocketCtor -): Promise { - if (clientIp) { - const { allowed, retryAfterMs } = edgeTtsLimiter.tryAcquire(clientIp, EDGE_TTS_RATE_WINDOW); - if (!allowed) { - return errorResponse( - 429, - `EdgeTTS rate limit exceeded, retry after ${Math.ceil(retryAfterMs / 1000)}s` - ); - } - } - - const text = typeof body?.input === "string" ? body.input : ""; - if (!text.trim()) { - return errorResponse(400, "input is required"); - } - - try { - const { audio, contentType } = await synthesizeEdgeTts( - { - text, - voice: typeof body.voice === "string" ? body.voice : undefined, - }, - WebSocketCtor - ); - return new Response(audio, { - status: 200, - headers: { "Content-Type": contentType }, - }); - } catch (err) { - return errorResponse( - 502, - `EdgeTTS request failed: ${err instanceof Error ? err.message : String(err)}` - ); - } -} diff --git a/open-sse/executors/felo-web.ts b/open-sse/executors/felo-web.ts deleted file mode 100644 index 537d46afba..0000000000 --- a/open-sse/executors/felo-web.ts +++ /dev/null @@ -1,372 +0,0 @@ -import { randomUUID } from "node:crypto"; -import { BaseExecutor, type ExecuteInput } from "./base.ts"; -import { sanitizeErrorMessage } from "../utils/error.ts"; - -/** - * FeloWebExecutor — anonymous, free access to Felo (felo.ai), a chat/search-agent - * aggregator. No API key or session cookie required (`needs_auth = False` in the - * g4f reference implementation, `g4f/Provider/Felo.py`, fetched 2026-07-17). - * - * Flow: - * 1. POST /api-proxy/main/search/threads — opens a search thread, returns `stream_key`. - * 2. GET /api/message/v1/stream/{stream_key}?offset=0 — SSE-shaped stream. Each line is - * `data:{...}` (no space after the colon, unlike most SSE producers). The JSON payload - * carries a double-encoded `content` string; parsing that yields `{ data: { type, data } }` - * where `type` is `"answer"` (incremental/snapshot text) or `"final_contexts"` (sources, - * dropped here — no OpenAI-compatible slot for citations on this translation path). - * - * Felo has no published API; this is a reverse-engineered, scrape-style integration in the - * same family as `duckduckgo-web.ts` / `blackbox-web.ts` (see #6666 plan). It may break - * without notice if Felo changes its frontend contract. - */ - -export const FELO_BASE = "https://felo.ai"; -export const FELO_THREADS_URL = `${FELO_BASE}/api-proxy/main/search/threads`; -export const FELO_PROVIDER_PREFIX = "felo-web/"; - -export function feloStreamUrl(streamKey: string): string { - return `${FELO_BASE}/api/message/v1/stream/${encodeURIComponent(streamKey)}?offset=0`; -} - -const FELO_USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " + - "(KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"; - -export const FELO_HEADERS: Record = { - Accept: "*/*", - "Content-Type": "application/json", - Origin: FELO_BASE, - Referer: `${FELO_BASE}/search?q=hello`, - "User-Agent": FELO_USER_AGENT, -}; - -const FELO_STREAM_REQUEST_HEADERS: Record = { - Accept: "*/*", - Origin: FELO_BASE, - Referer: FELO_HEADERS.Referer, - "User-Agent": FELO_USER_AGENT, -}; - -// Mirrors g4f's `Felo.model_aliases` — Felo has no published model list; this -// reverse-engineered mapping is the only reference (category drives which -// search/answer pipeline Felo routes the query through). -const FELO_MODEL_CATEGORIES: Record = { - "felo-chat": "chat", - "felo-search": "google", - "felo-scholar": "scholar", - "felo-social": "social", - "felo-document": "document", -}; - -export const FELO_DEFAULT_MODEL = "felo-chat"; - -export function normalizeFeloModel(model: string | undefined | null): string { - if (!model) return FELO_DEFAULT_MODEL; - const clean = model.startsWith(FELO_PROVIDER_PREFIX) - ? model.slice(FELO_PROVIDER_PREFIX.length) - : model; - return Object.prototype.hasOwnProperty.call(FELO_MODEL_CATEGORIES, clean) - ? clean - : FELO_DEFAULT_MODEL; -} - -export function resolveFeloCategory(model: string | undefined | null): string { - return FELO_MODEL_CATEGORIES[normalizeFeloModel(model)]; -} - -export function extractFeloLastUserPrompt(messages: Array>): string { - const lastUser = [...messages].reverse().find((m) => m.role === "user"); - if (!lastUser) return ""; - const content = lastUser.content; - if (typeof content === "string") return content; - if (!Array.isArray(content)) return ""; - return content - .map((part) => { - if (part && typeof part === "object" && typeof (part as Record).text === "string") { - return (part as Record).text as string; - } - return ""; - }) - .filter(Boolean) - .join("\n"); -} - -export function buildFeloThreadPayload( - model: string | undefined | null, - prompt: string -): Record { - const searchUuid = randomUUID(); - return { - query: prompt, - search_uuid: searchUuid, - lang: "", - agent_lang: "en", - search_options: { langcode: "en-US" }, - search_video: true, - query_from: "default", - category: resolveFeloCategory(model), - model: "", - auto_routing: true, - mode: "concise", - device_id: randomUUID().replaceAll("-", ""), - source_message_rid: "", - documents: [], - document_action: "", - slides_source: { type: "ask_question", files: {} }, - slide_template_uid: "", - selected_resource_ids: [], - process_id: searchUuid, - stream_protocol: "message_center_v1", - enable_task_state: true, - }; -} - -function extractFeloAnswerText(contentJson: unknown): string | null { - if (!contentJson || typeof contentJson !== "object") return null; - const data = (contentJson as Record).data; - if (!data || typeof data !== "object") return null; - const dataRecord = data as Record; - if (dataRecord.type !== "answer") return null; - const inner = dataRecord.data; - if (!inner || typeof inner !== "object") return null; - const text = (inner as Record).text; - return typeof text === "string" ? text : null; -} - -export interface FeloParsedLine { - /** New text to emit for this line, or null when the line carried nothing new. */ - newText: string | null; - /** Running "previous text" snapshot to pass into the next call. */ - nextPreviousText: string; -} - -/** - * Parse a single line of Felo's SSE-shaped stream, diffing against the running - * snapshot the same way the g4f reference implementation does: each `answer` - * event carries the full text-so-far, and only the new suffix is new content. - */ -export function parseFeloStreamLine(line: string, previousText: string): FeloParsedLine { - const trimmed = line.trim(); - if (!trimmed.startsWith("data:{")) { - return { newText: null, nextPreviousText: previousText }; - } - - let outer: unknown; - try { - outer = JSON.parse(trimmed.slice(5)); - } catch { - return { newText: null, nextPreviousText: previousText }; - } - - const content = (outer as Record | null)?.content; - if (typeof content !== "string") { - return { newText: null, nextPreviousText: previousText }; - } - - let contentJson: unknown; - try { - contentJson = JSON.parse(content); - } catch { - return { newText: null, nextPreviousText: previousText }; - } - - const text = extractFeloAnswerText(contentJson); - if (text === null) { - return { newText: null, nextPreviousText: previousText }; - } - - if (text.startsWith(previousText)) { - const newPart = text.slice(previousText.length); - return newPart - ? { newText: newPart, nextPreviousText: text } - : { newText: null, nextPreviousText: previousText }; - } - - return { newText: text, nextPreviousText: text }; -} - -/** Replay a full raw stream body through `parseFeloStreamLine`, returning the final text. */ -export function accumulateFeloStreamText(rawText: string): string { - let previousText = ""; - for (const line of rawText.split("\n")) { - previousText = parseFeloStreamLine(line, previousText).nextPreviousText; - } - return previousText; -} - -export class FeloWebExecutor extends BaseExecutor { - constructor() { - super("felo-web", { baseUrl: FELO_BASE }); - } - - async testConnection( - _credentials: Record, - signal?: AbortSignal - ): Promise { - const controller = new AbortController(); - const feloTestMs = this.getTimeoutMs(); - const timeout = setTimeout(() => { - const err = new Error(`felo-web testConnection timeout after ${feloTestMs}ms`); - err.name = "TimeoutError"; - controller.abort(err); - }, feloTestMs); - try { - const mergedSignal = signal - ? AbortSignal.any([signal, controller.signal]) - : controller.signal; - - const response = await fetch(FELO_THREADS_URL, { - method: "POST", - headers: FELO_HEADERS, - body: JSON.stringify(buildFeloThreadPayload(FELO_DEFAULT_MODEL, "hi")), - signal: mergedSignal, - }); - if (!response.ok) return false; - const data = await response.json().catch(() => null); - return typeof (data as Record | null)?.stream_key === "string"; - } catch { - return false; - } finally { - clearTimeout(timeout); - } - } - - async execute(input: ExecuteInput): Promise { - const { model, body, stream, signal } = input; - const bodyObj = (body || {}) as Record; - const messages = Array.isArray(bodyObj.messages) - ? (bodyObj.messages as Array>) - : []; - const isStreaming = stream !== false; - - if (messages.length === 0) { - return feloErrorResponse(400, "No messages provided"); - } - const prompt = extractFeloLastUserPrompt(messages); - if (!prompt) { - return feloErrorResponse(400, "No user message content found"); - } - - const controller = new AbortController(); - const feloExecMs = this.getTimeoutMs(); - const timeout = setTimeout(() => { - const err = new Error(`felo-web execute timeout after ${feloExecMs}ms`); - err.name = "TimeoutError"; - controller.abort(err); - }, feloExecMs); - const mergedSignal = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal; - - try { - const streamKey = await this.createFeloThread(model, prompt, mergedSignal); - if (streamKey instanceof Response) { - clearTimeout(timeout); - return streamKey; - } - - const streamResponse = await fetch(feloStreamUrl(streamKey), { - method: "GET", - headers: FELO_STREAM_REQUEST_HEADERS, - signal: mergedSignal, - }); - clearTimeout(timeout); - - if (!streamResponse.ok || !streamResponse.body) { - const status = !streamResponse.ok && streamResponse.status >= 500 ? 502 : streamResponse.status || 502; - return feloErrorResponse(status, `Felo stream request failed with HTTP ${streamResponse.status}`); - } - - return await processFeloResponse(streamResponse, isStreaming); - } catch (error) { - clearTimeout(timeout); - if (error instanceof DOMException && error.name === "AbortError") { - return feloErrorResponse(499, "Request cancelled"); - } - return feloErrorResponse(500, error instanceof Error ? error.message : "Unknown error"); - } - } - - /** Returns the resolved `stream_key`, or an error Response to propagate as-is. */ - private async createFeloThread( - model: string | undefined, - prompt: string, - signal: AbortSignal - ): Promise { - const threadResponse = await fetch(FELO_THREADS_URL, { - method: "POST", - headers: FELO_HEADERS, - body: JSON.stringify(buildFeloThreadPayload(model, prompt)), - signal, - }); - - if (!threadResponse.ok) { - const status = threadResponse.status >= 500 ? 502 : threadResponse.status; - return feloErrorResponse(status, `Felo thread creation failed with HTTP ${threadResponse.status}`); - } - - const threadJson = await threadResponse.json().catch(() => null); - const streamKey = (threadJson as Record | null)?.stream_key; - if (typeof streamKey !== "string" || !streamKey) { - return feloErrorResponse(502, "Felo did not return a stream_key"); - } - return streamKey; - } -} - -function feloErrorResponse(status: number, message: string): Response { - return new Response(JSON.stringify({ error: { message: sanitizeErrorMessage(message) } }), { - status, - headers: { "Content-Type": "application/json" }, - }); -} - -function buildFeloStreamTransform(): TransformStream { - let previousText = ""; - let buffer = ""; - const decoder = new TextDecoder(); - const encoder = new TextEncoder(); - - return new TransformStream({ - transform(chunk, controller) { - buffer += decoder.decode(chunk, { stream: true }); - const lines = buffer.split("\n"); - buffer = lines.pop() ?? ""; - for (const line of lines) { - const parsed = parseFeloStreamLine(line, previousText); - previousText = parsed.nextPreviousText; - if (!parsed.newText) continue; - const openaiChunk = { choices: [{ delta: { content: parsed.newText }, index: 0 }] }; - controller.enqueue(encoder.encode(`data: ${JSON.stringify(openaiChunk)}\n\n`)); - } - }, - flush(controller) { - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - }, - }); -} - -async function processFeloResponse(response: Response, streaming: boolean): Promise { - if (streaming) { - if (!response.body) { - return feloErrorResponse(500, "No response body"); - } - const transformed = response.body.pipeThrough(buildFeloStreamTransform()); - return new Response(transformed, { headers: { "Content-Type": "text/event-stream" } }); - } - - const rawText = await response.text(); - const fullText = accumulateFeloStreamText(rawText); - return new Response( - JSON.stringify({ - choices: [ - { - message: { role: "assistant", content: fullText }, - index: 0, - finish_reason: "stop", - }, - ], - }), - { headers: { "Content-Type": "application/json" } } - ); -} - -export const feloWebExecutor = new FeloWebExecutor(); diff --git a/open-sse/executors/gemini-web.ts b/open-sse/executors/gemini-web.ts index 18dd7af008..ebc49e763f 100644 --- a/open-sse/executors/gemini-web.ts +++ b/open-sse/executors/gemini-web.ts @@ -264,70 +264,6 @@ export function parseStreamResponse(raw: string): string { return lastText; } -/** - * Extract generated-image URLs from a Gemini StreamGenerate response (#10466). - * - * When the web UI generates images (Nano Banana), the model's answer frames - * carry the assets in the candidate's extension block, NOT in the text: - * - * inner[4][0][12][7][0] → array of generated-image entries - * entry[0][3][3] → the image URL — either a plain string or a - * list of strings (take the first http(s) one) - * - * This path is corroborated by the two maintained reverse-engineered clients - * (gpt4free's Gemini provider and HanaokaYuzu/Gemini-API's _parse_candidate). - * Deliberately NOT collected: `inner[4][0][12][1]` — those are web-search - * result thumbnails, not generated content; mixing them in would serve - * scraped images as "generated" (#10466 acceptance criteria). - * - * Frames are cumulative snapshots, so later frames repeat earlier images; - * we dedupe while preserving first-seen order. A `=s2048` size suffix is - * appended (gpt4free's proven heuristic) so callers get full-resolution - * assets instead of UI thumbnails. - */ -export function parseStreamResponseImages(raw: string): string[] { - const urls: string[] = []; - const seen = new Set(); - const lines = raw.split("\n"); - - for (const rawLine of lines) { - const line = rawLine.trim(); - if (!line || line === ")]}'" || /^\d+$/.test(line)) continue; - if (!line.includes("wrb.fr")) continue; - try { - const arr = JSON.parse(line); - if (!Array.isArray(arr) || !Array.isArray(arr[0]) || arr[0][0] !== "wrb.fr") continue; - const payload = arr[0]?.[2]; - if (typeof payload !== "string") continue; - const inner = JSON.parse(payload); - const imageEntries = inner?.[4]?.[0]?.[12]?.[7]?.[0]; - if (!Array.isArray(imageEntries)) continue; - for (const entry of imageEntries) { - const urlField = entry?.[0]?.[3]?.[3]; - let url = ""; - if (typeof urlField === "string") { - url = urlField; - } else if (Array.isArray(urlField)) { - const firstHttp = urlField.find( - (u: unknown) => typeof u === "string" && /^https?:\/\//.test(u) - ); - url = typeof firstHttp === "string" ? firstHttp : ""; - } - if (!url || !/^https?:\/\//.test(url)) continue; - // Upgrade to full resolution unless a size directive is already present - // (googleusercontent size syntax: trailing `=s2048`, `=w1024-h512`, ...). - if (!/=[swh]\d+/.test(url)) url += "=s2048"; - if (seen.has(url)) continue; - seen.add(url); - urls.push(url); - } - } catch { - // Skip unparseable lines - } - } - return urls; -} - function readCredentialString(value: unknown): string { if (typeof value !== "string") return ""; const trimmed = value.trim(); @@ -572,52 +508,20 @@ export class GeminiWebExecutor extends BaseExecutor { const page = await context.newPage(); - // #10466: image mode — the /v1/images/generations handler sets - // x_gemini_web_image_mode. Generated images arrive in the candidate's - // extension block ([12][7][0]) of the StreamGenerate frames, sometimes - // only in a LATER frame of the stream (or a follow-up StreamGenerate - // call), so image mode captures every StreamGenerate response, merges - // image URLs across frames, and resolves as soon as one is found. - // Chat mode keeps the original first-response-only behavior. - const imageMode = (body as Record)?.x_gemini_web_image_mode === true; - // Capture first StreamGenerate response let responseText = ""; - const responseImages: string[] = []; let captured = false; const responsePromise = new Promise((resolve) => { page.on("response", async (resp: any) => { - if (!resp.url().includes("StreamGenerate")) return; - if (!imageMode && captured) return; - if (imageMode) { - // Image mode: merge text + image URLs across every frame and - // resolve as soon as an image appears (images can land in a - // later frame than the text). - try { - const raw = await resp.text(); - const text = parseStreamResponse(raw); - if (text) responseText = text; - for (const url of parseStreamResponseImages(raw)) { - if (!responseImages.includes(url)) responseImages.push(url); - } - } catch { - /* ignore unreadable frames */ - } - if (responseImages.length > 0) resolve(); - } else { - // Chat mode: byte-for-byte the original first-response capture — - // resolve even if reading the body throws, so the flow falls - // through to the "No response from Gemini" 502 instead of - // burning the full wait window. - captured = true; - try { - const raw = await resp.text(); - responseText = parseStreamResponse(raw); - } catch { - /* ignore */ - } - resolve(); + if (captured || !resp.url().includes("StreamGenerate")) return; + captured = true; + try { + const raw = await resp.text(); + responseText = parseStreamResponse(raw); + } catch { + /* ignore */ } + resolve(); }); }); @@ -636,36 +540,12 @@ export class GeminiWebExecutor extends BaseExecutor { await page.waitForTimeout(300); await page.keyboard.press("Enter"); - // Wait for response or timeout. Image generation (Nano Banana) is - // noticeably slower than text — the UI renders the asset only after - // the full generation completes — so image mode gets a wider window. - await Promise.race([responsePromise, page.waitForTimeout(imageMode ? 90000 : 30000)]); + // Wait for response or timeout + await Promise.race([responsePromise, page.waitForTimeout(30000)]); if (signal?.aborted) { throw signal.reason instanceof Error ? signal.reason : new Error("Request aborted"); } - // #10466 image mode: return the captured image URLs to the image - // handler via a custom field (same precedent as chatgpt-web's - // x_image_resolution_failed). An image-only answer can carry little or - // no text, so the empty-text 502 below must not fire when images - // were captured. - if (imageMode) { - await this.persistRotatedCookies(context, cookie, credentials, onCredentialsRefreshed, log); - const modelId = model || "gemini-2.5-pro"; - return { - response: new Response( - JSON.stringify({ - ...formatChatCompletion(responseText, modelId), - x_gemini_web_image_urls: responseImages, - }), - { status: 200, headers: { "Content-Type": "application/json" } } - ), - url: GEMINI_URL, - headers: {}, - transformedBody: body, - }; - } - if (!responseText) { return { response: new Response(JSON.stringify({ error: "No response from Gemini" }), { diff --git a/open-sse/executors/gitlab.ts b/open-sse/executors/gitlab.ts index b82d5c47aa..af30e85e40 100644 --- a/open-sse/executors/gitlab.ts +++ b/open-sse/executors/gitlab.ts @@ -657,7 +657,7 @@ export class GitlabExecutor extends BaseExecutor { // calling). When `tools` are present we serialize the tool contract into the // prompt and parse `{...}` blocks back out of the completion text // into OpenAI `tool_calls` — the same web-tool-emulation idiom used by the - // qwen-web / duckduckgo-web executors (#6051). + // duckduckgo-web executor (#6051). const { hasTools, requestedTools, effectiveMessages } = prepareToolMessages( bodyObj, rawMessages as Array<{ role: string; content: unknown }> diff --git a/open-sse/executors/gtts.ts b/open-sse/executors/gtts.ts index ad70feba9d..cac3da7d59 100644 --- a/open-sse/executors/gtts.ts +++ b/open-sse/executors/gtts.ts @@ -3,7 +3,7 @@ * * Reverse-engineered, unofficial, undocumented endpoint (not a published * Google public API) — the same class of integration this codebase already - * accepts for other "-web"/no-auth style providers (edgeTts.ts, chipotle.ts). + * accepts for other "-web"/no-auth style providers such as chipotle.ts. * No user account/API key is required. * * The issue's originally proposed endpoint diff --git a/open-sse/executors/hailuo-web.ts b/open-sse/executors/hailuo-web.ts deleted file mode 100644 index 7d1b839c26..0000000000 --- a/open-sse/executors/hailuo-web.ts +++ /dev/null @@ -1,546 +0,0 @@ -/** - * HailuoWebExecutor — Hailuo AI (MiniMax) web chat via chat.minimax.io. - * - * Distinct from the paid API-key `minimax`/`minimax-cn` providers - * (open-sse/config/providers/registry/minimax/) — this targets the free - * consumer chat product at chat.minimax.io. - * - * Endpoint: POST https://chat.minimax.io/v4/api/chat/msg? - * Auth: `token` header — value read from the site's `_token` localStorage - * entry, plus a per-request `yy` signature header. - * Body: multipart/form-data — characterID, msgContent, chatID, searchMode. - * Response: text/event-stream lines (`event:` / `data:`) carrying - * `send_result` (chat title + chatID, once) and `message_result` - * (cumulative — not delta — `content` field per event) until a - * `close_chunk` event ends the stream. - * - * Ported from the g4f reference implementation - * (g4f/Provider/needs_auth/mini_max/{HailuoAI,crypt}.py) — request signing - * (`generate_yy_header`/`get_body_to_yy`) and the SSE event shape are ported - * 1:1. The device-fingerprint fields (device_id, uuid, os/browser name, - * screen dims) are normally generated by the browser and stored in - * localStorage; when the user hasn't captured them, this executor derives - * stable per-connection values from the token via MD5 so the signature stays - * consistent across requests without server-side state. - * - * ⚠️ Not yet validated against a live hailuo.ai session — see PR description - * for the exact VPS live-check command that must be run before this is - * treated as fully verified. The host, API path, header shape, and signing - * scheme are ported directly from the (actively maintained) g4f source, but - * upstream reverse-engineered protocols can change without notice. - */ -import { createHash } from "node:crypto"; -import { BaseExecutor, type ExecuteInput } from "./base.ts"; -import { makeExecutorErrorResult as makeErrorResult, sanitizeErrorMessage } from "../utils/error.ts"; - -const BASE_URL = "https://chat.minimax.io"; -const API_PATH = "/v4/api/chat/msg"; -const USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"; -const DEFAULT_CHARACTER_ID = "1"; -const DEFAULT_CHAT_ID = "0"; - -type JsonRecord = Record; - -function asRecord(value: unknown): JsonRecord { - return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; -} - -function toStringOrEmpty(value: unknown): string { - return typeof value === "string" ? value.trim() : ""; -} - -function md5(input: string): string { - return createHash("md5").update(input, "utf8").digest("hex"); -} - -/** - * Percent-encode matching Python's `urllib.parse.quote(s, safe="")` — encode - * every byte except the always-safe RFC 3986 unreserved set (letters, - * digits, `_.-~`). `encodeURIComponent` leaves a few extra characters - * (`!*'()`) unescaped, so it is not a drop-in replacement for the upstream - * signature to match byte-for-byte. - */ -export function pyQuote(input: string): string { - const bytes = new TextEncoder().encode(input); - let out = ""; - for (const byte of bytes) { - const ch = String.fromCharCode(byte); - if (/[A-Za-z0-9_.\-~]/.test(ch)) { - out += ch; - } else { - out += `%${byte.toString(16).toUpperCase().padStart(2, "0")}`; - } - } - return out; -} - -/** Port of `get_body_to_yy()` from crypt.py. */ -export function getBodyToYy(characterID: string, msgContent: string, chatID: string): string { - const normalized = msgContent.replace(/\r\n/g, "").replace(/\n/g, "").replace(/\r/g, ""); - return md5(characterID) + md5(normalized) + md5(chatID) + md5(""); -} - -/** Port of `generate_yy_header()` from crypt.py. */ -export function generateYyHeader( - pathAndQuery: string, - bodyToYy: string, - timestampMs: number -): string { - const encodedPath = pyQuote(pathAndQuery); - const timeHash = md5(String(timestampMs)); - const combined = `${encodedPath}_${bodyToYy}${timeHash}ooui`; - return md5(combined); -} - -/** - * Derive a stable per-connection fingerprint id from the token when the user - * hasn't captured the real browser-generated value from localStorage. Pure - * function of the token, so it stays identical across requests without - * needing to persist any new state. - */ -function deriveFingerprintId(token: string, salt: string): string { - return md5(`${token}:${salt}`); -} - -export function buildHailuoPathAndQuery( - token: string, - providerSpecificData: unknown, - unixMs: number -): string { - const data = asRecord(providerSpecificData); - const deviceId = - toStringOrEmpty(data.device_id) || - toStringOrEmpty(data.deviceId) || - deriveFingerprintId(token, "device_id"); - const uuid = toStringOrEmpty(data.uuid) || deriveFingerprintId(token, "uuid"); - - const params = new URLSearchParams({ - device_platform: "web", - biz_id: "2", - app_id: "3001", - version_code: "22201", - lang: "en", - uuid, - device_id: deviceId, - os_name: toStringOrEmpty(data.os_name) || "Windows", - browser_name: toStringOrEmpty(data.browser_name) || "chrome", - cpu_core_num: toStringOrEmpty(data.cpu_core_num) || "8", - browser_language: toStringOrEmpty(data.browser_language) || "en-US", - browser_platform: toStringOrEmpty(data.browser_platform) || "Win32", - screen_width: toStringOrEmpty(data.screen_width) || "1920", - screen_height: toStringOrEmpty(data.screen_height) || "1080", - unix: String(unixMs), - }); - return `${API_PATH}?${params.toString()}`; -} - -type HailuoInputMessage = { - role: string; - content: unknown; - tool_calls?: unknown; -}; - -function textFromContent(content: unknown): string { - if (typeof content === "string") return content; - if (!Array.isArray(content)) { - throw new Error("Hailuo Web only supports text message content"); - } - return content - .map((part) => { - if (!part || typeof part !== "object" || Array.isArray(part)) { - throw new Error("Hailuo Web only supports text message content"); - } - const record = part as Record; - if ( - (record.type === "text" || record.type === "input_text") && - typeof record.text === "string" - ) { - return record.text; - } - throw new Error("Hailuo Web does not support image, audio, file, or tool content"); - }) - .join(""); -} - -/** Fold text-only OpenAI history into the single msgContent field Hailuo accepts. */ -export function foldHailuoMessages(messages: HailuoInputMessage[]): string { - const parts: string[] = []; - for (const message of messages) { - if (message.role === "tool" || message.role === "function") { - throw new Error("Hailuo Web does not support tool result messages"); - } - if (message.tool_calls !== undefined) { - throw new Error("Hailuo Web does not support assistant tool calls"); - } - const text = textFromContent(message.content); - if (!text) continue; - if (message.role === "system" || message.role === "developer") { - parts.push(`System: ${text}`); - } else if (message.role === "user") { - parts.push(parts.length > 0 ? `User: ${text}` : text); - } else if (message.role === "assistant") { - parts.push(`Assistant: ${text}`); - } else { - throw new Error(`Hailuo Web does not support message role ${message.role}`); - } - } - return parts.join("\n\n").trim(); -} - -export interface HailuoStreamState { - emittedLen: number; -} - -/** `message_result.content` is a cumulative snapshot, not a delta — diff it. */ -export function extractHailuoMessageDelta(content: string, state: HailuoStreamState): string { - if (typeof content !== "string" || content.length <= state.emittedLen) return ""; - const delta = content.slice(state.emittedLen); - state.emittedLen = content.length; - return delta; -} - -export type HailuoSseLine = - | { type: "event"; value: string } - | { type: "data"; value: unknown } - | null; - -/** Parse a single raw SSE line. Malformed/truncated `data:` lines are swallowed, not thrown. */ -export function parseHailuoLine(line: string): HailuoSseLine { - if (line.startsWith("event:")) { - return { type: "event", value: line.slice(6).trim() }; - } - if (line.startsWith("data:")) { - const raw = line.slice(5).trim(); - try { - return { type: "data", value: JSON.parse(raw) }; - } catch { - return null; - } - } - return null; -} - -export function extractHailuoMessageResultContent(data: unknown): string | null { - const root = asRecord(data); - const payload = asRecord(root.data); - const messageResult = asRecord(payload.messageResult); - return typeof messageResult.content === "string" ? messageResult.content : null; -} - -function openAiChunk(id: string, created: number, modelId: string, content: string): JsonRecord { - return { - id, - object: "chat.completion.chunk", - created, - model: modelId, - choices: [{ index: 0, delta: { content }, finish_reason: null }], - }; -} - -function openAiCompletion(id: string, created: number, modelId: string, content: string): JsonRecord { - return { - id, - object: "chat.completion", - created, - model: modelId, - choices: [{ index: 0, message: { role: "assistant", content }, finish_reason: "stop" }], - }; -} - -export class HailuoWebExecutor extends BaseExecutor { - constructor() { - super("hailuo-web", { id: "hailuo-web", baseUrl: BASE_URL }); - } - - private buildStreamHeaders(token: string, yy: string): Record { - return { - Accept: "text/event-stream", - "User-Agent": USER_AGENT, - Origin: BASE_URL, - Referer: `${BASE_URL}/`, - token, - yy, - }; - } - - private async streamToText( - upstream: Response, - onDelta: (delta: string) => void - ): Promise<{ ok: boolean; errorMessage?: string }> { - const reader = upstream.body?.getReader(); - if (!reader) return { ok: true }; - - const decoder = new TextDecoder(); - const state: HailuoStreamState = { emittedLen: 0 }; - let currentEvent = ""; - let buffer = ""; - - const processLine = (line: string): "continue" | "close" => { - const parsed = parseHailuoLine(line); - if (!parsed) return "continue"; - if (parsed.type === "event") { - currentEvent = parsed.value; - if (currentEvent === "close_chunk") return "close"; - return "continue"; - } - if (currentEvent === "message_result") { - const content = extractHailuoMessageResultContent(parsed.value); - if (content !== null) { - const delta = extractHailuoMessageDelta(content, state); - if (delta) onDelta(delta); - } - } - return "continue"; - }; - - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split(/\r?\n/); - buffer = lines.pop() || ""; - for (const line of lines) { - if (processLine(line) === "close") return { ok: true }; - } - } - if (buffer) processLine(buffer); - return { ok: true }; - } catch (error) { - return { - ok: false, - errorMessage: error instanceof Error ? error.message : "Hailuo stream read failed", - }; - } - } - - /** Validate tool/function-call fields and fold messages into a single msgContent string. */ - private prepareMsgContent(bodyObj: JsonRecord): { msgContent: string } | { error: string } { - const tools = bodyObj.tools; - const functions = bodyObj.functions; - if (tools != null && (!Array.isArray(tools) || tools.length > 0)) { - return { error: "Hailuo Web does not support OpenAI function tools" }; - } - if (functions != null && (!Array.isArray(functions) || functions.length > 0)) { - return { error: "Hailuo Web does not support legacy function tools" }; - } - try { - const messages = Array.isArray(bodyObj.messages) - ? (bodyObj.messages as HailuoInputMessage[]) - : []; - const msgContent = foldHailuoMessages(messages); - if (!msgContent) throw new Error("Hailuo Web requires a non-empty user message"); - return { msgContent }; - } catch (error) { - return { error: error instanceof Error ? error.message : "Invalid Hailuo Web request" }; - } - } - - /** Build the signed request: URL, headers, and the multipart form body. */ - private buildSignedRequest( - token: string, - providerSpecificData: unknown, - msgContent: string - ): { url: string; headers: Record; form: FormData } { - const now = Date.now(); - const pathAndQuery = buildHailuoPathAndQuery(token, providerSpecificData, now); - const psd = asRecord(providerSpecificData); - const characterID = toStringOrEmpty(psd.characterID) || DEFAULT_CHARACTER_ID; - const chatID = toStringOrEmpty(psd.chatID) || DEFAULT_CHAT_ID; - const bodyToYy = getBodyToYy(characterID, msgContent, chatID); - const yy = generateYyHeader(pathAndQuery, bodyToYy, now); - - const form = new FormData(); - form.set("characterID", characterID); - form.set("msgContent", msgContent); - form.set("chatID", chatID); - form.set("searchMode", "0"); - - return { url: `${BASE_URL}${pathAndQuery}`, headers: this.buildStreamHeaders(token, yy), form }; - } - - /** POST the signed multipart request and normalize both network + upstream-status errors. */ - private async dispatch( - url: string, - reqHeaders: Record, - form: FormData, - signal: AbortSignal | null | undefined, - body: unknown, - bodyObj: JsonRecord - ): Promise<{ upstream: Response } | { errorResult: ReturnType }> { - let upstream: Response; - try { - upstream = await fetch(url, { method: "POST", headers: reqHeaders, body: form, signal }); - } catch (err) { - return { - errorResult: { - ...makeErrorResult( - 502, - `Hailuo fetch failed: ${err instanceof Error ? err.message : "unknown"}`, - body, - url - ), - headers: reqHeaders, - transformedBody: bodyObj, - }, - }; - } - if (!upstream.ok) { - const errText = await upstream.text().catch(() => ""); - return { - errorResult: { - ...makeErrorResult( - upstream.status, - `Hailuo error: ${sanitizeErrorMessage(errText)}`, - body, - url - ), - headers: reqHeaders, - transformedBody: bodyObj, - }, - }; - } - return { upstream }; - } - - /** Buffer the SSE stream into a single OpenAI-shaped chat.completion response. */ - private async buildNonStreamingResponse( - upstream: Response, - id: string, - created: number, - modelId: string, - url: string, - reqHeaders: Record, - body: unknown, - bodyObj: JsonRecord - ) { - let answer = ""; - const result = await this.streamToText(upstream, (delta) => { - answer += delta; - }); - if (!result.ok) { - return { - ...makeErrorResult( - 502, - `Hailuo protocol error: ${sanitizeErrorMessage(result.errorMessage || "unknown")}`, - body, - url - ), - headers: reqHeaders, - transformedBody: bodyObj, - }; - } - return { - response: new Response(JSON.stringify(openAiCompletion(id, created, modelId, answer)), { - headers: { "Content-Type": "application/json" }, - }), - url, - headers: reqHeaders, - transformedBody: bodyObj, - }; - } - - private buildStreamingResponse( - upstream: Response, - id: string, - created: number, - modelId: string, - signal?: AbortSignal | null - ): ReadableStream { - const encoder = new TextEncoder(); - return new ReadableStream({ - start: async (controller) => { - let emittedRole = false; - const result = await this.streamToText(upstream, (delta) => { - if (!emittedRole) { - emittedRole = true; - controller.enqueue( - encoder.encode(`data: ${JSON.stringify(openAiChunk(id, created, modelId, ""))}\n\n`) - ); - } - controller.enqueue( - encoder.encode(`data: ${JSON.stringify(openAiChunk(id, created, modelId, delta))}\n\n`) - ); - }); - if (!result.ok) { - if (!signal?.aborted) { - controller.error(new Error(result.errorMessage || "Hailuo stream error")); - } else { - try { - controller.close(); - } catch { - /* already closed */ - } - } - return; - } - controller.enqueue( - encoder.encode( - `data: ${JSON.stringify({ - id, - object: "chat.completion.chunk", - created, - model: modelId, - choices: [{ index: 0, delta: {}, finish_reason: "stop" }], - })}\n\n` - ) - ); - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - controller.close(); - }, - }); - } - - async execute(input: ExecuteInput) { - const { body, credentials, signal, stream: wantStream } = input; - const bodyObj = asRecord(body); - - const token = toStringOrEmpty(credentials?.apiKey) || toStringOrEmpty(credentials?.accessToken); - if (!token) { - return makeErrorResult( - 401, - "Missing Hailuo _token — log in at hailuo.ai and capture _token from localStorage.", - body, - `${BASE_URL}${API_PATH}` - ); - } - - const prepared = this.prepareMsgContent(bodyObj); - if ("error" in prepared) { - return makeErrorResult(400, prepared.error, body, BASE_URL); - } - - const { url, headers: reqHeaders, form } = this.buildSignedRequest( - token, - credentials?.providerSpecificData, - prepared.msgContent - ); - - const dispatched = await this.dispatch(url, reqHeaders, form, signal, body, bodyObj); - if ("errorResult" in dispatched) return dispatched.errorResult; - const { upstream } = dispatched; - - const id = `chatcmpl-hailuo-${Date.now()}`; - const created = Math.floor(Date.now() / 1000); - const modelId = input.model || "hailuo"; - - if (wantStream) { - const outStream = this.buildStreamingResponse(upstream, id, created, modelId, signal); - return { - response: new Response(outStream, { - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - }, - }), - url, - headers: reqHeaders, - transformedBody: bodyObj, - }; - } - - return this.buildNonStreamingResponse(upstream, id, created, modelId, url, reqHeaders, body, bodyObj); - } -} diff --git a/open-sse/executors/index.ts b/open-sse/executors/index.ts index f0c57270bd..1c57c87e95 100644 --- a/open-sse/executors/index.ts +++ b/open-sse/executors/index.ts @@ -46,11 +46,9 @@ import { DeepSeekWebWithAutoRefreshExecutor } from "./deepseek-web-with-auto-ref import { AdaptaWebExecutor } from "./adapta-web.ts"; import { CopilotWebExecutor } from "./copilot-web.ts"; import { CopilotM365WebExecutor } from "./copilot-m365-web.ts"; -import { MicrosoftDesignerWebExecutor } from "./microsoft-designer-web.ts"; import { AdobeFireflyExecutor } from "./adobe-firefly.ts"; import { VeoAIFreeWebExecutor } from "./veoaifree-web.ts"; import { DuckDuckGoWebExecutor } from "./duckduckgo-web.ts"; -import { FeloWebExecutor } from "./felo-web.ts"; import { T3ChatWebExecutor } from "./t3-chat-web.ts"; import { ClaudeWebExecutor } from "./claude-web.ts"; import { InnerAiExecutor } from "./inner-ai.ts"; @@ -63,9 +61,6 @@ import { V0VercelWebExecutor } from "./v0-vercel-web.ts"; import { CheaperInferenceExecutor } from "./cheaperinference.ts"; import { KimiWebExecutor } from "./kimi-web.ts"; import { DoubaoWebExecutor } from "./doubao-web.ts"; -import { QwenWebExecutor } from "./qwen-web.ts"; -import { RaycastExecutor } from "./raycast.ts"; -import { HailuoWebExecutor } from "./hailuo-web.ts"; import { ZaiWebExecutor } from "./zai-web.ts"; import { KimiExecutor } from "./kimi.ts"; import { MoonshotExecutor } from "./moonshot.ts"; @@ -162,16 +157,12 @@ const executors = { "copilot-web": new CopilotWebExecutor(), "copilot-m365-web": new CopilotM365WebExecutor(), copilot: new CopilotWebExecutor(), // Alias - "microsoft-designer-web": new MicrosoftDesignerWebExecutor(), - msdesigner: new MicrosoftDesignerWebExecutor(), // Alias "adobe-firefly": new AdobeFireflyExecutor(), firefly: new AdobeFireflyExecutor(), // Alias "veoaifree-web": new VeoAIFreeWebExecutor(), "veo-free": new VeoAIFreeWebExecutor(), // Alias "duckduckgo-web": new DuckDuckGoWebExecutor(), ddgw: new DuckDuckGoWebExecutor(), // Alias - "felo-web": new FeloWebExecutor(), - felo: new FeloWebExecutor(), // Alias "t3-web": new T3ChatWebExecutor(), t3chat: new T3ChatWebExecutor(), // Alias "inner-ai": new InnerAiExecutor(), @@ -203,10 +194,6 @@ const executors = { cinf: new CheaperInferenceExecutor("cheaperinference"), // Alias "doubao-web": new DoubaoWebExecutor(), db: new DoubaoWebExecutor(), // Alias - "qwen-web": new QwenWebExecutor(), - raycast: new RaycastExecutor(), - rc: new RaycastExecutor(), // Alias - "hailuo-web": new HailuoWebExecutor(), "zai-web": new ZaiWebExecutor(), zw: new ZaiWebExecutor(), // Alias theoldllm: new TheOldLlmExecutor(), @@ -231,7 +218,6 @@ const executors = { xai: new XaiExecutor(), "xai-oauth": new XaiExecutor("xai-oauth"), xao: new XaiExecutor("xai-oauth"), - qw: new QwenWebExecutor(), // Alias "conol-web": new ConolWebExecutor(), cnl: new ConolWebExecutor(), // Alias }; @@ -331,11 +317,9 @@ export { DevinCliAgenticExecutor } from "./devin-cli-agentic.ts"; export { AuggieExecutor } from "./auggie.ts"; export { CopilotWebExecutor } from "./copilot-web.ts"; export { CopilotM365WebExecutor } from "./copilot-m365-web.ts"; -export { MicrosoftDesignerWebExecutor } from "./microsoft-designer-web.ts"; export { AdobeFireflyExecutor } from "./adobe-firefly.ts"; export { VeoAIFreeWebExecutor } from "./veoaifree-web.ts"; export { DuckDuckGoWebExecutor } from "./duckduckgo-web.ts"; -export { FeloWebExecutor } from "./felo-web.ts"; export { ClaudeWebExecutor } from "./claude-web.ts"; export { DeepSeekWebExecutor } from "./deepseek-web.ts"; export { DeepSeekWebWithAutoRefreshExecutor } from "./deepseek-web-with-auto-refresh.ts"; @@ -343,8 +327,6 @@ export { AdaptaWebExecutor } from "./adapta-web.ts"; export { YuanbaoWebExecutor } from "./yuanbao-web.ts"; export { T3ChatWebExecutor } from "./t3-chat-web.ts"; export { InnerAiExecutor } from "./inner-ai.ts"; -export { QwenWebExecutor } from "./qwen-web.ts"; -export { HailuoWebExecutor } from "./hailuo-web.ts"; export { TheOldLlmExecutor } from "./theoldllm.ts"; export { ChipotleExecutor } from "./chipotle.ts"; export { LMArenaExecutor } from "./lmarena.ts"; diff --git a/open-sse/executors/microsoft-designer-web.ts b/open-sse/executors/microsoft-designer-web.ts deleted file mode 100644 index d2ffab604d..0000000000 --- a/open-sse/executors/microsoft-designer-web.ts +++ /dev/null @@ -1,51 +0,0 @@ -// MicrosoftDesignerWebExecutor — chat-completions guard for the -// microsoft-designer-web web-cookie provider (#6672). -// -// Microsoft Designer (designerapp.officeapps.live.com/DallE.ashx) is an -// image-generation-only upstream: it has no chat/completions surface at all. -// The real request/response flow lives entirely in the image-generation -// handler (open-sse/handlers/imageGeneration/providers/designerWeb.ts), -// dispatched from open-sse/handlers/imageGeneration.ts by -// providerConfig.format === "designer-web" — NOT through getExecutor(). -// -// microsoft-designer-web is still listed in WEB_COOKIE_PROVIDERS (it uses -// the same unofficial, DevTools-sourced bearer-token credential UX and -// subscription-risk notice as the other web-cookie providers — see -// tests/unit/microsoft-designer-web-6672.test.ts). Without a registered -// executor here, getExecutor("microsoft-designer-web") silently falls -// through to DefaultExecutor's `PROVIDERS[provider] || PROVIDERS.openai` -// fallback (open-sse/executors/index.ts:176 comment, #6699) — which would -// send the user's real Designer bearer token to api.openai.com, mislabeled -// as an OpenAI request, if anything ever mis-routes a chat/completions call -// to this provider. -// -// This executor closes that gap cheaply: it never calls the network. Any -// chat/completions attempt against microsoft-designer-web is rejected -// immediately with a clean, sanitized 400 telling the caller to use -// /v1/images/generations instead — satisfying the executor wrapper -// contract (tests/unit/executor-web-cookie-sweep.test.ts) without ever -// forwarding credentials anywhere. -import { BaseExecutor, type ExecuteInput } from "./base.ts"; -import { makeExecutorErrorResult } from "../utils/error.ts"; - -const DESIGNER_WEB_BASE_URL = - "https://designerapp.officeapps.live.com/designerapp/DallE.ashx?action=GetDallEImagesCogSci"; - -export class MicrosoftDesignerWebExecutor extends BaseExecutor { - constructor() { - super("microsoft-designer-web", { id: "microsoft-designer-web", baseUrl: DESIGNER_WEB_BASE_URL }); - } - - async execute(_input: ExecuteInput) { - return makeExecutorErrorResult( - 400, - "microsoft-designer-web is an image-generation-only provider and does not support " + - "chat completions. Use POST /v1/images/generations with model " + - '"microsoft-designer-web/dall-e-3" instead.', - _input.body, - DESIGNER_WEB_BASE_URL - ); - } -} - -export default MicrosoftDesignerWebExecutor; diff --git a/open-sse/executors/qwen-web.ts b/open-sse/executors/qwen-web.ts deleted file mode 100644 index 4a312d7003..0000000000 --- a/open-sse/executors/qwen-web.ts +++ /dev/null @@ -1,498 +0,0 @@ -/** - * QwenWebExecutor — Alibaba Tongyi Qwen Chat via chat.qwen.ai (v2 API) - * - * Routes requests through Qwen's consumer chat API. The legacy v1 endpoint - * (`/api/chat/completions`) was retired upstream in 2026 and now answers 504 - * HTML from Alibaba's gateway for every request, regardless of credentials - * (#3288 / discussion #2768). The current contract is a two-step v2 flow: - * - * 1. POST /api/v2/chats/new → create a chat, returns chat_id - * 2. POST /api/v2/chat/completions?chat_id= → phase-based SSE stream - * - * The v2 endpoints sit behind Alibaba's "baxia" WAF, which requires the full - * browser cookie jar from a real logged-in session (cna, ssxmod_itna, - * ssxmod_itna2, token, ...). We therefore replay the captured/pasted Cookie - * header verbatim plus the bearer token, mirroring how grok-web replays its - * anti-bot cookies. - * - * SSE chunks carry `choices[0].delta` with a `phase` field: `think` / - * `thinking_summary` map to reasoning, `answer` (or a null phase) carries the - * assistant content. - * - * Reference implementations: gpt4free `g4f/Provider/Qwen.py`, - * Chat2API `proxy/adapters/qwen-ai.ts`. - * - * Auth: full Cookie header from chat.qwen.ai + bearer token (localStorage - * `token`, also mirrored to a `token` cookie). - * Format: OpenAI-compatible (translated from Qwen's phase protocol). - */ -import { BaseExecutor, type ExecuteInput } from "./base.ts"; -import { makeExecutorErrorResult as makeErrorResult } from "../utils/error.ts"; -import { prepareToolMessages, buildToolAwareResult } from "../translator/webTools.ts"; -import { buildQwenCookieHeader, extractQwenToken } from "@/lib/providers/webCookieAuth"; - -const BASE_URL = "https://chat.qwen.ai"; -const CHATS_NEW_URL = `${BASE_URL}/api/v2/chats/new`; -const CHAT_COMPLETIONS_URL = `${BASE_URL}/api/v2/chat/completions`; -const USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"; - -// Anti-bot headers the v2 endpoint expects. `bx-umidtoken` is normally minted -// per-session from sg-wum.alibaba.com; a captured value travels with the cookie -// jar, but we also send a static fallback so the header is always present. -const BX_VERSION = "2.5.36"; -const BX_UMIDTOKEN_FALLBACK = "T2gA0000000000000000000000000000000000000000"; - -// Qwen SPA version — required by the v2 chat completion endpoint. Without this -// header the upstream returns HTTP 200 with `{"success":false,"data":{"code":"Bad_Request"}}` -// for every completion request, even with a valid session. The version string is -// the SPA build identifier shipped in the React client's `version` request header. -// Pinned from a live capture (2026-08); bump if Qwen ships a breaking change. -const QWEN_SPA_VERSION = "0.2.81"; - -const MODEL_ALIASES: Record = { - // Legacy OmniRoute ids → current upstream catalog (GET /api/models). - "qwen-plus": "qwen3.7-plus", - "qwen-max": "qwen3.7-max", - "qwen-turbo": "qwen3.6-plus", - "qwen3-plus": "qwen3.7-plus", - "qwen3-max": "qwen3.7-max", - "qwen3-flash": "qwen3.6-plus", - "qwen3.8-max-preview": "qwen3.8-max", - // Note: `qwen3-coder-plus` is a real upstream model id (Qwen3-Coder) and - // must NOT be aliased — the previous `"qwen3-coder-plus": "qwen3.7-max"` - // entry silently rewrote valid coder requests to the wrong model. - "qwen3-coder-flash": "qwen3.6-plus", - qwen: "qwen3.7-max", - qwen3: "qwen3.7-max", -}; - -const DEFAULT_MODEL = "qwen3.7-max"; -const REQUIRED_THINKING_MODELS = new Set(["qwen3.8-max"]); - -function mapModel(modelId: string): string { - return MODEL_ALIASES[modelId] || modelId; -} - -function uuid(): string { - return crypto.randomUUID(); -} - -/** Detect Alibaba's WAF / retired-v1 gateway page so we never surface raw HTML. */ -function isWafResponse(status: number, contentType: string, bodyText: string): boolean { - if (contentType.includes("text/html")) return true; - if (status === 504) return true; - return /aliyun_waf|baxia| { - const headers: Record = { - "Content-Type": "application/json", - Accept: "*/*", - "User-Agent": USER_AGENT, - Origin: BASE_URL, - Referer: chatId ? `${BASE_URL}/c/${chatId}` : `${BASE_URL}/`, - source: "web", - version: QWEN_SPA_VERSION, - "x-request-id": uuid(), - "bx-v": BX_VERSION, - "bx-umidtoken": BX_UMIDTOKEN_FALLBACK, - }; - if (token) headers["Authorization"] = `Bearer ${token}`; - if (cookieHeader) headers["Cookie"] = cookieHeader; - return headers; - } - - async execute(input: ExecuteInput) { - const { body, credentials, signal, stream: wantStream } = input; - const bodyObj = (body || {}) as Record; - - const rawCred = String(credentials?.apiKey ?? "").trim(); - const cookieHeader = buildQwenCookieHeader(rawCred); - let token = extractQwenToken(rawCred); - if (!token && credentials?.accessToken) token = String(credentials.accessToken).trim(); - - const messages = (bodyObj.messages as Array<{ role: string; content: string }>) || []; - const requestedModel = (bodyObj.model as string) || DEFAULT_MODEL; - const modelId = mapModel(requestedModel); - - const { hasTools, requestedTools, effectiveMessages } = prepareToolMessages(bodyObj, messages); - - // Qwen Web is single-turn: fold the conversation into one user prompt. - const prompt = this.foldMessages(effectiveMessages); - - // ── Step 1: create a chat ──────────────────────────────────────────────── - let chatId: string; - try { - const newChatRes = await fetch(CHATS_NEW_URL, { - method: "POST", - headers: this.buildApiHeaders(token, cookieHeader), - body: JSON.stringify({ - title: "New Chat", - models: [modelId], - chat_mode: "normal", - chat_type: "t2t", - timestamp: Date.now(), - }), - signal, - }); - - const ct = newChatRes.headers.get("content-type") || ""; - if (!newChatRes.ok || ct.includes("text/html")) { - const text = await newChatRes.text().catch(() => ""); - if (isWafResponse(newChatRes.status, ct, text)) { - return makeErrorResult(401, WAF_ERROR_MESSAGE, body, CHATS_NEW_URL); - } - return makeErrorResult( - newChatRes.status || 502, - `Qwen create-chat failed: ${text.slice(0, 300)}`, - body, - CHATS_NEW_URL - ); - } - - const data = (await newChatRes.json()) as { data?: { id?: string } }; - chatId = data?.data?.id ?? ""; - if (!chatId) { - return makeErrorResult(502, "Qwen create-chat returned no chat id", body, CHATS_NEW_URL); - } - } catch (err) { - return makeErrorResult( - 502, - `Qwen create-chat error: ${err instanceof Error ? err.message : "unknown"}`, - body, - CHATS_NEW_URL - ); - } - - // ── Step 2: send the message ───────────────────────────────────────────── - const completionUrl = `${CHAT_COMPLETIONS_URL}?chat_id=${chatId}`; - const msgPayload = this.buildMessagePayload(chatId, modelId, prompt, requestedModel); - - let upstream: Response; - try { - upstream = await fetch(completionUrl, { - method: "POST", - headers: this.buildApiHeaders(token, cookieHeader, chatId), - body: JSON.stringify(msgPayload), - signal, - }); - } catch (err) { - return makeErrorResult( - 502, - `Qwen completion fetch failed: ${err instanceof Error ? err.message : "unknown"}`, - body, - completionUrl - ); - } - - const ct = upstream.headers.get("content-type") || ""; - if (!upstream.ok || ct.includes("text/html")) { - const errText = await upstream.text().catch(() => ""); - if (isWafResponse(upstream.status, ct, errText)) { - return makeErrorResult(401, WAF_ERROR_MESSAGE, body, completionUrl); - } - return makeErrorResult( - upstream.status || 502, - `Qwen error: ${errText.slice(0, 300)}`, - body, - completionUrl - ); - } - - if (!wantStream) { - const { content } = await this.collectStream(upstream); - const finalText = content; - - if (hasTools) { - const { - content: toolContent, - toolCalls, - finishReason, - } = buildToolAwareResult(finalText, requestedTools, "qwen"); - const message: Record = { role: "assistant", content: toolContent }; - if (toolCalls) { - message.tool_calls = toolCalls; - message.content = null; - } - return this.jsonResponse(modelId, message, finishReason, completionUrl, msgPayload); - } - - return this.jsonResponse( - modelId, - { role: "assistant", content: finalText }, - "stop", - completionUrl, - msgPayload - ); - } - - // Streaming: transform Qwen phase SSE → OpenAI chat.completion.chunk SSE. - const stream = this.buildClientStream(upstream, modelId, hasTools, requestedTools, signal); - return { - response: new Response(stream, { - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - }, - }), - url: completionUrl, - headers: this.buildApiHeaders(token, cookieHeader, chatId), - transformedBody: msgPayload, - }; - } - - /** Flatten OpenAI-style content (string | Array<{type,text}>) into plain text. - * A bare String() on an array of content parts yields "[object Object]" — the - * serialization bug reported on the support mesh. */ - private contentToText(content: unknown): string { - if (typeof content === "string") return content; - if (Array.isArray(content)) { - return content - .map((part) => { - if (typeof part === "string") return part; - if (part && typeof part === "object") { - const p = part as { type?: unknown; text?: unknown }; - if (typeof p.text === "string") return p.text; - } - return ""; - }) - .filter(Boolean) - .join("\n"); - } - return content == null ? "" : String(content); - } - - private foldMessages(messages: Array<{ role: string; content: unknown }>): string { - let systemContent = ""; - let userContent = ""; - for (const m of messages) { - const text = this.contentToText(m.content); - if (m.role === "system") { - systemContent += (systemContent ? "\n\n" : "") + text; - } else if (m.role === "user") { - userContent = text; - } - } - return systemContent ? `${systemContent}\n\nUser: ${userContent}` : userContent; - } - - private buildMessagePayload( - chatId: string, - modelId: string, - prompt: string, - requestedModel: string - ): Record { - const fid = uuid(); - const enableThinking = - REQUIRED_THINKING_MODELS.has(modelId) || /think|reason|r1/i.test(requestedModel); - const featureConfig: Record = { - thinking_enabled: enableThinking, - output_schema: "phase", - auto_thinking: enableThinking, - research_mode: "normal", - auto_search: false, - }; - return { - stream: true, - incremental_output: true, - chat_id: chatId, - chat_mode: "normal", - model: modelId, - parent_id: null, - messages: [ - { - fid, - parentId: null, - childrenIds: [], - role: "user", - content: prompt, - user_action: "chat", - files: [], - timestamp: Math.floor(Date.now() / 1000), - models: [modelId], - chat_type: "t2t", - feature_config: featureConfig, - sub_chat_type: "t2t", - parent_id: null, - }, - ], - }; - } - - /** Read the whole upstream SSE stream, returning the joined answer + reasoning. */ - private async collectStream(upstream: Response): Promise<{ content: string; reasoning: string }> { - const reader = upstream.body?.getReader(); - const decoder = new TextDecoder(); - let content = ""; - let reasoning = ""; - if (!reader) return { content, reasoning }; - - let buffer = ""; - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split("\n"); - buffer = lines.pop() || ""; - for (const line of lines) { - const delta = parseSseDelta(line); - if (!delta) continue; - if (delta.kind === "answer") content += delta.text; - else if (delta.kind === "think") reasoning += delta.text; - } - } - } catch { - /* upstream closed mid-stream — return what we have */ - } - return { content, reasoning }; - } - - /** Transform the Qwen phase SSE into OpenAI chat.completion.chunk SSE. */ - private buildClientStream( - upstream: Response, - modelId: string, - hasTools: boolean, - requestedTools: unknown, - signal: AbortSignal | null | undefined - ): ReadableStream { - const encoder = new TextEncoder(); - const decoder = new TextDecoder(); - const id = `chatcmpl-qwen-${Date.now()}`; - const created = Math.floor(Date.now() / 1000); - const emitChunk = (delta: Record, finishReason: string | null) => - `data: ${JSON.stringify({ - id, - object: "chat.completion.chunk", - created, - model: modelId, - choices: [{ index: 0, delta, finish_reason: finishReason }], - })}\n\n`; - - return new ReadableStream({ - async start(controller) { - const reader = upstream.body?.getReader(); - if (!reader) { - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - controller.close(); - return; - } - let buffer = ""; - let fullContent = ""; - controller.enqueue(encoder.encode(emitChunk({ role: "assistant", content: "" }, null))); - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split("\n"); - buffer = lines.pop() || ""; - for (const line of lines) { - const delta = parseSseDelta(line); - if (!delta || !delta.text) continue; - if (delta.kind === "answer") { - fullContent += delta.text; - if (!hasTools) { - controller.enqueue(encoder.encode(emitChunk({ content: delta.text }, null))); - } - } else if (delta.kind === "think" && !hasTools) { - controller.enqueue( - encoder.encode(emitChunk({ reasoning_content: delta.text }, null)) - ); - } - } - } - } catch (err) { - if (!signal?.aborted) { - controller.error(err); - return; - } - } - - if (hasTools) { - const { content, toolCalls, finishReason } = buildToolAwareResult( - fullContent, - requestedTools, - "qwen" - ); - const delta = toolCalls - ? { role: "assistant", content: null, tool_calls: toolCalls } - : { role: "assistant", content }; - controller.enqueue(encoder.encode(emitChunk(delta, null))); - controller.enqueue(encoder.encode(emitChunk({}, finishReason))); - } else { - controller.enqueue(encoder.encode(emitChunk({}, "stop"))); - } - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - controller.close(); - }, - }); - } - - private jsonResponse( - modelId: string, - message: Record, - finishReason: string, - url: string, - transformedBody: unknown - ) { - return { - response: new Response( - JSON.stringify({ - id: `chatcmpl-qwen-${Date.now()}`, - object: "chat.completion", - created: Math.floor(Date.now() / 1000), - model: modelId, - choices: [{ index: 0, message, finish_reason: finishReason }], - }), - { headers: { "Content-Type": "application/json" } } - ), - url, - headers: {} as Record, - transformedBody, - }; - } -} - -/** Parse one SSE line into a typed delta, or null if it carries no content. */ -function parseSseDelta(line: string): { kind: "answer" | "think"; text: string } | null { - if (!line.startsWith("data:")) return null; - const payload = line.slice(5).trim(); - if (!payload || payload === "[DONE]") return null; - let parsed: { - choices?: Array<{ delta?: { phase?: string | null; content?: unknown } }>; - }; - try { - parsed = JSON.parse(payload); - } catch { - return null; - } - const delta = parsed?.choices?.[0]?.delta; - if (!delta) return null; - const phase = delta.phase; - const content = typeof delta.content === "string" ? delta.content : ""; - if (phase === "think" || phase === "thinking_summary") { - return { kind: "think", text: content }; - } - // `answer` phase or a null/absent phase both carry assistant content. - if (phase === "answer" || phase === null || phase === undefined) { - return { kind: "answer", text: content }; - } - return null; -} diff --git a/open-sse/executors/raycast.ts b/open-sse/executors/raycast.ts deleted file mode 100644 index bfa8d28028..0000000000 --- a/open-sse/executors/raycast.ts +++ /dev/null @@ -1,235 +0,0 @@ -/** - * @file raycast.ts - * @description Executor for Raycast Pro AI (reverse-engineered backend.raycast.com API). - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast Pro local-dev executor - */ - -import { BaseExecutor, mergeUpstreamExtraHeaders, type ProviderCredentials } from "./base.ts"; -import { PROVIDERS } from "../config/constants.ts"; -import { sanitizeErrorMessage } from "../utils/error.ts"; -import { - RAYCAST_CHAT_URL, - buildRaycastChatBody, - buildRaycastHeaders, - parseRaycastSseText, -} from "../services/raycast.ts"; - -type JsonRecord = Record; -type ChatMessage = { role?: string; content?: unknown }; - -export class RaycastExecutor extends BaseExecutor { - constructor() { - super("raycast", PROVIDERS.raycast); - } - - buildUrl(): string { - return RAYCAST_CHAT_URL; - } - - // Not a BaseExecutor.buildHeaders override: Raycast signs headers over the exact - // request payload (2nd param is the body string, not the base's `stream` boolean), - // and execute() below is fully custom — keep it as a distinct helper so a - // polymorphic buildHeaders(credentials, true) call can never land here. - private buildRaycastRequestHeaders( - credentials: ProviderCredentials, - payload?: string - ): Record { - const body = payload || "{}"; - return buildRaycastHeaders(body, credentials as JsonRecord); - } - - async execute({ model, body, stream, credentials, signal, upstreamExtraHeaders }) { - const reqBody = body as { messages?: ChatMessage[]; temperature?: number }; - let payload: string; - - try { - payload = buildRaycastChatBody(model as string, reqBody.messages || [], reqBody.temperature); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - return { - response: new Response( - JSON.stringify({ - error: { - message: sanitizeErrorMessage(message), - type: "invalid_request_error", - code: "", - }, - }), - { status: 400, headers: { "Content-Type": "application/json" } } - ), - url: RAYCAST_CHAT_URL, - headers: {}, - transformedBody: body, - }; - } - - const headers = this.buildRaycastRequestHeaders(credentials as ProviderCredentials, payload); - mergeUpstreamExtraHeaders(headers, upstreamExtraHeaders as Record | null); - - let raycastResponse: Response; - try { - raycastResponse = await fetch(RAYCAST_CHAT_URL, { - method: "POST", - headers, - body: payload, - signal: signal || undefined, - }); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - return { - response: new Response( - JSON.stringify({ - error: { message: sanitizeErrorMessage(message), type: "api_error", code: "" }, - }), - { status: 502, headers: { "Content-Type": "application/json" } } - ), - url: RAYCAST_CHAT_URL, - headers, - transformedBody: payload, - }; - } - - if (!raycastResponse.ok) { - const errorText = await raycastResponse.text(); - return { - response: new Response( - JSON.stringify({ - error: { - message: sanitizeErrorMessage(`Raycast API error (${raycastResponse.status})`), - type: "api_error", - code: String(raycastResponse.status), - }, - }), - { status: raycastResponse.status, headers: { "Content-Type": "application/json" } } - ), - url: RAYCAST_CHAT_URL, - headers, - transformedBody: payload, - }; - } - - const responseId = `chatcmpl-raycast-${Date.now()}`; - const created = Math.floor(Date.now() / 1000); - const modelId = model as string; - - if (stream !== false) { - const raycastBody = raycastResponse.body; - if (!raycastBody) { - return { - response: new Response( - JSON.stringify({ - error: { message: "Raycast returned empty stream body", type: "api_error", code: "" }, - }), - { status: 502, headers: { "Content-Type": "application/json" } } - ), - url: RAYCAST_CHAT_URL, - headers, - transformedBody: payload, - }; - } - - const sseStream = new ReadableStream({ - async start(controller) { - const encoder = new TextEncoder(); - const reader = raycastBody.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - buffer += decoder.decode(value, { stream: true }); - let newlineIndex: number; - while ((newlineIndex = buffer.indexOf("\n")) >= 0) { - const line = buffer.slice(0, newlineIndex).trim(); - buffer = buffer.slice(newlineIndex + 1); - if (!line.startsWith("data:")) continue; - - try { - const data = JSON.parse(line.slice(5).trim()) as { - text?: string; - finish_reason?: string | null; - complete?: boolean; - }; - const hasContent = typeof data.text === "string" && data.text.length > 0; - const hasFinishReason = - data.finish_reason !== undefined && data.finish_reason !== null; - if (data.complete || (!hasContent && !hasFinishReason)) continue; - - const chunk = { - id: responseId, - object: "chat.completion.chunk", - created, - model: modelId, - choices: [ - { - index: 0, - delta: { content: data.text || "" }, - finish_reason: hasFinishReason ? data.finish_reason : null, - }, - ], - }; - controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`)); - } catch { - // Ignore malformed SSE data. - } - } - } - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - controller.close(); - } catch (err) { - controller.error(err); - } - }, - }); - - return { - response: new Response(sseStream, { - status: 200, - headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", - }, - }), - url: RAYCAST_CHAT_URL, - headers, - transformedBody: payload, - }; - } - - const responseText = await raycastResponse.text(); - const content = parseRaycastSseText(responseText); - - return { - response: new Response( - JSON.stringify({ - id: responseId, - object: "chat.completion", - created, - model: modelId, - choices: [ - { - index: 0, - message: { role: "assistant", content, refusal: null }, - finish_reason: "stop", - }, - ], - usage: { - prompt_tokens: 0, - completion_tokens: 0, - total_tokens: 0, - }, - }), - { status: 200, headers: { "Content-Type": "application/json" } } - ), - url: RAYCAST_CHAT_URL, - headers, - transformedBody: payload, - }; - } -} diff --git a/open-sse/handlers/audioSpeech.ts b/open-sse/handlers/audioSpeech.ts index 9dc499a1e4..80b1c98ee1 100644 --- a/open-sse/handlers/audioSpeech.ts +++ b/open-sse/handlers/audioSpeech.ts @@ -22,7 +22,6 @@ import { buildAuthHeaders } from "../config/registryUtils.ts"; import { kieExecutor } from "../executors/kie.ts"; import { vertexGenerateSpeech } from "../executors/vertexMedia.ts"; import { handleAwsPollySpeech } from "../executors/awsPollyTts.ts"; -import { handleEdgeTtsSpeech } from "../executors/edgeTts.ts"; import { GttsUpstreamError, normalizeGttsLang, synthesizeGtts } from "../executors/gtts.ts"; import { errorResponse } from "../utils/error.ts"; import { resolveElevenLabsVoiceId } from "./elevenLabsVoiceMap.ts"; @@ -843,7 +842,6 @@ export async function handleAudioSpeech({ credentials, resolvedProvider = null, resolvedModel = null, - clientIp = null, }) { if (!body.model) { return errorResponse(400, "model is required"); @@ -865,7 +863,7 @@ export async function handleAudioSpeech({ if (!providerConfig) { return errorResponse( 400, - `No speech provider found for model "${body.model}". Use format provider/model. Available: openai, hyperbolic, deepgram, nvidia, elevenlabs, huggingface, inworld, cartesia, fishaudio, playht, kie, aws-polly, xiaomi-mimo, edgetts, gtts, coqui, tortoise, qwen` + `No speech provider found for model "${body.model}". Use format provider/model. Available: openai, hyperbolic, deepgram, nvidia, elevenlabs, huggingface, inworld, cartesia, fishaudio, playht, kie, aws-polly, xiaomi-mimo, gtts, coqui, tortoise, qwen` ); } @@ -938,10 +936,6 @@ export async function handleAudioSpeech({ return handleAwsPollySpeech(providerConfig, body, modelId, token, credentials); } - if (providerConfig.format === "edgetts") { - return handleEdgeTtsSpeech(body, clientIp); - } - if (providerConfig.format === "gtts") { return handleGttsSpeech(body); } diff --git a/open-sse/handlers/imageGeneration.ts b/open-sse/handlers/imageGeneration.ts index fde2f4a403..d003989996 100644 --- a/open-sse/handlers/imageGeneration.ts +++ b/open-sse/handlers/imageGeneration.ts @@ -50,10 +50,8 @@ import { extractMarkdownImageUrls, CHATGPT_WEB_IMAGE_ID_RE, } from "./imageGeneration/providers/chatgptWeb.ts"; -import { handleGeminiWebImageGeneration } from "./imageGeneration/providers/geminiWeb.ts"; import { handleNvidiaNimImageGeneration } from "./imageGeneration/providers/nvidiaNim.ts"; import { handleSegmindImageGeneration } from "./imageGeneration/providers/segmind.ts"; -import { handleDesignerWebImageGeneration } from "./imageGeneration/providers/designerWeb.ts"; import { handleCursorAgentImageGeneration } from "./imageGeneration/providers/cursorAgentImage.ts"; import { handleMinimaxImageGeneration } from "./imageGeneration/providers/minimax.ts"; import { handleAdobeFireflyImageGeneration } from "./imageGeneration/providers/adobeFirefly.ts"; @@ -521,19 +519,6 @@ export async function handleImageGeneration({ }); } - // #10466: Gemini Web session image generation (Nano Banana) - if (providerConfig.format === "gemini-web") { - return handleGeminiWebImageGeneration({ - model, - provider, - body, - credentials, - log, - signal, - clientHeaders, - }); - } - if (providerConfig.format === "cursor-agent-image") { return handleCursorAgentImageGeneration({ model, @@ -546,17 +531,6 @@ export async function handleImageGeneration({ }); } - if (providerConfig.format === "designer-web") { - return handleDesignerWebImageGeneration({ - model, - provider, - providerConfig, - body, - credentials, - log, - }); - } - if (providerConfig.format === "adobe-firefly-image") { return handleAdobeFireflyImageGeneration({ model, diff --git a/open-sse/handlers/imageGeneration/providers/designerWeb.ts b/open-sse/handlers/imageGeneration/providers/designerWeb.ts deleted file mode 100644 index f362eecd14..0000000000 --- a/open-sse/handlers/imageGeneration/providers/designerWeb.ts +++ /dev/null @@ -1,301 +0,0 @@ -// Microsoft Designer (unofficial, reverse-engineered web API) image handler. -// Family: designer-web | Provider: microsoft-designer-web -// Reference: g4f/Provider/needs_auth/MicrosoftDesigner.py (fetched + verified -// during triage of #6672) — Bearer access_token auth against -// designerapp.officeapps.live.com/designerapp/DallE.ashx, submit-then-poll -// for image_urls_thumbnail[].ImageUrl. -// -// The upstream ClientId header is a fixed, publicly-shared value the -// designer.microsoft.com frontend sends on every session (not a secret) — -// routed through resolvePublicCred() per Hard Rule #11 / docs/security/PUBLIC_CREDS.md. - -import { randomUUID, randomBytes } from "node:crypto"; -import { resolvePublicCred } from "../../../utils/publicCreds.ts"; -import { sanitizeErrorMessage } from "../../../utils/error.ts"; -import { saveImageErrorResult, saveImageSuccessResult } from "../../imageGeneration.ts"; - -const DESIGNER_WEB_POLL_TIMEOUT_MS_DEFAULT = 60000; -const DESIGNER_WEB_POLL_INTERVAL_MS_DEFAULT = 2000; -const DESIGNER_WEB_BATCH_SIZE = "4"; - -/** Maps an OpenAI-style "WxH" size string to the closest Designer aspect ratio bucket. */ -export function mapDesignerWebImageSize(size: unknown): "1_1" | "16_9" | "9_16" { - if (typeof size !== "string" || !size.includes("x")) return "1_1"; - const [wRaw, hRaw] = size.split("x"); - const w = Number(wRaw); - const h = Number(hRaw); - if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) return "1_1"; - if (w > h * 1.2) return "16_9"; - if (h > w * 1.2) return "9_16"; - return "1_1"; -} - -/** Builds the fixed + per-request headers Microsoft Designer expects on every call. */ -export function buildDesignerWebHeaders({ - accessToken, - sessionId = randomUUID(), - userId = randomBytes(16).toString("hex"), -}: { - accessToken: string; - sessionId?: string; - userId?: string; -}): Record { - return { - Authorization: `Bearer ${accessToken}`, - ClientId: resolvePublicCred("microsoft_designer_client_id"), - SessionId: sessionId, - UserId: userId, - "Content-Type": "application/x-www-form-urlencoded", - }; -} - -/** Builds the DallE.ashx form body from an OpenAI-shaped image-generation request. */ -export function buildDesignerWebFormBody(prompt: string, size: unknown): URLSearchParams { - const params = new URLSearchParams(); - params.set("dalle-caption", prompt); - params.set("dalle-image-size", mapDesignerWebImageSize(size)); - params.set("dalle-batch-size", DESIGNER_WEB_BATCH_SIZE); - params.set("dalle-seed", String(Math.floor(Math.random() * 1_000_000_000))); - return params; -} - -interface DesignerWebParsedResponse { - status: "ready" | "pending" | "empty"; - imageUrls: string[]; - pollIntervalMs: number | null; -} - -/** Parses a DallE.ashx JSON body into a ready/pending/empty verdict. */ -export function parseDesignerWebResponse(json: unknown): DesignerWebParsedResponse { - const body = (json ?? {}) as Record; - const thumbs = Array.isArray(body.image_urls_thumbnail) ? body.image_urls_thumbnail : []; - const imageUrls = thumbs - .map((t) => (t && typeof t === "object" ? (t as Record).ImageUrl : null)) - .filter((u): u is string => typeof u === "string" && u.length > 0); - - if (imageUrls.length > 0) { - return { status: "ready", imageUrls, pollIntervalMs: null }; - } - - const pollingMeta = (body.polling_response as Record | undefined) - ?.polling_meta_data as Record | undefined; - const pollIntervalMs = Number.isFinite(pollingMeta?.poll_interval) - ? Number(pollingMeta?.poll_interval) - : null; - - if (pollIntervalMs !== null) { - return { status: "pending", imageUrls: [], pollIntervalMs }; - } - - return { status: "empty", imageUrls: [], pollIntervalMs: null }; -} - -function normalizePositiveNumber(value: unknown, fallback: number): number { - const n = Number(value); - return Number.isFinite(n) && n > 0 ? n : fallback; -} - -interface DesignerWebRequestConfig { - prompt: string; - accessToken: string; - headers: Record; - formBody: URLSearchParams; - timeoutMs: number; - pollIntervalMs: number; -} - -/** - * Outcome of request validation. String-discriminated rather than `ok: boolean` - * because `open-sse` compiles with `strictNullChecks: false`, where a - * boolean-literal discriminant narrows the positive branch but leaves the - * negative one as the full union — so `if (!resolved.ok)` would not expose - * `status`/`error`. All three unions in this file shared that root cause. - */ -type DesignerWebRequestResolution = - | { state: "resolved"; config: DesignerWebRequestConfig } - | { state: "invalid"; status: number; error: string }; - -/** Validates the request and resolves auth + poll timing. Returns an error status/message on failure. */ -function resolveDesignerWebRequest( - body: { prompt?: unknown; size?: unknown; timeout_ms?: unknown; poll_interval_ms?: unknown }, - credentials: { apiKey?: string; accessToken?: string } -): DesignerWebRequestResolution { - const prompt = typeof body.prompt === "string" ? body.prompt.trim() : ""; - if (!prompt) { - return { - state: "invalid", - status: 400, - error: "Prompt is required for Microsoft Designer image generation", - }; - } - - const accessToken = credentials?.apiKey || credentials?.accessToken; - if (!accessToken) { - return { - state: "invalid", - status: 401, - error: "Microsoft Designer credentials missing access_token", - }; - } - - const timeoutMs = normalizePositiveNumber( - body.timeout_ms, - normalizePositiveNumber( - process.env.DESIGNER_WEB_POLL_TIMEOUT_MS, - DESIGNER_WEB_POLL_TIMEOUT_MS_DEFAULT - ) - ); - const pollIntervalMs = normalizePositiveNumber( - body.poll_interval_ms, - normalizePositiveNumber( - process.env.DESIGNER_WEB_POLL_INTERVAL_MS, - DESIGNER_WEB_POLL_INTERVAL_MS_DEFAULT - ) - ); - - return { - state: "resolved", - config: { - prompt, - accessToken, - headers: buildDesignerWebHeaders({ accessToken }), - formBody: buildDesignerWebFormBody(prompt, body.size), - timeoutMs, - pollIntervalMs, - }, - }; -} - -type DesignerWebPending = { state: "pending"; waitMs: number }; -type DesignerWebReady = { state: "ready"; imageUrls: string[] }; -type DesignerWebFailed = { state: "failed"; status: number; error: string }; - -/** One poll cycle: still working, finished with images, or finished with an error. */ -type DesignerWebStepResult = DesignerWebPending | DesignerWebReady | DesignerWebFailed; - -/** - * What the poll loop hands back. Deliberately excludes the pending arm — the - * loop either returns a terminal step or synthesizes a 504, and never surfaces - * `pending` to its caller. The previous signature admitted it, which is why - * `outcome.success` did not exist on every member of that union. - */ -type DesignerWebOutcome = DesignerWebReady | DesignerWebFailed; - -/** Runs one submit/poll fetch cycle and classifies the outcome. */ -async function stepDesignerWebPoll( - baseUrl: string, - headers: Record, - formBody: URLSearchParams, - pollIntervalMs: number, - fetchImpl: typeof fetch -): Promise { - const resp = await fetchImpl(baseUrl, { method: "POST", headers, body: formBody }); - - if (!resp.ok) { - return { - state: "failed", - status: resp.status, - error: sanitizeErrorMessage(await resp.text()), - }; - } - - const parsed = parseDesignerWebResponse(await resp.json()); - - if (parsed.status === "ready") { - return { state: "ready", imageUrls: parsed.imageUrls }; - } - if (parsed.status === "empty") { - return { - state: "failed", - status: 502, - error: "Microsoft Designer response did not contain image data or polling metadata", - }; - } - return { - state: "pending", - waitMs: Math.min(parsed.pollIntervalMs ?? pollIntervalMs, pollIntervalMs), - }; -} - -/** Drives the submit-then-poll loop to completion, timeout, or a terminal error. */ -async function runDesignerWebPollLoop( - baseUrl: string, - config: DesignerWebRequestConfig, - fetchImpl: typeof fetch, - log?: { info?: (...args: unknown[]) => void } -): Promise { - const deadline = Date.now() + config.timeoutMs; - let attempt = 0; - - while (Date.now() < deadline) { - attempt += 1; - const step = await stepDesignerWebPoll( - baseUrl, - config.headers, - config.formBody, - config.pollIntervalMs, - fetchImpl - ); - if (step.state !== "pending") return step; - log?.info?.("IMAGE", `designer-web pending, poll #${attempt} in ${step.waitMs}ms`); - await new Promise((resolve) => setTimeout(resolve, step.waitMs)); - } - - return { - state: "failed", - status: 504, - error: "Microsoft Designer image generation timed out waiting for a result", - }; -} - -export async function handleDesignerWebImageGeneration({ - model, - provider, - providerConfig, - body, - credentials, - log, - fetchImpl = fetch, -}: { - model: string; - provider: string; - providerConfig: { baseUrl: string }; - body: { prompt?: unknown; size?: unknown; timeout_ms?: unknown; poll_interval_ms?: unknown }; - credentials: { apiKey?: string; accessToken?: string }; - log?: { info?: (...args: unknown[]) => void; error?: (...args: unknown[]) => void }; - fetchImpl?: typeof fetch; -}) { - const startTime = Date.now(); - const resolved = resolveDesignerWebRequest(body, credentials); - if (resolved.state === "invalid") { - return saveImageErrorResult({ - provider, - model, - status: resolved.status, - startTime, - error: resolved.error, - }); - } - - try { - const outcome = await runDesignerWebPollLoop(providerConfig.baseUrl, resolved.config, fetchImpl, log); - if (outcome.state === "ready") { - return saveImageSuccessResult({ - provider, - model, - startTime, - images: outcome.imageUrls.map((url) => ({ url })), - }); - } - if (log?.error) { - log.error("IMAGE", `${provider} designer-web error ${outcome.status}: ${outcome.error}`); - } - return saveImageErrorResult({ provider, model, status: outcome.status, startTime, error: outcome.error }); - } catch (err) { - const errorText = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); - if (log?.error) { - log.error("IMAGE", `${provider} designer-web exception: ${errorText}`); - } - return saveImageErrorResult({ provider, model, status: 500, startTime, error: errorText }); - } -} diff --git a/open-sse/handlers/imageGeneration/providers/geminiWeb.ts b/open-sse/handlers/imageGeneration/providers/geminiWeb.ts deleted file mode 100644 index 8f131fe83d..0000000000 --- a/open-sse/handlers/imageGeneration/providers/geminiWeb.ts +++ /dev/null @@ -1,229 +0,0 @@ -// Gemini Web image generation handler (#10466). -// -// Exposes the gemini-web session provider through POST /v1/images/generations. -// Follows the chatgpt-web precedent (./chatgptWeb.ts): the web-session chat -// executor is driven with an image-generation prompt, and the generated -// assets are extracted from the response. -// -// Transport: GeminiWebExecutor in image mode (x_gemini_web_image_mode). The -// executor types the prompt into gemini.google.com, captures every -// StreamGenerate frame, and returns generated-image URLs in the custom -// `x_gemini_web_image_urls` field. URLs point at lh3.googleusercontent.com -// with a `=s2048` full-resolution size directive; they are public (no -// cookies needed to fetch them). -// -// Prompting: the web UI only GENERATES images when the prompt uses a -// generation verb ("generate"/"create"/"draw"); otherwise it answers with -// web-search thumbnails. The prompt builder therefore always leads with an -// explicit generation directive (corroborated by gemini-webapi's docs). - -import { GeminiWebExecutor } from "../../../executors/gemini-web.ts"; -import { fetchRemoteImage } from "@/shared/network/remoteImageFetch"; -import { saveImageErrorResult, saveImageSuccessResult } from "../../imageGeneration.ts"; -import { sanitizeErrorMessage } from "../../../utils/error.ts"; - -/** Each image is one gemini.google.com turn (~30-60s). Cap like chatgpt-web. */ -const GEMINI_WEB_IMAGE_N_MAX = 4; - -export function buildGeminiWebImagePrompt(body: Record): string { - const prompt = String(body.prompt || "").trim(); - const details: string[] = [ - `Generate an image for this prompt: ${prompt}`, - "Use the image generation model. Do not search the web for existing images.", - ]; - if (typeof body.size === "string" && body.size.trim()) { - details.push(`Requested aspect/size: ${body.size.trim()}.`); - } - if (typeof body.style === "string" && body.style.trim()) { - details.push(`Requested style: ${body.style.trim()}.`); - } - return details.join("\n"); -} - -/** - * #10494: the underlying GeminiWebExecutor's browser-automation catch paths - * classify an expired/blocked Gemini Web session as HTTP 400 ("the session - * is so expired it lands on a different page" — see gemini-web.ts's - * Playwright selector/click-timeout branch, #9407) or HTTP 500 (its generic - * automation-failure catch-all, which covers a blocked/CAPTCHA/login page - * this handler has no further way to inspect). Both statuses previously - * passed straight through to executeImageWithCredentialFallback, which only - * advances to another account on a plain 401 — so an expired/blocked - * session never triggered account fallback, contrary to #10466's - * acceptance criteria ("Expired or blocked sessions ... can fall back - * normally inside an image Combo"). HTTP 503 (missing Playwright browser — - * a host/config problem, not a per-account issue) is intentionally excluded, - * as is the local 401 this handler already returns before any account is - * selected (missing session cookie — handled by the 401 path already). - */ -export function isExpiredOrBlockedGeminiWebSession(status: number): boolean { - return status === 400 || status === 500; -} - -export async function handleGeminiWebImageGeneration({ - model, - provider, - body, - credentials, - log, - signal, - clientHeaders, - // Injectable so unit tests can drive the handler without a live Gemini - // session; production uses the real executor. - executorFactory = () => new GeminiWebExecutor(), - // Injectable for tests; production fetches the public googleusercontent URL. - imageFetcher = fetchRemoteImage, -}: { - model: string; - provider: string; - body: Record; - credentials: Record | null | undefined; - log: { - info: (scope: string, message: string) => void; - warn: (scope: string, message: string) => void; - error: (scope: string, message: string) => void; - } | null; - signal?: AbortSignal | null; - clientHeaders?: Record | null; - executorFactory?: () => { - execute: (input: Record) => Promise<{ response: Response }>; - }; - imageFetcher?: (url: string) => Promise<{ buffer: Buffer; contentType: string }>; -}) { - const startTime = Date.now(); - const prompt = typeof body.prompt === "string" ? body.prompt.trim() : ""; - if (!prompt) { - return saveImageErrorResult({ - provider, - model, - status: 400, - startTime, - error: "Prompt is required for Gemini Web image generation", - }); - } - - if (!credentials?.apiKey) { - return saveImageErrorResult({ - provider, - model, - status: 401, - startTime, - error: "Gemini Web credentials missing session cookie", - }); - } - - const rawCount = Number.isInteger(body.n) && (body.n as number) > 0 ? (body.n as number) : 1; - if (rawCount > GEMINI_WEB_IMAGE_N_MAX) { - return saveImageErrorResult({ - provider, - model, - status: 400, - startTime, - error: `Gemini Web image generation supports n=1..${GEMINI_WEB_IMAGE_N_MAX} (got ${rawCount}); each n is a separate ~30-60s web turn.`, - }); - } - const requestedCount = rawCount; - if (log && requestedCount > 1) { - log.warn( - "IMAGE", - `Gemini Web returns image(s) per chat turn; requested n=${requestedCount} will run sequentially` - ); - } - - const wantsBase64 = body.response_format === "b64_json"; - const images: Array<{ url?: string; b64_json?: string }> = []; - const requestBody = { - model, - prompt: prompt.slice(0, 500), - size: body.size || undefined, - n: requestedCount, - }; - - for (let i = 0; i < requestedCount; i++) { - const executor = executorFactory(); - const result = await executor.execute({ - model, - body: { - messages: [{ role: "user", content: buildGeminiWebImagePrompt(body) }], - x_gemini_web_image_mode: true, - }, - stream: false, - credentials, - signal, - log, - clientHeaders, - }); - - const responseText = await result.response.text(); - if (result.response.status >= 400) { - return saveImageErrorResult({ - provider, - model, - status: result.response.status, - startTime, - error: responseText, - requestBody, - retryable: isExpiredOrBlockedGeminiWebSession(result.response.status), - }); - } - - let content = ""; - let urls: string[] = []; - try { - const json = JSON.parse(responseText); - content = String(json?.choices?.[0]?.message?.content || ""); - urls = Array.isArray(json?.x_gemini_web_image_urls) - ? (json.x_gemini_web_image_urls as unknown[]).filter( - (u): u is string => typeof u === "string" && /^https?:\/\//.test(u) - ) - : []; - } catch { - content = responseText; - } - - if (urls.length === 0) { - // Distinguish "refused / no image produced" from a transport failure: - // the executor returns 200 with an empty URL list when the model - // answered with text only (e.g. a policy refusal or a web-search - // answer instead of generation). Surface the assistant text so the - // caller can see WHY nothing was generated. - return saveImageErrorResult({ - provider, - model, - status: 502, - startTime, - error: `Gemini Web completed without generating an image. Assistant text: ${content.slice(0, 300) || "(empty)"}`, - requestBody, - }); - } - - for (const url of urls) { - if (!wantsBase64) { - images.push({ url }); - continue; - } - try { - const fetched = await imageFetcher(url); - images.push({ b64_json: fetched.buffer.toString("base64") }); - } catch (err) { - return saveImageErrorResult({ - provider, - model, - status: 502, - startTime, - error: `Gemini Web generated an image but OmniRoute could not download it for b64_json conversion: ${sanitizeErrorMessage(err instanceof Error ? err.message : String(err))}`, - requestBody, - }); - } - } - } - - return saveImageSuccessResult({ - provider, - model, - startTime, - requestBody, - responseBody: { images_count: images.length }, - images, - }); -} diff --git a/open-sse/mcp-server/README.md b/open-sse/mcp-server/README.md index 4a01ff0a5b..0ad5b2255a 100644 --- a/open-sse/mcp-server/README.md +++ b/open-sse/mcp-server/README.md @@ -1,6 +1,6 @@ # OmniRoute MCP Server -> **Model Context Protocol server** that exposes OmniRoute's gateway intelligence as **107 tools** for AI agents. +> **Model Context Protocol server** that exposes OmniRoute's gateway intelligence as **110 tools** for AI agents. > > **Source of truth for the full tool catalog and REST surface:** [`docs/frameworks/MCP-SERVER.md`](../../docs/frameworks/MCP-SERVER.md). This README focuses on architecture, configuration, and integration examples; the catalog below is a summary subset. @@ -20,7 +20,7 @@ The MCP Server allows any AI agent (Claude Desktop, Cursor, VS Code Copilot, cus ┌──────────────────────────────────────────────────────────────────┐ │ OmniRoute MCP Server │ │ ┌──────────────┐ ┌─────────────────┐ ┌────────────────────┐ │ -│ │ Scope │ │ 107 MCP Tools │ │ Audit Logger │ │ +│ │ Scope │ │ 110 MCP Tools │ │ Audit Logger │ │ │ │ Enforcement │──│ (core + memory │──│ (SHA-256/SQLite) │ │ │ │ │ │ + skills + …) │ │ │ │ │ └──────────────┘ └────────┬────────┘ └────────────────────┘ │ diff --git a/open-sse/services/autoCombo/virtualFactory.ts b/open-sse/services/autoCombo/virtualFactory.ts index e3dbac4d73..9eaa5bb82d 100644 --- a/open-sse/services/autoCombo/virtualFactory.ts +++ b/open-sse/services/autoCombo/virtualFactory.ts @@ -212,8 +212,8 @@ const SYNTHETIC_NOAUTH_CONNECTION_ID = RESILIENCE_NOAUTH_CONNECTION_ID; // Allowlist of no-auth (keyless) providers permitted to enter the `auto`/`auto-*` // candidate pool. Narrowed to the backends verified to answer without any -// configuration on our reference egress (VPS .15): `opencode` and `felo-web` -// both return 200 there, while duckduckgo-web (429/VQD rate limit), theoldllm +// configuration on our reference egress (VPS .15): `opencode` returns 200 +// there, while duckduckgo-web (429/VQD rate limit), theoldllm // (403 Vercel egress block), chipotle (502), aihorde (401, anon key rejected) // and the others are unreliable. The excluded providers stay fully usable via // direct `/` calls — they are just kept OUT of auto-routing until @@ -227,7 +227,7 @@ const SYNTHETIC_NOAUTH_CONNECTION_ID = RESILIENCE_NOAUTH_CONNECTION_ID; // pool, so it admits any no-auth backend that genuinely serves the family (e.g. // auggie, a local CLI subprocess with zero HTTP egress, belongs in auto/glm // regardless of this list). See the `bypassAllowlist` param below. -const AUTO_COMBO_NOAUTH_ALLOWLIST = new Set(["opencode", "felo-web"]); +const AUTO_COMBO_NOAUTH_ALLOWLIST = new Set(["opencode"]); function isChatAutoComboNoAuthProvider( providerDef: NoAuthProviderDefinition, diff --git a/open-sse/services/modelDeprecation.ts b/open-sse/services/modelDeprecation.ts index 90ac077b1d..fb99b98bf8 100644 --- a/open-sse/services/modelDeprecation.ts +++ b/open-sse/services/modelDeprecation.ts @@ -41,7 +41,7 @@ const BUILT_IN_ALIASES: Record = { "kimi-k2": "moonshotai/Kimi-K2", // Qwen — the model ships only under the `-preview` id (bailian-coding-plan, qoder, - // qwen-cloud-token-plan, qwen-web). Without this, the bare id missed MODEL_SPECS and + // qwen-cloud-token-plan). Without this, the bare id missed MODEL_SPECS and // the context preflight fell back to contextManager's `default: 128000`, rejecting // prompts the model's real 1M window accepts. Drop this line if Alibaba ever ships a // distinct GA `qwen3.8-max` — it would no longer be the same model. diff --git a/open-sse/services/raycast.ts b/open-sse/services/raycast.ts deleted file mode 100644 index 801f2bf77a..0000000000 --- a/open-sse/services/raycast.ts +++ /dev/null @@ -1,280 +0,0 @@ -/** - * @file raycast.ts - * @description Raycast Pro AI reverse-engineered protocol (backend.raycast.com). - * Ported from szcharlesji/raycast-relay (Node, 2026-06) — V2 HMAC + V1 JWT signatures. - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast Pro local-dev provider protocol - */ - -import { createHmac, createHash, randomUUID } from "node:crypto"; - -import { resolvePublicCred } from "../utils/publicCreds.ts"; - -export const RAYCAST_CHAT_URL = "https://backend.raycast.com/api/v1/ai/chat_completions"; -export const RAYCAST_MODELS_URL = "https://backend.raycast.com/api/v1/ai/models"; -export const RAYCAST_DEFAULT_USER_AGENT = "Raycast/1.104.20 (macOS Version 26.5.1 (Build 25F80))"; -export const RAYCAST_DEFAULT_EXPERIMENTAL = "chatBranching, mcpHTTPServer"; - -/** - * Community-extracted default; override via providerSpecificData.sigSecret or - * RAYCAST_SIG_SECRET. Embedded through resolvePublicCred() per Hard Rule #11 — - * a public upstream credential must never be a string literal in the source - * (see docs/security/PUBLIC_CREDS.md). - */ -export const RAYCAST_DEFAULT_SIG_SECRET = resolvePublicCred( - "raycast_sig_secret", - "RAYCAST_SIG_SECRET" -); - -export type RaycastCredentials = { - accessToken?: string; - providerSpecificData?: { - deviceId?: string; - aid?: string; - sigSecret?: string; - userAgent?: string; - experimental?: string; - }; -}; - -export type RaycastModelEntry = { - id: string; - model: string; - name: string; - provider: string; - requires_better_ai?: boolean; - availability?: string; -}; - -type ChatMessage = { role?: string; content?: unknown }; - -export function rot13rot5(input: string): string { - return input.replace(/[A-Za-z0-9]/g, (char) => { - const code = char.charCodeAt(0); - if (code >= 65 && code <= 90) return String.fromCharCode(((code - 65 + 13) % 26) + 65); - if (code >= 97 && code <= 122) return String.fromCharCode(((code - 97 + 13) % 26) + 97); - return String.fromCharCode(((code - 48 + 5) % 10) + 48); - }); -} - -export function signatureV2( - timestamp: string, - deviceId: string, - payload: string, - secret: string -): string { - const bodyHash = createHash("sha256").update(payload).digest("hex"); - const message = [timestamp, deviceId, bodyHash].map(rot13rot5).join("."); - return createHmac("sha256", secret).update(message).digest("hex"); -} - -function base64UrlJson(value: Record): string { - return Buffer.from(JSON.stringify(value)).toString("base64url"); -} - -export function raycastJwt(aid: string, secret: string): string { - const iat = Date.now() / 1000; - const header = base64UrlJson({ typ: "JWT", alg: "HS256" }); - const payload = base64UrlJson({ aid, exp: iat + 60, iat }); - const signature = createHmac("sha256", secret).update(`${header}.${payload}`).digest("base64url"); - return `${header}.${payload}.${signature}`; -} - -export function decodeAidFromRaycastJwt(jwt: string): string | null { - const parts = jwt.trim().split("."); - if (parts.length < 2) return null; - try { - const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8")) as { - aid?: string; - }; - return payload.aid || null; - } catch { - return null; - } -} - -export function resolveRaycastSecrets(credentials: RaycastCredentials): { - bearerToken: string; - deviceId: string; - aid: string; - sigSecret: string; -} { - const psd = credentials.providerSpecificData || {}; - const bearerToken = (credentials.accessToken || "").trim(); - const deviceId = (psd.deviceId || "").trim(); - const aid = (psd.aid || deviceId || "").trim(); - const sigSecret = ( - psd.sigSecret || - process.env.RAYCAST_SIG_SECRET || - RAYCAST_DEFAULT_SIG_SECRET - ).trim(); - - if (!bearerToken) throw new Error("Raycast bearer token is required"); - if (!deviceId) throw new Error("Raycast device ID is required"); - if (!sigSecret) throw new Error("Raycast signature secret is required"); - - return { bearerToken, deviceId, aid, sigSecret }; -} - -export function buildRaycastHeaders( - payload: string, - credentials: RaycastCredentials -): Record { - const { bearerToken, deviceId, aid, sigSecret } = resolveRaycastSecrets(credentials); - const psd = credentials.providerSpecificData || {}; - const timestamp = Math.floor(Date.now() / 1000).toString(); - - return { - Accept: "application/json", - Authorization: `Bearer ${bearerToken}`, - "X-Raycast-Timestamp": timestamp, - "Accept-Language": "en-US,en;q=0.9", - "X-Raycast-DeviceId": deviceId, - "Content-Type": "application/json", - "X-Raycast-Signature-v2": signatureV2(timestamp, deviceId, payload, sigSecret), - "X-Raycast-Experimental": psd.experimental || RAYCAST_DEFAULT_EXPERIMENTAL, - "X-Raycast-Signature": raycastJwt(aid, sigSecret), - "User-Agent": psd.userAgent || RAYCAST_DEFAULT_USER_AGENT, - }; -} - -export function contentToText(content: unknown): string { - if (typeof content === "string") return content; - if (!Array.isArray(content)) return JSON.stringify(content ?? ""); - - return content - .map((part) => { - if (typeof part === "string") return part; - if ( - part && - typeof part === "object" && - "type" in part && - (part as { type?: string }).type === "text" - ) { - return String((part as { text?: string }).text || ""); - } - return ""; - }) - .filter(Boolean) - .join("\n"); -} - -export function convertOpenAiMessages(messages: ChatMessage[]): { - raycastMessages: Array<{ author: string; content: { text: string } }>; - systemInstruction: string; -} { - let systemInstruction = "markdown"; - const raycastMessages: Array<{ author: string; content: { text: string } }> = []; - - for (const [index, message] of messages.entries()) { - if (message.role === "system" && index === 0) { - systemInstruction = contentToText(message.content); - continue; - } - - if (message.role === "user" || message.role === "assistant") { - raycastMessages.push({ - author: message.role, - content: { text: contentToText(message.content) }, - }); - } - } - - return { raycastMessages, systemInstruction }; -} - -export function inferProviderInfo(modelId: string): { provider: string; model: string } { - if (modelId.startsWith("openai_o1-")) { - return { provider: "openai", model: modelId.slice("openai_o1-".length) }; - } - - const providers = [ - "anthropic", - "baseten", - "google", - "groq", - "mistral", - "openai", - "perplexity", - "raycast", - "together", - "xai", - ]; - - for (const provider of providers) { - const prefix = `${provider}-`; - if (modelId.startsWith(prefix)) { - return { provider, model: modelId.slice(prefix.length) }; - } - } - - if (modelId.includes("/")) return { provider: "baseten", model: modelId }; - return { provider: "openai", model: modelId || "gpt-5-mini" }; -} - -export function buildRaycastChatBody( - modelId: string, - messages: ChatMessage[], - temperature?: number -): string { - const { provider, model } = inferProviderInfo(modelId); - const { raycastMessages, systemInstruction } = convertOpenAiMessages(messages); - - if (raycastMessages.length === 0) { - throw new Error("Raycast requires at least one user or assistant message"); - } - - return JSON.stringify({ - model, - provider, - messages: raycastMessages, - system_instruction: systemInstruction, - temperature: temperature ?? 0.5, - additional_system_instructions: "", - debug: false, - locale: "en-US", - source: "ai_chat", - thread_id: randomUUID(), - tools: [], - }); -} - -export function parseRaycastSseText(responseText: string): string { - let fullText = ""; - - for (const line of responseText.split("\n")) { - if (!line.startsWith("data:")) continue; - try { - const data = JSON.parse(line.slice(5).trim()) as { text?: string }; - if (data.text) fullText += data.text; - } catch { - // Ignore non-JSON SSE lines. - } - } - - return fullText; -} - -export async function fetchRaycastModels( - credentials: RaycastCredentials, - options?: { includePremium?: boolean; includeDeprecated?: boolean } -): Promise { - const payload = "{}"; - const headers = buildRaycastHeaders(payload, credentials); - const res = await fetch(RAYCAST_MODELS_URL, { method: "GET", headers }); - if (!res.ok) { - const text = await res.text(); - throw new Error(`Raycast models error [${res.status}]: ${text.slice(0, 300)}`); - } - - const data = (await res.json()) as { models?: RaycastModelEntry[] }; - const includePremium = options?.includePremium ?? true; - const includeDeprecated = options?.includeDeprecated ?? true; - - return (data.models || []).filter((model) => { - if (!includePremium && model.requires_better_ai) return false; - if (!includeDeprecated && model.availability === "deprecated") return false; - return true; - }); -} diff --git a/open-sse/services/speechCombo.ts b/open-sse/services/speechCombo.ts index 1d73337784..efbb7c13b3 100644 --- a/open-sse/services/speechCombo.ts +++ b/open-sse/services/speechCombo.ts @@ -24,7 +24,6 @@ import { handleAudioSpeech } from "@omniroute/open-sse/handlers/audioSpeech.ts"; import { attachOmniRouteMetaToResponse } from "@/domain/omnirouteResponseMeta"; import { generateRequestId } from "@/shared/utils/requestId"; import { calculateModalCost } from "@/lib/usage/costCalculator"; -import { getClientIpFromRequest } from "@/lib/ipUtils"; import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; import { errorResponse } from "@omniroute/open-sse/utils/error.ts"; @@ -80,7 +79,6 @@ export async function executeSpeechCombo( ); } - const clientIp = getClientIpFromRequest(auth.request); let lastError: { status: number; error: string } | null = null; let fallbackCount = 0; @@ -129,7 +127,6 @@ export async function executeSpeechCombo( credentials, resolvedProvider: providerConfig, resolvedModel, - clientIp, }); if (response?.ok) { diff --git a/open-sse/services/tokenExtractionConfig.ts b/open-sse/services/tokenExtractionConfig.ts index 8ffc7af921..e4345285bc 100644 --- a/open-sse/services/tokenExtractionConfig.ts +++ b/open-sse/services/tokenExtractionConfig.ts @@ -163,28 +163,6 @@ const RAW_CONFIGS: TokenExtractionConfig[] = [ { cookieDomain: ".deepseek.com" } ), - // ── Qwen Web ────────────────────────────────────────────── - // The v2 API sits behind Alibaba's "baxia" WAF, which needs the full browser - // cookie jar (cna + ssxmod_itna/itna2 + token), not just the bearer token. - // Capture the WAF cookies alongside the localStorage token (#3288). - config( - "qwen-web", - "Qwen Web (Tongyi)", - "https://chat.qwen.ai/", - "https://chat.qwen.ai", - [ - { type: "localStorage", key: "token" }, - { type: "cookie", name: "token", domain: ".chat.qwen.ai" }, - { type: "cookie", name: "cna", domain: ".chat.qwen.ai" }, - { type: "cookie", name: "ssxmod_itna", domain: ".chat.qwen.ai" }, - { type: "cookie", name: "ssxmod_itna2", domain: ".chat.qwen.ai" }, - { type: "cookie", name: "XSRF_TOKEN", domain: ".chat.qwen.ai" }, - ], - "Log in to Qwen at chat.qwen.ai using your Alibaba account. The session token and the " + - "Alibaba WAF cookies (cna, ssxmod_itna) will be extracted — all are required by the v2 API.", - { cookieDomain: ".chat.qwen.ai" } - ), - // ── Kimi Web ────────────────────────────────────────────── config( "kimi-web", diff --git a/open-sse/utils/publicCreds.ts b/open-sse/utils/publicCreds.ts index ad915e4ce2..af2de6c6c3 100644 --- a/open-sse/utils/publicCreds.ts +++ b/open-sse/utils/publicCreds.ts @@ -172,29 +172,12 @@ const EMBEDDED_DEFAULTS = { openference_id: [0, 0, 0, 0, 0, 0, 0, 0, 0], // Trae Cloud IDE — public oauth client id trae_id: [10, 3, 95, 6, 10, 22, 66, 3, 11, 90, 72, 31, 91, 2], - // Microsoft Designer web app — public ClientId header sent by the - // designer.microsoft.com frontend to designerapp.officeapps.live.com - // (not a secret — every browser session sends the same fixed value; - // reverse-engineered from the g4f MicrosoftDesigner provider reference). - microsoft_designer_client_id: [ - 13, 88, 13, 91, 68, 89, 65, 21, 72, 26, 21, 76, 0, 65, 93, 2, 26, 23, 28, 87, 14, 87, 8, 95, 12, - 17, 70, 6, 24, 66, 17, 1, 10, 95, 81, 28, - ], // Microsoft 365 Copilot web (m365.cloud.microsoft) — public SPA client id // observed in browser tokens and M365-Copilot2API. Not a per-user secret. m365_oauth_client_id: [ 12, 93, 15, 11, 74, 12, 16, 77, 72, 72, 73, 20, 82, 65, 93, 81, 72, 65, 28, 13, 93, 88, 93, 95, 92, 70, 16, 81, 31, 66, 17, 4, 88, 88, 5, 28, ], - // Microsoft Edge Read Aloud (EdgeTTS) — public "trusted client token" used to - // derive the Sec-MS-GEC anti-abuse header. Hardcoded in every known Edge - // browser build and every open-source edge-tts reimplementation (e.g. - // rany2/edge-tts constants.py) — not a per-user secret, just an - // abuse-mitigation constant Microsoft ships in public client binaries. - edgetts_token: [ - 89, 44, 91, 40, 51, 94, 49, 64, 32, 108, 54, 51, 86, 41, 80, 37, 111, 69, 6, 42, 95, 93, 45, 68, - 87, 65, 77, 84, 105, 70, 51, 86, - ], // Adobe Firefly web (firefly.adobe.com) — public x-api-key + IMS client_id // (`clio-playground-web`). Captured from live browser generate/discovery calls. // Not a per-user secret; every Firefly SPA session sends the same value. @@ -206,15 +189,6 @@ const EMBEDDED_DEFAULTS = { // Firefly credits balance endpoint public x-api-key (`SunbreakWebUI1`) from // GET firefly.adobe.io/v1/credits/balance browser traffic. adobe_firefly_balance_api_key: [60, 24, 0, 11, 0, 10, 20, 31, 50, 72, 18, 32, 43, 93], - // Raycast Pro V2 request-signature secret (#8895). Community-extracted from the - // public Raycast macOS client — the SAME value ships to every install, so it is - // public by design, not a per-user credential. Overridable via RAYCAST_SIG_SECRET - // or providerSpecificData.sigSecret. - raycast_sig_secret: [ - 89, 15, 13, 93, 71, 90, 65, 67, 86, 24, 71, 67, 1, 9, 91, 0, 73, 64, 87, 88, 93, 90, 91, 68, 12, - 20, 18, 3, 21, 70, 66, 3, 13, 11, 1, 72, 69, 87, 88, 95, 87, 88, 17, 94, 20, 67, 92, 27, 72, 68, - 3, 10, 92, 6, 21, 21, 84, 95, 14, 15, 88, 70, 95, 77, - ], } as const; export type EmbeddedDefaultKey = keyof typeof EMBEDDED_DEFAULTS; diff --git a/package.json b/package.json index cf08e93b61..6ba7746853 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "omniroute", "version": "3.8.50", - "description": "Unified AI router with 350 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.", + "description": "Unified AI router with 346 providers, RTK+Caveman compression, auto fallback, MCP/A2A, desktop, PWA, and OpenAI-compatible APIs.", "type": "module", "bin": { "omniroute": "bin/omniroute.mjs", diff --git a/scripts/quality/verify-ratchet-bank.mjs b/scripts/quality/verify-ratchet-bank.mjs index 73f2089710..abd8a89506 100644 --- a/scripts/quality/verify-ratchet-bank.mjs +++ b/scripts/quality/verify-ratchet-bank.mjs @@ -63,7 +63,7 @@ export function verifyFrozenMap(before = {}, after = {}, label = "frozen") { if (typeof prev !== "number") { // note key if (!has) problems.push(`${label}: note "${key}" was deleted — notes must be preserved`); - else if (after[key] !== prev) + else if (!jsonEqual(after[key], prev)) problems.push(`${label}: note "${key}" was rewritten — notes must be preserved verbatim`); continue; } diff --git a/scripts/raycast/extract-credentials.mjs b/scripts/raycast/extract-credentials.mjs deleted file mode 100644 index 44d3866239..0000000000 --- a/scripts/raycast/extract-credentials.mjs +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env node -/** - * @file extract-credentials.mjs - * @description Print Raycast Pro credentials from local macOS install (redacted preview). - * - * Usage: node scripts/raycast/extract-credentials.mjs - * - * @changes - * - [2026-07-27] [Composer] - CLI credential extractor for local Raycast - */ - -import { execFileSync } from "node:child_process"; -import { createHash } from "node:crypto"; -import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmdirSync, unlinkSync } from "node:fs"; -import { homedir, tmpdir } from "node:os"; -import { join } from "node:path"; - -const RAYCAST_SALT = "yvkwWXzxPPBAqY2tmaKrB*DvYjjMaeEf"; -const RAYCAST_SUPPORT = join(homedir(), "Library", "Application Support", "com.raycast.macos"); -const RAYCAST_DB = join(RAYCAST_SUPPORT, "raycast-enc.sqlite"); - -function redact(s, keep = 8) { - if (!s || s.length <= keep * 2) return "***"; - return `${s.slice(0, keep)}…${s.slice(-4)}`; -} - -function readKeychain(account) { - return JSON.parse( - execFileSync("security", ["find-generic-password", "-s", "Raycast", "-a", account, "-w"], { - encoding: "utf-8", - }).trim() - ); -} - -function dbPassphrase() { - const keyHex = execFileSync( - "security", - ["find-generic-password", "-s", "Raycast", "-a", "database_key", "-w"], - { encoding: "utf-8" } - ).trim(); - return createHash("sha256") - .update(keyHex + RAYCAST_SALT) - .digest("hex"); -} - -function queryDb(sql) { - const tmpDir = mkdtempSync(join(tmpdir(), "raycast-extract-")); - const tmpDb = join(tmpDir, "db.sqlite"); - copyFileSync(RAYCAST_DB, tmpDb); - for (const ext of ["-wal", "-shm"]) { - const src = RAYCAST_DB + ext; - if (existsSync(src)) copyFileSync(src, tmpDb + ext); - } - const passphrase = dbPassphrase(); - const input = `PRAGMA key = '${passphrase}';\n.mode json\n${sql}`; - const out = execFileSync("sqlcipher", [tmpDb], { input, encoding: "utf-8" }); - for (const ext of ["", "-wal", "-shm"]) { - try { - unlinkSync(tmpDb + ext); - } catch {} - } - try { - rmdirSync(tmpDir); - } catch {} - const jsonStr = out.startsWith("ok\n") ? out.slice(3) : out; - return JSON.parse(jsonStr.trim() || "[]"); -} - -if (process.platform !== "darwin") { - console.error("macOS only"); - process.exit(1); -} - -const store = readKeychain("raycast-store_credentials"); -const token = store?.oauth?.access_token; -if (!token) { - console.error("No Raycast bearer token in Keychain — open Raycast and sign in"); - process.exit(1); -} - -const users = queryDb("SELECT analyticsId, email, username, hasProFeatures, hasBetterAI FROM user LIMIT 1;"); -const user = users[0] || {}; -const deviceId = - user.analyticsId || - JSON.parse(readFileSync(join(RAYCAST_SUPPORT, "posthog.distinctId"), "utf-8"))["posthog.distinctId"]; - -console.log(JSON.stringify({ - accessTokenPreview: redact(token), - accessToken: token, - deviceId, - aid: deviceId, - email: user.email || store?.user?.email, - username: user.username || store?.user?.username, - hasProFeatures: !!user.hasProFeatures, - hasBetterAI: !!user.hasBetterAI, - sources: { - bearer: "Keychain Raycast / raycast-store_credentials", - deviceId: "raycast-enc.sqlite user.analyticsId", - }, -}, null, 2)); diff --git a/scripts/raycast/usage-benchmark.mjs b/scripts/raycast/usage-benchmark.mjs deleted file mode 100644 index 85c30232d6..0000000000 --- a/scripts/raycast/usage-benchmark.mjs +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env node -/** - * @file usage-benchmark.mjs - * @description Battle-test Raycast Pro usage via OmniRoute local endpoint. - * - * Env (required): - * OMNIROUTE_URL default http://127.0.0.1:20128/v1 - * OMNIROUTE_API_KEY OmniRoute API key (if REQUIRE_API_KEY) - * - * Env (optional — direct Raycast probe without OmniRoute): - * RAYCAST_BEARER_TOKEN - * RAYCAST_DEVICE_ID - * RAYCAST_AID - * RAYCAST_SIG_SECRET - * - * Usage: - * node scripts/raycast/usage-benchmark.mjs --models 5 --rounds 3 - * node scripts/raycast/usage-benchmark.mjs --model openai-gpt-5-mini --rounds 10 - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast Pro usage benchmark script - */ - -import { createHmac, createHash } from "node:crypto"; - -const args = process.argv.slice(2); -function arg(name, fallback) { - const i = args.indexOf(`--${name}`); - return i >= 0 && args[i + 1] ? args[i + 1] : fallback; -} - -const rounds = Number(arg("rounds", "3")); -const model = arg("model", ""); -const modelCount = Number(arg("models", "5")); -const omnirouteUrl = (process.env.OMNIROUTE_URL || "http://127.0.0.1:20128/v1").replace(/\/$/, ""); -const apiKey = process.env.OMNIROUTE_API_KEY || ""; - -const RAYCAST_CHAT_URL = "https://backend.raycast.com/api/v1/ai/chat_completions"; -const RAYCAST_MODELS_URL = "https://backend.raycast.com/api/v1/ai/models"; -const SIG_SECRET = - process.env.RAYCAST_SIG_SECRET || - "6bc455473576ce2cd6f70426caff867aabbe3f7291c1a79681af5e8ce0ca1408"; - -function rot13rot5(input) { - return input.replace(/[A-Za-z0-9]/g, (char) => { - const code = char.charCodeAt(0); - if (code >= 65 && code <= 90) return String.fromCharCode(((code - 65 + 13) % 26) + 65); - if (code >= 97 && code <= 122) return String.fromCharCode(((code - 97 + 13) % 26) + 97); - return String.fromCharCode(((code - 48 + 5) % 10) + 48); - }); -} - -function signatureV2(timestamp, deviceId, payload, secret) { - const bodyHash = createHash("sha256").update(payload).digest("hex"); - const message = [timestamp, deviceId, bodyHash].map(rot13rot5).join("."); - return createHmac("sha256", secret).update(message).digest("hex"); -} - -function raycastJwt(aid, secret) { - const iat = Date.now() / 1000; - const header = Buffer.from(JSON.stringify({ typ: "JWT", alg: "HS256" })).toString("base64url"); - const payload = Buffer.from(JSON.stringify({ aid, exp: iat + 60, iat })).toString("base64url"); - const signature = createHmac("sha256", secret) - .update(`${header}.${payload}`) - .digest("base64url"); - return `${header}.${payload}.${signature}`; -} - -function raycastHeaders(payload) { - const bearerToken = process.env.RAYCAST_BEARER_TOKEN; - const deviceId = process.env.RAYCAST_DEVICE_ID; - const aid = process.env.RAYCAST_AID; - if (!bearerToken || !deviceId || !aid) { - throw new Error("Set RAYCAST_BEARER_TOKEN, RAYCAST_DEVICE_ID, RAYCAST_AID for direct probe"); - } - const timestamp = Math.floor(Date.now() / 1000).toString(); - return { - Accept: "application/json", - Authorization: `Bearer ${bearerToken}`, - "X-Raycast-Timestamp": timestamp, - "X-Raycast-DeviceId": deviceId, - "Content-Type": "application/json", - "X-Raycast-Signature-v2": signatureV2(timestamp, deviceId, payload, SIG_SECRET), - "X-Raycast-Signature": raycastJwt(aid, SIG_SECRET), - "X-Raycast-Experimental": "chatBranching, mcpHTTPServer", - "User-Agent": "Raycast/1.104.20 (macOS Version 26.5.1 (Build 25F80))", - }; -} - -async function fetchRaycastModels() { - const payload = "{}"; - const res = await fetch(RAYCAST_MODELS_URL, { method: "GET", headers: raycastHeaders(payload) }); - const text = await res.text(); - if (!res.ok) throw new Error(`models [${res.status}]: ${text.slice(0, 200)}`); - const data = JSON.parse(text); - return (data.models || []).map((m) => m.id); -} - -async function chatOmniroute(modelId, prompt) { - const headers = { "Content-Type": "application/json" }; - if (apiKey) headers.Authorization = `Bearer ${apiKey}`; - const started = Date.now(); - const res = await fetch(`${omnirouteUrl}/chat/completions`, { - method: "POST", - headers, - body: JSON.stringify({ - model: `raycast/${modelId}`, - messages: [{ role: "user", content: prompt }], - stream: false, - max_tokens: 32, - }), - }); - const ms = Date.now() - started; - const body = await res.text(); - return { ok: res.ok, status: res.status, ms, body: body.slice(0, 300) }; -} - -async function main() { - console.log(`OmniRoute: ${omnirouteUrl}`); - console.log(`Rounds per model: ${rounds}`); - - let models = []; - if (model) { - models = [model]; - } else if (process.env.RAYCAST_BEARER_TOKEN) { - models = (await fetchRaycastModels()).slice(0, modelCount); - console.log(`Direct Raycast model probe — testing ${models.length} models via OmniRoute`); - } else { - models = ["openai-gpt-5-mini"]; - console.log("No RAYCAST_* env — using default model openai-gpt-5-mini via OmniRoute combo id"); - } - - const results = []; - for (const modelId of models) { - let ok = 0; - let fail = 0; - const latencies = []; - for (let i = 0; i < rounds; i++) { - const prompt = `Raycast benchmark round ${i + 1} — reply with exactly: pong`; - try { - const r = await chatOmniroute(modelId, prompt); - latencies.push(r.ms); - if (r.ok) ok++; - else { - fail++; - console.error(` FAIL ${modelId} #${i + 1} [${r.status}]: ${r.body}`); - } - } catch (err) { - fail++; - console.error(` ERR ${modelId} #${i + 1}:`, err.message); - } - } - const avg = latencies.length ? Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length) : 0; - results.push({ modelId, ok, fail, avgMs: avg }); - console.log(`${modelId}: ${ok}/${rounds} ok, avg ${avg}ms`); - } - - console.log("\nSummary:"); - console.table(results); -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/scripts/release/aggregate-changelog.mjs b/scripts/release/aggregate-changelog.mjs index 7d490045f6..6b016b4972 100644 --- a/scripts/release/aggregate-changelog.mjs +++ b/scripts/release/aggregate-changelog.mjs @@ -20,7 +20,8 @@ // allowed). Credit format stays the repo norm: "(#PR — thanks @user)". // // Usage: -// node scripts/release/aggregate-changelog.mjs [--dry-run] +// node scripts/release/aggregate-changelog.mjs --version [--dry-run] +// --version exact CHANGELOG release section to update (for example, 3.8.50); // --dry-run print the would-be CHANGELOG.md to stdout and list fragments; // touch nothing. // @@ -44,6 +45,12 @@ export const SECTIONS = Object.freeze({ const SKIP_FILES = new Set(["README.md", ".gitkeep"]); +function assertTargetVersion(version) { + if (typeof version !== "string" || !/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(version)) { + throw new Error('target version is required (for example, { version: "3.8.50" })'); + } +} + /** * Validate one fragment's text. Returns null when OK, or a human-readable error. * Pure — unit-tested. @@ -57,6 +64,15 @@ export function validateFragmentText(text) { return 'fragment must start with a markdown bullet ("- ")'; } if (/^(<{7}|={7}|>{7})/m.test(body)) return "fragment contains merge-conflict markers"; + if (/#(?:PRNUM|PENDING)\b|\/pull\/(?:PRNUM|PENDING)(?:[/?#)]|$)/i.test(body)) { + return "fragment contains an unresolved PR placeholder"; + } + for (const match of body.matchAll( + /\[([^\]\n]+)\]\(https:\/\/github\.com\/diegosouzapw\/OmniRoute\/pull\/(\d+)\/?(?:[?#][^)]*)?\)/g + )) { + const expected = `#${match[2]}`; + if (match[1].trim() !== expected) return `pull link label must be "${expected}"`; + } return null; } @@ -88,27 +104,72 @@ export function collectFragments(root) { } /** - * Append bullets at the END of a living-section heading's bullet block (before the - * next "##"/"###" heading). Operates on the FIRST occurrence of the heading — in this - * repo's CHANGELOG the living cycle section always appears first. Pure — unit-tested. - * Throws when a needed heading is missing (the release captain adds the heading; the - * script never invents structure). + * Append bullets at the END of a target version's section-heading blocks. Pure — unit-tested. + * The version is mandatory because Unreleased and released sections intentionally reuse the + * same headings. */ -export function insertBullets(changelogText, bulletsBySection) { +export function insertBullets(changelogText, bulletsBySection, { version } = {}) { + assertTargetVersion(version); + let lines = changelogText.split("\n"); + const escapedVersion = version.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const targetHeading = new RegExp(`^## \\[${escapedVersion}\\](?:\\s|$)`); + const targetMatches = lines.flatMap((line, index) => (targetHeading.test(line) ? [index] : [])); + if (targetMatches.length === 0) { + throw new Error(`target version [${version}] not found in CHANGELOG.md`); + } + if (targetMatches.length > 1) { + throw new Error(`target version [${version}] appears ${targetMatches.length} times`); + } + + const targetStart = targetMatches[0]; + let targetEnd = lines.findIndex((line, index) => index > targetStart && /^##\s/.test(line)); + if (targetEnd === -1) targetEnd = lines.length; + + const insertions = []; + const targetBody = `\n${lines + .slice(targetStart + 1, targetEnd) + .join("\n") + .trimEnd()}\n`; + const seenFragmentText = new Map(); for (const [section, heading] of Object.entries(SECTIONS)) { - const bullets = (bulletsBySection[section] || []).map((b) => b.text ?? b); + const entries = bulletsBySection[section] || []; + const bullets = entries.map((entry) => { + const text = String(entry.text ?? entry).trimEnd(); + const file = entry.file || `${section} fragment`; + const firstFile = seenFragmentText.get(text); + if (firstFile) { + throw new Error(`duplicate fragment content in ${firstFile} and ${file}`); + } + seenFragmentText.set(text, file); + if (targetBody.includes(`\n${text}\n`)) { + throw new Error(`fragment content is already present in [${version}]: ${file}`); + } + return text; + }); if (bullets.length === 0) continue; - const headIdx = lines.findIndex((l) => l.trim() === heading); - if (headIdx === -1) { + const headingMatches = lines.flatMap((line, index) => + index > targetStart && index < targetEnd && line.trim() === heading ? [index] : [] + ); + if (headingMatches.length === 0) { throw new Error( - `heading "${heading}" not found in CHANGELOG.md — add it to the living section before aggregating ${section} fragments` + `heading "${heading}" not found inside target version [${version}] before aggregating ${section} fragments` ); } + if (headingMatches.length > 1) { + throw new Error( + `heading "${heading}" appears ${headingMatches.length} times inside target version [${version}]` + ); + } + insertions.push({ headIdx: headingMatches[0], bullets }); + } + + // Work from the bottom up so earlier insertions cannot invalidate later section indexes. + for (const { headIdx, bullets } of insertions.sort((a, b) => b.headIdx - a.headIdx)) { // End of this section's block: last non-empty line before the next heading. - let nextHead = lines.length; - for (let i = headIdx + 1; i < lines.length; i++) { - if (/^##/.test(lines[i])) { + let nextHead = targetEnd; + for (let i = headIdx + 1; i < targetEnd; i++) { + if (/^#{2,3}\s/.test(lines[i])) { nextHead = i; break; } @@ -125,7 +186,8 @@ export function insertBullets(changelogText, bulletsBySection) { * Aggregate fragments into CHANGELOG.md. Returns a summary object. When dryRun is * true nothing is written or deleted. */ -export function aggregate({ root = ROOT, dryRun = false } = {}) { +export function aggregate({ root = ROOT, version, dryRun = false } = {}) { + assertTargetVersion(version); const collected = collectFragments(root); if (collected.invalid.length > 0) { const detail = collected.invalid.map((i) => ` ✗ ${i.file}: ${i.error}`).join("\n"); @@ -134,7 +196,7 @@ export function aggregate({ root = ROOT, dryRun = false } = {}) { const total = collected.features.length + collected.fixes.length + collected.maintenance.length; const changelogPath = join(root, "CHANGELOG.md"); const before = readFileSync(changelogPath, "utf8"); - const after = total === 0 ? before : insertBullets(before, collected); + const after = insertBullets(before, collected, { version }); if (!dryRun && total > 0) { writeFileSync(changelogPath, after); for (const section of Object.keys(SECTIONS)) { @@ -144,24 +206,67 @@ export function aggregate({ root = ROOT, dryRun = false } = {}) { return { total, collected, changed: total > 0, after }; } -function main() { - const dryRun = process.argv.includes("--dry-run"); - const result = aggregate({ dryRun }); +function parseCliArgs(argv) { + let version; + let dryRun = false; + for (let i = 0; i < argv.length; i++) { + const arg = argv[i]; + if (arg === "--dry-run") { + dryRun = true; + continue; + } + if (arg === "--version") { + if (version !== undefined) throw new Error("--version may only be provided once"); + const value = argv[++i]; + if (!value || value.startsWith("--")) { + throw new Error("--version is required"); + } + version = value; + continue; + } + throw new Error(`unknown argument: ${arg}`); + } + if (!version) throw new Error("--version is required"); + return { version, dryRun }; +} + +export function main( + argv = process.argv.slice(2), + { root = ROOT, stdout = process.stdout, stderr = process.stderr } = {} +) { + let args; + let result; + try { + args = parseCliArgs(argv); + result = aggregate({ root, ...args }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + stderr.write(`[aggregate-changelog] error: ${message}\n`); + return 2; + } + + const log = args.dryRun ? stderr : stdout; + if (args.dryRun) { + stdout.write(result.after); + if (!result.after.endsWith("\n")) stdout.write("\n"); + } if (result.total === 0) { - console.log("[aggregate-changelog] no fragments to aggregate — nothing to do."); + log.write("[aggregate-changelog] no fragments to aggregate — nothing to do.\n"); return 0; } for (const section of Object.keys(SECTIONS)) { for (const { file } of result.collected[section]) { - console.log(`[aggregate-changelog] ${dryRun ? "would aggregate" : "aggregated"} ${file}`); + log.write( + `[aggregate-changelog] ${args.dryRun ? "would aggregate" : "aggregated"} ${file}\n` + ); } } - console.log( - `[aggregate-changelog] ${result.total} fragment(s) → CHANGELOG.md${dryRun ? " (dry-run, nothing written)" : " (fragments deleted — commit CHANGELOG.md + deletions together)"}` + log.write( + `[aggregate-changelog] ${result.total} fragment(s) → CHANGELOG.md${args.dryRun ? " (dry-run, nothing written)" : " (fragments deleted — commit CHANGELOG.md + deletions together)"}\n` ); return 0; } if (process.argv[1] === fileURLToPath(import.meta.url)) { - process.exit(main()); + process.exitCode = main(); } diff --git a/scripts/release/gen-contributors.mjs b/scripts/release/gen-contributors.mjs index 660fbb5893..c4bcd97438 100644 --- a/scripts/release/gen-contributors.mjs +++ b/scripts/release/gen-contributors.mjs @@ -65,7 +65,10 @@ export function parseContributors(sectionText) { if (!agg.has(handle)) agg.set(handle, new Set()); for (const r of refs) agg.get(handle).add(r); }; - const handlesIn = (s) => [...s.matchAll(/@([A-Za-z0-9_-]+)/g)].map((m) => m[1]); + // A slash is a contributor separator only when another @handle follows it. This prevents + // GitHub App identities such as `@app/dependabot` from being truncated and credited as `@app`. + const handlesIn = (s) => + [...s.matchAll(/@([A-Za-z0-9_-]+)(?=$|[\s,;:.)\]}>]|\/\s*@)/g)].map((m) => m[1]); const refsIn = (s) => [...s.matchAll(/#(\d+)/g)].map((m) => Number(m[1])); for (const raw of sectionText.split("\n")) { @@ -98,7 +101,9 @@ export function parseContributors(sectionText) { } // (3) "Extracted from #N by @X" (links already collapsed by the preprocessing above) - for (const em of line.matchAll(/[Ee]xtracted from #(\d+)\s+by\s+@([A-Za-z0-9_-]+)/g)) { + for (const em of line.matchAll( + /[Ee]xtracted from #(\d+)\s+by\s+@([A-Za-z0-9_-]+)(?![A-Za-z0-9_/-])/g + )) { add(em[2], [Number(em[1])]); } } diff --git a/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx b/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx index 45aa63ec63..a4d994eac5 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx @@ -8,7 +8,6 @@ import { KiroOAuthWrapper, CursorAuthModal, TraeAuthModal, - RaycastAuthModal, ProxyConfigModal, } from "@/shared/components"; import RiskNoticeModal from "../../components/RiskNoticeModal"; @@ -281,13 +280,6 @@ export default function ProviderModalsPanel({ onSuccess={handleOAuthSuccess} onClose={() => setShowOAuthModal(false)} /> - ) : providerId === "raycast" ? ( - setShowOAuthModal(false)} - /> ) : ( - raycastService.probeModels({ - accessToken: local.accessToken, - deviceId: local.deviceId, - aid: resolved.aid, - }) - ); - - const connection: any = await createProviderConnection({ - provider: "raycast", - authType: "oauth", - accessToken: local.accessToken, - refreshToken: null, - email: local.email || null, - expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), - providerSpecificData: { - deviceId: local.deviceId, - aid: resolved.aid, - authMethod: "auto_imported", - username: local.username, - hasProFeatures: local.hasProFeatures, - hasBetterAI: local.hasBetterAI, - extractSource: local.source, - modelCount: models.length, - premiumModelCount: models.filter((m) => m.requires_better_ai).length, - }, - testStatus: "active", - }); - - await replaceSyncedAvailableModelsForConnection( - "raycast", - connection.id, - models.map((model) => ({ - id: model.id, - name: model.name || model.id, - })) - ); - - return NextResponse.json({ - success: true, - source: local.source, - connection: { - id: connection.id, - provider: connection.provider, - email: connection.email, - }, - models: { - total: models.length, - premium: models.filter((m) => m.requires_better_ai).length, - sample: models.slice(0, 12).map((m) => m.id), - }, - }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : String(error); - console.error("Raycast auto-import error:", message); - return NextResponse.json({ error: message }, { status: 400 }); - } -} diff --git a/src/app/api/oauth/raycast/import/route.ts b/src/app/api/oauth/raycast/import/route.ts deleted file mode 100644 index 266dd1aecc..0000000000 --- a/src/app/api/oauth/raycast/import/route.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @file route.ts - * @description Import Raycast Pro credentials captured from macOS app traffic. - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast token import route (local dev) - */ - -import { NextResponse } from "next/server"; -import { createProviderConnection } from "@/models"; -import { RaycastService } from "@/lib/oauth/services/raycast"; -import { raycastImportSchema } from "@/shared/validation/schemas"; -import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; -import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; -import { resolveProxyForProvider } from "@/models"; -import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; - -async function requireOAuthImportAuth(request: Request) { - // GHSA-mg76: importing a provider connection is a state-mutating admin action; - // require management scope (or a dashboard session), not any valid client key. - return requireManagementAuth(request, { invalidApiKeyStatus: 401 }); -} - -export async function POST(request: Request) { - const authResponse = await requireOAuthImportAuth(request); - if (authResponse) return authResponse; - - let rawBody; - try { - rawBody = await request.json(); - } catch { - return NextResponse.json( - { - error: { - message: "Invalid request", - details: [{ field: "body", message: "Invalid JSON body" }], - }, - }, - { status: 400 } - ); - } - - try { - const validation = validateBody(raycastImportSchema, rawBody); - if (isValidationFailure(validation)) { - return NextResponse.json({ error: validation.error }, { status: 400 }); - } - - const { accessToken, deviceId, aid, signatureJwt, sigSecret } = validation.data; - const raycastService = new RaycastService(); - const resolved = raycastService.validateCredentials({ - accessToken, - deviceId, - aid, - signatureJwt, - sigSecret, - }); - - const proxy = await resolveProxyForProvider("raycast"); - const models = await runWithProxyContext(proxy, () => - raycastService.probeModels({ - accessToken: accessToken.trim(), - deviceId: deviceId.trim(), - aid: resolved.aid, - sigSecret: sigSecret?.trim(), - }) - ); - - const connection: any = await createProviderConnection({ - provider: "raycast", - authType: "oauth", - accessToken: accessToken.trim(), - refreshToken: null, - expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), - providerSpecificData: { - deviceId: deviceId.trim(), - aid: resolved.aid, - sigSecret: sigSecret?.trim() || "", - authMethod: "imported", - modelCount: models.length, - premiumModelCount: models.filter((m) => m.requires_better_ai).length, - }, - testStatus: "active", - }); - - return NextResponse.json({ - success: true, - connection: { - id: connection.id, - provider: connection.provider, - }, - models: { - total: models.length, - premium: models.filter((m) => m.requires_better_ai).length, - sample: models.slice(0, 8).map((m) => m.id), - }, - }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : String(error); - console.error("Raycast import token error:", message); - return NextResponse.json({ error: message }, { status: 400 }); - } -} - -export async function GET(request: Request) { - const authResponse = await requireOAuthImportAuth(request); - if (authResponse) return authResponse; - - const raycastService = new RaycastService(); - - return NextResponse.json({ - provider: "raycast", - method: "import_token", - localDevOnly: true, - instructions: raycastService.getCaptureInstructions(), - requiredFields: [ - { - name: "accessToken", - label: "Bearer Token", - description: "From Authorization: Bearer header on backend.raycast.com requests", - type: "textarea", - }, - { - name: "deviceId", - label: "Device ID", - description: "From X-Raycast-DeviceId header", - type: "text", - }, - { - name: "signatureJwt", - label: "Signature JWT", - description: "From X-Raycast-Signature header (AID decoded automatically)", - type: "textarea", - }, - { - name: "sigSecret", - label: "Signature Secret", - description: "Optional override — defaults to community-extracted SIG_SECRET", - type: "text", - }, - ], - }); -} diff --git a/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts b/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts index 0939b59b55..cc45e6b727 100644 --- a/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts +++ b/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts @@ -408,25 +408,6 @@ export const PROVIDER_MODELS_CONFIG: Record = authPrefix: "Bearer ", parseResponse: (data) => normalizeOpenAiLikeModelsResponse(data, "huggingface"), }, - // #3931: qwen-web (cookie provider) was missing here, so its discovery page - // showed nothing. - // `chat.qwen.ai/api/v2/models/` is public (no auth header configured/sent); - // shape `{ data: { data: [{ id, name, owned_by }] } }`, flatter `{ data: [] }` fallback. - "qwen-web": { - url: "https://chat.qwen.ai/api/v2/models/", - method: "GET", - headers: { "Content-Type": "application/json" }, - parseResponse: (data) => { - const innerData = data?.data?.data || data?.data || []; - return (Array.isArray(innerData) ? innerData : []) - .map((item: any) => ({ - id: item.id || item.name, - name: item.name || item.id, - owned_by: item.owned_by || "qwen", - })) - .filter((m: any) => m.id); - }, - }, "qwen-cloud": QWEN_CLOUD_TEXT_MODELS_CONFIG, antigravity: { url: getAntigravityModelsDiscoveryUrls()[0], diff --git a/src/app/api/providers/[id]/models/route.ts b/src/app/api/providers/[id]/models/route.ts index fcc1d9b655..c86a6abb95 100755 --- a/src/app/api/providers/[id]/models/route.ts +++ b/src/app/api/providers/[id]/models/route.ts @@ -94,8 +94,6 @@ import { isConnectionUnavailableToAuxiliaryActivity } from "@/lib/exclusiveLease import { fetchCursorAgentModels } from "@/lib/providerModels/cursorAgent"; import { fetchCursorAvailableModels } from "@/lib/providerModels/cursorAvailableModels"; import { ensureCursorAutoCatalogEntry } from "@/lib/providerModels/cursorAutoCatalog"; -import { fetchRaycastModels } from "@omniroute/open-sse/services/raycast.ts"; -import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; import { type JsonRecord, asRecord, @@ -1298,58 +1296,6 @@ export async function GET( }); } - if (provider === "raycast") { - const cachedResponse = maybeReturnCachedDiscovery(); - if (cachedResponse) return cachedResponse; - - const autoFetchDisabledResponse = maybeReturnAutoFetchDisabled(); - if (autoFetchDisabledResponse) return autoFetchDisabledResponse; - - const psd = asRecord(connection.providerSpecificData); - const deviceId = toNonEmptyString(psd.deviceId); - const aid = toNonEmptyString(psd.aid) || deviceId; - if (!accessToken || !deviceId) { - const fallback = buildDiscoveryFallbackResponse({ - localWarning: "Raycast credentials incomplete — using local catalog", - }); - if (fallback) return fallback; - return NextResponse.json({ error: "Raycast credentials incomplete" }, { status: 400 }); - } - - try { - const raycastModels = await runWithProxyContext(proxy, () => - fetchRaycastModels({ - accessToken, - providerSpecificData: { - deviceId, - aid: aid || deviceId, - sigSecret: toNonEmptyString(psd.sigSecret) || undefined, - }, - }) - ); - const models = raycastModels.map((model) => ({ - id: model.id, - name: model.name || model.id, - owned_by: model.provider || provider, - ...(model.requires_better_ai ? { premium: true } : {}), - ...(model.availability ? { availability: model.availability } : {}), - })); - return buildApiDiscoveryResponse(models); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - console.log("[models] raycast fetch failed:", message); - const fallback = buildDiscoveryFallbackResponse({ - cacheWarning: `Raycast API unavailable (${message}) — using cached catalog`, - localWarning: `Raycast API unavailable (${message}) — using local catalog`, - }); - if (fallback) return fallback; - return NextResponse.json( - { error: `Failed to fetch Raycast models: ${message}` }, - { status: 502 } - ); - } - } - if (provider === "cursor") { const cachedResponse = maybeReturnCachedDiscovery(); if (cachedResponse) return cachedResponse; diff --git a/src/app/api/providers/[id]/test/oauthTestConfig.ts b/src/app/api/providers/[id]/test/oauthTestConfig.ts index 754003e44b..354c4adef3 100644 --- a/src/app/api/providers/[id]/test/oauthTestConfig.ts +++ b/src/app/api/providers/[id]/test/oauthTestConfig.ts @@ -205,14 +205,6 @@ export const OAUTH_TEST_CONFIG: Record = { // Validate using token presence/expiry as a lightweight auth check. checkExpiry: true, }, - raycast: { - // #8895 — Raycast Pro is an `import_token` provider: the token is imported - // from the local Raycast install, `refreshToken` is always null and the - // stored `expiresIn` defaults to 30 days. There is nothing to refresh, so - // the test is the expiry check on the imported token; without an entry here - // Test Connection persists testStatus="error" on a healthy account (#8408). - checkExpiry: true, - }, "zed-hosted": { // Zed Hosted Models uses a long-lived native-app access token with no // expiry or refresh token. Validate presence here; real connectivity is diff --git a/src/app/api/providers/[id]/test/webSessionTestDispatch.ts b/src/app/api/providers/[id]/test/webSessionTestDispatch.ts index dc2ba36a5a..3ade751b5e 100644 --- a/src/app/api/providers/[id]/test/webSessionTestDispatch.ts +++ b/src/app/api/providers/[id]/test/webSessionTestDispatch.ts @@ -8,8 +8,8 @@ import { getWebSessionCredentialRequirement } from "@/shared/providers/webSessio * `validateWebCookieProvider` probe (`src/lib/providers/validation/webCookie.ts`). * * `WEB_SESSION_CREDENTIAL_REQUIREMENTS` currently marks more providers as `kind: "token"` - * than have a matching validator (e.g. hailuo-web, microsoft-designer-web, t3-chat-web, - * promptql). Those fall through to `validateWebCookieProvider`'s generic probe, which + * than have a matching validator (e.g. t3-chat-web and promptql). + * Those fall through to `validateWebCookieProvider`'s generic probe, which * sends the stored credential as a `Cookie` header and treats most non-401/403 responses * as valid — the wrong wire format for a token-authenticated provider, so an invalid * token can be reported as a healthy connection. Keep this set in sync with @@ -30,7 +30,6 @@ export function shouldUseApiKeyConnectionTest(authType: unknown, providerId: unk if (authType !== "cookie") return false; if (getWebSessionCredentialRequirement(providerId)?.kind !== "token") return false; return ( - typeof providerId === "string" && - TOKEN_AWARE_VALIDATED_WEB_SESSION_PROVIDERS.has(providerId) + typeof providerId === "string" && TOKEN_AWARE_VALIDATED_WEB_SESSION_PROVIDERS.has(providerId) ); } diff --git a/src/app/api/v1/audio/speech/route.ts b/src/app/api/v1/audio/speech/route.ts index 799a933fed..69507f7ec6 100644 --- a/src/app/api/v1/audio/speech/route.ts +++ b/src/app/api/v1/audio/speech/route.ts @@ -18,7 +18,6 @@ import { import { attachOmniRouteMetaToResponse } from "@/domain/omnirouteResponseMeta"; import { calculateModalCost } from "@/lib/usage/costCalculator"; import { generateRequestId } from "@/shared/utils/requestId"; -import { getClientIpFromRequest } from "@/lib/ipUtils"; /** * Handle CORS preflight @@ -102,7 +101,6 @@ async function postHandler(request, context) { credentials, resolvedProvider: providerConfig, resolvedModel, - clientIp: getClientIpFromRequest(request), }); if (response?.ok) { await clearRecoveredProviderState(credentials); diff --git a/src/lib/db/migrations/163_remove_unlicensed_providers.sql b/src/lib/db/migrations/163_remove_unlicensed_providers.sql new file mode 100644 index 0000000000..0cd836afaf --- /dev/null +++ b/src/lib/db/migrations/163_remove_unlicensed_providers.sql @@ -0,0 +1,400 @@ +-- 163_remove_unlicensed_providers.sql +-- The Raycast Relay, Hailuo Web, Felo Web, and Qwen Web integrations are no +-- longer distributed by OmniRoute. Remove their executable/current +-- configuration and historical runtime aliases without erasing request, +-- usage, quota-snapshot, or call-log history. +-- +-- The temporary connection ledger keeps every cleanup predicate exact. It +-- deliberately avoids broad substring matches such as `%rc%`, which would hit +-- unrelated provider/model names. + +DROP TABLE IF EXISTS temp._omniroute_removed_provider_connections; +DROP TABLE IF EXISTS temp._omniroute_removed_provider_ids; + +CREATE TEMP TABLE _omniroute_removed_provider_ids ( + provider_id TEXT PRIMARY KEY +) WITHOUT ROWID; + +INSERT INTO _omniroute_removed_provider_ids (provider_id) +VALUES + ('raycast'), + ('rc'), + ('hailuo-web'), + ('felo-web'), + ('felo'), + ('qwen-web'), + ('qw'), + ('microsoft-designer-web'), + ('msdesigner'); + +CREATE TEMP TABLE _omniroute_removed_provider_connections ( + connection_id TEXT PRIMARY KEY +) WITHOUT ROWID; + +INSERT OR IGNORE INTO _omniroute_removed_provider_connections (connection_id) +SELECT id +FROM provider_connections +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +-- Leases are historical/auditable records. End active leases instead of +-- deleting them, so operators can still explain why a lease stopped. +UPDATE exclusive_connection_leases +SET state = 'INVALIDATED', + ended_at = COALESCE(ended_at, datetime('now')), + end_reason = COALESCE(end_reason, 'provider removed in v3.8.50') +WHERE state = 'ACTIVE' + AND ( + provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + OR connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + ); + +-- A multi-connection quota pool survives when it still has another member. +-- Provider-only pools are removed together with their non-historical policy. +DELETE FROM quota_pool_connections +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections +); + +UPDATE quota_pools +SET connection_id = ( + SELECT MIN(membership.connection_id) + FROM quota_pool_connections AS membership + WHERE membership.pool_id = quota_pools.id +) +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + AND EXISTS ( + SELECT 1 + FROM quota_pool_connections AS membership + WHERE membership.pool_id = quota_pools.id + ); + +DELETE FROM quota_allocation_model_caps +WHERE pool_id IN ( + SELECT id + FROM quota_pools + WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + AND NOT EXISTS ( + SELECT 1 + FROM quota_pool_connections AS membership + WHERE membership.pool_id = quota_pools.id + ) +); + +DELETE FROM quota_allocations +WHERE pool_id IN ( + SELECT id + FROM quota_pools + WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + AND NOT EXISTS ( + SELECT 1 + FROM quota_pool_connections AS membership + WHERE membership.pool_id = quota_pools.id + ) +); + +DELETE FROM quota_pools +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + AND NOT EXISTS ( + SELECT 1 + FROM quota_pool_connections AS membership + WHERE membership.pool_id = quota_pools.id + ); + +DELETE FROM provider_quota_state +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections +); + +DELETE FROM connection_runtime_state +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections +); + +DELETE FROM auto_candidate_overrides +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections +); + +DELETE FROM reasoning_routing_rules +WHERE connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + OR EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE target_model = removed.provider_id + OR substr(target_model, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' + OR model_pattern = removed.provider_id + OR substr(model_pattern, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' + ); + +DELETE FROM provider_plans +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + OR connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ); + +DELETE FROM session_account_affinity +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + OR connection_id IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ); + +DELETE FROM combo_adaptation_state +WHERE provider_id IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM tier_assignments +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM model_context_overrides +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM model_capability_overrides +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM group_model_permissions +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + OR EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE model_pattern = removed.provider_id + OR substr(model_pattern, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' + ); + +DELETE FROM upstream_proxy_config +WHERE provider_id IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM radar_local_model_state +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM cloud_agent_credentials +WHERE provider_id IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM domain_circuit_breakers +WHERE name IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM provider_nodes +WHERE id IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +-- Provider-limit cache keys are connection ids, so remove them before the +-- provider_connections rows disappear. +DELETE FROM key_value +WHERE namespace = 'providerLimitsCache' + AND key IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ); + +DELETE FROM key_value +WHERE namespace IN ('customModels', 'modelCompatOverrides', 'providerAliases') + AND key IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM key_value +WHERE namespace = 'syncedAvailableModels' + AND EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE substr(key, 1, length(removed.provider_id) + 1) = removed.provider_id || ':' + ); + +DELETE FROM key_value +WHERE namespace = 'modelAliases' + AND EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE value = json_quote(removed.provider_id) + OR substr(value, 1, length(removed.provider_id) + 2) = '"' || removed.provider_id || '/' + ); + +-- Filter retired targets while preserving the rest of each combo object. +-- Invalid legacy JSON is left untouched for the database health repair path. +UPDATE combos +SET data = json_set( + data, + '$.models', + COALESCE( + ( + SELECT json_group_array( + CASE + WHEN entry.type IN ('object', 'array') THEN json(entry.value) + ELSE entry.value + END + ) + FROM json_each(combos.data, '$.models') AS entry + WHERE CASE + WHEN entry.type = 'object' THEN NOT ( + COALESCE(json_extract(entry.value, '$.connectionId'), '') IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + OR EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE COALESCE(json_extract(entry.value, '$.provider'), '') = removed.provider_id + OR COALESCE(json_extract(entry.value, '$.providerId'), '') = removed.provider_id + OR COALESCE(json_extract(entry.value, '$.model'), '') = removed.provider_id + OR substr( + COALESCE(json_extract(entry.value, '$.model'), ''), + 1, + length(removed.provider_id) + 1 + ) = removed.provider_id || '/' + ) + ) + WHEN entry.type = 'text' THEN NOT ( + EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE entry.value = removed.provider_id + OR substr(entry.value, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' + ) + ) + ELSE 1 + END + ), + json('[]') + ) +) +WHERE CASE + WHEN json_valid(data) THEN json_type(data, '$.models') = 'array' + ELSE 0 +END; + +-- Shadow targets use the same model-entry schema as primary combo targets. +UPDATE combos +SET data = json_set( + data, + '$.config.shadowRouting.targets', + COALESCE( + ( + SELECT json_group_array( + CASE + WHEN entry.type IN ('object', 'array') THEN json(entry.value) + ELSE entry.value + END + ) + FROM json_each(combos.data, '$.config.shadowRouting.targets') AS entry + WHERE CASE + WHEN entry.type = 'object' THEN NOT ( + COALESCE(json_extract(entry.value, '$.connectionId'), '') IN ( + SELECT connection_id FROM _omniroute_removed_provider_connections + ) + OR EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE COALESCE(json_extract(entry.value, '$.provider'), '') = removed.provider_id + OR COALESCE(json_extract(entry.value, '$.providerId'), '') = removed.provider_id + OR COALESCE(json_extract(entry.value, '$.model'), '') = removed.provider_id + OR substr( + COALESCE(json_extract(entry.value, '$.model'), ''), + 1, + length(removed.provider_id) + 1 + ) = removed.provider_id || '/' + ) + ) + WHEN entry.type = 'text' THEN NOT ( + EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE entry.value = removed.provider_id + OR substr(entry.value, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' + ) + ) + ELSE 1 + END + ), + json('[]') + ) +) +WHERE CASE + WHEN json_valid(data) + THEN json_type(data, '$.config.shadowRouting.targets') = 'array' + ELSE 0 +END; + +-- Provider-only allowlists and handoff lists are arrays of exact provider ids. +UPDATE combos +SET data = json_set( + data, + '$.allowedProviders', + COALESCE( + ( + SELECT json_group_array(entry.value) + FROM json_each(combos.data, '$.allowedProviders') AS entry + WHERE entry.type != 'text' + OR entry.value NOT IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + ), + json('[]') + ) +) +WHERE CASE + WHEN json_valid(data) THEN json_type(data, '$.allowedProviders') = 'array' + ELSE 0 +END; + +UPDATE combos +SET data = json_set( + data, + '$.config.handoffProviders', + COALESCE( + ( + SELECT json_group_array(entry.value) + FROM json_each(combos.data, '$.config.handoffProviders') AS entry + WHERE entry.type != 'text' + OR entry.value NOT IN (SELECT provider_id FROM _omniroute_removed_provider_ids) + ), + json('[]') + ) +) +WHERE CASE + WHEN json_valid(data) THEN json_type(data, '$.config.handoffProviders') = 'array' + ELSE 0 +END; + +-- Fallback policies are current routing configuration, not historical usage. +UPDATE domain_fallback_chains +SET chain = COALESCE( + ( + SELECT json_group_array(json(entry.value)) + FROM json_each(domain_fallback_chains.chain) AS entry + WHERE entry.type != 'object' + OR COALESCE(json_extract(entry.value, '$.provider'), '') NOT IN ( + SELECT provider_id FROM _omniroute_removed_provider_ids + ) + ), + json('[]') +) +WHERE CASE + WHEN json_valid(chain) THEN json_type(chain) = 'array' + ELSE 0 +END; + +DELETE FROM domain_fallback_chains +WHERE EXISTS ( + SELECT 1 + FROM _omniroute_removed_provider_ids AS removed + WHERE model = removed.provider_id + OR substr(model, 1, length(removed.provider_id) + 1) = removed.provider_id || '/' +); + +DELETE FROM provider_connections +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM registered_keys +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM provider_key_limits +WHERE provider IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DELETE FROM discovery_results +WHERE provider_id IN (SELECT provider_id FROM _omniroute_removed_provider_ids); + +DROP TABLE IF EXISTS temp._omniroute_removed_provider_connections; +DROP TABLE IF EXISTS temp._omniroute_removed_provider_ids; diff --git a/src/lib/db/webSessionDedup.ts b/src/lib/db/webSessionDedup.ts index b68ee00122..7983c2686f 100644 --- a/src/lib/db/webSessionDedup.ts +++ b/src/lib/db/webSessionDedup.ts @@ -78,7 +78,7 @@ function fieldMatch(incoming: string | null, existing: string | null): boolean | * and `incomingProfileArn` (#10815). * * Two independent disambiguators, either of which can prove "different - * account": `providerSpecificData.username` (Raycast-style IdP dedup) and + * account": `providerSpecificData.username` (generic username/IdP fallback) and * `providerSpecificData.profileArn` (Kiro/AWS profile dedup — Kiro never * sets `username`). A field only rules a match IN/OUT when both the * incoming and existing record carry it; when neither carries either field diff --git a/src/lib/oauth/constants/oauth.ts b/src/lib/oauth/constants/oauth.ts index 0318db40b3..0b8a65a75c 100644 --- a/src/lib/oauth/constants/oauth.ts +++ b/src/lib/oauth/constants/oauth.ts @@ -435,17 +435,6 @@ export const TRAE_CONFIG = { "Authorize via trae.ai in the popup, or sign in to solo.trae.ai and paste the Cloud-IDE-JWT from the Authorization header (~14-day lifetime).", }; -// Raycast Pro AI — reverse-engineered, unofficial API. LOCAL / PERSONAL USE ONLY. -// See docs/security/PUBLIC_CREDS.md pattern: no secrets in repo; credentials from user's Mac. -export const RAYCAST_CONFIG = { - apiEndpoint: "https://backend.raycast.com", - chatEndpoint: "/api/v1/ai/chat_completions", - modelsEndpoint: "/api/v1/ai/models", - clientType: "macos-app", - captureInstructions: - "macOS only: use Auto-Import (Keychain + Raycast DB) or capture Bearer, X-Raycast-DeviceId, and optional X-Raycast-Signature JWT from backend.raycast.com traffic.", -}; - // Devin Desktop / Devin CLI import-token configuration. // Public product identity is Devin. The upstream transport still identifies // the IDE as `windsurf`; authentication itself is import-only. @@ -509,10 +498,6 @@ export const PROVIDERS = { KIRO: "kiro", AMAZON_Q: "amazon-q", CURSOR: "cursor", - // #8895 — registered in src/lib/oauth/providers/index.ts but missing here, so - // every consumer reading PROVIDERS (onboarding wizard, test-connection routing) - // did not know Raycast Pro exists as an OAuth provider. - RAYCAST: "raycast", KILOCODE: "kilocode", CLINE: "cline", CLINEPASS: "clinepass", diff --git a/src/lib/oauth/providers/index.ts b/src/lib/oauth/providers/index.ts index 596890c6bd..cfd7ced721 100644 --- a/src/lib/oauth/providers/index.ts +++ b/src/lib/oauth/providers/index.ts @@ -22,7 +22,6 @@ import { gitlabDuo } from "./gitlab-duo"; import { kiro } from "./kiro"; import { cursor } from "./cursor"; import { trae } from "./trae"; -import { raycast } from "./raycast"; import { kilocode } from "./kilocode"; import { cline } from "./cline"; import { devinDesktop } from "./devin-desktop"; @@ -47,7 +46,6 @@ export const PROVIDERS = { "amazon-q": kiro, cursor, trae, - raycast, kilocode, cline, // clinepass reuses the Cline WorkOS OAuth flow 1:1 (same api.cline.bot host, same token diff --git a/src/lib/oauth/providers/raycast.ts b/src/lib/oauth/providers/raycast.ts deleted file mode 100644 index 85f15bd35c..0000000000 --- a/src/lib/oauth/providers/raycast.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file raycast.ts - * @description Raycast Pro token-import OAuth provider (reverse-engineered, local dev only). - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast Pro import_token provider - */ - -import { RAYCAST_CONFIG } from "../constants/oauth"; - -type RaycastRawTokens = { - accessToken?: string; - access_token?: string; - deviceId?: string; - device_id?: string; - aid?: string; - sigSecret?: string; - signatureSecret?: string; - signatureJwt?: string; - expiresIn?: number; -}; - -export const raycast = { - config: RAYCAST_CONFIG, - flowType: "import_token", - mapTokens: (tokens: RaycastRawTokens) => ({ - accessToken: tokens.accessToken || tokens.access_token, - refreshToken: null, - expiresIn: tokens.expiresIn || 30 * 24 * 60 * 60, - providerSpecificData: { - deviceId: tokens.deviceId || tokens.device_id || "", - aid: tokens.aid || "", - sigSecret: tokens.sigSecret || tokens.signatureSecret || "", - authMethod: "imported", - }, - }), -}; diff --git a/src/lib/oauth/services/raycast.ts b/src/lib/oauth/services/raycast.ts deleted file mode 100644 index cadd9d82a8..0000000000 --- a/src/lib/oauth/services/raycast.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @file raycast.ts - * @description Raycast Pro credential validation via live models API probe. - * - * @changes - * - [2026-07-27] [Composer] - Initial Raycast import validation service - */ - -import { - decodeAidFromRaycastJwt, - fetchRaycastModels, - type RaycastModelEntry, -} from "@omniroute/open-sse/services/raycast.ts"; - -export class RaycastService { - validateCredentials(input: { - accessToken: string; - deviceId: string; - aid?: string; - signatureJwt?: string; - sigSecret?: string; - }): { aid: string } { - const accessToken = input.accessToken.trim(); - const deviceId = input.deviceId.trim(); - let aid = (input.aid || "").trim(); - - if (!aid && input.signatureJwt?.trim()) { - aid = decodeAidFromRaycastJwt(input.signatureJwt.trim()) || ""; - } - - if (!accessToken) throw new Error("Bearer token is required"); - if (!deviceId) throw new Error("Device ID is required"); - - // AID is optional for current Raycast API — fall back to deviceId when not captured manually. - if (!aid) aid = deviceId; - - return { aid }; - } - - async probeModels(credentials: { - accessToken: string; - deviceId: string; - aid: string; - sigSecret?: string; - }): Promise { - return fetchRaycastModels({ - accessToken: credentials.accessToken, - providerSpecificData: { - deviceId: credentials.deviceId, - aid: credentials.aid, - sigSecret: credentials.sigSecret, - }, - }); - } - - getCaptureInstructions(): string[] { - return [ - "Easiest: click Auto-Import (macOS) — reads Keychain + local Raycast DB.", - "Manual fallback: Proxyman/Charles SSL proxy on backend.raycast.com.", - "Bearer token lives in Keychain: Raycast / raycast-store_credentials.", - "Device ID = analyticsId in ~/Library/Application Support/com.raycast.macos/posthog.distinctId.", - "Signature JWT is optional with current Raycast builds.", - ]; - } -} diff --git a/src/lib/oauth/services/raycastLocal.ts b/src/lib/oauth/services/raycastLocal.ts deleted file mode 100644 index 976a023a39..0000000000 --- a/src/lib/oauth/services/raycastLocal.ts +++ /dev/null @@ -1,198 +0,0 @@ -/** - * @file raycastLocal.ts - * @description Extract Raycast Pro credentials from local macOS install (Keychain + encrypted DB). - * - * @changes - * - [2026-07-27] [Composer] - Auto-extract bearer token and device ID from local Raycast - */ - -import { execFileSync } from "node:child_process"; -import { createHash } from "node:crypto"; -import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmdirSync, unlinkSync } from "node:fs"; -import { homedir, tmpdir } from "node:os"; -import { join } from "node:path"; - -const RAYCAST_SALT = "yvkwWXzxPPBAqY2tmaKrB*DvYjjMaeEf"; -const RAYCAST_SUPPORT = join(homedir(), "Library", "Application Support", "com.raycast.macos"); -const RAYCAST_DB = join(RAYCAST_SUPPORT, "raycast-enc.sqlite"); -const POSTHOG_DISTINCT = join(RAYCAST_SUPPORT, "posthog.distinctId"); - -export type RaycastLocalCredentials = { - accessToken: string; - deviceId: string; - aid: string; - email?: string; - username?: string; - hasProFeatures?: boolean; - hasBetterAI?: boolean; - source: "keychain+analyticsId" | "keychain+posthog"; -}; - -function readKeychainJson(account: string): Record | null { - try { - const raw = execFileSync( - "security", - ["find-generic-password", "-s", "Raycast", "-a", account, "-w"], - { encoding: "utf-8" } - ).trim(); - return JSON.parse(raw) as Record; - } catch { - return null; - } -} - -function getDatabasePassphrase(): string { - const keyHex = execFileSync( - "security", - ["find-generic-password", "-s", "Raycast", "-a", "database_key", "-w"], - { encoding: "utf-8" } - ).trim(); - return createHash("sha256") - .update(keyHex + RAYCAST_SALT) - .digest("hex"); -} - -function queryEncryptedDb(passphrase: string, sql: string): unknown[] { - if (!existsSync(RAYCAST_DB)) return []; - - const tmpDir = mkdtempSync(join(tmpdir(), "omniroute-raycast-")); - const tmpDb = join(tmpDir, "raycast-enc.sqlite"); - - const cleanup = () => { - for (const ext of ["", "-wal", "-shm"]) { - try { - unlinkSync(tmpDb + ext); - } catch { - // ignore - } - } - try { - rmdirSync(tmpDir); - } catch { - // ignore - } - }; - - try { - copyFileSync(RAYCAST_DB, tmpDb); - for (const ext of ["-wal", "-shm"]) { - const src = RAYCAST_DB + ext; - if (existsSync(src)) copyFileSync(src, tmpDb + ext); - } - - const input = `PRAGMA key = '${passphrase}';\n.mode json\n${sql}`; - const result = execFileSync("sqlcipher", [tmpDb], { input, encoding: "utf-8" }); - const jsonStr = result.startsWith("ok\n") ? result.slice(3) : result; - return JSON.parse(jsonStr.trim() || "[]") as unknown[]; - } catch { - return []; - } finally { - cleanup(); - } -} - -function readAnalyticsIdFromDb(): string | null { - try { - const passphrase = getDatabasePassphrase(); - const rows = queryEncryptedDb( - passphrase, - "SELECT analyticsId FROM user WHERE analyticsId IS NOT NULL LIMIT 1;" - ) as Array<{ analyticsId?: string }>; - const id = rows[0]?.analyticsId?.trim(); - return id || null; - } catch { - return null; - } -} - -function readAnalyticsIdFromPosthog(): string | null { - try { - if (!existsSync(POSTHOG_DISTINCT)) return null; - const parsed = JSON.parse(readFileSync(POSTHOG_DISTINCT, "utf-8")) as { - "posthog.distinctId"?: string; - }; - const id = parsed["posthog.distinctId"]?.trim(); - return id || null; - } catch { - return null; - } -} - -function readUserProfile(): { email?: string; username?: string; hasProFeatures?: boolean; hasBetterAI?: boolean } { - try { - const passphrase = getDatabasePassphrase(); - const rows = queryEncryptedDb( - passphrase, - "SELECT email, username, hasProFeatures, hasBetterAI FROM user LIMIT 1;" - ) as Array<{ - email?: string; - username?: string; - hasProFeatures?: number; - hasBetterAI?: number; - }>; - const row = rows[0]; - if (!row) return {}; - return { - email: row.email, - username: row.username, - hasProFeatures: !!row.hasProFeatures, - hasBetterAI: !!row.hasBetterAI, - }; - } catch { - return {}; - } -} - -export function isRaycastLocalExtractAvailable(): boolean { - if (process.platform !== "darwin") return false; - try { - execFileSync("which", ["sqlcipher"], { encoding: "utf-8" }); - } catch { - return false; - } - return existsSync(RAYCAST_DB) || existsSync(POSTHOG_DISTINCT); -} - -/** - * Pull Raycast Pro credentials from the local macOS install. - * Bearer token: Keychain entry `raycast-store_credentials` → oauth.access_token - * Device ID: user.analyticsId (same as posthog.distinctId) - */ -export function extractLocalRaycastCredentials(): RaycastLocalCredentials { - if (process.platform !== "darwin") { - throw new Error("Raycast auto-import is macOS-only"); - } - - const store = readKeychainJson("raycast-store_credentials"); - const oauth = (store?.oauth || {}) as { access_token?: string }; - const accessToken = oauth.access_token?.trim(); - if (!accessToken) { - throw new Error( - "Raycast bearer token not found in Keychain — open Raycast and sign in first" - ); - } - - const analyticsFromDb = readAnalyticsIdFromDb(); - const analyticsFromPosthog = readAnalyticsIdFromPosthog(); - const deviceId = analyticsFromDb || analyticsFromPosthog; - if (!deviceId) { - throw new Error( - "Raycast device/analytics ID not found — launch Raycast once so it writes local state" - ); - } - - const profile = readUserProfile(); - const user = (store?.user || {}) as { email?: string; username?: string }; - - return { - accessToken, - deviceId, - // V1 JWT aid — chat works without a captured signature JWT; deviceId is a stable fallback. - aid: deviceId, - email: profile.email || user.email, - username: profile.username || user.username, - hasProFeatures: profile.hasProFeatures, - hasBetterAI: profile.hasBetterAI, - source: analyticsFromDb ? "keychain+analyticsId" : "keychain+posthog", - }; -} diff --git a/src/lib/providers/validation.ts b/src/lib/providers/validation.ts index 8148173d1a..3bf0c277aa 100644 --- a/src/lib/providers/validation.ts +++ b/src/lib/providers/validation.ts @@ -29,7 +29,6 @@ import { import { toValidationErrorResult } from "./validation/transport"; import { validateDeepSeekWebProvider, - validateQwenWebProvider, validateGrokWebProvider, validateChatGptWebProvider, validatePerplexityWebProvider, @@ -165,7 +164,11 @@ export async function validateFreebuffProvider({ apiKey }: { apiKey: string }) { return { valid: false, error: "Invalid or expired Freebuff Auth Token", unsupported: false }; } const errText = await res.text().catch(() => ""); - return { valid: false, error: `Freebuff validation returned ${res.status}: ${errText.slice(0, 100)}`, unsupported: false }; + return { + valid: false, + error: `Freebuff validation returned ${res.status}: ${errText.slice(0, 100)}`, + unsupported: false, + }; } catch (err: unknown) { const msg = err instanceof Error ? err.message : String(err); return { valid: false, error: `Freebuff validation network error: ${msg}`, unsupported: false }; @@ -303,7 +306,6 @@ export async function validateProviderApiKey({ provider, apiKey, providerSpecifi "deepseek-web": validateDeepSeekWebProvider, "zai-web": validateZaiWebProvider, "grok-web": validateGrokWebProvider, - "qwen-web": validateQwenWebProvider, "kimi-web": validateKimiWebProvider, "chatgpt-web": validateChatGptWebProvider, "chatgpt-web-codex": validateChatGptWebCodexProvider, diff --git a/src/lib/providers/validation/transport.ts b/src/lib/providers/validation/transport.ts index c486ff41fc..54944eae05 100644 --- a/src/lib/providers/validation/transport.ts +++ b/src/lib/providers/validation/transport.ts @@ -75,7 +75,7 @@ export async function validationWrite(url: string, init: RequestInit, isLocal: b // surfaces as a `provider.validation.ssrf_blocked` audit event + a security warning in // the UI) when it is a GENUINE SSRF/guard block — not for every outbound-guard 503. // A blocked redirect (REDIRECT_BLOCKED) to a PUBLIC host is benign: the redirect was -// never followed, so no SSRF occurred. Web-cookie providers like qwen-web answer their +// never followed, so no SSRF occurred. Web-cookie providers answer their // probe with a 307 to a public host, which used to be mislabeled as an SSRF block // (#3288 / #3758). Only treat a blocked redirect as a security event when its target is // a private/internal host. diff --git a/src/lib/providers/validation/webProvidersA.ts b/src/lib/providers/validation/webProvidersA.ts index 52e9aa4c0e..fd4c012061 100644 --- a/src/lib/providers/validation/webProvidersA.ts +++ b/src/lib/providers/validation/webProvidersA.ts @@ -1,4 +1,4 @@ -// Web-cookie provider key validators (part A): deepseek-web, qwen-web, grok-web, chatgpt-web, +// Web-cookie provider key validators (part A): deepseek-web, grok-web, chatgpt-web, // perplexity-web, blackbox-web. Extracted from validation.ts (god-file decomposition) — top-level // functions with no dispatcher-state captures; behavior is byte-identical to the original inline defs. import { addModelsSuffix } from "./urlHelpers"; @@ -6,10 +6,8 @@ import { applyCustomUserAgent } from "./headers"; import { toValidationErrorResult, validationRead, validationWrite } from "./transport"; import { buildGrokCookieHeader, - buildQwenCookieHeader, extractCookieValue, extractKimiAccessToken, - extractQwenToken, normalizeSessionCookieHeader, } from "@/lib/providers/webCookieAuth"; @@ -153,120 +151,6 @@ export async function validateDeepSeekWebProvider({ apiKey }: any) { } } -// qwen-web has no `modelsUrl` in its registry entry, so the generic OpenAI-compatible -// validator used to derive a probe URL of `https://chat.qwen.ai/api/v2/models/` (via -// addModelsSuffix) — a non-existent path that answers with a 307 redirect, which the -// outbound guard blocked and the route then mislabeled as an SSRF block (#3288/#3758). -// -// History of the session probe: -// - Originally `GET /api/v2/user` (Chat2API-derived). Upstream retired the path -// in mid-2026: it now returns `{"success":false,"data":{"code":"not found"}}` -// regardless of credentials, so the body-shape check (#3958) always fails. -// - Current probe: `GET /api/v1/auths/` (note the trailing slash — without it -// the path returns 401). This is the endpoint Qwen's own SPA hits right after -// login to fetch the user profile. It returns the user object directly at the -// top level: `{ id, email, name, role, ... }`. -// -// The validator mirrors the executor's anti-bot headers + cookie-jar replay and uses -// plain fetch (like the other web-cookie validators) so it never hits the -// addModelsSuffix/redirect path. -export async function validateQwenWebProvider({ apiKey }: any) { - const rawCred = String(apiKey ?? "").trim(); - if (!rawCred) { - return { - valid: false, - error: - "Missing Qwen session — paste the full chat.qwen.ai Cookie header (must include token, cna and ssxmod_itna)", - }; - } - - const token = extractQwenToken(rawCred); - const cookieHeader = buildQwenCookieHeader(rawCred); - if (!token && !cookieHeader) { - return { - valid: false, - error: "Could not find a Qwen token/cookie in the pasted value", - }; - } - - try { - const headers: Record = { - Accept: "*/*", - "User-Agent": - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36", - Origin: "https://chat.qwen.ai", - Referer: "https://chat.qwen.ai/", - source: "web", - "bx-v": "2.5.36", - // The Qwen SPA's `version` header is required by the v2 chat completion - // endpoint; the validator sends it too so the probe matches a real - // browser request as closely as possible. (The session probe endpoint - // doesn't enforce it, but consistency with the executor avoids surprises - // if Qwen ever tightens its WAF rules.) - version: "0.2.66", - }; - if (token) headers["Authorization"] = `Bearer ${token}`; - if (cookieHeader) headers["Cookie"] = cookieHeader; - - // The trailing slash is significant: `/api/v1/auths` (no slash) answers 401, - // `/api/v1/auths/` returns the user profile. - const resp = await fetch("https://chat.qwen.ai/api/v1/auths/", { headers }); - const contentType = resp.headers.get("content-type") || ""; - - if (resp.status === 401 || resp.status === 403) { - return { - valid: false, - error: - "Qwen session is invalid or expired — re-login at https://chat.qwen.ai and paste a fresh full Cookie header", - }; - } - // Alibaba's WAF / retired-v1 gateway answers with an HTML challenge page (or 504) - // instead of JSON. A bearer token alone is no longer enough for the v2 endpoint. - if (contentType.includes("text/html") || resp.status === 504) { - return { - valid: false, - error: - "Qwen blocked the request with its anti-bot WAF. Re-login at https://chat.qwen.ai and paste a fresh full Cookie header (must include cna, ssxmod_itna and token) — a bearer token alone is not accepted.", - }; - } - if (!resp.ok) { - return { valid: false, error: `Qwen returned HTTP ${resp.status}` }; - } - - // Parse JSON response and verify we have a real user object. - // /api/v1/auths/ returns the user at the top level: {id, email, name, role, ...}. - // We require `id` to be a non-empty string AND look like a real identifier - // (uuid-ish or otherwise ≥8 chars) to avoid false-positives from upstream - // error envelopes that happen to ship a top-level `id: "not_found"` style - // field. Keep the legacy nested checks (data.user, user) for robustness in - // case the upstream shape changes again. - try { - const data = await resp.json(); - const hasTopLevelUser = - typeof data?.id === "string" && data.id.length >= 8 && typeof data?.email === "string"; - const hasNestedUser = - (typeof data?.user?.id === "string" && data.user.id.length > 0) || - (typeof data?.data?.user?.id === "string" && data.data.user.id.length > 0); - if (!hasTopLevelUser && !hasNestedUser) { - return { - valid: false, - error: - "Qwen session token is invalid or expired — re-login at https://chat.qwen.ai and paste a fresh full Cookie header", - }; - } - } catch (parseError) { - return { - valid: false, - error: "Qwen returned invalid JSON response", - }; - } - - return { valid: true, error: null }; - } catch (error) { - return toValidationErrorResult(error); - } -} - /** * Heuristic for a Grok 403 that is an anti-bot / IP-reputation block rather than * a genuine upstream API error (issue #3474). diff --git a/src/lib/providers/webCookieAuth.ts b/src/lib/providers/webCookieAuth.ts index 2035ed444f..325b5e20f5 100644 --- a/src/lib/providers/webCookieAuth.ts +++ b/src/lib/providers/webCookieAuth.ts @@ -130,41 +130,6 @@ export function buildGrokCookieHeader(rawValue: string): string { return parts.join("; "); } -/** - * Build the `Cookie` header value for chat.qwen.ai (Qwen Web / Tongyi). - * - * The Qwen v2 API sits behind Alibaba's "baxia" WAF, which requires the full - * browser cookie jar from a real logged-in session (`cna`, `ssxmod_itna`, - * `ssxmod_itna2`, `token`, `_bl_uid`, `x-ap`, ...). Unlike grok we cannot - * reconstruct a canonical subset, so we forward the whole pasted/captured blob - * verbatim (minus a leading `Cookie:`/`bearer ` prefix). - * - * A bare token (no cookie pairs, i.e. no `=`) yields "" — there is no jar to - * replay, only a bearer credential (handled by {@link extractQwenToken}). - */ -export function buildQwenCookieHeader(rawValue: string): string { - const trimmed = stripCookieInputPrefix(rawValue); - if (!trimmed || !trimmed.includes("=")) return ""; - return trimmed; -} - -/** - * Extract the Qwen bearer token from whatever the user pasted/captured. - * - * Qwen stores its auth JWT in localStorage as `token`, and chat.qwen.ai also - * mirrors it into a `token` cookie. So: - * - full cookie blob with `token=...` → that value - * - bare token (no cookie pairs) → the value itself - * - cookie blob without a `token` pair → "" (token must come from elsewhere) - */ -export function extractQwenToken(rawValue: string): string { - const trimmed = stripCookieInputPrefix(rawValue); - if (!trimmed) return ""; - if (!trimmed.includes("=")) return trimmed; - const match = trimmed.match(/(?:^|;\s*)token=([^;\s]+)/); - return match ? match[1] : ""; -} - /** Extract Kimi Web's current localStorage access token, with legacy cookie compatibility. */ export function extractKimiAccessToken(rawValue: string): string { const raw = String(rawValue ?? "").trim(); diff --git a/src/server/authz/routeGuard.ts b/src/server/authz/routeGuard.ts index 7c61d24545..abfc5d0f55 100644 --- a/src/server/authz/routeGuard.ts +++ b/src/server/authz/routeGuard.ts @@ -57,7 +57,6 @@ export const LOCAL_ONLY_API_PREFIXES: ReadonlyArray = [ "/api/jobs/", // sub-paths: /api/jobs/:id/{runs,enable,disable,run-now} (the bare `/api/jobs` above matches the list route; this matches children) "/api/oauth/cursor/auto-import", // spawns execFile("which", argv-array-of-one-arg "cursor") to verify a local Cursor install before importing creds — RCE-via-tunnel surface (Hard Rules #15 + #17, found by 6A.8 route-guard gate). Specific path only: the rest of /api/oauth/ (browser redirect/callback flows) must stay remote-reachable. Note: this comment intentionally avoids a literal closing square bracket character — check-openapi-security-tiers.mjs's naive regex parser for this array stops at the first one it finds, silently truncating its view of every entry after this one. "/api/oauth/kiro/auto-import", // reads host-local Kiro credential files (homedir kiro-cli data) — must reach the loopback-only gate, not the PUBLIC /api/oauth/ prefix (GHSA-wgwc-crjm-pmwv, GHSA-gxv4-955v-v6cm). Excluded from PUBLIC in publicApiRoutes.ts. - "/api/oauth/raycast/auto-import", // reads host-local Raycast credential files — same loopback-only rationale as the kiro and cursor auto-import routes above. "/api/skills/collect/", // Skill Collector CLI detection: GET .../detect probes getCliRuntimeStatus() per CLI_TOOL_IDS entry, which spawns a child process to check each tool — RCE-via-tunnel surface (Hard Rules #15 + #17, PR #6294 review). "/api/discovery/", // Discovery tool (opt-in provider scanner): the scan route makes outbound probes to provider endpoints (SSRF-adjacent) and the whole surface is an admin research tool — strict-loopback only, no manage-scope bypass (NOT in LOCAL_ONLY_MANAGE_SCOPE_BYPASS_PREFIXES). See _tasks/features-v3.8.42/gaps/DISCOVERY_TOOL_DESIGN.md. VNC_ROUTE_PREFIX, // #7892: /api/vnc-session/* spawns Docker containers via child_process.spawn (src/lib/vncSession/service.ts) — RCE-via-tunnel surface (Hard Rules #15 + #17), same CVE class (GHSA-fhh6-4qxv-rpqj). diff --git a/src/shared/components/RaycastAuthModal.tsx b/src/shared/components/RaycastAuthModal.tsx deleted file mode 100644 index 7d1461294f..0000000000 --- a/src/shared/components/RaycastAuthModal.tsx +++ /dev/null @@ -1,213 +0,0 @@ -"use client"; - -/** - * @file RaycastAuthModal.tsx - * @description Import Raycast Pro AI credentials (auto-detect from local macOS install). - * - * @changes - * - [2026-07-27] [Composer] - Add one-click auto-import from Keychain + Raycast DB - */ - -import { useEffect, useState } from "react"; -import Modal from "./Modal"; -import Button from "./Button"; -import Input from "./Input"; - -type RaycastAuthModalProps = { - isOpen: boolean; - reauthConnection?: unknown; - onSuccess?: () => void; - onClose: () => void; -}; - -export default function RaycastAuthModal({ - isOpen, - onSuccess, - onClose, -}: RaycastAuthModalProps) { - const [accessToken, setAccessToken] = useState(""); - const [deviceId, setDeviceId] = useState(""); - const [signatureJwt, setSignatureJwt] = useState(""); - const [sigSecret, setSigSecret] = useState(""); - const [importing, setImporting] = useState(false); - const [autoAvailable, setAutoAvailable] = useState(false); - const [showManual, setShowManual] = useState(false); - const [error, setError] = useState(null); - - useEffect(() => { - if (!isOpen) return; - fetch("/api/oauth/raycast/auto-import") - .then((r) => r.json()) - .then((d) => setAutoAvailable(!!d.available)) - .catch(() => setAutoAvailable(false)); - }, [isOpen]); - - const handleAutoImport = async () => { - setImporting(true); - setError(null); - try { - const res = await fetch("/api/oauth/raycast/auto-import", { method: "POST" }); - const data = await res.json(); - if (!res.ok) { - throw new Error( - typeof data.error === "string" ? data.error : data.error?.message || "Auto-import failed" - ); - } - onSuccess?.(); - onClose(); - } catch (err) { - setError(err instanceof Error ? err.message : String(err)); - } finally { - setImporting(false); - } - }; - - const handleImportToken = async () => { - if (!accessToken.trim() || !deviceId.trim()) { - setError("Bearer token and device ID are required."); - return; - } - - setImporting(true); - setError(null); - - try { - const body: Record = { - accessToken: accessToken.trim(), - deviceId: deviceId.trim(), - }; - if (signatureJwt.trim()) body.signatureJwt = signatureJwt.trim(); - if (sigSecret.trim()) body.sigSecret = sigSecret.trim(); - - const res = await fetch("/api/oauth/raycast/import", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(body), - }); - const data = await res.json(); - if (!res.ok) { - throw new Error( - typeof data.error === "string" ? data.error : data.error?.message || "Import failed" - ); - } - - onSuccess?.(); - onClose(); - } catch (err) { - setError(err instanceof Error ? err.message : String(err)); - } finally { - setImporting(false); - } - }; - - return ( - -
-
-

- Auto-import (recommended on macOS): reads your local Raycast login from - Keychain + analytics device ID. No proxy needed. -

- - {!autoAvailable && ( -

- Install sqlcipher: brew install sqlcipher -

- )} -
- -
-

- Local dev only. Uses your Raycast Pro subscription via reverse-engineered - API. Not official — may break on Raycast updates. -

- -
- - {showManual && ( - <> -
- -