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