v3.8.11
cheaper-inference/OmniRoutev3.8.11Jun 5, 2026by diegosouzapw
Upgrading?
AI Summary
This release focuses on Codex login improvements via device authorization, per-connection proxy distribution, and API enhancements for image generations. It also includes extensive bug fixes for Codex CLI fallback, OAuth token exchange, Docker healthchecks, and provider validations.
Key Highlights
- Codex login via OpenAI's device authorization flow with a shareable public link.
- Per-connection proxy distribution with dashboard UI and automatic fallback selection.
- API improvements for `/v1/images/generations` and `/v1/images/edits` to support aliases and custom providers.
- Bug fixes for Codex CLI WS→HTTP fallback and OAuth token exchange to Cloudflare.
- Docker healthcheck improvements and NVIDIA NIM key validation fixes.
New Features
- Codex device authorization flow.
- Proxy distribution backend and UI.
- Image generation API enhancements.
- NVIDIA key validation improvements.
- OpenCode Free inclusion in auto-combo.
Full Release Notes
### ✨ New Features
- **codex:** add Codex login via OpenAI's browser-driven device authorization flow, exposed as a shareable "Adicionar Externo" public link (`/connect/codex/{token}`) so a third party can complete the OpenAI device login without dashboard access (#3195 — thanks @zhiru)
- **proxy:** per-connection proxy distribution — `proxy_enabled` DB schema + Zod-validated resolution backend, automatic proxy-fallback selection when provider validation hits a network error, and a dashboard UI with per-connection toggles and a tag-filtered "Distribute Proxies" button (#3170, #3171, #3172 — thanks @pizzav-xyz)
- **api:** `/v1/images/generations` and `/v1/images/edits` now resolve a bare combo/alias model name (e.g. `image`) to its single image target, and `/v1/images/edits` forwards multipart edits to custom OpenAI-compatible providers' `{base_url}/images/edits` (also accepting JSON/data-URL edit input) instead of rejecting everything but chatgpt-web (#3214, #3215 — thanks @ngocquynh85)
### 🔧 Bug Fixes
- **api:** combo names sent to `/v1/responses` are no longer force-rewritten to `codex/<name>` — the Codex CLI WS→HTTP fallback rewrite now skips bare names that are combos, so combos (e.g. `n8n-text`, `paid-premium`) route correctly again instead of failing with "No credentials for provider: codex" (regression since v3.8.9) (#3227, #3233 — thanks @Marcus1Pierce, @Dima-Kal)
- **antigravity:** the `agy` `gemini-3.1-pro-high`/`-low` models now alias to the plain `gemini-3.1-pro` upstream id (the `-high`/`-low` suffix is rejected for gemini-3.x), and non-streaming upstream 4xx/5xx errors surface as real error bodies instead of being masked as an empty `chat.completion` envelope (#3229)
- **auth:** honor the effective `REQUIRE_API_KEY` feature flag (DB override > env > default) in client API auth instead of reading `process.env` directly, and align the route-local optional-auth checks (`/v1/embeddings`, `/v1/web/fetch`, `/v1/combos`, playground) with it (#3188 — thanks @xz-dev)
- **oauth:** use `api.anthropic.com` for the Claude OAuth token exchange so self-hosted VPS deployments are no longer blocked by Cloudflare Bot Management on `console.anthropic.com` (#3203, fixes #3192 — thanks @wilsonicdev)
- **oauth:** validate OAuth client IDs against `resolvePublicCred` so adding an Antigravity / Gemini CLI / AGY connection with the built-in public client no longer fails with a Google `redirect_uri_mismatch` (#3206 — thanks @juandisay)
- **auto-combo:** include zero-config OpenCode Free in `auto/*` virtual combos even with no `provider_connections` row, reusing the synthetic `noauth` connection id and routing through the `oc/` prefix (#3189, fixes #3155 — thanks @wilsonicdev)
- **sse:** refine Kimi thinking-block handling and add regression tests for assistant tool-call replay (#3191 — thanks @bypanghu)
- **openrouter:** report the true upstream `context_length` for passthrough models instead of the 128K default — `normalizeDiscoveredModels` now reads `context_length`/`top_provider.context_length` (and `max_completion_tokens` for output) when `inputTokenLimit` is absent (#3202 — thanks @pulyankote)
- **images:** custom image-generation providers now use the provider node's base URL (`providerSpecificData.baseUrl`) and resolve the `prefix/model` form, instead of silently falling back to the Gemini endpoint (#3205 — thanks @ngocquynh85)
- **docker:** the container healthcheck now probes `127.0.0.1`/`localhost`/`::1` and prints the failure to stderr instead of swallowing it, fixing false "unhealthy" status when the server binds to a non-loopback address (#3151 — thanks @naimo84)
- **docker:** copy `scripts/dev/healthcheck.mjs` into the runner-base image — the Next.js standalone output doesn't trace it, so the `HEALTHCHECK CMD ["node", "healthcheck.mjs"]` probe silently exited 1 (#3201 — thanks @wilsonicdev)
- **llama-cpp:** fall back to the provider's local default base URL (`127.0.0.1:8080/v1`) when a local connection has no base URL set, instead of silently routing to OpenAI (residual of #3136) (#3197 — thanks @tjengbudi)
- **provider-models:** allow deleting synced/fetched models (e.g. llama-cpp) via `DELETE /api/provider-models` — the handler now clears the `syncedAvailableModels` namespace, not just `customModels` (#3204, fixes #3199 — thanks @wilsonicdev); and a deleted synced model now stays deleted across an auto-fetch re-import (the DELETE marks it hidden and the re-import skips hidden ids) (#3199 — thanks @tjengbudi)
- **db/electron:** fix `Cannot find module 'better-sqlite3'` crash when importing a database backup in the packaged Electron app (Windows installer) — the `db-backups/import` route now opens its integrity-check DB through the resilient driver factory (better-sqlite3 → node:sqlite → sql.js) instead of a static native import that is stripped from the standalone server bundle; a guard test prevents any API route from reintroducing a direct native import (#3025 — thanks @yeardie)
- **dashboard:** the home provider-topology graph now shows the friendly provider name instead of the internal UUID for custom providers — the label precedence let `getProviderConfig`'s `{ name: providerId }` fallback shadow the pre-resolved name (#3198 — thanks @tjengbudi)
- **providers:** NVIDIA key validation now probes the universally-available `meta/llama-3.1-8b-instruct` instead of the catalog's first model (`z-ai/glm-5.1`), which requires the "Public API Endpoints" account permission and could hang/be DEGRADED — making a valid key fail with a misleading "Upstream Error" (#3116 — thanks @miracuves)
- **providers:** NVIDIA NIM key validation no longer times out (504) — the probe bypasses the global undici `fetch` proxy patch (`open-sse/utils/proxyFetch.ts`) that is incompatible with NVIDIA's endpoint and made the request hang silently (#3226 — thanks @miracuves)
- **dashboard:** corrected two misleading provider credential hints — Grok Web now states both `sso` and `sso-rw` cookies are required (was just `sso`), and the Vertex AI Service Account field shows real instructional placeholder text instead of an untranslated stub across 40 locales (#3180, #3091 — thanks @YoursSweetDom, @Guru01100101)
- **i18n:** normalize dotted `compliance.eventTypes` keys into nested objects at load time so next-intl no longer throws `INVALID_KEY: Namespace keys cannot contain "."` (the same PR also corrects the Codex import-auth provider hint) ([#3185](https://github.com/diegosouzapw/OmniRoute/pull/3185) — thanks @zhiru; the same i18n bug was independently fixed by @androw in [#3167](https://github.com/diegosouzapw/OmniRoute/pull/3167), credited here as co-author)
- **usage:** route the `agy` provider's quota through the existing Antigravity usage implementation (register `agy` in `USAGE_FETCHER_PROVIDERS`, all four `getUsageForProvider` call sites + `parseQuotaData` + `syncAntigravitySubscriptionIfNeeded`) so it no longer falls through to "Usage API not implemented" (#3232, fixes #3230 — thanks @wilsonicdev)
- **cli:** show OpenCode Free in the Hermes Agent model picker even with no active connection — new optional `alwaysIncludeProviders` prop on `ModelSelectModal` (defaults to `[]`, so other callers are unaffected) lets zero-config providers like `opencode` surface in the grouped list (#3240 — thanks @wilsonicdev)
- **gemini:** refresh the Gemini (AI Studio) static fallback so the provider tab exposes current 3.x / 2.5 models on first run, preserving the `gemini-2.0-flash` default ordering; the full catalog still comes from API sync once a key is added (#3241, fixes #3231 — thanks @wilsonicdev)
### 📝 Maintenance
- **build:** finish the build-output-isolation cleanup — `assembleStandalone.mjs` now derives both its async (`syncStandalone*`) and sync copy paths from a single `NATIVE_ASSET_ENTRIES`/`EXTRA_MODULE_ENTRIES` source of truth (previously two hand-maintained lists that could silently drift), guarded by a new parity test; and the `Dockerfile` drops 5 redundant per-module `COPY` overrides (`@swc/helpers`, `pino-abstract-transport`, `pino-pretty`, `split2`, `migrations`) now that `assembleStandalone` bundles them into the standalone regardless of NFT/Turbopack tracing (validated with a real Turbopack `docker build` + boot → `/api/monitoring/health` 200; `better-sqlite3` stays explicit since only its native `build/` is synced) (#3187 — thanks @diegosouzapw)
- **combo:** add a regression guard asserting the same-provider cascade is short-circuited by the connection-cooldown layer (#3200 — thanks @diegosouzapw)
- **repo:** housekeeping — ignore the generated `coverage/` output dir and prune deprecated `.agents/skills/*` SKILL definitions superseded by the current workflow skills (thanks @diegosouzapw)
### 🙌 Contributors
Thanks to everyone whose work landed in v3.8.11:
| Contributor | PRs / Issues |
| --- | --- |
| [@wilsonicdev](https://github.com/wilsonicdev) | #3189, #3201, #3203, #3204, #3232, #3240, #3241 |
| [@pizzav-xyz](https://github.com/pizzav-xyz) | #3170, #3171, #3172 |
| [@zhiru](https://github.com/zhiru) | #3185, #3195 |
| [@oyi77](https://github.com/oyi77) | #3217 |
| [@miracuves](https://github.com/miracuves) | #3116, #3226 |
| [@ngocquynh85](https://github.com/ngocquynh85) | #3205, #3214, #3215 |
| [@xz-dev](https://github.com/xz-dev) | #3188 |
| [@bypanghu](https://github.com/bypanghu) | #3191 |
| [@juandisay](https://github.com/juandisay) | #3206 |
| [@tjengbudi](https://github.com/tjengbudi) | #3197, #3198, #3199 |
| [@naimo84](https://github.com/naimo84) | #3151 |
| [@yeardie](https://github.com/yeardie) | #3025 |
| [@pulyankote](https://github.com/pulyankote) | #3202 |
| [@YoursSweetDom](https://github.com/YoursSweetDom) | #3180 |
| [@Guru01100101](https://github.com/Guru01100101) | #3091 |
| [@androw](https://github.com/androw) | #3167 (co-author) |
| [@diegosouzapw](https://github.com/diegosouzapw) | maintainer — #3187, #3200, issue-fix batches |
## What's Changed
* Fix/codex import auth by @zhiru in https://github.com/diegosouzapw/OmniRoute/pull/3185
* refactor(build): single-source sidecar list + drop redundant Dockerfile COPYs by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3187
* fix(auto-combo): include no-auth OpenCode Free by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3189
* fix(auth): honor REQUIRE_API_KEY feature flag by @xz-dev in https://github.com/diegosouzapw/OmniRoute/pull/3188
* feat(proxy): per-key proxy toggle backend with DB schema by @pizzav-xyz in https://github.com/diegosouzapw/OmniRoute/pull/3170
* feat(proxy): auto-fallback proxy selection when validation fails by @pizzav-xyz in https://github.com/diegosouzapw/OmniRoute/pull/3171
* feat(proxy): proxy toggle switches and distribute button UI by @pizzav-xyz in https://github.com/diegosouzapw/OmniRoute/pull/3172
* fix(Oauth): validate client IDs against resolvePublicCred to correctly togg… by @juandisay in https://github.com/diegosouzapw/OmniRoute/pull/3206
* fix(models): allow deleting synced/fetched models (e.g. llamacpp) via DELETE /api/provider-models by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3204
* fix(oauth): use api.anthropic.com for Claude token exchange to avoid Cloudflare bot block on VPS by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3203
* test(combo): guard same-provider cascade is handled by connection cooldown (#3200) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3194
* fix(openrouter): true context_length for passthrough models (#3202) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3207
* fix(images): use node base_url + resolve prefix for custom image providers (#3205) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3208
* fix(docker): healthcheck multi-host probe + surface errors (#3151) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3209
* fix(llama-cpp): local-default base URL fallback when none set (#3197) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3210
* fix(provider-models): keep a deleted synced model deleted across re-fetch (#3199) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3212
* docs(changelog): record the v3.8.11 issue-fix batch by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3213
* fix(db): resolve better-sqlite3 import crash in packaged Electron app (#3025) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3218
* feat(api): combo/alias resolution + OpenAI-compatible edits for image routes (#3214, #3215) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3219
* docs(changelog): v3.8.11 issue-fix batch 2 (#3025, #3214/#3215) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3220
* fix(dashboard): home topology shows provider UUID instead of friendly name (#3198) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3222
* fix(providers): reliable NVIDIA key-validation probe model (#3116) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3223
* fix(dashboard): correct misleading grok/vertex credential hints (#3180, #3091) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3224
* docs(changelog): v3.8.11 deep-triage fixes (#3198/#3116/#3180/#3091) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3225
* fix(sse): refine kimi thinking handling and add unit tests by @bypanghu in https://github.com/diegosouzapw/OmniRoute/pull/3191
* fix: NVIDIA NIM API key validation timeout (bypass proxy fetch patch) by @miracuves in https://github.com/diegosouzapw/OmniRoute/pull/3226
* Feat/codex device flow by @zhiru in https://github.com/diegosouzapw/OmniRoute/pull/3195
* fix(usage): route agy quota through Antigravity usage by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3232
* fix(cli): show OpenCode Free in Hermes Agent picker by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3240
* fix(gemini): refresh AI Studio model fallback by @wilsonicdev in https://github.com/diegosouzapw/OmniRoute/pull/3241
* fix(api): combo names misrouted to codex/ on /v1/responses (#3227, #3233) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3244
* fix(antigravity): agy gemini-3.1-pro -high/-low 400 + masked-error (#3229) by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3245
* docs(changelog): #3227/#3233 + #3229 by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3246
* Release v3.8.11 by @diegosouzapw in https://github.com/diegosouzapw/OmniRoute/pull/3190
## New Contributors
* @zhiru made their first contribution in https://github.com/diegosouzapw/OmniRoute/pull/3185
* @miracuves made their first contribution in https://github.com/diegosouzapw/OmniRoute/pull/3226
**Full Changelog**: https://github.com/diegosouzapw/OmniRoute/compare/v3.8.10...v3.8.11
Related Repositories
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
Interactive roadmaps, guides and other educational content to help developers grow in their careers.
Reverse engineer anything with agents, from app behavior down to native binaries.
The open source coding agent.
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.