From 9b4ef2ab34bdb6f2313bef3f8ee25202eb089ef2 Mon Sep 17 00:00:00 2001 From: ccurme Date: Sun, 9 Aug 2026 12:21:09 -0400 Subject: [PATCH] fix(openai): filter invalid tool calls from content (#39366) --- .../langchain_openai/chat_models/_compat.py | 2 +- .../tests/unit_tests/chat_models/test_base.py | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/libs/partners/openai/langchain_openai/chat_models/_compat.py b/libs/partners/openai/langchain_openai/chat_models/_compat.py index cc04a9235f..d64c854ad7 100644 --- a/libs/partners/openai/langchain_openai/chat_models/_compat.py +++ b/libs/partners/openai/langchain_openai/chat_models/_compat.py @@ -165,7 +165,7 @@ def _convert_from_v1_to_chat_completions(message: AIMessage) -> AIMessage: if block_type == "text": # Strip annotations new_content.append({"type": "text", "text": block["text"]}) - elif block_type in ("reasoning", "tool_call"): + elif block_type in ("reasoning", "tool_call", "invalid_tool_call"): pass else: new_content.append(block) diff --git a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py index 5c54c458e6..3cc4474ccc 100644 --- a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py +++ b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py @@ -3643,6 +3643,13 @@ def test_compat_responses_v03_apply_patch_tool_outputs() -> None: "name": "get_weather", "args": {"location": "San Francisco"}, }, + { + "type": "invalid_tool_call", + "id": "call_234", + "name": "get_weather", + "args": '{"location":', + "error": "Failed to parse tool call arguments as JSON", + }, { "type": "text", "text": "Hello, world!", @@ -3653,11 +3660,29 @@ def test_compat_responses_v03_apply_patch_tool_outputs() -> None: ], id="chatcmpl-123", response_metadata={"model_provider": "openai", "model_name": "gpt-4.1"}, + invalid_tool_calls=[ + InvalidToolCall( + id="call_234", + name="get_weather", + args='{"location":', + error="Failed to parse tool call arguments as JSON", + type="invalid_tool_call", + ) + ], ), AIMessage( [{"type": "text", "text": "Hello, world!"}], id="chatcmpl-123", response_metadata={"model_provider": "openai", "model_name": "gpt-4.1"}, + invalid_tool_calls=[ + InvalidToolCall( + id="call_234", + name="get_weather", + args='{"location":', + error="Failed to parse tool call arguments as JSON", + type="invalid_tool_call", + ) + ], ), ) ], @@ -3668,6 +3693,7 @@ def test_convert_from_v1_to_chat_completions( result = _convert_from_v1_to_chat_completions(message_v1) assert result == expected assert result.tool_calls == message_v1.tool_calls # tool calls remain cached + assert result.invalid_tool_calls == message_v1.invalid_tool_calls # Check no mutation assert message_v1 != result