diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index d5880cd3b13..c70babc4280 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 param for Azure/LiteLLM compatibility. }) const ollamaSchema = baseProviderSettingsSchema.extend({ diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 9d632fbdf4c..0cc63d68fe6 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -161,7 +161,7 @@ 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 +231,7 @@ 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 +358,7 @@ 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 +394,7 @@ 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..61fac1140f2 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.omitToolChoiceTips")} +
+