github diegosouzapw/OmniRoute v3.8.17

latest release: v3.8.18
12 hours ago

✨ New Features

  • feat(providers): LMArena provider — routes requests to the LMArena battle platform via the new lmarena executor; supports streaming chat completions. (#3421 — thanks @oyi77)
  • feat(providers): ZenMux provider — adds the zenmux executor for ZenMux's OpenAI-compatible endpoint with streaming support. (#3429 — thanks @oyi77)
  • feat(providers): Gemini Business provider — adds the gemini-business executor (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/auto endpoint 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-style id field is stripped from functionCall/functionResponse parts for vertex/vertex-partner; the public Gemini API still receives id as required for Gemini 3+ signature matching. (#3457 — thanks @nullbytef0x / @diegosouzapw)
  • fix(claude): Claude Code claude-opus-4-8 tool calls no longer break with tool call could not be parsed — OmniRoute no longer force-injects interleaved-thinking / advanced-tool-use / effort beta flags the client never negotiated; clients sending their own anthropic-beta header 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/models and 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 cloakbrowser import 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 found errors under load. (#3447 — thanks @ReqX)
  • fix(command-code): chat endpoint reverted to /alpha/generate and 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-Version header 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 undefined lookups 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 containsTextualToolCallMarker deduplicated — 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_content replaced with placeholder on cache miss — injectEmptyReasoningContentForToolCalls pre-sets reasoning_content="" before the cache lookup; the old guard checked for undefined, never firing on miss and leaving "" in place, which DeepSeek V4+ rejects with a 400. (#3433 — thanks @ViFigueiredo)
  • fix(catalog): combos auto-compute context_length for 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 localhost which resolves to IPv6 ::1 inside 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 .node binary 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-provider package, with migration guidance. (#3418 — thanks @herjarsa)
  • docs(env): COMMAND_CODE_VERSION override documented — environment variable added to .env.example and 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

Full Changelog: v3.8.16...v3.8.17

Don't miss a new OmniRoute release

NewReleases is sending notifications on new releases.