From d4f2aad929ca55d988e40bd1656564b5c2706b0d Mon Sep 17 00:00:00 2001 From: Chester Curme Date: Tue, 11 Mar 2025 15:08:45 -0400 Subject: [PATCH] ainvoke --- .../langchain_openai/chat_models/base.py | 11 ++++++- .../chat_models/test_base.py | 30 +++++++++++++++++++ 2 files changed, 40 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 57052c37ce4..6d4007e8879 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -1039,7 +1039,16 @@ class BaseChatOpenAI(BaseChatModel): response = raw_response.parse() generation_info = {"headers": dict(raw_response.headers)} else: - response = await self.async_client.create(**payload) + if "tools" in payload and any( + _is_builtin_tool(tool) for tool in payload["tools"] + ): + responses_payload = _transform_payload_for_responses(payload) + response = await self.root_async_client.responses.create( + **responses_payload + ) + return self._create_chat_result_responses(response, generation_info) + else: + response = await self.async_client.create(**payload) return await run_in_executor( None, self._create_chat_result, response, generation_info ) diff --git a/libs/partners/openai/tests/integration_tests/chat_models/test_base.py b/libs/partners/openai/tests/integration_tests/chat_models/test_base.py index 09cae79520b..bfae40ebfd9 100644 --- a/libs/partners/openai/tests/integration_tests/chat_models/test_base.py +++ b/libs/partners/openai/tests/integration_tests/chat_models/test_base.py @@ -1228,3 +1228,33 @@ def test_structured_output_and_tools() -> None: assert len(full.tool_calls) == 1 tool_call = full.tool_calls[0] assert tool_call["name"] == "GenerateUsername" + + +def test_web_search() -> None: + llm = ChatOpenAI(model="gpt-4o") + response = llm.invoke( + "What was a positive news story from today?", + tools=[{"type": "web_search_preview"}], + ) + assert isinstance(response, AIMessage) + assert response.content + assert response.usage_metadata["input_tokens"] > 0 + assert response.usage_metadata["output_tokens"] > 0 + assert response.usage_metadata["total_tokens"] > 0 + assert response.response_metadata["model_name"] + assert response.response_metadata["status"] + + +async def test_web_search_async() -> None: + llm = ChatOpenAI(model="gpt-4o") + response = await llm.ainvoke( + "What was a positive news story from today?", + tools=[{"type": "web_search_preview"}], + ) + assert isinstance(response, AIMessage) + assert response.content + assert response.usage_metadata["input_tokens"] > 0 + assert response.usage_metadata["output_tokens"] > 0 + assert response.usage_metadata["total_tokens"] > 0 + assert response.response_metadata["model_name"] + assert response.response_metadata["status"]