Skip to content

fix(translator): scope thoughtSignature bypass to Antigravity/CLI only - #3560

Merged
diegosouzapw merged 8 commits into
cheaper-inference:release/v3.8.20from
oyi77:fix/gemini-thought-signature-focused
Jun 10, 2026
Merged

diegosouzapw merged 8 commits into
cheaper-inference:release/v3.8.20from
oyi77:fix/gemini-thought-signature-focused

Conversation

@oyi77

@oyi77 oyi77 commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Re-submits the thoughtSignature bypass fix as a focused 6-file PR per @diegosouzapw's review on #3514. The previous PR was 130+ files (with ~42 i18n CHANGELOG dumps and unrelated incidental edits from a stale rebase). This PR is a clean 6-file change off current release/v3.8.20.

What's included (6 files, +87 / -103)

Source (3 files)

  • open-sse/translator/request/openai-to-gemini.ts — scoped bypass injection: only openaiToGeminiCLIRequest (which serves CLI + Antigravity) sets supportsSignatureBypass: true; standard Gemini (openaiToGeminiRequest) leaves it undefined. Also removed the redundant toolCallIds.push (already at loop end).
  • open-sse/executors/antigravity.ts — minor 4-line alignment
  • open-sse/utils/error.ts — Gemini error parsing fix

Tests (3 files)

  • tests/unit/t43-gemini-tool-call-no-thought-signature.test.ts — verify standard Gemini does NOT inject fake signature
  • tests/unit/t44-antigravity-thought-signature-preserved.test.ts — verify Antigravity/CLI path preserves the bypass
  • tests/unit/translator-openai-to-gemini.test.ts — update legacy evasion tests to reflect native bypass behavior

What's NOT included (removed from this PR per review)

  • ❌ No ~42 docs/i18n/*/CHANGELOG.md dump
  • ❌ No unrelated incidental edits from stale rebase (chatCore, requestLogger, streamHandler, plugin lifecycle hooks, package.json×3, etc.)
  • ❌ No claude-to-gemini.ts (the original +1/-1 netted to 0)
  • ❌ No open-sse/package.json bump (was carrying unrelated test-script noise)

Verification

  • npm run check:any-budget:t11 → PASS
  • prettier --check → all 6 files pass
  • All 3 new tests pass (regression guards in place)

Original problem

Standard Gemini API (FORMATS.GEMINI) does not support thoughtSignature and rejects requests with it as 400. The bypass sentinel skip_thought_signature_validator was being unconditionally injected by openaiToGeminiBase, which is shared between standard Gemini, Gemini CLI, and Antigravity.

Fix: add supportsSignatureBypass option to GeminiToolNameOptions and gate it at the call site.

Refs the original review from @gemini-code-assist on PR #3414 and PR #3514.

Six7Day and others added 6 commits June 10, 2026 19:44
Standard Gemini API (FORMATS.GEMINI) does not support the thoughtSignature
field and rejects requests containing it with 400. The bypass sentinel
'skip_thought_signature_validator' was being unconditionally injected by
openaiToGeminiBase, which is shared between standard Gemini, Gemini CLI,
and Antigravity.

Fix: add supportsSignatureBypass option to GeminiToolNameOptions, set it
true only in openaiToGeminiCLIRequest (which serves both CLI and Antigravity).
Standard Gemini callers (openaiToGeminiRequest) leave it undefined/false.

Addresses review comment from @gemini-code-assist on PR cheaper-inference#3414.
The conditional toolCallIds.push(id) was redundant since the unconditional
push at the end of the loop always executes. This caused duplicate tool
response entries when contextualizeSignaturelessToolResponses was true.

Addresses HIGH priority review comment from @gemini-code-assist on PR cheaper-inference#3514.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the handling of signature-less tool calls for Gemini and Antigravity models, replacing the legacy text-context evasion logic with a native bypass sentinel (skip_thought_signature_validator) to prevent 400 errors. It also updates upstream error parsing to handle array responses and adapts the test suite to verify native function calls and responses. The review feedback points out that the refactoring leaves behind several unused variables and redundant checks (such as stringifySignaturelessToolCalls and contextualizeSignaturelessToolResponses) that should be cleaned up, and identifies a test name that has become misleading and needs renaming.

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.

if (!contextualizeSignaturelessToolResponses || signatureForToolCall) {
toolCallIds.push(id);
}
toolCallIds.push(id);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

With the removal of the signatureless tool call evasion/text-context logic, the variables stringifySignaturelessToolCalls and contextualizeSignaturelessToolResponses (defined earlier in this function) are now unused/dead code. Additionally, hasSignaturelessTextResponses is redundant because toolCallIds now unconditionally contains all tool call IDs, making hasActualResponses equivalent to just checking toolCallIds.some((fid) => toolResponses[fid]). These unused variables and redundant checks should be cleaned up to maintain code readability and avoid dead code.

Comment on lines +844 to +849
// With skip_thought_signature_validator bypass: native functionResponse is emitted
// The legacy XML escaping is no longer needed since we send native functionResponse
const toolResponseTurn = result.request.contents.find(
(c) => c.role === "user" && c.parts.some((p) => p.functionResponse)
);
assert.ok(toolResponseTurn, "expected native functionResponse turn");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since the legacy XML escaping assertions have been removed and replaced with a check for native functionResponse emission, the test name at line 817 ('OpenAI -> Antigravity escapes signature-less tool response context content') is now misleading. It should be renamed to accurately describe the new test behavior, e.g., 'OpenAI -> Antigravity emits native functionResponse instead of escaped XML context for signature-less tool responses'.

diegosouzapw and others added 2 commits June 10, 2026 09:51
…dard-Gemini text repr

The thoughtSignature bypass + native-emission path is correctly scoped to
Antigravity/CLI (supportsSignatureBypass). Gate the removal of the
text/context representation behind !supportsSignatureBypass so the standard
Gemini direct path (mode "text"/"context", cheaper-inference#3358) keeps its current behavior
(it rejects both thoughtSignature and signature-less native tool parts), and
re-wire the previously-orphaned buildInert*/buildHistorical* helpers. Add a
regression test for the text-mode path.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
@diegosouzapw

Copy link
Copy Markdown
Collaborator

Thanks @oyi77 — this is exactly the clean, scoped resubmission I was hoping for, and it addresses the #3414 review precisely:

  • ✅ Bypass is now correctly gated to Antigravity/CLI via supportsSignatureBypass (only set in openaiToGeminiCLIRequest), so standard Gemini is untouched.
  • ✅ T43 correctly asserts undefined again on the standard path (no more inverted contract).
  • ✅ Client-provided signatures take precedence over the sentinel.
  • ✅ The error.ts array-unwrap fix (originally from @Six7Day's fix(translator): implement thought_signature bypass and fix Gemini er… #3414) is preserved.

I pushed one follow-up so it's fully safe: the removal of the text/context signature-less representation was un-gated, which would have changed the standard Gemini direct path (FORMATS.GEMINI, mode "text" — it rejects both thoughtSignature and signature-less native tool parts, the reason #3358 added the text representation). I gated that removal behind !supportsSignatureBypass so the Antigravity/CLI path keeps your new native+sentinel behavior while standard Gemini keeps its current behavior, re-wired the now-no-longer-orphaned buildInert*/buildHistorical* helpers, and added a regression test for the text-mode path. Full translator suite + T43 + T44 + new test = 41/41 green, typecheck/lint clean.

Credit to @Six7Day for the original fix (#3414) — your commits are preserved in this branch's history. Merging now. 🙌

@diegosouzapw
diegosouzapw merged commit 280d6a9 into cheaper-inference:release/v3.8.20 Jun 10, 2026
1 of 2 checks passed
diegosouzapw added a commit that referenced this pull request Jun 10, 2026
The #3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original #3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.
diegosouzapw pushed a commit that referenced this pull request Jun 10, 2026
…to text (#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule #18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (#3560) untouched.
@diegosouzapw diegosouzapw mentioned this pull request Jun 10, 2026
diegosouzapw added a commit that referenced this pull request Jun 10, 2026
* chore(release): open v3.8.20 development cycle

* fix(images): prefer bare combos over image aliases (#3527)

Integrated into release/v3.8.20

* fix(translator): map Codex local_shell tool (#3534)

Integrated into release/v3.8.20

* fix(usage): make opencode-go quota fetcher fail-open instead of throwing 500 (#3522)

Integrated into release/v3.8.20

* Fix Runtime page breaker state rendering (#3533)

Integrated into release/v3.8.20

* Expose provider breaker degradation threshold setting (#3535)

Integrated into release/v3.8.20

* fix(executor): strip provider prefix from versioned built-in tool model field (#3532)

Integrated into release/v3.8.20

* feat(providers): add Claude Fable 5 support (#3524)

Integrated into release/v3.8.20

* feat(resilience): add global provider cooldown tracking to prevent combo re-walking (#3556)

Integrated into release/v3.8.20 (default OFF, opt-in)

* fix(translator): scope thoughtSignature bypass to Antigravity/CLI only (#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>

* fix(routing): normalize thinking:disabled for combo-substituted models that reject it (#3554) (#3563)

Integrated into release/v3.8.20

* fix(usage): accept 0/empty budget limits so the dashboard can save and clear (#3537) (#3564)

Integrated into release/v3.8.20

* docs(changelog): credit @Six7Day for #3560 thoughtSignature fix (#3414)

The #3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original #3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.

* fix(gamification): dedup badge unlock via user_badges so events don't re-fire every request (#3472) (#3565)

Integrated into release/v3.8.20

* fix(routing): pass through 'auto' keyword on codex /v1/responses instead of rewriting to codex/auto (#3509) (#3566)

Integrated into release/v3.8.20

* fix(cli-tools): normalize apiKey null in guide-settings schema so cloud-mode config saves (#3552) (#3567)

Integrated into release/v3.8.20

* fix(catalog): reclassify PublicAI from keyless to one-time-initial (requires API key) (#3558) (#3568)

Integrated into release/v3.8.20

* fix(gemini-web): surface missing Playwright browser as actionable 503 + cooldown hint, not a retryable 500 loop (#3516) (#3570)

Integrated into release/v3.8.20

* fix(security): sanitize raw err.message in web executors + embeddings/search response bodies (Rule #12) (#3494, #3495) (#3573)

Integrated into release/v3.8.20

* fix(dashboard): point CustomHostsManager + FeatureFlagsGrid at real routes (#3486, #3487) (#3574)

Integrated into release/v3.8.20

* chore(providers): remove dead krutrim entry (#3483) + docs(api): fix agent-bridge per-agent state route (#3489) (#3575)

Integrated into release/v3.8.20

* docs(api): correct API_REFERENCE.md paths for skills/plugins/admin/cache/acp/system-info (#3497) (#3577)

Integrated into release/v3.8.20

* fix(proxy): drive SOCKS5 UI option from runtime ENABLE_SOCKS5_PROXY, not build-time NEXT_PUBLIC (#3508) (#3579)

Integrated into release/v3.8.20

* fix(playground): filter playground models by node prefix so custom-endpoint models appear (#3505) (#3581)

Integrated into release/v3.8.20

* fix(usage): show an informative message instead of a blank Kiro quota card when no usage breakdown (#3506) (#3582)

Integrated into release/v3.8.20

* docs(changelog): add the #3506 Kiro quota entry (missed in #3582 due to a stale-base CHANGELOG anchor) (#3583)

Integrated into release/v3.8.20

* fix(auto-update): use stable PROJECT_ROOT walker, not frozen process.cwd() (#3561)

Integrated into release/v3.8.20. Auto-update PROJECT_ROOT now uses a stable __dirname-anchored upward walker instead of the no-op process.cwd() resolver.

* fix: address PR #3518 review comments (lifecycle hooks, regex, indentation, route params) (#3562)

Integrated into release/v3.8.20. Addresses #3518 review: regex literals, logs/[id] route params (Next 16), indentation, and wires plugin lifecycle hooks (onInstall/onActivate/onDeactivate/onUninstall) in the loader so manager.ts can register them. Adds Rule #18 regression test.

* docs(changelog): credit @ViFigueiredo (#3423) for PROJECT_ROOT + log #3561/#3562 (v3.8.20)

* fix: openai to gemini incorrectly translates historical tool calls into text (#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule #18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (#3560) untouched.

* docs(changelog)+test: reconcile standard-Gemini native mode (#3569) — update round-2 rationale comment + log VPS validation

* docs(changelog): reconcile v3.8.20 — add 9 missing bullets + move [Unreleased] to versioned section

* docs(changelog): complete v3.8.20 reconciliation — 27 bullets, 11 contributors

---------

Co-authored-by: Alexander Averyanov <alex@averyan.ru>
Co-authored-by: Hakan Kurşun <bykamaka@gmail.com>
Co-authored-by: Wilson <pedbookmed@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Giorgos Giakoumettis <giorgos@yiakoumettis.gr>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
rafacpti23 pushed a commit to rafacpti23/OmniRoute that referenced this pull request Jun 10, 2026
* chore(release): open v3.8.20 development cycle

* fix(images): prefer bare combos over image aliases (cheaper-inference#3527)

Integrated into release/v3.8.20

* fix(translator): map Codex local_shell tool (cheaper-inference#3534)

Integrated into release/v3.8.20

* fix(usage): make opencode-go quota fetcher fail-open instead of throwing 500 (cheaper-inference#3522)

Integrated into release/v3.8.20

* Fix Runtime page breaker state rendering (cheaper-inference#3533)

Integrated into release/v3.8.20

* Expose provider breaker degradation threshold setting (cheaper-inference#3535)

Integrated into release/v3.8.20

* fix(executor): strip provider prefix from versioned built-in tool model field (cheaper-inference#3532)

Integrated into release/v3.8.20

* feat(providers): add Claude Fable 5 support (cheaper-inference#3524)

Integrated into release/v3.8.20

* feat(resilience): add global provider cooldown tracking to prevent combo re-walking (cheaper-inference#3556)

Integrated into release/v3.8.20 (default OFF, opt-in)

* fix(translator): scope thoughtSignature bypass to Antigravity/CLI only (cheaper-inference#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>

* fix(routing): normalize thinking:disabled for combo-substituted models that reject it (cheaper-inference#3554) (cheaper-inference#3563)

Integrated into release/v3.8.20

* fix(usage): accept 0/empty budget limits so the dashboard can save and clear (cheaper-inference#3537) (cheaper-inference#3564)

Integrated into release/v3.8.20

* docs(changelog): credit @Six7Day for cheaper-inference#3560 thoughtSignature fix (cheaper-inference#3414)

The cheaper-inference#3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original cheaper-inference#3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.

* fix(gamification): dedup badge unlock via user_badges so events don't re-fire every request (cheaper-inference#3472) (cheaper-inference#3565)

Integrated into release/v3.8.20

* fix(routing): pass through 'auto' keyword on codex /v1/responses instead of rewriting to codex/auto (cheaper-inference#3509) (cheaper-inference#3566)

Integrated into release/v3.8.20

* fix(cli-tools): normalize apiKey null in guide-settings schema so cloud-mode config saves (cheaper-inference#3552) (cheaper-inference#3567)

Integrated into release/v3.8.20

* fix(catalog): reclassify PublicAI from keyless to one-time-initial (requires API key) (cheaper-inference#3558) (cheaper-inference#3568)

Integrated into release/v3.8.20

* fix(gemini-web): surface missing Playwright browser as actionable 503 + cooldown hint, not a retryable 500 loop (cheaper-inference#3516) (cheaper-inference#3570)

Integrated into release/v3.8.20

* fix(security): sanitize raw err.message in web executors + embeddings/search response bodies (Rule cheaper-inference#12) (cheaper-inference#3494, cheaper-inference#3495) (cheaper-inference#3573)

Integrated into release/v3.8.20

* fix(dashboard): point CustomHostsManager + FeatureFlagsGrid at real routes (cheaper-inference#3486, cheaper-inference#3487) (cheaper-inference#3574)

Integrated into release/v3.8.20

* chore(providers): remove dead krutrim entry (cheaper-inference#3483) + docs(api): fix agent-bridge per-agent state route (cheaper-inference#3489) (cheaper-inference#3575)

Integrated into release/v3.8.20

* docs(api): correct API_REFERENCE.md paths for skills/plugins/admin/cache/acp/system-info (cheaper-inference#3497) (cheaper-inference#3577)

Integrated into release/v3.8.20

* fix(proxy): drive SOCKS5 UI option from runtime ENABLE_SOCKS5_PROXY, not build-time NEXT_PUBLIC (cheaper-inference#3508) (cheaper-inference#3579)

Integrated into release/v3.8.20

* fix(playground): filter playground models by node prefix so custom-endpoint models appear (cheaper-inference#3505) (cheaper-inference#3581)

Integrated into release/v3.8.20

* fix(usage): show an informative message instead of a blank Kiro quota card when no usage breakdown (cheaper-inference#3506) (cheaper-inference#3582)

Integrated into release/v3.8.20

* docs(changelog): add the cheaper-inference#3506 Kiro quota entry (missed in cheaper-inference#3582 due to a stale-base CHANGELOG anchor) (cheaper-inference#3583)

Integrated into release/v3.8.20

* fix(auto-update): use stable PROJECT_ROOT walker, not frozen process.cwd() (cheaper-inference#3561)

Integrated into release/v3.8.20. Auto-update PROJECT_ROOT now uses a stable __dirname-anchored upward walker instead of the no-op process.cwd() resolver.

* fix: address PR cheaper-inference#3518 review comments (lifecycle hooks, regex, indentation, route params) (cheaper-inference#3562)

Integrated into release/v3.8.20. Addresses cheaper-inference#3518 review: regex literals, logs/[id] route params (Next 16), indentation, and wires plugin lifecycle hooks (onInstall/onActivate/onDeactivate/onUninstall) in the loader so manager.ts can register them. Adds Rule cheaper-inference#18 regression test.

* docs(changelog): credit @ViFigueiredo (cheaper-inference#3423) for PROJECT_ROOT + log cheaper-inference#3561/cheaper-inference#3562 (v3.8.20)

* fix: openai to gemini incorrectly translates historical tool calls into text (cheaper-inference#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule cheaper-inference#18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (cheaper-inference#3560) untouched.

* docs(changelog)+test: reconcile standard-Gemini native mode (cheaper-inference#3569) — update round-2 rationale comment + log VPS validation

* docs(changelog): reconcile v3.8.20 — add 9 missing bullets + move [Unreleased] to versioned section

* docs(changelog): complete v3.8.20 reconciliation — 27 bullets, 11 contributors

---------

Co-authored-by: Alexander Averyanov <alex@averyan.ru>
Co-authored-by: Hakan Kurşun <bykamaka@gmail.com>
Co-authored-by: Wilson <pedbookmed@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Giorgos Giakoumettis <giorgos@yiakoumettis.gr>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
* chore(release): open v3.8.20 development cycle

* fix(images): prefer bare combos over image aliases (cheaper-inference#3527)

Integrated into release/v3.8.20

* fix(translator): map Codex local_shell tool (cheaper-inference#3534)

Integrated into release/v3.8.20

* fix(usage): make opencode-go quota fetcher fail-open instead of throwing 500 (cheaper-inference#3522)

Integrated into release/v3.8.20

* Fix Runtime page breaker state rendering (cheaper-inference#3533)

Integrated into release/v3.8.20

* Expose provider breaker degradation threshold setting (cheaper-inference#3535)

Integrated into release/v3.8.20

* fix(executor): strip provider prefix from versioned built-in tool model field (cheaper-inference#3532)

Integrated into release/v3.8.20

* feat(providers): add Claude Fable 5 support (cheaper-inference#3524)

Integrated into release/v3.8.20

* feat(resilience): add global provider cooldown tracking to prevent combo re-walking (cheaper-inference#3556)

Integrated into release/v3.8.20 (default OFF, opt-in)

* fix(translator): scope thoughtSignature bypass to Antigravity/CLI only (cheaper-inference#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>

* fix(routing): normalize thinking:disabled for combo-substituted models that reject it (cheaper-inference#3554) (cheaper-inference#3563)

Integrated into release/v3.8.20

* fix(usage): accept 0/empty budget limits so the dashboard can save and clear (cheaper-inference#3537) (cheaper-inference#3564)

Integrated into release/v3.8.20

* docs(changelog): credit @Six7Day for cheaper-inference#3560 thoughtSignature fix (cheaper-inference#3414)

The cheaper-inference#3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original cheaper-inference#3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.

* fix(gamification): dedup badge unlock via user_badges so events don't re-fire every request (cheaper-inference#3472) (cheaper-inference#3565)

Integrated into release/v3.8.20

* fix(routing): pass through 'auto' keyword on codex /v1/responses instead of rewriting to codex/auto (cheaper-inference#3509) (cheaper-inference#3566)

Integrated into release/v3.8.20

* fix(cli-tools): normalize apiKey null in guide-settings schema so cloud-mode config saves (cheaper-inference#3552) (cheaper-inference#3567)

Integrated into release/v3.8.20

* fix(catalog): reclassify PublicAI from keyless to one-time-initial (requires API key) (cheaper-inference#3558) (cheaper-inference#3568)

Integrated into release/v3.8.20

* fix(gemini-web): surface missing Playwright browser as actionable 503 + cooldown hint, not a retryable 500 loop (cheaper-inference#3516) (cheaper-inference#3570)

Integrated into release/v3.8.20

* fix(security): sanitize raw err.message in web executors + embeddings/search response bodies (Rule cheaper-inference#12) (cheaper-inference#3494, cheaper-inference#3495) (cheaper-inference#3573)

Integrated into release/v3.8.20

* fix(dashboard): point CustomHostsManager + FeatureFlagsGrid at real routes (cheaper-inference#3486, cheaper-inference#3487) (cheaper-inference#3574)

Integrated into release/v3.8.20

* chore(providers): remove dead krutrim entry (cheaper-inference#3483) + docs(api): fix agent-bridge per-agent state route (cheaper-inference#3489) (cheaper-inference#3575)

Integrated into release/v3.8.20

* docs(api): correct API_REFERENCE.md paths for skills/plugins/admin/cache/acp/system-info (cheaper-inference#3497) (cheaper-inference#3577)

Integrated into release/v3.8.20

* fix(proxy): drive SOCKS5 UI option from runtime ENABLE_SOCKS5_PROXY, not build-time NEXT_PUBLIC (cheaper-inference#3508) (cheaper-inference#3579)

Integrated into release/v3.8.20

* fix(playground): filter playground models by node prefix so custom-endpoint models appear (cheaper-inference#3505) (cheaper-inference#3581)

Integrated into release/v3.8.20

* fix(usage): show an informative message instead of a blank Kiro quota card when no usage breakdown (cheaper-inference#3506) (cheaper-inference#3582)

Integrated into release/v3.8.20

* docs(changelog): add the cheaper-inference#3506 Kiro quota entry (missed in cheaper-inference#3582 due to a stale-base CHANGELOG anchor) (cheaper-inference#3583)

Integrated into release/v3.8.20

* fix(auto-update): use stable PROJECT_ROOT walker, not frozen process.cwd() (cheaper-inference#3561)

Integrated into release/v3.8.20. Auto-update PROJECT_ROOT now uses a stable __dirname-anchored upward walker instead of the no-op process.cwd() resolver.

* fix: address PR cheaper-inference#3518 review comments (lifecycle hooks, regex, indentation, route params) (cheaper-inference#3562)

Integrated into release/v3.8.20. Addresses cheaper-inference#3518 review: regex literals, logs/[id] route params (Next 16), indentation, and wires plugin lifecycle hooks (onInstall/onActivate/onDeactivate/onUninstall) in the loader so manager.ts can register them. Adds Rule cheaper-inference#18 regression test.

* docs(changelog): credit @ViFigueiredo (cheaper-inference#3423) for PROJECT_ROOT + log cheaper-inference#3561/cheaper-inference#3562 (v3.8.20)

* fix: openai to gemini incorrectly translates historical tool calls into text (cheaper-inference#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule cheaper-inference#18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (cheaper-inference#3560) untouched.

* docs(changelog)+test: reconcile standard-Gemini native mode (cheaper-inference#3569) — update round-2 rationale comment + log VPS validation

* docs(changelog): reconcile v3.8.20 — add 9 missing bullets + move [Unreleased] to versioned section

* docs(changelog): complete v3.8.20 reconciliation — 27 bullets, 11 contributors

---------

Co-authored-by: Alexander Averyanov <alex@averyan.ru>
Co-authored-by: Hakan Kurşun <bykamaka@gmail.com>
Co-authored-by: Wilson <pedbookmed@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Giorgos Giakoumettis <giorgos@yiakoumettis.gr>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
* chore(release): open v3.8.20 development cycle

* fix(images): prefer bare combos over image aliases (cheaper-inference#3527)

Integrated into release/v3.8.20

* fix(translator): map Codex local_shell tool (cheaper-inference#3534)

Integrated into release/v3.8.20

* fix(usage): make opencode-go quota fetcher fail-open instead of throwing 500 (cheaper-inference#3522)

Integrated into release/v3.8.20

* Fix Runtime page breaker state rendering (cheaper-inference#3533)

Integrated into release/v3.8.20

* Expose provider breaker degradation threshold setting (cheaper-inference#3535)

Integrated into release/v3.8.20

* fix(executor): strip provider prefix from versioned built-in tool model field (cheaper-inference#3532)

Integrated into release/v3.8.20

* feat(providers): add Claude Fable 5 support (cheaper-inference#3524)

Integrated into release/v3.8.20

* feat(resilience): add global provider cooldown tracking to prevent combo re-walking (cheaper-inference#3556)

Integrated into release/v3.8.20 (default OFF, opt-in)

* fix(translator): scope thoughtSignature bypass to Antigravity/CLI only (cheaper-inference#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>

* fix(routing): normalize thinking:disabled for combo-substituted models that reject it (cheaper-inference#3554) (cheaper-inference#3563)

Integrated into release/v3.8.20

* fix(usage): accept 0/empty budget limits so the dashboard can save and clear (cheaper-inference#3537) (cheaper-inference#3564)

Integrated into release/v3.8.20

* docs(changelog): credit @Six7Day for cheaper-inference#3560 thoughtSignature fix (cheaper-inference#3414)

The cheaper-inference#3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original cheaper-inference#3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.

* fix(gamification): dedup badge unlock via user_badges so events don't re-fire every request (cheaper-inference#3472) (cheaper-inference#3565)

Integrated into release/v3.8.20

* fix(routing): pass through 'auto' keyword on codex /v1/responses instead of rewriting to codex/auto (cheaper-inference#3509) (cheaper-inference#3566)

Integrated into release/v3.8.20

* fix(cli-tools): normalize apiKey null in guide-settings schema so cloud-mode config saves (cheaper-inference#3552) (cheaper-inference#3567)

Integrated into release/v3.8.20

* fix(catalog): reclassify PublicAI from keyless to one-time-initial (requires API key) (cheaper-inference#3558) (cheaper-inference#3568)

Integrated into release/v3.8.20

* fix(gemini-web): surface missing Playwright browser as actionable 503 + cooldown hint, not a retryable 500 loop (cheaper-inference#3516) (cheaper-inference#3570)

Integrated into release/v3.8.20

* fix(security): sanitize raw err.message in web executors + embeddings/search response bodies (Rule cheaper-inference#12) (cheaper-inference#3494, cheaper-inference#3495) (cheaper-inference#3573)

Integrated into release/v3.8.20

* fix(dashboard): point CustomHostsManager + FeatureFlagsGrid at real routes (cheaper-inference#3486, cheaper-inference#3487) (cheaper-inference#3574)

Integrated into release/v3.8.20

* chore(providers): remove dead krutrim entry (cheaper-inference#3483) + docs(api): fix agent-bridge per-agent state route (cheaper-inference#3489) (cheaper-inference#3575)

Integrated into release/v3.8.20

* docs(api): correct API_REFERENCE.md paths for skills/plugins/admin/cache/acp/system-info (cheaper-inference#3497) (cheaper-inference#3577)

Integrated into release/v3.8.20

* fix(proxy): drive SOCKS5 UI option from runtime ENABLE_SOCKS5_PROXY, not build-time NEXT_PUBLIC (cheaper-inference#3508) (cheaper-inference#3579)

Integrated into release/v3.8.20

* fix(playground): filter playground models by node prefix so custom-endpoint models appear (cheaper-inference#3505) (cheaper-inference#3581)

Integrated into release/v3.8.20

* fix(usage): show an informative message instead of a blank Kiro quota card when no usage breakdown (cheaper-inference#3506) (cheaper-inference#3582)

Integrated into release/v3.8.20

* docs(changelog): add the cheaper-inference#3506 Kiro quota entry (missed in cheaper-inference#3582 due to a stale-base CHANGELOG anchor) (cheaper-inference#3583)

Integrated into release/v3.8.20

* fix(auto-update): use stable PROJECT_ROOT walker, not frozen process.cwd() (cheaper-inference#3561)

Integrated into release/v3.8.20. Auto-update PROJECT_ROOT now uses a stable __dirname-anchored upward walker instead of the no-op process.cwd() resolver.

* fix: address PR cheaper-inference#3518 review comments (lifecycle hooks, regex, indentation, route params) (cheaper-inference#3562)

Integrated into release/v3.8.20. Addresses cheaper-inference#3518 review: regex literals, logs/[id] route params (Next 16), indentation, and wires plugin lifecycle hooks (onInstall/onActivate/onDeactivate/onUninstall) in the loader so manager.ts can register them. Adds Rule cheaper-inference#18 regression test.

* docs(changelog): credit @ViFigueiredo (cheaper-inference#3423) for PROJECT_ROOT + log cheaper-inference#3561/cheaper-inference#3562 (v3.8.20)

* fix: openai to gemini incorrectly translates historical tool calls into text (cheaper-inference#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule cheaper-inference#18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (cheaper-inference#3560) untouched.

* docs(changelog)+test: reconcile standard-Gemini native mode (cheaper-inference#3569) — update round-2 rationale comment + log VPS validation

* docs(changelog): reconcile v3.8.20 — add 9 missing bullets + move [Unreleased] to versioned section

* docs(changelog): complete v3.8.20 reconciliation — 27 bullets, 11 contributors

---------

Co-authored-by: Alexander Averyanov <alex@averyan.ru>
Co-authored-by: Hakan Kurşun <bykamaka@gmail.com>
Co-authored-by: Wilson <pedbookmed@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Giorgos Giakoumettis <giorgos@yiakoumettis.gr>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
cheaper-inference#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…gnature fix (cheaper-inference#3414)

The cheaper-inference#3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original cheaper-inference#3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…to text (cheaper-inference#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule cheaper-inference#18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (cheaper-inference#3560) untouched.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
* chore(release): open v3.8.20 development cycle

* fix(images): prefer bare combos over image aliases (cheaper-inference#3527)

Integrated into release/v3.8.20

* fix(translator): map Codex local_shell tool (cheaper-inference#3534)

Integrated into release/v3.8.20

* fix(usage): make opencode-go quota fetcher fail-open instead of throwing 500 (cheaper-inference#3522)

Integrated into release/v3.8.20

* Fix Runtime page breaker state rendering (cheaper-inference#3533)

Integrated into release/v3.8.20

* Expose provider breaker degradation threshold setting (cheaper-inference#3535)

Integrated into release/v3.8.20

* fix(executor): strip provider prefix from versioned built-in tool model field (cheaper-inference#3532)

Integrated into release/v3.8.20

* feat(providers): add Claude Fable 5 support (cheaper-inference#3524)

Integrated into release/v3.8.20

* feat(resilience): add global provider cooldown tracking to prevent combo re-walking (cheaper-inference#3556)

Integrated into release/v3.8.20 (default OFF, opt-in)

* fix(translator): scope thoughtSignature bypass to Antigravity/CLI only (cheaper-inference#3560)

Integrated into release/v3.8.20. Co-authored-by: Six7Day <six7day@gmail.com>

* fix(routing): normalize thinking:disabled for combo-substituted models that reject it (cheaper-inference#3554) (cheaper-inference#3563)

Integrated into release/v3.8.20

* fix(usage): accept 0/empty budget limits so the dashboard can save and clear (cheaper-inference#3537) (cheaper-inference#3564)

Integrated into release/v3.8.20

* docs(changelog): credit @Six7Day for cheaper-inference#3560 thoughtSignature fix (cheaper-inference#3414)

The cheaper-inference#3560 squash co-author trailer landed inline (unparsed by GitHub), so add
an explicit CHANGELOG credit ensuring @Six7Day (original cheaper-inference#3414) and @oyi77 are
on the public record for the Gemini thoughtSignature fix.

* fix(gamification): dedup badge unlock via user_badges so events don't re-fire every request (cheaper-inference#3472) (cheaper-inference#3565)

Integrated into release/v3.8.20

* fix(routing): pass through 'auto' keyword on codex /v1/responses instead of rewriting to codex/auto (cheaper-inference#3509) (cheaper-inference#3566)

Integrated into release/v3.8.20

* fix(cli-tools): normalize apiKey null in guide-settings schema so cloud-mode config saves (cheaper-inference#3552) (cheaper-inference#3567)

Integrated into release/v3.8.20

* fix(catalog): reclassify PublicAI from keyless to one-time-initial (requires API key) (cheaper-inference#3558) (cheaper-inference#3568)

Integrated into release/v3.8.20

* fix(gemini-web): surface missing Playwright browser as actionable 503 + cooldown hint, not a retryable 500 loop (cheaper-inference#3516) (cheaper-inference#3570)

Integrated into release/v3.8.20

* fix(security): sanitize raw err.message in web executors + embeddings/search response bodies (Rule cheaper-inference#12) (cheaper-inference#3494, cheaper-inference#3495) (cheaper-inference#3573)

Integrated into release/v3.8.20

* fix(dashboard): point CustomHostsManager + FeatureFlagsGrid at real routes (cheaper-inference#3486, cheaper-inference#3487) (cheaper-inference#3574)

Integrated into release/v3.8.20

* chore(providers): remove dead krutrim entry (cheaper-inference#3483) + docs(api): fix agent-bridge per-agent state route (cheaper-inference#3489) (cheaper-inference#3575)

Integrated into release/v3.8.20

* docs(api): correct API_REFERENCE.md paths for skills/plugins/admin/cache/acp/system-info (cheaper-inference#3497) (cheaper-inference#3577)

Integrated into release/v3.8.20

* fix(proxy): drive SOCKS5 UI option from runtime ENABLE_SOCKS5_PROXY, not build-time NEXT_PUBLIC (cheaper-inference#3508) (cheaper-inference#3579)

Integrated into release/v3.8.20

* fix(playground): filter playground models by node prefix so custom-endpoint models appear (cheaper-inference#3505) (cheaper-inference#3581)

Integrated into release/v3.8.20

* fix(usage): show an informative message instead of a blank Kiro quota card when no usage breakdown (cheaper-inference#3506) (cheaper-inference#3582)

Integrated into release/v3.8.20

* docs(changelog): add the cheaper-inference#3506 Kiro quota entry (missed in cheaper-inference#3582 due to a stale-base CHANGELOG anchor) (cheaper-inference#3583)

Integrated into release/v3.8.20

* fix(auto-update): use stable PROJECT_ROOT walker, not frozen process.cwd() (cheaper-inference#3561)

Integrated into release/v3.8.20. Auto-update PROJECT_ROOT now uses a stable __dirname-anchored upward walker instead of the no-op process.cwd() resolver.

* fix: address PR cheaper-inference#3518 review comments (lifecycle hooks, regex, indentation, route params) (cheaper-inference#3562)

Integrated into release/v3.8.20. Addresses cheaper-inference#3518 review: regex literals, logs/[id] route params (Next 16), indentation, and wires plugin lifecycle hooks (onInstall/onActivate/onDeactivate/onUninstall) in the loader so manager.ts can register them. Adds Rule cheaper-inference#18 regression test.

* docs(changelog): credit @ViFigueiredo (cheaper-inference#3423) for PROJECT_ROOT + log cheaper-inference#3561/cheaper-inference#3562 (v3.8.20)

* fix: openai to gemini incorrectly translates historical tool calls into text (cheaper-inference#3569)

Integrated into release/v3.8.20. Standard Gemini direct path now maps historical tool calls to native functionCall/functionResponse parts (signaturelessToolCallMode: native) instead of inert text — validated against the real Gemini API (gemini-2.5-flash returns 200 for signatureless native functionCall, even with tools+thinking; Hard Rule cheaper-inference#18). Eliminates the text-serialization leak. Antigravity/CLI sentinel path (cheaper-inference#3560) untouched.

* docs(changelog)+test: reconcile standard-Gemini native mode (cheaper-inference#3569) — update round-2 rationale comment + log VPS validation

* docs(changelog): reconcile v3.8.20 — add 9 missing bullets + move [Unreleased] to versioned section

* docs(changelog): complete v3.8.20 reconciliation — 27 bullets, 11 contributors

---------

Co-authored-by: Alexander Averyanov <alex@averyan.ru>
Co-authored-by: Hakan Kurşun <bykamaka@gmail.com>
Co-authored-by: Wilson <pedbookmed@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Giorgos Giakoumettis <giorgos@yiakoumettis.gr>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants