Repository navigation
Release v3.8.17 - #3448
Release v3.8.17#3448
Conversation
There was a problem hiding this comment.
Code Review
This pull request bumps the project version from 3.8.16 to 3.8.17 across various package configuration files, lockfiles, OpenAPI documentation, and updates the CHANGELOG.md with a new unreleased section. As there are no review comments, I have no further feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
CI Coverage Report
Coverage artifact was not available for this run. |
|
Integrated into release/v3.8.17
Integrated into release/v3.8.17
Integrated into release/v3.8.17
Integrated into release/v3.8.17
Integrated into release/v3.8.17
Integrated into release/v3.8.17
…del sync discovery (#3432) Integrated into release/v3.8.17
Integrated into release/v3.8.17
#3437) Integrated into release/v3.8.17
…d path over @omniroute/opencode-provider (#3418) Integrated into release/v3.8.17
…, compression) (#3438) Integrated into release/v3.8.17
Integrated into release/v3.8.17
…r id form (#3417) Integrated into release/v3.8.17
…deduplicate containsTextualToolCallMarker (#3413) Integrated into release/v3.8.17
…abel normaliser (3 mrmm-fork backports) (#3420) Integrated into release/v3.8.17
| const cleaned = name | ||
| .replace(/\s*\(free\)\s*$/i, "") | ||
| .replace(/[\s-]+free\s*$/i, "") |
| const cleaned = name | ||
| .replace(/\s*\(free\)\s*$/i, "") |
| const response = await fetch(`${baseURL}/models`, { | ||
| headers: { Authorization: `Bearer ${apiKey}` }, | ||
| signal: controller.signal, | ||
| }); |
| const cleaned = name | ||
| .replace(/\s*\(free\)\s*$/i, "") | ||
| .replace(/[\s-]+free\s*$/i, "") |
| const cleaned = name | ||
| .replace(/\s*\(free\)\s*$/i, "") |
…tion, and custom banned keywords (#3454) Integrated into release/v3.8.17
#3457) Vertex AI's FunctionCall/FunctionResponse protos have no id field; emitting it made Vertex reject tool calls with 400 'Unknown name id'. The id is now stripped only when the routed provider is vertex/vertex-partner (threaded via credentials._provider), preserving it for the public Gemini API where Gemini 3+ uses it for signature matching. Co-authored-by: nullbytef0x <nullbytef0x@users.noreply.github.com>
…g/effort betas (#3415) (#3458) Claude Code -> claude-opus-4-8 turns intermittently died with 'tool call could not be parsed (retry also failed)'. OmniRoute's claude identity cloak rebuilt the anthropic-beta header from scratch and unconditionally forced interleaved-thinking-2025-05-14 (+ advanced-tool-use / effort for heavy agents), even when the client never negotiated them. The forced interleaved-thinking conflicts with tool_choice-forced turns, producing malformed opus tool_use streams (and sibling 400 'Thinking may not be enabled when tool_choice forces tool use'). selectBetaFlags now takes the client's inbound anthropic-beta: when present, thinking/effort betas are only emitted if the client requested them. Opaque clients (no header — the OAuth cloak path) keep the full set unchanged, so existing behavior and the #2454 model-tier gating are preserved. Co-authored-by: Forcerecon <Forcerecon@users.noreply.github.com>
…/models (#3200) (#3463) The custom-models loop in getUnifiedModelsResponse gated every model through hasEligibleConnectionForModel(getConnectionsForProvider(...)). no-auth providers (theoldllm, etc.) never create DB connection rows, so that returned [] and the gate dropped every imported/custom model for them — the Playground dropdown showed nothing for imported models while built-in/custom models on auth providers worked. Built-in models survived because they go through providerSupportsModel(), which already has a no-auth bypass (#2798). The custom-model gate now applies the same no-auth bypass, keeping the eligibility check (with parentProviderType) intact for auth providers. Co-authored-by: tjengbudi <tjengbudi@users.noreply.github.com> Co-authored-by: a2belugin <a2belugin@users.noreply.github.com>
Integrated into release/v3.8.17
Integrated into release/v3.8.17
Integrated into release/v3.8.17
#3462 added a process.env.COMMAND_CODE_VERSION read but did not document it, tripping the env-doc-sync gate on the release branch (PR-merges bypass the pre-commit check-docs-sync hook). Add the var to .env.example + ENVIRONMENT.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Integrated into release/v3.8.17
CHANGELOG: 8 features, 15 bug fixes, 6 maintenance entries (29 bullets / 32 commits since v3.8.16). i18n: sync [3.8.17] section to all 41 locale CHANGELOG files. fix(translator): strip empty reasoning_content on non-tool-call kimi-k2 messages (#3433 regression) fix(translator): update placeholder assertion for non-empty cache-miss behaviour (test alignment) fix(executor): lmarena.ts return wrapper shape {response,url,headers,transformedBody} (#3421 regression) test: align lmarena-provider + tool-request-sanitization to corrected executor contract



[3.8.17] — 2026-06-09
✨ New Features
lmarenaexecutor; supports streaming chat completions. (#3421 — thanks @oyi77)zenmuxexecutor for ZenMux's OpenAI-compatible endpoint with streaming support. (#3429 — thanks @oyi77)gemini-businessexecutor (Phase 2C of the Google provider expansion), enabling Gemini models via Google Workspace accounts. (#3436 — thanks @oyi77)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)🔧 Bug Fixes
400 Unknown name "id"— the OpenAI-styleidfield is stripped fromfunctionCall/functionResponseparts forvertex/vertex-partner; the public Gemini API still receivesidas required. (#3457 — thanks @nullbytef0x / @diegosouzapw)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)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)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)SQLITE_MISUSE: named parameter not founderrors under load. (#3447 — thanks @ReqX)/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)X-Command-Code-Versionheader value was pinned to a stale version string, causing upstream version-gated features to be rejected. (#3462 — thanks @hevener10)undefinedlookups in the executor registry; all IDs are now coerced to string at the SSE entry point. (#3427 — thanks @disafronov)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)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)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)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)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).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
@omniroute/opencode-providerpackage, with migration guidance. (#3418 — thanks @herjarsa)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)main. (thanks @diegosouzapw)🙌 Contributors
Thank you to everyone who contributed to this release!
Quality Gate
Commit coverage
v3.8.16..HEADRegressions fixed in this release commit
translator: PR fix(translator): use non-empty reasoning_content placeholder on cache miss instead of empty string #3433 broke strip of emptyreasoning_contenton kimi-k2 non-tool-call messages — fixedexecutor: PR feat: add LMArena provider (Phase 2A of #3368) #3421 lmarena returned rawResponseinstead of required wrapper{response, url, headers, transformedBody}— fixedtests: alignedlmarena-provider.test.tsandtool-request-sanitization.test.tsto corrected contracts