From 2d4dba0286af8d6fac3010b0cd43c8712e68c8f9 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Tue, 13 Jan 2026 01:37:41 -0500 Subject: [PATCH] fix: omit parallel_tool_calls when not explicitly enabled (COM-406) (#10671) --- .../__tests__/openai-native-tools.spec.ts | 5 +++- src/api/providers/openai.ts | 28 +++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/api/providers/__tests__/openai-native-tools.spec.ts b/src/api/providers/__tests__/openai-native-tools.spec.ts index 7be4814b63..4ce6afd320 100644 --- a/src/api/providers/__tests__/openai-native-tools.spec.ts +++ b/src/api/providers/__tests__/openai-native-tools.spec.ts @@ -71,10 +71,13 @@ describe("OpenAiHandler native tools", () => { function: expect.objectContaining({ name: "test_tool" }), }), ]), - parallel_tool_calls: false, }), expect.anything(), ) + // Verify parallel_tool_calls is NOT included when parallelToolCalls is not explicitly true + // This is required for LiteLLM/Bedrock compatibility (see COM-406) + const callArgs = mockCreate.mock.calls[0][0] + expect(callArgs).not.toHaveProperty("parallel_tool_calls") }) }) diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 43a4fe7ae3..9d632fbdf4 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -162,9 +162,10 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl ...(reasoning && reasoning), ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), - ...(metadata?.toolProtocol === "native" && { - parallel_tool_calls: metadata.parallelToolCalls ?? false, - }), + ...(metadata?.toolProtocol === "native" && + metadata.parallelToolCalls === true && { + parallel_tool_calls: true, + }), } // Add max_tokens if needed @@ -231,9 +232,10 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl : [systemMessage, ...convertToOpenAiMessages(messages)], ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), - ...(metadata?.toolProtocol === "native" && { - parallel_tool_calls: metadata.parallelToolCalls ?? false, - }), + ...(metadata?.toolProtocol === "native" && + metadata.parallelToolCalls === true && { + parallel_tool_calls: true, + }), } // Add max_tokens if needed @@ -357,9 +359,10 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl temperature: undefined, ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), - ...(metadata?.toolProtocol === "native" && { - parallel_tool_calls: metadata.parallelToolCalls ?? false, - }), + ...(metadata?.toolProtocol === "native" && + metadata.parallelToolCalls === true && { + parallel_tool_calls: true, + }), } // O3 family models do not support the deprecated max_tokens parameter @@ -392,9 +395,10 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl temperature: undefined, ...(metadata?.tools && { tools: this.convertToolsForOpenAI(metadata.tools) }), ...(metadata?.tool_choice && { tool_choice: metadata.tool_choice }), - ...(metadata?.toolProtocol === "native" && { - parallel_tool_calls: metadata.parallelToolCalls ?? false, - }), + ...(metadata?.toolProtocol === "native" && + metadata.parallelToolCalls === true && { + parallel_tool_calls: true, + }), } // O3 family models do not support the deprecated max_tokens parameter