✨ New Features
- feat(providers): LMArena provider — routes requests to the LMArena battle platform via the new
lmarenaexecutor; supports streaming chat completions. (#3421 — thanks @oyi77) - feat(providers): ZenMux provider — adds the
zenmuxexecutor for ZenMux's OpenAI-compatible endpoint with streaming support. (#3429 — thanks @oyi77) - feat(providers): Gemini Business provider — adds the
gemini-businessexecutor (Phase 2C of the Google provider expansion), enabling Gemini models via Google Workspace accounts. (#3436 — thanks @oyi77) - feat(plugin+api): auto-combos API + free model quota display — new
GET /api/combos/autoendpoint lists dynamically scored combos; provider pages now surface free-tier quotas inline; MCP-plugin surface extended to match. (#3435 — thanks @mrmm) - feat(opencode-plugin): per-prefix API format selection, debug logging, and free-label normaliser — three backports from the mrmm fork: each route prefix can specify its own wire format (OpenAI / Anthropic / Gemini), structured debug output is toggled via env var, and free-tier labels are normalized across providers. (#3420 — thanks @herjarsa)
- feat(connections): connection pagination, health filter, batch-delete confirmation, and custom banned keywords — the provider connections table is now paginated; a health-state filter lets operators show only healthy/degraded/failed connections; multi-select + confirm dialog for bulk deletes; per-connection keyword denylist for content safety. (#3454 — thanks @sdfsdfw2)
- feat(settings): Endpoint Token Saver visibility toggle — operators can now show or hide the Token Saver widget on the endpoint page from Settings → Appearance. (#3461 — thanks @rdself)
- feat(catalog): model catalog name feature flag — a new feature flag controls whether the catalog exposes provider-prefixed model names, letting deployments opt into the legacy bare-name format for downstream tooling compatibility. (#3464 — thanks @rdself)
🔧 Bug Fixes
- fix(translator): Vertex AI tool calls no longer fail with
400 Unknown name "id"— the OpenAI-styleidfield is stripped fromfunctionCall/functionResponseparts forvertex/vertex-partner; the public Gemini API still receivesidas required for Gemini 3+ signature matching. (#3457 — thanks @nullbytef0x / @diegosouzapw) - fix(claude): Claude Code
claude-opus-4-8tool calls no longer break withtool call could not be parsed— OmniRoute no longer force-injectsinterleaved-thinking/advanced-tool-use/effortbeta flags the client never negotiated; clients sending their ownanthropic-betaheader control those betas themselves. (#3458 — thanks @Forcerecon / @diegosouzapw) - fix(catalog): imported/custom models on no-auth providers (e.g. The Old LLM) now appear in
GET /api/v1/modelsand the Playground model selector — the eligibility gate required a DB connection row which no-auth providers never have, silently dropping every imported model for them. (#3463 — thanks @tjengbudi / @diegosouzapw) - fix(browser): optional
cloakbrowserimport no longer causes bundle errors when the package is absent — the import is now wrapped in a dynamic require so the build succeeds on environments that don't install the optional dep. (#3460 — thanks @rdself) - fix(claude-web): claude-web session handling cleanup — corrects an edge case where session cookies were not properly refreshed after a Turnstile challenge, and removes stale wrapper code left over from the provider split. (#3449 — thanks @androw)
- fix(analytics): SQL named params are now scoped per query context — a shared params object was being mutated across concurrent analytics queries, causing
SQLITE_MISUSE: named parameter not founderrors under load. (#3447 — thanks @ReqX) - fix(command-code): chat endpoint reverted to
/alpha/generateand model-sync discovery fixed — a prior refactor incorrectly targeted the wrong path, causing Command Code completions to silently 404; model listing now also resolves from the correct discovery endpoint. (#3432 — thanks @TapZe) - fix(command-code): CLI version header aligned to current Command Code release — the
X-Command-Code-Versionheader value was pinned to a stale version string, causing upstream version-gated features to be rejected. (#3462 — thanks @hevener10) - fix(sse): provider IDs are normalized to strings before lookup — numeric provider IDs (e.g. from legacy DB rows) caused
undefinedlookups in the executor registry; all IDs are now coerced to string at the SSE entry point. (#3427 — thanks @disafronov) - fix(stream): textual tool-call slicing index mismatch resolved and
containsTextualToolCallMarkerdeduplicated — two related bugs in the rolling-buffer parser caused partial tool-call chunks to be emitted twice or sliced from the wrong offset, producing garbled JSON in streamed tool responses. (#3413 — thanks @Ardem2025) - fix(stream): OpenAI usage-only chunks (empty
choices: []) are now passed through instead of being dropped — some providers emit a trailing stats-only chunk after the last content delta; discarding it caused usage counters to be missing in logged responses. (#3422 — thanks @xz-dev) - fix(translator): empty-string
reasoning_contentreplaced with placeholder on cache miss —injectEmptyReasoningContentForToolCallspre-setsreasoning_content=""before the cache lookup; the old guard checked forundefined, never firing on miss and leaving""in place, which DeepSeek V4+ rejects with a 400. (#3433 — thanks @ViFigueiredo) - fix(catalog): combos auto-compute
context_lengthfor any provider-ID form — the context-length resolution only matched exact-string provider IDs, missing combos declared with a numeric or aliased ID; the lookup now normalizes before matching. (#3417 — thanks @herjarsa) - fix(healthcheck): container bridge network IP probed correctly — the healthcheck script was hard-coded to
localhostwhich resolves to IPv6::1inside some container runtimes; it now queries the bridge gateway IP so the probe succeeds on both bridge and host networking modes. (#3434 — thanks @naimo84) - fix(publish): onnxruntime CUDA binary removed from npm tarball — the native
.nodebinary exceeded npm's 413 payload limit and was never needed at runtime (OmniRoute uses the CPU build); the pack policy now excludes the CUDA artifact. (#3437 — thanks @herjarsa)
📝 Maintenance
- docs: critical documentation gaps closed — new guides for ACP protocol, router strategies, compression, REST API reference, and updated AUTO-COMBO deep-dive; getting-started section added with Quick Start, Providers, Free Tiers, Auto-Combo, and Troubleshooting pages. (#3438 — thanks @oyi77)
- docs(opencode-plugin): plugin README rewritten to lead with the why — positions the plugin as the recommended integration path over the legacy
@omniroute/opencode-providerpackage, with migration guidance. (#3418 — thanks @herjarsa) - docs(env):
COMMAND_CODE_VERSIONoverride documented — environment variable added to.env.exampleand reference docs so operators can pin the CLI version header without a code change. (#3462 — thanks @hevener10) - test(auto-combo): same-provider connection identity assertion added — regression test covering the case where two connections for the same provider share an account ID, verifying the combo engine selects the correct one. (#3378 — thanks @oyi77)
- deps: electron upgraded to 42.3.3; electron-builder to 26.15.2; electron-updater to 6.8.9; 4 development-group and 10 production-group packages bumped via Dependabot. (#3441 / #3442 / #3443 / #3444 / #3445 — thanks @diegosouzapw)
- chore(release): v3.8.17 development cycle opened from
main. (thanks @diegosouzapw)
What's Changed
- deps: bump electron from 42.3.2 to 42.3.3 in /electron by @dependabot[bot] in #3441
- deps: bump the production group with 10 updates by @dependabot[bot] in #3444
- deps: bump the development group with 4 updates by @dependabot[bot] in #3445
- deps: bump electron-updater from 6.8.8 to 6.8.9 in /electron by @dependabot[bot] in #3442
- deps: bump electron-builder from 26.14.0 to 26.15.2 in /electron by @dependabot[bot] in #3443
- fix(sse): normalize provider ids to strings by @disafronov in #3427
- fix(command-code): revert chat endpoint to /alpha/generate and fix model sync discovery by @TapZe in #3432
- fix(analytics): scope SQL named params per query context by @ReqX in #3447
- fix claude-web and cleanup by @androw in #3449
- feat: add ZenMux provider (Phase 2B of #3368) by @oyi77 in #3429
- feat: add LMArena provider (Phase 2A of #3368) by @oyi77 in #3421
- feat: add Gemini Business provider (Phase 2C of #3368) by @oyi77 in #3436
- fix: probe container bridge network IP in healthcheck (#3151) by @naimo84 in #3434
- fix(publish): remove onnxruntime CUDA binary from tarball to avoid 413 by @herjarsa in #3437
- docs(opencode-plugin): lead with the why — make plugin the recommended path over @omniroute/opencode-provider by @herjarsa in #3418
- docs: close critical documentation gaps (ACP, router strategies, APIs, compression) by @oyi77 in #3438
- fix(stream): allow OpenAI usage-only empty choices chunks by @xz-dev in #3422
- fix(catalog): make combos auto-compute context_length for any provider id form by @herjarsa in #3417
- fix(stream): resolve index mismatch in textual tool-call slicing and deduplicate containsTextualToolCallMarker by @Ardem2025 in #3413
- feat(opencode-plugin): per-prefix API format + debug logging + free-label normaliser (3 mrmm-fork backports) by @herjarsa in #3420
- fix(translator): use non-empty reasoning_content placeholder on cache miss instead of empty string by @ViFigueiredo in #3433
- feat(plugin+api): auto combos + free model quota display + /api/combos/auto by @mrmm in #3435
- test(auto-combo): cover same-provider connection identity by @oyi77 in #3378
- feat: add connection pagination, health filter, batch delete confirmation, and custom banned keywords by @sdfsdfw2 in #3454
- fix(translator): strip function_call.id for Vertex AI provider (#3440) by @diegosouzapw in #3457
- fix(claude): respect client anthropic-beta instead of forcing thinking/effort betas (#3415) by @diegosouzapw in #3458
- fix(catalog): surface imported models on no-auth providers in /api/v1/models (#3200) by @diegosouzapw in #3463
- fix(browser): avoid bundling optional cloakbrowser import by @rdself in #3460
- fix(command-code): align CLI version header by @hevener10 in #3462
- Add Endpoint Token Saver visibility setting by @rdself in #3461
- Add model catalog name feature flag by @rdself in #3464
- Release v3.8.17 by @diegosouzapw in #3448
New Contributors
- @disafronov made their first contribution in #3427
- @naimo84 made their first contribution in #3434
- @ViFigueiredo made their first contribution in #3433
- @sdfsdfw2 made their first contribution in #3454
- @hevener10 made their first contribution in #3462
Full Changelog: v3.8.16...v3.8.17