From 1b56f5ef8440f0e36ca8582dfa70d6a469c3cba7 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 13 Jan 2026 22:19:19 +0000 Subject: [PATCH] feat: add openAiOmitToolChoice setting for Azure/LiteLLM compatibility Add a new boolean setting that allows users to omit the tool_choice parameter from OpenAI API requests. This fixes compatibility issues with Azure-hosted models and LiteLLM proxies that do not support the tool_choice parameter. Fixes #10701 --- packages/types/src/provider-settings.ts | 1 + src/api/providers/openai.ts | 12 ++++++++---- .../settings/providers/OpenAICompatible.tsx | 10 ++++++++++ webview-ui/src/i18n/locales/en/settings.json | 2 ++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index d5880cd3b13..3f39ad0eccd 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -250,6 +250,7 @@ const openAiSchema = baseProviderSettingsSchema.extend({ openAiStreamingEnabled: z.boolean().optional(), openAiHostHeader: z.string().optional(), // Keep temporarily for backward compatibility during migration. openAiHeaders: z.record(z.string(), z.string()).optional(), + openAiOmitToolChoice: z.boolean().optional(), // Omit tool_choice parameter for Azure/LiteLLM compatibility. }) const ollamaSchema = baseProviderSettingsSchema.extend({ diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 9d632fbdf4c..918bc52a6c8 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -161,7 +161,8 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl ...(isGrokXAI ? {} : { stream_options: { include_usage: true } }), ...(reasoning && reasoning), ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), - ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), + ...(metadata?.tool_choice && + !this.options.openAiOmitToolChoice && { tool_choice: metadata.tool_choice }), ...(metadata?.toolProtocol === "native" && metadata.parallelToolCalls === true && { parallel_tool_calls: true, @@ -231,7 +232,8 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl ? convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) : [systemMessage, ...convertToOpenAiMessages(messages)], ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), - ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), + ...(metadata?.tool_choice && + !this.options.openAiOmitToolChoice && { tool_choice: metadata.tool_choice }), ...(metadata?.toolProtocol === "native" && metadata.parallelToolCalls === true && { parallel_tool_calls: true, @@ -358,7 +360,8 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl reasoning_effort: modelInfo.reasoningEffort as "low" | "medium" | "high" | undefined, temperature: undefined, ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), - ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), + ...(metadata?.tool_choice && + !this.options.openAiOmitToolChoice && { tool_choice: metadata.tool_choice }), ...(metadata?.toolProtocol === "native" && metadata.parallelToolCalls === true && { parallel_tool_calls: true, @@ -394,7 +397,8 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl reasoning_effort: modelInfo.reasoningEffort as "low" | "medium" | "high" | undefined, temperature: undefined, ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), - ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), + ...(metadata?.tool_choice && + !this.options.openAiOmitToolChoice && { tool_choice: metadata.tool_choice }), ...(metadata?.toolProtocol === "native" && metadata.parallelToolCalls === true && { parallel_tool_calls: true, diff --git a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx index 4eea6f09f1b..393df0e536b 100644 --- a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx +++ b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx @@ -173,6 +173,16 @@ export const OpenAICompatible = ({ onChange={handleInputChange("openAiUseAzure", noTransform)}> {t("settings:modelInfo.useAzure")} +
+ + {t("settings:modelInfo.omitToolChoice")} + +
+ {t("settings:modelInfo.omitToolChoiceDescription")} +
+