From db9ec3af61cbac7a56251959c365443098590db0 Mon Sep 17 00:00:00 2001 From: Khanh Le Date: Wed, 17 Jun 2026 09:46:41 +0700 Subject: [PATCH] fix(antigravity): strip optional from tool schemas before Gemini Closes #1537, #1841 Co-authored-by: Cursor --- open-sse/translator/formats/gemini.js | 2 +- tests/translator/bugs-antigravity.test.js | 30 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/open-sse/translator/formats/gemini.js b/open-sse/translator/formats/gemini.js index b4432402..73b7561c 100644 --- a/open-sse/translator/formats/gemini.js +++ b/open-sse/translator/formats/gemini.js @@ -19,7 +19,7 @@ export const UNSUPPORTED_SCHEMA_CONSTRAINTS = [ // Dependency keywords (not supported) "dependencies", "dependentSchemas", "dependentRequired", // Other unsupported keywords - "title", "if", "then", "else", "contentMediaType", "contentEncoding", + "title", "optional", "if", "then", "else", "contentMediaType", "contentEncoding", // UI/Styling properties (from Cursor tools - NOT JSON Schema standard) "cornerRadius", "fillColor", "fontFamily", "fontSize", "fontWeight", "gap", "padding", "strokeColor", "strokeThickness", "textColor" diff --git a/tests/translator/bugs-antigravity.test.js b/tests/translator/bugs-antigravity.test.js index 62ecb6fb..c20fcd2e 100644 --- a/tests/translator/bugs-antigravity.test.js +++ b/tests/translator/bugs-antigravity.test.js @@ -3,6 +3,7 @@ import { describe, it, expect } from "vitest"; import "./registerAll.js"; import { translateRequest } from "../../open-sse/translator/index.js"; import { FORMATS } from "../../open-sse/translator/formats.js"; +import { AntigravityExecutor } from "../../open-sse/executors/antigravity.js"; const AG2O = (req) => translateRequest(FORMATS.ANTIGRAVITY, FORMATS.OPENAI, "m", { request: req }, true, null, null); @@ -52,3 +53,32 @@ describe("Antigravity → OpenAI", () => { expect(hasEmpty, "empty text part emitted").toBe(false); }); }); + +describe("Antigravity executor", () => { + it("strips optional from nested tool schemas", () => { + const out = new AntigravityExecutor().transformRequest("gemini-2.5-pro", { + request: { + contents: [{ role: "user", parts: [{ text: "hi" }] }], + tools: [{ + functionDeclarations: [{ + name: "lookup", + description: "Lookup a value", + parameters: { + type: "object", + properties: { + query: { + type: "string", + description: "Search query", + optional: true, + }, + }, + }, + }], + }], + }, + }, true, { projectId: "project-1", connectionId: "conn-1" }); + + const query = out.request.tools[0].functionDeclarations[0].parameters.properties.query; + expect(query).toEqual({ type: "string", description: "Search query" }); + }); +});