From fd4fd92fbb269b578b4f65f148d34bf996c90400 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Fri, 19 Dec 2025 17:03:14 -0700 Subject: [PATCH] fix: normalize tool schemas for VS Code LM API to fix error 400 Apply normalizeToolSchema to tool inputSchema in convertToVsCodeLmTools to convert JSON Schema draft-07 syntax to draft 2020-12 compliant format required by GitHub Copilot's backend. This converts type: ['string', 'null'] array syntax to anyOf format and sets additionalProperties: false for object types. --- src/api/providers/__tests__/vscode-lm.spec.ts | 2 ++ src/api/providers/vscode-lm.ts | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/api/providers/__tests__/vscode-lm.spec.ts b/src/api/providers/__tests__/vscode-lm.spec.ts index 0087db6b0bf..e277ce53300 100644 --- a/src/api/providers/__tests__/vscode-lm.spec.ts +++ b/src/api/providers/__tests__/vscode-lm.spec.ts @@ -336,6 +336,7 @@ describe("VsCodeLmHandler", () => { } // Verify sendRequest was called with tools in options + // Note: normalizeToolSchema adds additionalProperties: false for JSON Schema 2020-12 compliance expect(mockLanguageModelChat.sendRequest).toHaveBeenCalledWith( expect.any(Array), expect.objectContaining({ @@ -348,6 +349,7 @@ describe("VsCodeLmHandler", () => { properties: { operation: { type: "string" }, }, + additionalProperties: false, }, }, ], diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index ed244ba97d7..5c598ccd012 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -6,6 +6,7 @@ import { type ModelInfo, openAiModelInfoSaneDefaults } from "@roo-code/types" import type { ApiHandlerOptions } from "../../shared/api" import { SELECTOR_SEPARATOR, stringifyVsCodeLmModelSelector } from "../../shared/vsCodeSelectorUtils" +import { normalizeToolSchema } from "../../utils/json-schema" import { ApiStream } from "../transform/stream" import { convertToVsCodeLmMessages, extractTextCountFromMessage } from "../transform/vscode-lm-format" @@ -15,6 +16,8 @@ import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from ". /** * Converts OpenAI-format tools to VSCode Language Model tools. + * Normalizes the JSON Schema to draft 2020-12 compliant format required by + * GitHub Copilot's backend, converting type: ["T", "null"] to anyOf format. * @param tools Array of OpenAI ChatCompletionTool definitions * @returns Array of VSCode LanguageModelChatTool definitions */ @@ -24,7 +27,9 @@ function convertToVsCodeLmTools(tools: OpenAI.Chat.ChatCompletionTool[]): vscode .map((tool) => ({ name: tool.function.name, description: tool.function.description || "", - inputSchema: tool.function.parameters as Record | undefined, + inputSchema: tool.function.parameters + ? normalizeToolSchema(tool.function.parameters as Record) + : undefined, })) }