From 41000c029a3d1d9b79661cbcac95efe23d375c29 Mon Sep 17 00:00:00 2001 From: Ahmed Tammaa Date: Sun, 13 Jul 2025 01:52:06 +0300 Subject: [PATCH] fix: update tool_choice logic for Azure-hosted models Modified the tool_choice assignment in BaseChatOpenAI to set a default value based on the API base URL. If the base URL indicates an Azure-hosted model, the tool_choice is set to "required"; otherwise, it defaults to the tool name. This change enhances compatibility with Azure deployments. --- .../openai/langchain_openai/chat_models/base.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index b5dea2b0f87..fdc5327218e 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -1870,11 +1870,22 @@ class BaseChatOpenAI(BaseChatModel): "schema must be specified when method is not 'json_mode'. " "Received None." ) + tool_name = convert_to_openai_tool(schema)["function"]["name"] + base_url = ( + getattr(self, "openai_api_base", "") or getattr(self, "api_base", "") or "" + ).lower() + # The Azure-Hosted Models routes to this function + # so we need to set the tool_choice to required + if "azure.com" in base_url: + tool_choice_default = "required" + else: + tool_choice_default = tool_name + bind_kwargs = self._filter_disabled_params( **{ **dict( - tool_choice=tool_name, + tool_choice=tool_choice_default, parallel_tool_calls=False, strict=strict, ls_structured_output_format={