-
Notifications
You must be signed in to change notification settings - Fork 2.8k
fix: correct Gemini 3 thought signature injection format via OpenRouter #10640
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: correct Gemini 3 thought signature injection format via OpenRouter #10640
Conversation
Fix 'Thought signature is not valid' error when using Gemini 3 models via OpenRouter with native tool calling. The issue was caused by creating multiple reasoning_details entries (one per tool call), but OpenRouter/Gemini expects ONE entry per assistant turn with the first tool call's ID and index 0. Changes: - Create ONE reasoning.encrypted block per assistant message with tool calls - Use first tool call's ID instead of each tool call's individual ID - Always set index to 0 instead of incrementing indices This matches the format documented by OpenRouter (Toven, Nov 2025) and aligns with the native Gemini provider's behavior in gemini-format.ts. Closes ROO-494
Review complete. No issues found. The fix correctly addresses the 'Thought signature is not valid' error by creating ONE Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues. |
* fix(evals): add missing packages/core to Dockerfile.runner (RooCodeInc#10272) * feat: add Cloud Team page with comprehensive team features (RooCodeInc#10267) * feat: add Cloud Team page with features and pricing integration * Copy tweaks * Visual tweaks * Content adjustments * Update apps/web-roo-code/src/app/cloud/team/page.tsx Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Bruno Bergher <bruno@roocode.com> Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * feat: remove parallel_tool_calls parameter from litellm provider (RooCodeInc#10274) Co-authored-by: Roo Code <roomote@roocode.com> * feat(build): add types package bundling and alias support * update(settings): change default tool protocol to XML * fix: enable Requesty refresh models with credentials (RooCodeInc#10273) * fix: disable strict mode for MCP tools to preserve optional parameters (RooCodeInc#10220) Co-authored-by: Roo Code <roomote@roocode.com> * fix: move array-specific properties into anyOf variant in normalizeToolSchema (RooCodeInc#10276) * fix: move array-specific properties into anyOf variant in normalizeToolSchema Fixes read_file tool schema rejection with GPT-5-mini which requires items property to be inside the { type: 'array' } variant when using anyOf for nullable arrays. Resolves ROO-262 * refactor: extract array-specific properties constant and helper function * refactor(custom-tools): improve tool loading and instance consistency * fix(chutes): add graceful fallback for model parsing (RooCodeInc#10279) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: emit tool_call_end events in OpenAI handler when streaming ends (RooCodeInc#10280) * feat(core): add support for custom tool parsing in AssistantMessageParser * Merge remote-tracking branch 'upstream/main' into roo-to-main * feat: deprecate XML tool protocol selection, force native for new tasks (RooCodeInc#10281) - Disable tool protocol selector UI in ApiOptions.tsx - Force native protocol for all new tasks in resolveToolProtocol() - Keep locked protocol support for resumed tasks that used XML - Remove models without supportsNativeTools: true from providers: - baseten.ts: removed 6 models - bedrock.ts: removed 2 embedding models - featherless.ts: removed 3 models, updated default - groq.ts: removed 5 models - sambanova.ts: removed 2 models - vertex.ts: removed 7 models - vercel-ai-gateway.ts: added supportsNativeTools: true - Update tests to expect native format output * feat(zai): add GLM-4.7 model with thinking mode support (RooCodeInc#10282) Co-authored-by: Roo Code <roomote@roocode.com> * fix: improve reasoning_details accumulation and serialization (RooCodeInc#10285) * feat(evals): add message log deduper utility (RooCodeInc#10286) * feat(minimax): move environment_details to system message for thinking models (RooCodeInc#10284) * fix: add CRLF line ending normalization to search_replace and search_and_replace tools (RooCodeInc#10288) - Normalize file content to LF after reading to ensure consistent matching - Normalize search/replace strings to handle CRLF from model output - Add comprehensive CRLF normalization tests for both tools - Consistent with existing edit_file tool behavior * refactor(zai): merge environment_details into tool result instead of system message (RooCodeInc#10289) * fix: emit tool_call_end events in BaseOpenAiCompatibleProvider (RooCodeInc#10293) * fix: preserve reasoning_content in condense summary for DeepSeek-reasoner (RooCodeInc#10292) * Release v3.37.0 (RooCodeInc#10295) Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Changeset version bump (RooCodeInc#10296) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: enable mergeToolResultText for Roo Code Cloud provider (RooCodeInc#10301) * feat: add grace retry for empty assistant messages (RooCodeInc#10297) Implements grace retry error handling for 'no assistant messages' API errors, following the same pattern as PR RooCodeInc#10196 for 'no tools used'. - Add consecutiveNoAssistantMessagesCount counter to Task.ts - First failure: silent retry (grace retry) - After 2+ consecutive failures: show MODEL_NO_ASSISTANT_MESSAGES error - Add UI handling in ChatRow.tsx with ErrorRow component - Add localized strings to all 18 locale files - Add comprehensive tests for the grace retry behavior * Release: v1.95.0 (RooCodeInc#10309) chore: bump version to v1.95.0 * feat(prompts): strengthen native tool-use guidance (RooCodeInc#10311) * feat: enable mergeToolResultText for all OpenAI-compatible providers (RooCodeInc#10299) * fix: preserve reasoning_details shape to prevent malformed responses (RooCodeInc#10313) * fix(task): drain queued messages while waiting for ask (RooCodeInc#10315) * fix(openai): send native tool definitions by default (RooCodeInc#10314) Co-authored-by: Roo Code <roomote@roocode.com> * ux: Provider-centric signup (RooCodeInc#10306) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * chore: add changeset for v3.37.1 (RooCodeInc#10316) * Changeset version bump (RooCodeInc#10317) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * refactor: simplify tool protocol resolution logic * refactor: optimize stream rendering and file reading limits * refactor(tools): simplify extractTextFromFile parameters * feat(chat): add tool protocol display to task header * fix(test): respect user toolProtocol preference over model capabilities * update(provider): update zgsm model handling and native tool protocol logic * feat: remove OpenRouter Transforms feature (RooCodeInc#10341) - Remove openRouterUseMiddleOutTransform checkbox from settings UI - Remove openRouterUseMiddleOutTransform from TypeScript types - Remove transforms parameter logic from OpenRouter handler - Remove setting from EVALS_SETTINGS - Remove translation keys from all locale files (18 locales) Co-authored-by: Roo Code <roomote@roocode.com> * feat: remove simpleReadFileTool completely (RooCodeInc#10254) - Delete simpleReadFileTool.ts file - Delete simple-read-file.ts prompt description file - Delete single-file-read-models.ts types file - Remove imports and usage from presentAssistantMessage.ts - Remove imports and usage from prompts/tools/index.ts - Remove export from packages/types/src/index.ts This removes all traces of the legacy single-file read tool implementation that was used for specific models. All models now use the standard read_file tool. Co-authored-by: Roo Code <roomote@roocode.com> * Add support for skills (RooCodeInc#10335) * Add support for skills * fix: use type-only import for ClineProvider and relative paths in skills section --------- Co-authored-by: Roo Code <roomote@roocode.com> * Add support for npm packages and .env files to custom tools (RooCodeInc#10336) Co-authored-by: Roo Code <roomote@roocode.com> * fix: capture extended thinking signatures for tool use continuations (RooCodeInc#10351) * feat: add optional mode field to slash command front matter (RooCodeInc#10344) * feat: add optional mode field to slash command front matter - Add mode field to Command interface - Update command parsing to extract mode from frontmatter - Modify RunSlashCommandTool to automatically switch mode when specified - Add comprehensive tests for mode field parsing and switching - Update existing tests to include mode field * Make it work for manual slash commands too --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Remove the mergeToolResultText in the Roo provider for now (RooCodeInc#10359) * Revert "fix: capture extended thinking signatures for tool use continuations" (RooCodeInc#10360) * Release v3.38.0 (RooCodeInc#10361) * Changeset version bump (RooCodeInc#10362) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: enforce maxConcurrentFileReads limit in read_file tool (RooCodeInc#10363) Co-authored-by: Roo Code <roomote@roocode.com> * refactor(zgsm): optimize native protocol handling and model ID usage * docs: clarify path to Security Settings in privacy policy (RooCodeInc#10367) Co-authored-by: Roo Code <roomote@roocode.com> * Improve error message when read_file is used on directory (RooCodeInc#10371) Co-authored-by: Roo Code <roomote@roocode.com> * Handle custom tool use similarly to MCP tools for ipc schema purposes (RooCodeInc#10364) * fix: correct GitHub repository URL in marketing page (RooCodeInc#10377) Co-authored-by: Roo Code <roomote@roocode.com> * Revert "feat: enable mergeToolResultText for all OpenAI-compatible providers (RooCodeInc#10299)" (RooCodeInc#10381) * fix: flush pending tool results before condensing context (RooCodeInc#10379) * chore: add changeset for v3.38.1 (RooCodeInc#10384) * Changeset version bump (RooCodeInc#10385) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: update Cerebras maxTokens to 16384 (RooCodeInc#10387) * docs: Replace Todo Lists video with Context Management video (RooCodeInc#10375) Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local> * Release: v1.96.0 (RooCodeInc#10395) chore: bump version to v1.96.0 * fix(utils): add optional chaining for provider settings * feat(skills): align with Agent Skills spec (RooCodeInc#10409) * chore: remove human-relay provider (RooCodeInc#10388) Co-authored-by: Roo Code <roomote@roocode.com> * Fix rate limit wait display (RooCodeInc#10389) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix: prevent write_to_file from creating files at truncated paths (RooCodeInc#10415) Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> Co-authored-by: Roo Code <roomote@roocode.com> * Release v3.38.2 (RooCodeInc#10416) * Changeset version bump (RooCodeInc#10417) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * fix(claude-code): stop frequent sign-ins by hardening OAuth refresh (RooCodeInc#10410) * fix(claude-code): prevent sign-outs on oauth refresh * test(claude-code): restore fetch after mocking * refactor(claude-code): replace while(true) with bounded for loop for clarity --------- Co-authored-by: Roo Code <roomote@roocode.com> * fix: add type check for lastMessage.text in TTS useEffect (RooCodeInc#10431) fix: add type check for lastMessage.text before calling startsWith Fixes RooCodeInc#10430 The TTS useEffect was calling .startsWith() on lastMessage.text after only checking if it was truthy. If text was a non-string truthy value (array, object, or number), this would crash with "Q.text.startsWith is not a function". Changed the truthy check to an explicit type check: typeof lastMessage.text === "string" Co-authored-by: Roo Code <roomote@roocode.com> * feat(chat): add collapsible markdown blocks and improve protocol error handling * refactor(task): restructure conversation history handling * feat: recursively load .roo/rules and AGENTS.md from subdirectories (RooCodeInc#10446) Co-authored-by: Roo Code <roomote@roocode.com> * Release: v1.99.0 (RooCodeInc#10447) * fix: add maxConcurrentFileReads limit to native read_file tool schema (RooCodeInc#10449) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * chore: add changeset for v3.38.3 (RooCodeInc#10450) * Changeset version bump (RooCodeInc#10451) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: add image support documentation to read_file native tool description (RooCodeInc#10442) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add explicit deduplication for duplicate tool_result blocks (RooCodeInc#10466) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> * VSCode shim + basic cli (RooCodeInc#10452) Co-authored-by: Roo Code <roomote@roocode.com> * Add an option to use our cli for evals (RooCodeInc#10456) Co-authored-by: Roo Code <roomote@roocode.com> * fix: preserve tool_use blocks for all tool_results in kept messages during condensation (RooCodeInc#10471) * fix: add additionalProperties: false to MCP tool schemas for OpenAI Responses API (RooCodeInc#10472) * feat(cli): add zgsm provider support * Add a cli installer (RooCodeInc#10474) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * feat(zgsm): add debug mode and fix tool name handling * feat(i18n): add debug status to custom config label * refactor: improve terminal encoding handling and UI styling * feat(ui): add automatically focus option for chat input * feat(proxy): add debug-mode proxy routing (RooCodeInc#10467) * feat(terminal): enhance compilation markers and output handling * fix: prevent duplicate tool_result blocks causing API errors (RooCodeInc#10497) * feat: add Kimi K2 thinking model to Fireworks AI provider (RooCodeInc#9202) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add missing description fields for debugProxy configuration (RooCodeInc#10505) Co-authored-by: Roo Code <roomote@roocode.com> * Tweak the style of the follow up suggestion modes (RooCodeInc#9260) * feat(web-evals): remember last Roo model selection + add evals skill (RooCodeInc#10470) * feat(web-evals): remember last Roo model selection * fix(web-evals): reset model selections on provider switch and fix lint warning - Add useEffect to reset model selections when switching between providers This prevents OpenRouter model IDs from persisting when switching to Roo, which was causing Roo's stored selection to be overwritten with wrong IDs - Remove unused 'executionMethod' from onSubmit dependency array to fix react-hooks/exhaustive-deps warning * fix(web-evals): add missing executionMethod to test cases * fix(web-evals): harden localStorage + keep provider selections * feat: rename YOLO to BRRR (RooCodeInc#10507) Co-authored-by: Roo Code <roomote@roocode.com> * feat: implement sticky provider profile for task-level API config persistence (RooCodeInc#10018) * feat(settings): move CHAT_SEARCH from experimental to UI settings * fix: remove legacy Claude 2 series models from Bedrock provider (RooCodeInc#10501) Co-authored-by: Roo Code <roomote@roocode.com> * feat: add support for image file @mentions (RooCodeInc#10189) Co-authored-by: Roo Code <roomote@roocode.com> * fix: handle PowerShell ENOENT error in os-name on Windows (RooCodeInc#9897) Co-authored-by: Roo Code <roomote@roocode.com> * feat: add xhigh reasoning effort to OpenAI compatible endpoints (RooCodeInc#10061) Co-authored-by: Roo Code <roomote@roocode.com> * feat: filter @ mention file search results using .rooignore (RooCodeInc#10174) * feat: filter @ mention file search results using .rooignore - Modify searchFiles case in webviewMessageHandler.ts to filter results using RooIgnoreController - Use existing RooIgnoreController from current task if available, otherwise create a temporary one - Respect showRooIgnoredFiles setting to allow users to toggle this behavior - Add comprehensive test coverage for the new filtering behavior Fixes RooCodeInc#10169 * fix: dispose temporary RooIgnoreController to prevent resource leak Addresses Rooviewer feedback: the temporary RooIgnoreController created when no task exists was never disposed, causing file watchers to accumulate. Changes: - Track temporary controller separately with tempController variable - Wrap filtering logic in try/finally block - Call dispose() in finally block to ensure cleanup - Add test cases to verify dispose is called for temp controllers - Verify task's controller is NOT disposed (only temp ones) --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> * fix: use task stored API config as fallback for rate limit (RooCodeInc#10266) Co-authored-by: Roo Code <roomote@roocode.com> * fix: make command chaining examples shell-aware for Windows compatibility (RooCodeInc#10434) * fix: make command chaining examples shell-aware for Windows compatibility Addresses Issue RooCodeInc#10352 where Roo Code generates Unix-style command chaining (&&) even on Windows systems using PowerShell or cmd.exe. Changes: - Add getCommandChainOperator() to detect the user shell and return the appropriate command chaining syntax: - Unix shells (bash, zsh, etc.): && - PowerShell: ; - cmd.exe: & - Update getRulesSection() to use shell-specific chaining in examples - Add informative note for non-Unix shells about different syntaxes - Add comprehensive tests for shell detection and command chaining * feat: add Unix utility guidance for Windows shells Addresses feedback from issue RooCodeInc#10352 about sed and other Unix-specific utilities being suggested on Windows. The system prompt now includes guidance for PowerShell and cmd.exe users to use native alternatives: PowerShell: - Select-String instead of grep - Get-Content instead of cat - Remove-Item instead of rm - Copy-Item instead of cp - Move-Item instead of mv - -replace operator or [regex] instead of sed cmd.exe: - type instead of cat - del instead of rm - copy instead of cp - move instead of mv - find/findstr instead of grep * Apply suggestion from @roomote[bot] Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: use && for cmd.exe to preserve conditional execution semantics - Update getCommandChainOperator() to return && for cmd.exe (already done) - Update getCommandChainNote() to document && instead of & for cmd.exe - Update JSDoc to reflect cmd.exe uses && for conditional execution - Update tests to expect && for cmd.exe cmd.exe supports && for conditional execution (run next command only if previous succeeds), which provides the same semantics as Unix shells. * fix: update PowerShell note to use && for cmd.exe reference --------- Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * feat(types): add zai-glm-4.7 to Cerebras models (RooCodeInc#10500) Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * 🐛 Fix glitchy kangaroo bounce animation on welcome screen (RooCodeInc#10035) The kangaroo logo on the welcome screen had a visual glitch where it would instantly jump to the top position when hovering, instead of smoothly starting the bounce from its resting position. Changes: - Added custom smooth-bounce keyframe animation in index.css that explicitly starts from translateY(0) - Updated RooHero component to use hover state tracking with the new animation - Removed Tailwind's animate-bounce class which was causing the glitch The animation now smoothly bounces from the resting position without any jarring visual jumps. * Release v3.39.0 (RooCodeInc#10537) * feat: Change "Get Started" button label to "Create Roo Account" (RooCodeInc#10543) Co-authored-by: Roo Code <roomote@roocode.com> * fix: add @roo-code/cli to changeset ignore list (RooCodeInc#10545) * Changeset version bump (RooCodeInc#10546) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Update changelog for version 3.39.0 release * fix: change minItems from 2 to 1 for Anthropic API compatibility (RooCodeInc#10551) * fix: disable Gemini thought signature persistence to prevent corrupted signature errors (RooCodeInc#10554) * fix: stabilize file paths during native tool call streaming (RooCodeInc#10555) * Release v3.39.1 (RooCodeInc#10557) * Changeset version bump (RooCodeInc#10558) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * chore(cli): change default model to anthropic/claude-opus-4.5 (RooCodeInc#10544) * fix: ensure assistant message content is never undefined for Gemini compatibility (RooCodeInc#10559) * Update Terms of Service (effective January 9, 2026) (RooCodeInc#10568) Co-authored-by: Roo Code <roomote@roocode.com> * fix(vscode-lm): order text parts before tool calls in assistant messages (RooCodeInc#10573) * fix: merge approval feedback into tool result instead of pushing duplicate (ROO-410) (RooCodeInc#10519) * feat: improve error messaging for stream termination errors from provider (RooCodeInc#10548) * fix(openai): remove convertToSimpleMessages to fix tool calling for OpenAI-compatible providers (RooCodeInc#10575) * Move more types to @roo-code/types (for the cli) (RooCodeInc#10583) * Add some functionality to @roo-code/core for the cli (RooCodeInc#10584) * Add some slash commands that are useful for cli development (RooCodeInc#10586) * feat: add debug setting to settings page (RooCodeInc#10580) * feat: add debug mode toggle to settings * Update About component with debug mode description * i18n: add debug mode strings to settings locales * Update debug mode description in all locales * fix: post state to webview after debugSetting update This addresses the review feedback that the debugSetting handler was not posting updated state back to the webview, which could cause the UI to stay stale until another state refresh occurred. * fix: clarify debug mode description to specify task header location Updated debugMode.description across all 18 locales to clarify that debug buttons appear in the task header, per review feedback. * fix: remove redundant postStateToWebview call after debug setting update * Update src/core/webview/webviewMessageHandler.ts Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: round-trip Gemini thought signatures for tool calls (RooCodeInc#10590) * fix: make edit_file matching more resilient (RooCodeInc#10585) * chore(gemini): stop overriding tool allow/deny lists (RooCodeInc#10592) * fix(cerebras): ensure all tools have consistent strict mode values (RooCodeInc#10589) Co-authored-by: Roo Code <roomote@roocode.com> * chore: disable edit_file tool for Gemini/Vertex (RooCodeInc#10594) * Release v3.39.2 (RooCodeInc#10595) * Changeset version bump (RooCodeInc#10596) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * Add a TUI (RooCodeInc#10480) Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> * Allow the cli release script to install locally for testing (RooCodeInc#10597) * feat(ipc): add retry mechanism and error handling * More file organization for the cli (RooCodeInc#10599) * refactor: rename roo-cli to cos-cli and update related references * Some cleanup in ExtensionHost (RooCodeInc#10600) Co-authored-by: Roo Code <roomote@roocode.com> * refactor: optimize response rendering and tool call handling * Rename Roo Code Cloud Provider to Roo Code Router (RooCodeInc#10560) Co-authored-by: Roo Code <roomote@roocode.com> * chore: bump version to v1.102.0 (RooCodeInc#10604) * Update router name in types (RooCodeInc#10605) * Update Roo Code Router service name (RooCodeInc#10607) * chore: add changeset for v3.39.3 (RooCodeInc#10608) * Update router name in types (RooCodeInc#10610) * Changeset version bump (RooCodeInc#10609) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> * feat: add debug mode configuration and state management * fix(settings): add debug condition for ZgsmAI custom config * Basic settings search (RooCodeInc#10619) * Prototype of a simpler searchable settings * Fix tests * UI improvements * Input tweaks * Update webview-ui/src/components/settings/SettingsSearch.tsx Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: remove duplicate Escape key handler dead code * Cleanup * Fix tests --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: Roo Code <roomote@roocode.com> * ux: UI improvements to search settings (RooCodeInc#10633) * UI changs * Update webview-ui/src/components/marketplace/MarketplaceView.tsx Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * i18n --------- Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * feat: display edit_file errors in UI after consecutive failures (RooCodeInc#10581) * feat(chat): enhance reasoning block with animated thinking indicator and varied messages * perf: optimize message block cloning in presentAssistantMessage (RooCodeInc#10616) * feat(chat): add random loading messages with localization * fix: correct Gemini 3 thought signature injection format via OpenRouter (RooCodeInc#10640) * fix: encode hyphens in MCP tool names before sanitization (RooCodeInc#10644) * fix: sanitize tool_use IDs to match API validation pattern (RooCodeInc#10649) * fix(path): return empty string from getReadablePath when path is empty - ROO-437 (RooCodeInc#10638) * ux: Standard stop button 🟥 (RooCodeInc#10639) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> * fix: omit parallel_tool_calls when not explicitly enabled (COM-406) (RooCodeInc#10671) * fix: use placeholder for empty tool result content to fix Gemini API validation (RooCodeInc#10672) * ux: Further improve error display (RooCodeInc#10692) * Ensures error details are shown for all errors (except diff, which has its own case) * More details * litellm is a proxy --------- Co-authored-by: Hannes Rudolph <hrudolph@gmail.com> Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: Roo Code <roomote@roocode.com> Co-authored-by: Bruno Bergher <bruno@roocode.com> Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: John Richmond <5629+jr@users.noreply.github.com> Co-authored-by: Chris Estreich <cestreich@gmail.com> Co-authored-by: Seb Duerr <sebastian.duerr@cerebras.net> Co-authored-by: SannidhyaSah <sah_sannidhya@outlook.com> Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local> Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com> Co-authored-by: Danny Ricciotti <dan.ricciotti@gmail.com> Co-authored-by: Archimedes <84040360+ArchimedesCrypto@users.noreply.github.com> Co-authored-by: Patrick Decat <pdecat@gmail.com>
Summary
Fix 'Thought signature is not valid' error when using Gemini 3 models (e.g.,
google/gemini-3-flash-preview) via OpenRouter with native tool calling.Problem
Users encounter error 400 "Unable to submit request because Thought signature is not valid" when switching models mid-conversation to Gemini 3 via OpenRouter.
PostHog Issue: https://us.posthog.com/error_tracking/019bb2c8-0b6c-71c3-9ef8-a2c43cd045fd
Root Cause
The original code was creating multiple
reasoning_detailsentries (one per tool call), but OpenRouter/Gemini expects exactly ONE entry per assistant turn with:idset to the first tool call's IDindexset to0This format mismatch caused Google's API to reject the signatures as invalid.
Solution
Fixed the injection logic in
src/api/providers/openrouter.tsto create ONEreasoning.encryptedblock per assistant message with tool calls, matching the documented format from OpenRouter (conversation with Toven, Nov 2025).Changes
reasoning.encryptedblock per assistant message with tool callsindexto 0 instead of incrementing indicesReferences
gemini-format.ts: "keep the signature only on the first functionCall part to match Gemini 3 parallel-calling behavior"Testing
All 24 OpenRouter tests pass.
Closes ROO-494
Important
Fixes 'Thought signature is not valid' error for Gemini 3 models in
openrouter.tsby correctingreasoning.encryptedblock injection.openrouter.tsby correctingreasoning.encryptedblock injection.reasoning.encryptedblock per assistant message with tool calls, using the first tool call's ID and settingindexto 0.This description was created by
for 53a5edd. You can customize this summary. It will automatically update as commits are pushed.