Skip to content

fix(core): prevent duplicate tool schemas for instantiated tools#22204

Merged
abhipatel12 merged 1 commit intomainfrom
abhi/cli-help-fix
Mar 12, 2026
Merged

fix(core): prevent duplicate tool schemas for instantiated tools#22204
abhipatel12 merged 1 commit intomainfrom
abhi/cli-help-fix

Conversation

@abhipatel12
Copy link
Collaborator

Summary

Fixes a bug where tools passed as object instances duplicate their schemas to the LLM.

Details

In LocalAgentExecutor.prepareToolsList, schemas were being pushed directly into toolsList from explicit tool instances in toolConfig.tools, and then this.toolRegistry.getFunctionDeclarations() was pushing all of them again. This caused a duplicate function declaration error when running the cli_help agent, which embeds its tool directly via new GetInternalDocsTool.

The logic was updated to rely completely on this.toolRegistry.getFunctionDeclarations() for all schemas to ensure deduplication.

Added a new regression test to local-executor.test.ts to catch duplicate schemas for instantiated tools in the future. Also addressed some miscellaneous type checking warnings within the test file, and added an environment variable stub to config.test.ts to improve test stability.

Related Issues

None.

How to Validate

  1. Run npm test -w @google/gemini-cli-core -- src/agents/local-executor.test.ts and ensure all tests continue to pass.
  2. Run the cli_help agent locally or any context where an agent directly instantiates a tool. Verify it does not crash with a "Duplicate function declaration found" error.

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
      • npm run
      • npx
      • Docker
      • Podman
      • Seatbelt
    • Windows
      • npm run
      • npx
      • Docker
    • Linux
      • npm run
      • npx
      • Docker

This commit fixes an issue where LocalAgentExecutor would push the schema of an instantiated tool twice during agent invocation, leading to 'Duplicate function declaration' API errors.
@abhipatel12 abhipatel12 requested a review from a team as a code owner March 12, 2026 18:57
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses a critical bug that caused duplicate tool schemas when agents were configured with instantiated tool objects. The fix centralizes the process of gathering tool schemas, ensuring that each tool's schema is declared only once, thereby preventing runtime errors and improving the robustness of tool execution. This change enhances the reliability of agents that directly instantiate tools.

Highlights

  • Bug Fix: Resolved an issue where instantiated tools would incorrectly duplicate their schemas when passed to the LLM, leading to 'Duplicate function declaration found' errors.
  • Schema Handling Logic: Refactored the LocalAgentExecutor.prepareToolsList method to exclusively rely on this.toolRegistry.getFunctionDeclarations() for all tool schemas, ensuring proper deduplication.
  • Testing: Introduced a new regression test in local-executor.test.ts to prevent future occurrences of duplicate schemas for instantiated tools. Also addressed minor type checking warnings and added environment variable stubs in related tests for stability.
Changelog
  • packages/cli/src/config/config.test.ts
    • Stubbed VSCODE_GIT_ASKPASS_MAIN environment variable for test stability.
    • Stubbed ANTIGRAVITY_CLI_ALIAS environment variable for test stability.
  • packages/core/src/agents/local-executor.test.ts
    • Imported FunctionDeclaration type.
    • Added a new test case to verify that instantiated tools do not result in duplicate schemas.
  • packages/core/src/agents/local-executor.ts
    • Removed direct pushing of tool schemas from instantiated objects into toolsList.
    • Updated logic to rely solely on this.toolRegistry.getFunctionDeclarations() for all tool schemas, including those from instantiated tools.
Activity
  • abhipatel12 has added/updated tests to cover the changes.
  • abhipatel12 has validated the changes on MacOS using npm run.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

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

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 correctly addresses a bug that caused duplicate tool schemas when tools were provided as instantiated objects. The fix simplifies the logic in prepareToolsList to rely on the toolRegistry as the single source of truth for schemas, which is the right approach. The addition of a regression test in local-executor.test.ts is excellent for preventing this issue from recurring. The other minor changes to test files to improve stability are also good practice. The changes are well-implemented and I have no further feedback.

Note: Security Review did not run due to the size of the PR.

@abhipatel12 abhipatel12 enabled auto-merge March 12, 2026 19:00
@github-actions
Copy link

Size Change: -122 B (0%)

Total Size: 26.6 MB

ℹ️ View Unchanged
Filename Size Change
./bundle/gemini.js 26.1 MB -122 B (0%)
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 221 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 227 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 11.5 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B

compressed-size-action

@gemini-cli gemini-cli bot added the status/need-issue Pull requests that need to have an associated issue. label Mar 12, 2026
@abhipatel12 abhipatel12 added this pull request to the merge queue Mar 12, 2026
Merged via the queue into main with commit 7242d71 Mar 12, 2026
30 checks passed
@abhipatel12 abhipatel12 deleted the abhi/cli-help-fix branch March 12, 2026 19:23
gsquared94 added a commit to gsquared94/gemini-cli that referenced this pull request Mar 12, 2026
Add 6 tests for the DeclarativeTool instance pattern used by the
browser agent (no duplicate declarations, registry registration,
mixed patterns, tool execution, complete_task injection, and
browser-agent-scale coverage). These serve as regression guards
for the fix in google-gemini#22204.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status/need-issue Pull requests that need to have an associated issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants