Changelog
[3.0.0] — 2026-03-24
🎉 OmniRoute v3.0.0 — The Free AI Gateway, Now with 67+ Providers
The biggest release ever. From 36 providers in v2.9.5 to 67+ providers in v3.0.0 — with MCP Server, A2A Protocol, auto-combo engine, Provider Icons, Registered Keys API, 926 tests, and contributions from 12 community members across 10 merged PRs.
Consolidated from v3.0.0-rc.1 through rc.17 (17 release candidates over 3 days of intense development).
🆕 New Providers (+31 since v2.9.5)
| Provider | Alias | Tier | Notes |
|---|---|---|---|
| OpenCode Zen | opencode-zen
| Free | 3 models via opencode.ai/zen/v1 (PR #530 by @kang-heewon)
|
| OpenCode Go | opencode-go
| Paid | 4 models via opencode.ai/zen/go/v1 (PR #530 by @kang-heewon)
|
| LongCat AI | lc
| Free | 50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) during public beta |
| Pollinations AI | pol
| Free | No API key needed — GPT-5, Claude, Gemini, DeepSeek V3, Llama 4 (1 req/15s) |
| Cloudflare Workers AI | cf
| Free | 10K Neurons/day — ~150 LLM responses or 500s Whisper audio, edge inference |
| Scaleway AI | scw
| Free | 1M free tokens for new accounts — EU/GDPR compliant (Paris) |
| AI/ML API | aiml
| Free | $0.025/day free credits — 200+ models via single endpoint |
| Puter AI | pu
| Free | 500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3) |
| Alibaba Cloud (DashScope) | ali
| Paid | International + China endpoints via alicode/alicode-intl
|
| Alibaba Coding Plan | bcp
| Paid | Alibaba Model Studio with Anthropic-compatible API |
| Kimi Coding (API Key) | kmca
| Paid | Dedicated API-key-based Kimi access (separate from OAuth) |
| MiniMax Coding | minimax
| Paid | International endpoint |
| MiniMax (China) | minimax-cn
| Paid | China-specific endpoint |
| Z.AI (GLM-5) | zai
| Paid | Zhipu AI next-gen GLM models |
| Vertex AI | vertex
| Paid | Google Cloud — Service Account JSON or OAuth access_token |
| Ollama Cloud | ollamacloud
| Paid | Ollama's hosted API service |
| Synthetic | synthetic
| Paid | Passthrough models gateway |
| Kilo Gateway | kg
| Paid | Passthrough models gateway |
| Perplexity Search | pplx-search
| Paid | Dedicated search-grounded endpoint |
| Serper Search | serper-search
| Paid | Web search API integration |
| Brave Search | brave-search
| Paid | Brave Search API integration |
| Exa Search | exa-search
| Paid | Neural search API integration |
| Tavily Search | tavily-search
| Paid | AI search API integration |
| NanoBanana | nb
| Paid | Image generation API |
| ElevenLabs | el
| Paid | Text-to-speech voice synthesis |
| Cartesia | cartesia
| Paid | Ultra-fast TTS voice synthesis |
| PlayHT | playht
| Paid | Voice cloning and TTS |
| Inworld | inworld
| Paid | AI character voice chat |
| SD WebUI | sdwebui
| Self-hosted | Stable Diffusion local image generation |
| ComfyUI | comfyui
| Self-hosted | ComfyUI local workflow node-based generation |
| GLM Coding | glm
| Paid | BigModel/Zhipu coding-specific endpoint |
Total: 67+ providers (4 Free, 8 OAuth, 55 API Key) + unlimited OpenAI/Anthropic-Compatible custom providers.
✨ Major Features
🔑 Registered Keys Provisioning API (#464)
Auto-generate and issue OmniRoute API keys programmatically with per-provider and per-account quota enforcement.
| Endpoint | Method | Description |
|---|---|---|
/api/v1/registered-keys
| POST
| Issue a new key — raw key returned once only |
/api/v1/registered-keys
| GET
| List registered keys (masked) |
/api/v1/registered-keys/{id}
| GET/DELETE
| Get metadata / Revoke |
/api/v1/quotas/check
| GET
| Pre-validate quota before issuing |
/api/v1/providers/{id}/limits
| GET/PUT
| Configure per-provider issuance limits |
/api/v1/accounts/{id}/limits
| GET/PUT
| Configure per-account issuance limits |
/api/v1/issues/report
| POST
| Report quota events to GitHub Issues |
Security: Keys stored as SHA-256 hashes. Raw key shown once on creation, never retrievable again.
🎨 Provider Icons via @lobehub/icons (#529)
130+ provider logos using @lobehub/icons React components (SVG). Fallback chain: Lobehub SVG → existing PNG → generic icon. Applied across Dashboard, Providers, and Agents pages with standardized ProviderIcon component.
🔄 Model Auto-Sync Scheduler (#488)
Auto-refreshes model lists for connected providers every 24 hours. Runs on server startup. Configurable via MODEL_SYNC_INTERVAL_HOURS.
🔀 Per-Model Combo Routing (#563)
Map model name patterns (glob) to specific combos for automatic routing:
claude-sonnet*→ code-combo,gpt-4o*→ openai-combo,gemini-*→ google-combo- New
model_combo_mappingstable with glob-to-regex matching - Dashboard UI section: "Model Routing Rules" with inline add/edit/toggle/delete
🧭 API Endpoints Dashboard
Interactive catalog, webhooks management, OpenAPI viewer — all in one tabbed page at /dashboard/endpoint.
🔍 Web Search Providers
5 new search provider integrations: Perplexity Search, Serper, Brave Search, Exa, Tavily — enabling grounded AI responses with real-time web data.
📊 Search Analytics
New tab in /dashboard/analytics — provider breakdown, cache hit rate, cost tracking. API: GET /api/v1/search/analytics.
🛡️ Per-API-Key Rate Limits (#452)
max_requests_per_day and max_requests_per_minute columns with in-memory sliding-window enforcement returning HTTP 429.
🎵 Media Playground
Full media generation playground at /dashboard/media: Image Generation, Video, Music, Audio Transcription (2GB upload limit), and Text-to-Speech.
🔒 Security & CI/CD
- CodeQL remediation — Fixed 10+ alerts: 6 polynomial-redos, 1 insecure-randomness (
Math.random()→crypto.randomUUID()), 1 shell-command-injection - Route validation — Zod schemas +
validateBody()on 176/176 API routes — CI enforced - CVE fix — dompurify XSS vulnerability (GHSA-v2wj-7wpq-c8vv) resolved via npm overrides
- Flatted — Bumped 3.3.3 → 3.4.2 (CWE-1321 prototype pollution)
- Docker — Upgraded
docker/setup-buildx-actionv3 → v4
🐛 Bug Fixes (40+)
OAuth & Auth
- #537 — Gemini CLI OAuth: clear actionable error when
GEMINI_OAUTH_CLIENT_SECRETmissing in Docker - #549 — CLI settings routes now resolve real API key from
keyId(not masked strings) - #574 — Login no longer freezes after skipping wizard password setup
- #506 — Cross-platform
machineIdrewritten (Windows REG.exe → macOS ioreg → Linux → hostname fallback)
Providers & Routing
- #536 — LongCat AI: fixed
baseUrlandauthHeader - #535 — Pinned model override:
body.modelcorrectly set topinnedModel - #570 — Unprefixed Claude models now resolve to Anthropic provider
- #585 —
<omniModel>internal tags no longer leak to clients in SSE streaming - #493 — Custom provider model naming no longer mangled by prefix stripping
- #490 — Streaming + context cache protection via
TransformStreaminjection - #511 —
<omniModel>tag injected into first content chunk (not after[DONE])
CLI & Tools
- #527 — Claude Code + Codex loop:
tool_resultblocks now converted to text - #524 — OpenCode config saved correctly (XDG_CONFIG_HOME, TOML format)
- #522 — API Manager: removed misleading "Copy masked key" button
- #546 —
--versionreturningunknownon Windows (PR by @k0valik) - #544 — Secure CLI tool detection via known installation paths (PR by @k0valik)
- #510 — Windows MSYS2/Git-Bash paths normalized automatically
- #492 — CLI detects
mise/nvm-managed Node whenapp/server.jsmissing
Streaming & SSE
- PR #587 — Revert
resolveDataDirimport in responsesTransformer for Cloudflare Workers compat (@k0valik) - PR #495 — Bottleneck 429 infinite wait: drop waiting jobs on rate limit (@xandr0s)
- #483 — Stop trailing
data: nullafter[DONE]signal - #473 — Zombie SSE streams: timeout reduced 300s → 120s for faster fallback
Media & Transcription
- Transcription — Deepgram
video/mp4→audio/mp4MIME mapping, auto language detection, punctuation - TTS —
[object Object]error display fixed for ElevenLabs-style nested errors - Upload limits — Media transcription increased to 2GB (nginx
client_max_body_size 2g+maxDuration=300)
🔧 Infrastructure & Improvements
Sub2api Gap Analysis (T01–T15 + T23–T42)
- T01 —
requested_modelcolumn in call logs (migration 009) - T02 — Strip empty text blocks from nested
tool_result.content - T03 — Parse
x-codex-5h-*/x-codex-7d-*quota headers - T04 —
X-Session-Idheader for external sticky routing - T05 — Rate-limit DB persistence with dedicated API
- T06 — Account deactivated → permanent block (1-year cooldown)
- T07 — X-Forwarded-For IP validation (
extractClientIp()) - T08 — Per-API-key session limits with sliding-window enforcement
- T09 — Codex vs Spark rate-limit scopes (separate pools)
- T10 — Credits exhausted → distinct 1h cooldown fallback
- T11 —
maxreasoning effort → 131072 budget tokens - T12 — MiniMax M2.7 pricing entries
- T13 — Stale quota display fix (reset window awareness)
- T14 — Proxy fast-fail TCP check (≤2s, cached 30s)
- T15 — Array content normalization for Anthropic
- T23 — Intelligent quota reset fallback (header extraction)
- T24 —
503cooldown +406mapping - T25 — Provider validation fallback
- T29 — Vertex AI Service Account JWT auth
- T33 — Thinking level to budget conversion
- T36 —
403vs429error classification - T38 — Centralized model specifications (
modelSpecs.ts) - T39 — Endpoint fallback for
fetchAvailableModels - T41 — Background task auto-redirect to flash models
- T42 — Image generation aspect ratio mapping
Other Improvements
- Per-model upstream custom headers — via configuration UI (PR #575 by @zhangqiang8vip)
- Model context length — configurable in model metadata (PR #578 by @hijak)
- Model prefix stripping — option to remove provider prefix from model names (PR #582 by @jay77721)
- Gemini CLI deprecation — marked deprecated with Google OAuth restriction warning
- YAML parser — replaced custom parser with
js-yamlfor correct OpenAPI spec parsing - ZWS v5 — HMR leak fix (485 DB connections → 1, memory 2.4GB → 195MB)
- Log export — New JSON export button on dashboard with time range dropdown
- Update notification banner — dashboard homepage shows when new versions are available
🌐 i18n & Documentation
- 30 languages at 100% parity — 2,788 missing keys synced
- Czech — Full translation: 22 docs, 2,606 UI strings (PR by @zen0bit)
- Chinese (zh-CN) — Complete retranslation (PR by @only4copilot)
- VM Deployment Guide — Translated to English as source document
- API Reference — Added
/v1/embeddingsand/v1/audio/speechendpoints - Provider count — Updated from 36+/40+/44+ to 67+ across README and all 30 i18n READMEs
🔀 Community PRs Merged (10)
| PR | Author | Summary |
|---|---|---|
| #587 | @k0valik | fix(sse): revert resolveDataDir import for Cloudflare Workers compat |
| #582 | @jay77721 | feat(proxy): model name prefix stripping option |
| #581 | @jay77721 | fix(npm): link electron-release to npm-publish workflow |
| #578 | @hijak | feat: configurable context length in model metadata |
| #575 | @zhangqiang8vip | feat: per-model upstream headers, compat PATCH, chat alignment |
| #562 | @coobabm | fix: MCP session management, Claude passthrough, detectFormat |
| #561 | @zen0bit | fix(i18n): Czech translation corrections |
| #555 | @k0valik | fix(sse): centralized resolveDataDir() for path resolution
|
| #546 | @k0valik | fix(cli): --version returning unknown on Windows
|
| #544 | @k0valik | fix(cli): secure CLI tool detection via installation paths |
| #542 | @rdself | fix(ui): light mode contrast CSS theme variables |
| #530 | @kang-heewon | feat: OpenCode Zen + Go providers with OpencodeExecutor
|
| #512 | @zhangqiang8vip | feat: per-protocol model compatibility (compatByProtocol)
|
| #497 | @zhangqiang8vip | fix: dev-mode HMR resource leaks (ZWS v5) |
| #495 | @xandr0s | fix: Bottleneck 429 infinite wait (drop waiting jobs) |
| #494 | @zhangqiang8vip | feat: MiniMax developer→system role fix |
| #480 | @prakersh | fix: stream flush usage extraction |
| #479 | @prakersh | feat: Codex 5.3/5.4 and Anthropic pricing entries |
| #475 | @only4copilot | feat(i18n): improved Chinese translation |
Thank you to all contributors! 🙏
📋 Issues Resolved (50+)
#452 #458 #462 #464 #466 #473 #474 #481 #483 #487 #488 #489 #490 #491 #492 #493 #506 #508 #509 #510 #511 #513 #520 #521 #522 #524 #525 #527 #529 #531 #532 #535 #536 #537 #541 #546 #549 #563 #570 #574 #585
🧪 Tests
- 926 tests, 0 failures (up from 821 in v2.9.5)
- +105 new tests covering: model-combo mappings, registered keys, OpencodeExecutor, Bailian provider, route validation, error classification, aspect ratio mapping, and more
📦 Database Migrations
| Migration | Description |
|---|---|
| 008 | registered_keys, provider_key_limits, account_key_limits tables
|
| 009 | requested_model column in call_logs
|
| 010 | model_combo_mappings table for per-model combo routing
|
⬆️ Upgrading from v2.9.5
# npm
npm install -g omniroute@3.0.0
# Docker
docker pull diegosouzapw/omniroute:3.0.0
# Migrations run automatically on first startupBreaking changes: None. All existing configurations, combos, and API keys are preserved.
Database migrations 008-010 run automatically on startup.
[3.0.0-rc.17] — 2026-03-24
🔒 Security & CI/CD
- CodeQL remediation — Fixed 10+ alerts:
- 6 polynomial-redos in
provider.ts/chatCore.ts(replaced(?:^|/)alternation patterns with segment-based matching) - 1 insecure-randomness in
acp/manager.ts(Math.random()→crypto.randomUUID()) - 1 shell-command-injection in
prepublish.mjs(JSON.stringify()path escaping)
- 6 polynomial-redos in
- Route validation — Added Zod schemas +
validateBody()to 5 routes missing validation:model-combo-mappings(POST, PUT),webhooks(POST, PUT),openapi/try(POST)- CI
check:route-validation:t06now passes: 176/176 routes validated
🐛 Bug Fixes
- #585 —
<omniModel>internal tags no longer leak to clients in SSE responses. Added outbound sanitizationTransformStreamincombo.ts
⚙️ Infrastructure
- Docker — Upgraded
docker/setup-buildx-actionfrom v3 → v4 (Node.js 20 deprecation fix) - CI cleanup — Deleted 150+ failed/cancelled workflow runs
🧪 Tests
- Test suite: 926 tests, 0 failures (+3 new)
[3.0.0-rc.16] — 2026-03-24
✨ New Features
- Increased media transcription limits
- Added Model Context Length to registry metadata
- Added per-model upstream custom headers via configuration UI
- Fixed multiple bugs, Zod valiadation for patches, and resolved various community issues.
[3.0.0-rc.15] — 2026-03-24
✨ New Features
- #563 — Per-model Combo Routing: map model name patterns (glob) to specific combos for automatic routing
- New
model_combo_mappingstable (migration 010) with pattern, combo_id, priority, enabled resolveComboForModel()DB function with glob-to-regex matching (case-insensitive,*and?wildcards)getComboForModel()inmodel.ts: augmentsgetCombo()with model-pattern fallbackchat.ts: routing decision now checks model-combo mappings before single-model handling- API:
GET/POST /api/model-combo-mappings,GET/PUT/DELETE /api/model-combo-mappings/:id - Dashboard: "Model Routing Rules" section added to Combos page with inline add/edit/toggle/delete
- Examples:
claude-sonnet*→ code-combo,gpt-4o*→ openai-combo,gemini-*→ google-combo
- New
🌐 i18n
- Full i18n Sync: 2,788 missing keys added across 30 language files — all languages now at 100% parity with
en.json - Agents page i18n: OpenCode Integration section fully internationalized (title, description, scanning, download labels)
- 6 new keys added to
agentsnamespace for OpenCode section
🎨 UI/UX
- Provider Icons: 16 missing provider icons added (3 copied, 2 downloaded, 11 SVG created)
- SVG fallback:
ProviderIconcomponent updated with 4-tier strategy: Lobehub → PNG → SVG → Generic icon - Agents fingerprinting: Synced with CLI tools — added droid, openclaw, copilot, opencode to fingerprint list (14 total)
🔒 Security
- CVE fix: Resolved dompurify XSS vulnerability (GHSA-v2wj-7wpq-c8vv) via npm overrides forcing
dompurify@^3.3.2 npm auditnow reports 0 vulnerabilities
🧪 Tests
- Test suite: 923 tests, 0 failures (+15 new model-combo mapping tests)
[3.0.0-rc.14] — 2026-03-23
🔀 Community PRs Merged
| PR | Author | Summary |
|---|---|---|
| #562 | @coobabm | fix(ux): MCP session management, Claude passthrough normalization, OAuth modal, detectFormat |
| #561 | @zen0bit | fix(i18n): Czech translation corrections — HTTP method names and documentation updates |
🧪 Tests
- Test suite: 908 tests, 0 failures
[3.0.0-rc.13] — 2026-03-23
🔧 Bug Fixes
- config: resolve real API key from
keyIdin CLI settings routes (codex-settings,droid-settings,kilo-settings) to prevent writing masked strings (#549)
[3.0.0-rc.12] — 2026-03-23
🔀 Community PRs Merged
| PR | Author | Summary |
|---|---|---|
| #546 | @k0valik | fix(cli): --version returning unknown on Windows — use JSON.parse(readFileSync) instead of ESM import
|
| #555 | @k0valik | fix(sse): centralized resolveDataDir() for path resolution in credentials, autoCombo, responses logger, and request logger
|
| #544 | @k0valik | fix(cli): secure CLI tool detection via known installation paths (8 tools) with symlink validation, file-type checks, size bounds, minimal env in healthcheck |
| #542 | @rdself | fix(ui): improve light mode contrast — add missing CSS theme variables (bg-primary, bg-subtle, text-primary) and fix dark-only colors in log detail
|
🔧 Bug Fixes
- TDZ fix in
cliRuntime.ts—validateEnvPathwas used before initialization at module startup bygetExpectedParentPaths(). Reordered declarations to fixReferenceError. - Build fixes — Added
pinoandpino-prettytoserverExternalPackagesto prevent Turbopack from breaking Pino's internal worker loading.
🧪 Tests
- Test suite: 905 tests, 0 failures
[3.0.0-rc.10] — 2026-03-23
🔧 Bug Fixes
- #509 / #508 — Electron build regression: downgraded Next.js from
16.1.xto16.0.10to eliminate Turbopack module-hashing instability that caused blank screens in the Electron desktop bundle. - Unit test fixes — Corrected two stale test assertions (
nanobanana-image-handleraspect ratio/resolution,thinking-budgetGeminithinkingConfigfield mapping) that had drifted after recent implementation changes. - #541 — Responded to user feedback about installation complexity; no code changes required.
[3.0.0-rc.9] — 2026-03-23
✨ New Features
- T29 — Vertex AI SA JSON Executor: implemented using the
joselibrary to handle JWT/Service Account auth, along with configurable regions in the UI and automatic partner model URL building. - T42 — Image generation aspect ratio mapping: created
sizeMapperlogic for generic OpenAI formats (size), added nativeimagen3handling, and updated NanoBanana endpoints to utilize mapped aspect ratios automatically. - T38 — Centralized model specifications:
modelSpecs.tscreated for limits and parameters per model.
🔧 Improvements
- T40 — OpenCode CLI tools integration: native
opencode-zenandopencode-gointegration completed in earlier PR.
[3.0.0-rc.8] — 2026-03-23
🔧 Bug Fixes & Improvements (Fallback, Quota & Budget)
- T24 —
503cooldown await fix +406mapping: mapped406 Not Acceptableto503 Service Unavailablewith proper cooldown intervals. - T25 — Provider validation fallback: graceful fallback to standard validation models when a specific
validationModelIdis not present. - T36 —
403vs429provider handling refinement: extracted intoerrorClassifier.tsto properly segregate hard permissions failures (403) from rate limits (429). - T39 — Endpoint Fallback for
fetchAvailableModels: implemented a tri-tier mechanism (/models->/v1/models-> local generic catalog) +list_models_catalogMCP tool updates to reflectsourceandwarning. - T33 — Thinking level to budget conversion: translates qualitative thinking levels into precise budget allocations.
- T41 — Background task auto redirect: routes heavy background evaluation tasks to flash/efficient models automatically.
- T23 — Intelligent quota reset fallback: accurately extracts
x-ratelimit-reset/retry-afterheader values or maps static cooldowns.
[3.0.0-rc.7] — 2026-03-23 (What's New vs v2.9.5 — will be released as v3.0.0)
Upgrade from v2.9.5: 16 issues resolved · 2 community PRs merged · 2 new providers · 7 new API endpoints · 3 new features · DB migration 008+009 · 832 tests passing · 15 sub2api gap improvements (T01–T15 complete).
🆕 New Providers
| Provider | Alias | Tier | Notes |
|---|---|---|---|
| OpenCode Zen | opencode-zen
| Free | 3 models via opencode.ai/zen/v1 (PR #530 by @kang-heewon)
|
| OpenCode Go | opencode-go
| Paid | 4 models via opencode.ai/zen/go/v1 (PR #530 by @kang-heewon)
|
Both providers use the new OpencodeExecutor with multi-format routing (/chat/completions, /messages, /responses, /models/{model}:generateContent).
✨ New Features
🔑 Registered Keys Provisioning API (#464)
Auto-generate and issue OmniRoute API keys programmatically with per-provider and per-account quota enforcement.
| Endpoint | Method | Description |
|---|---|---|
/api/v1/registered-keys
| POST
| Issue a new key — raw key returned once only |
/api/v1/registered-keys
| GET
| List registered keys (masked) |
/api/v1/registered-keys/{id}
| GET
| Get key metadata |
/api/v1/registered-keys/{id}
| DELETE
| Revoke a key |
/api/v1/registered-keys/{id}/revoke
| POST
| Revoke (for clients without DELETE support) |
/api/v1/quotas/check
| GET
| Pre-validate quota before issuing |
/api/v1/providers/{id}/limits
| GET/PUT
| Configure per-provider issuance limits |
/api/v1/accounts/{id}/limits
| GET/PUT
| Configure per-account issuance limits |
/api/v1/issues/report
| POST
| Report quota events to GitHub Issues |
DB — Migration 008: Three new tables: registered_keys, provider_key_limits, account_key_limits.
Security: Keys stored as SHA-256 hashes. Raw key shown once on creation, never retrievable again.
Quota types: maxActiveKeys, dailyIssueLimit, hourlyIssueLimit per provider and per account.
Idempotency: idempotency_key field prevents duplicate issuance. Returns 409 IDEMPOTENCY_CONFLICT if key was already used.
Budget per key: dailyBudget / hourlyBudget — limits how many requests a key can route per window.
GitHub reporting: Optional. Set GITHUB_ISSUES_REPO + GITHUB_ISSUES_TOKEN to auto-create GitHub issues on quota exceeded or issuance failures.
🎨 Provider Icons — @lobehub/icons (#529)
All provider icons in the dashboard now use @lobehub/icons React components (130+ providers with SVG).
Fallback chain: Lobehub SVG → existing /providers/{id}.png → generic icon. Uses a proper React ErrorBoundary pattern.
🔄 Model Auto-Sync Scheduler (#488)
OmniRoute now automatically refreshes model lists for connected providers every 24 hours.
- Runs on server startup via the existing
/api/sync/initializehook - Configurable via
MODEL_SYNC_INTERVAL_HOURSenvironment variable - Covers 16 major providers
- Records last sync time in the settings database
🔧 Bug Fixes
OAuth & Auth
- #537 — Gemini CLI OAuth: Clear actionable error when
GEMINI_OAUTH_CLIENT_SECRETis missing in Docker/self-hosted deployments. Previously showed crypticclient_secret is missingfrom Google. Now provides specificdocker-compose.ymland~/.omniroute/.envinstructions.
Providers & Routing
- #536 — LongCat AI: Fixed
baseUrl(api.longcat.chat/openai) andauthHeader(Authorization: Bearer). - #535 — Pinned model override:
body.modelis now correctly set topinnedModelwhen context-cache protection is active. - #532 — OpenCode Go key validation: Now uses the
zen/v1test endpoint (testKeyBaseUrl) — same key works for both tiers.
CLI & Tools
- #527 — Claude Code + Codex loop:
tool_resultblocks are now converted to text instead of dropped, stopping infinite tool-result loops. - #524 — OpenCode config save: Added
saveOpenCodeConfig()handler (XDG_CONFIG_HOME aware, writes TOML). - #521 — Login stuck: Login no longer freezes after skipping password setup — redirects correctly to onboarding.
- #522 — API Manager: Removed misleading "Copy masked key" button (replaced with a lock icon tooltip).
- #532 — OpenCode Go config: Guide settings handler now handles
opencodetoolId.
Developer Experience
- #489 — Antigravity: Missing
googleProjectIdreturns a structured 422 error with reconnect guidance instead of a cryptic crash. - #510 — Windows paths: MSYS2/Git-Bash paths (
/c/Program Files/...) are now normalized toC:\\Program Files\\...automatically. - #492 — CLI startup:
omnirouteCLI now detectsmise/nvm-managed Node whenapp/server.jsis missing and shows targeted fix instructions.
📖 Documentation Updates
- #513 — Docker password reset:
INITIAL_PASSWORDenv var workaround documented - #520 — pnpm:
pnpm approve-builds better-sqlite3step documented
✅ Issues Resolved in v3.0.0
#464 #488 #489 #492 #510 #513 #520 #521 #522 #524 #527 #529 #532 #535 #536 #537
🔀 Community PRs Merged
| PR | Author | Summary |
|---|---|---|
| #530 | @kang-heewon | OpenCode Zen + Go providers with OpencodeExecutor and improved tests
|
[3.0.0-rc.7] - 2026-03-23
🔧 Improvements (sub2api Gap Analysis — T05, T08, T09, T13, T14)
- T05 — Rate-limit DB persistence:
setConnectionRateLimitUntil(),isConnectionRateLimited(),getRateLimitedConnections()inproviders.ts. The existingrate_limited_untilcolumn is now exposed as a dedicated API — OAuth token refresh must NOT touch this field to prevent rate-limit loops. - T08 — Per-API-key session limit:
max_sessions INTEGER DEFAULT 0added toapi_keysvia auto-migration.sessionManager.tsgainsregisterKeySession(),unregisterKeySession(),checkSessionLimit(), andgetActiveSessionCountForKey(). Callers inchatCore.jscan enforce the limit and decrement onreq.close. - T09 — Codex vs Spark rate-limit scopes:
getCodexModelScope()andgetCodexRateLimitKey()incodex.ts. Standard models (gpt-5.x-codex,codex-mini) get scope"codex"; spark models (codex-spark*) get scope"spark". Rate-limit keys should be${accountId}:${scope}so exhausting one pool doesn't block the other. - T13 — Stale quota display fix:
getEffectiveQuotaUsage(used, resetAt)returns0when the reset window has passed;formatResetCountdown(resetAt)returns a human-readable countdown string (e.g."2h 35m"). Both exported fromproviders.ts+localDb.tsfor dashboard consumption. - T14 — Proxy fast-fail: new
src/lib/proxyHealth.tswithisProxyReachable(proxyUrl, timeoutMs=2000)(TCP check, ≤2s instead of 30s timeout),getCachedProxyHealth(),invalidateProxyHealth(), andgetAllProxyHealthStatuses(). Results cached 30s by default; configurable viaPROXY_FAST_FAIL_TIMEOUT_MS/PROXY_HEALTH_CACHE_TTL_MS.
🧪 Tests
- Test suite: 832 tests, 0 failures
[3.0.0-rc.6] - 2026-03-23
🔧 Bug Fixes & Improvements (sub2api Gap Analysis — T01–T15)
- T01 —
requested_modelcolumn incall_logs(migration 009): track which model the client originally requested vs the actual routed model. Enables fallback rate analytics. - T02 — Strip empty text blocks from nested
tool_result.content: prevents Anthropic 400 errors (text content blocks must be non-empty) when Claude Code chains tool results. - T03 — Parse
x-codex-5h-*/x-codex-7d-*headers:parseCodexQuotaHeaders()+getCodexResetTime()extract Codex quota windows for precise cooldown scheduling instead of generic 5-min fallback. - T04 —
X-Session-Idheader for external sticky routing:extractExternalSessionId()insessionManager.tsreadsx-session-id/x-omniroute-sessionheaders withext:prefix to avoid collision with internal SHA-256 session IDs. Nginx-compatible (hyphenated header). - T06 — Account deactivated → permanent block:
isAccountDeactivated()inaccountFallback.tsdetects 401 deactivation signals and applies a 1-year cooldown to prevent retrying permanently dead accounts. - T07 — X-Forwarded-For IP validation: new
src/lib/ipUtils.tswithextractClientIp()andgetClientIpFromRequest()— skipsunknown/non-IP entries inX-Forwarded-Forchains (Nginx/proxy-forwarded requests). - T10 — Credits exhausted → distinct fallback:
isCreditsExhausted()inaccountFallback.tsreturns 1h cooldown withcreditsExhaustedflag, distinct from generic 429 rate limiting. - T11 —
maxreasoning effort → 131072 budget tokens:EFFORT_BUDGETSandTHINKING_LEVEL_MAPupdated; reverse mapping now returns"max"for full-budget responses. Unit test updated. - T12 — MiniMax M2.7 pricing entries added:
minimax-m2.7,MiniMax-M2.7,minimax-m2.7-highspeedadded to pricing table (sub2api PR #1120). M2.5/GLM-4.7/GLM-5/Kimi pricing already existed. - T15 — Array content normalization:
normalizeContentToString()helper inopenai-to-claude.tscorrectly collapses array-formatted system/tool messages to string before sending to Anthropic.
🧪 Tests
- Test suite: 832 tests, 0 failures (unchanged from rc.5)
[3.0.0-rc.5] - 2026-03-22
✨ New Features
- #464 — Registered Keys Provisioning API: auto-issue API keys with per-provider & per-account quota enforcement
POST /api/v1/registered-keys— issue keys with idempotency supportGET /api/v1/registered-keys— list (masked) registered keysGET /api/v1/registered-keys/{id}— get key metadataDELETE /api/v1/registered-keys/{id}/POST ../{id}/revoke— revoke keysGET /api/v1/quotas/check— pre-validate before issuingPUT /api/v1/providers/{id}/limits— set provider issuance limitsPUT /api/v1/accounts/{id}/limits— set account issuance limitsPOST /api/v1/issues/report— optional GitHub issue reporting- DB migration 008:
registered_keys,provider_key_limits,account_key_limitstables
[3.0.0-rc.4] - 2026-03-22
✨ New Features
- #530 (PR) — OpenCode Zen and OpenCode Go providers added (by @kang-heewon)
- New
OpencodeExecutorwith multi-format routing (/chat/completions,/messages,/responses) - 7 models across both tiers
- New
[3.0.0-rc.3] - 2026-03-22
✨ New Features
- #529 — Provider icons now use @lobehub/icons with graceful PNG fallback and a
ProviderIconcomponent (130+ providers supported) - #488 — Auto-update model lists every 24h via
modelSyncScheduler(configurable viaMODEL_SYNC_INTERVAL_HOURS)
🔧 Bug Fixes
- #537 — Gemini CLI OAuth: now shows clear actionable error when
GEMINI_OAUTH_CLIENT_SECRETis missing in Docker/self-hosted deployments
[3.0.0-rc.2] - 2026-03-22
🔧 Bug Fixes
- #536 — LongCat AI key validation: fixed baseUrl (
api.longcat.chat/openai) and authHeader (Authorization: Bearer) - #535 — Pinned model override:
body.modelis now set topinnedModelwhen context-cache protection detects a pinned model - #524 — OpenCode config now saved correctly: added
saveOpenCodeConfig()handler (XDG_CONFIG_HOME aware, writes TOML)
[3.0.0-rc.1] - 2026-03-22
🔧 Bug Fixes
- #521 — Login no longer gets stuck after skipping password setup (redirects to onboarding)
- #522 — API Manager: Removed misleading "Copy masked key" button (replaced with lock icon tooltip)
- #527 — Claude Code + Codex superpowers loop:
tool_resultblocks now converted to text instead of dropped - #532 — OpenCode GO API key validation now uses the correct
zen/v1endpoint (testKeyBaseUrl) - #489 — Antigravity: missing
googleProjectIdreturns structured 422 error with reconnect guidance - #510 — Windows: MSYS2/Git-Bash paths (
/c/Program Files/...) are now normalized toC:\\Program Files\\... - #492 —
omnirouteCLI now detectsmise/nvmwhenapp/server.jsis missing and shows targeted fix
📖 Documentation
- #513 — Docker password reset:
INITIAL_PASSWORDenv var workaround documented - #520 — pnpm:
pnpm approve-builds better-sqlite3documented
✅ Closed Issues
#489, #492, #510, #513, #520, #521, #522, #525, #527, #532