From b07dff53a85cd399c19de9dd17f8da0f70d9ed86 Mon Sep 17 00:00:00 2001 From: King Star Date: Mon, 6 Jul 2026 10:26:41 +0800 Subject: [PATCH 1/3] fix: sanitize empty Gemini object requirements --- packages/opencode/src/provider/transform.ts | 10 ++++- .../opencode/test/provider/transform.test.ts | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 18b94c5adf7..a3dc90a16e8 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1487,9 +1487,15 @@ export function schema(model: Provider.Model, schema: JSONSchema7): JSONSchema7 } // Filter required array to only include fields that exist in properties - if (result.type === "object" && result.properties && Array.isArray(result.required)) { - result.required = result.required.filter((field: any) => field in result.properties) + // kilocode_change start - Gemini rejects required entries without matching properties + if (result.type === "object" && Array.isArray(result.required)) { + const properties = isPlainObject(result.properties) ? result.properties : undefined + result.required = properties ? result.required.filter((field: any) => field in properties) : [] + if (result.required.length === 0) { + delete result.required + } } + // kilocode_change end if (result.type === "array" && !hasCombiner(result)) { if (result.items == null) { diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 709d8dac3a3..32d63204571 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -934,6 +934,51 @@ describe("ProviderTransform.schema - gemini non-object properties removal", () = expect(result.properties.data.required).toEqual(["name"]) }) + test("removes required from object array items with no properties", () => { + const schema = { + type: "object", + properties: { + issue_fields: { + type: "array", + items: { + type: "object", + required: ["type"], + }, + }, + }, + } as any + + const result = ProviderTransform.schema(geminiModel, schema) as any + + expect(result.properties.issue_fields.items.type).toBe("object") + expect(result.properties.issue_fields.items.required).toBeUndefined() + }) + + test("sanitizes gemini schemas routed through the Kilo Gateway", () => { + const gatewayGeminiModel = { + providerID: "kilocode", + api: { + id: "google/gemini-2.5-pro", + }, + } as any + const schema = { + type: "object", + properties: { + issue_fields: { + type: "array", + items: { + type: "object", + required: ["type"], + }, + }, + }, + } as any + + const result = ProviderTransform.schema(gatewayGeminiModel, schema) as any + + expect(result.properties.issue_fields.items.required).toBeUndefined() + }) + test("does not affect non-gemini providers", () => { const openaiModel = { providerID: "openai", From cac82a36cac448154c880a0ebdfd283b89559668 Mon Sep 17 00:00:00 2001 From: King Star Date: Mon, 6 Jul 2026 11:13:54 +0800 Subject: [PATCH 2/3] docs: add Gemini MCP schema changeset --- .changeset/gemini-mcp-schema-required.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gemini-mcp-schema-required.md diff --git a/.changeset/gemini-mcp-schema-required.md b/.changeset/gemini-mcp-schema-required.md new file mode 100644 index 00000000000..b735f56ff6c --- /dev/null +++ b/.changeset/gemini-mcp-schema-required.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Prevent Gemini requests from failing when MCP tool schemas contain `required` fields without matching object properties. From 9887e43fc4ac79f456d923c5532a49e06c0ed371 Mon Sep 17 00:00:00 2001 From: King Star Date: Sat, 11 Jul 2026 18:12:14 +0800 Subject: [PATCH 3/3] test: annotate Gemini schema regressions --- packages/opencode/test/provider/transform.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index 32d63204571..92e0bf11a79 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -934,6 +934,7 @@ describe("ProviderTransform.schema - gemini non-object properties removal", () = expect(result.properties.data.required).toEqual(["name"]) }) + // kilocode_change start test("removes required from object array items with no properties", () => { const schema = { type: "object", @@ -978,6 +979,7 @@ describe("ProviderTransform.schema - gemini non-object properties removal", () = expect(result.properties.issue_fields.items.required).toBeUndefined() }) + // kilocode_change end test("does not affect non-gemini providers", () => { const openaiModel = {