Skip to content

Fix Gemini API rejecting tool schemas with unsupported JSON Schema keywords#52644

Closed
OmChillure wants to merge 1 commit intozed-industries:mainfrom
OmChillure:fix/gemini-tool-schema-unsupported-keys
Closed

Fix Gemini API rejecting tool schemas with unsupported JSON Schema keywords#52644
OmChillure wants to merge 1 commit intozed-industries:mainfrom
OmChillure:fix/gemini-tool-schema-unsupported-keys

Conversation

@OmChillure
Copy link
Copy Markdown
Contributor

@OmChillure OmChillure commented Mar 29, 2026

Summary

The Gemini API enforces strict validation on function_declarations and rejects requests containing unsupported JSON Schema keywords such as additionalProperties, propertyNames. This caused Write mode to fail with "failed to stream completion" when tools with complex schemas were used.

This PR strips these unsupported keywords from tool schemas before sending them to the Gemini API in adapt_to_json_schema_subset.

How to Review

  • Check crates/language_model/src/tool_schema.rs — the adapt_to_json_schema_subset function now removes additionalProperties and propertyNames from schemas.
  • Tests are added covering removal of these keys and nested schema handling.
  • To reproduce the original issue, send a tool schema containing propertyNames or additionalProperties to the Gemini API — it returns HTTP 400 INVALID_ARGUMENT

How to Test

Run the unit tests:

cargo test -p language_model

OR manually reproduce this using ->

curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=YOUR_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"test"}]}],"tools":[{"functionDeclarations":[{"name":"test","parameters":{"type":"OBJECT","properties":{"field":{"type":"OBJECT","propertyNames":{"pattern":"^[a-z]+$"},"additionalProperties":{"type":"STRING"}}}}}]}]}'

Closes #52430

  • I've reviewed my own diff for quality, security, and reliability
  • Unsafe blocks (if any) have justifying comments
  • The content is consistent with the UI/UX checklist
  • Tests cover the new/changed behavior
  • Performance impact has been considered and is acceptable

Video

Screencast.from.2026-03-29.08-32-18.webm

Release Notes:
In Write mode when tool schemas contain unsupported JSON Schema keywords (additionalProperties, propertyNames). These are now stripped before sending to the Gemini API.

@cla-bot cla-bot bot added the cla-signed The user has signed the Contributor License Agreement label Mar 29, 2026
@zed-community-bot zed-community-bot bot added the guild Pull requests by someone in Zed Guild. NOTE: the label application is automated via github actions label Mar 29, 2026
@zed-codeowner-coordinator zed-codeowner-coordinator bot requested review from a team, benbrandt and osyvokon and removed request for a team March 29, 2026 03:11
@maxdeviant maxdeviant changed the title Fix Gemini API rejecting tool schemas with unsupported JSON Schema ke… Fix Gemini API rejecting tool schemas with unsupported JSON Schema keywords Mar 29, 2026
@zed-industries-bot
Copy link
Copy Markdown
Contributor

Warnings
⚠️

This PR is missing release notes.

Please add a "Release Notes" section that describes the change:

Release Notes:

- Added/Fixed/Improved ...

If your change is not user-facing, you can use "N/A" for the entry:

Release Notes:

- N/A

Generated by 🚫 dangerJS against 4f53aed

@Vastargazing
Copy link
Copy Markdown
Contributor

Hey guys, one catch in the release notes mention anyOf as one of the stripped keywords, but the diff doesn't add it to KEYS_TO_REMOVE — and Gemini actually supports anyOf natively (the code even produces it by converting oneOf → anyOf). Looks like a copy-paste slip. Worth fixing before merge to avoid confusing users into removing anyOf from their schemas unnecessarily.

@OmChillure
Copy link
Copy Markdown
Contributor Author

OmChillure commented Mar 29, 2026

Hey guys, one catch in the release notes mention anyOf as one of the stripped keywords, but the diff doesn't add it to KEYS_TO_REMOVE — and Gemini actually supports anyOf natively (the code even produces it by converting oneOf → anyOf). Looks like a copy-paste slip. Worth fixing before merge to avoid confusing users into removing anyOf from their schemas unnecessarily.

Thank you for pointing out, It was a description copy/paste slip, though the code doenst touch anyOf, I removed it from summary but ig it was left in release notes. I have fixed the description.

@OmChillure OmChillure closed this by deleting the head repository Mar 29, 2026
bennetbo pushed a commit that referenced this pull request Mar 29, 2026
### Summary

The Gemini API enforces strict validation on `function_declarations` and
rejects requests containing unsupported JSON Schema keywords such as
`additionalProperties`, `propertyNames`. This caused Write mode to fail
with "failed to stream completion" when tools with complex schemas were
used.

This PR strips these unsupported keywords from tool schemas before
sending them to the Gemini API in `adapt_to_json_schema_subset`.

### How to Review

- Check `crates/language_model/src/tool_schema.rs` — the
`adapt_to_json_schema_subset` function now removes
`additionalProperties` and `propertyNames` from schemas.
- Tests are added covering removal of these keys and nested schema
handling.
- To reproduce the original issue, send a tool schema containing
`propertyNames` or `additionalProperties` to the Gemini API — it returns
HTTP 400 `INVALID_ARGUMENT`

### How to Test

Run the unit tests:
```sh
cargo test -p language_model
```

OR manually reproduce this using ->

```
curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=YOUR_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"test"}]}],"tools":[{"functionDeclarations":[{"name":"test","parameters":{"type":"OBJECT","properties":{"field":{"type":"OBJECT","propertyNames":{"pattern":"^[a-z]+$"},"additionalProperties":{"type":"STRING"}}}}}]}]}'
```


#### Closes #52430

- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Video 

[Screencast from 2026-03-29
08-32-18.webm](https://github.com/user-attachments/assets/a0069f0e-1f2b-45dc-85bf-f24aacb08599)


### Note : Reopens previous work from closed PR #52644 (fork was
deleted)


Release Notes:

- Fixed an issue where Gemini models would not work when using specific
MCP servers
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement guild Pull requests by someone in Zed Guild. NOTE: the label application is automated via github actions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Gemini API: "failed to stream completion" in Write mode due to strict JSON Schema validation on tools

5 participants