From dbc1fbf93172113edc1d28780b220ee27f5e1f50 Mon Sep 17 00:00:00 2001 From: Nishitha M <32355027+imnishitha@users.noreply.github.com> Date: Mon, 10 Aug 2026 17:11:59 +0000 Subject: [PATCH] fix(core): treat status as a last-wins field when merging chunks "status" fields on streamed content blocks (e.g. a Responses API function_call moving from "in_progress" to "completed") are enum-like state, not accumulated text. merge_dicts previously concatenated two string "status" values like any other string, corrupting them into values like "in_progresscompleted" once a provider integration started carrying status across chunks. Co-authored-by: open-swe[bot] --- libs/core/langchain_core/utils/_merge.py | 5 +++++ libs/core/tests/unit_tests/utils/test_utils.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/libs/core/langchain_core/utils/_merge.py b/libs/core/langchain_core/utils/_merge.py index 8ddc797f62..e3539cbdf5 100644 --- a/libs/core/langchain_core/utils/_merge.py +++ b/libs/core/langchain_core/utils/_merge.py @@ -61,6 +61,11 @@ def merge_dicts(left: dict[str, Any], *others: dict[str, Any]) -> dict[str, Any] and merged[right_k] == right_v ): continue + if right_k == "status": + # Enum-like state (e.g. "in_progress" -> "completed") that a + # later chunk overwrites, not accumulated text. + merged[right_k] = right_v + continue merged[right_k] += right_v elif isinstance(merged[right_k], dict): merged[right_k] = merge_dicts(merged[right_k], right_v) diff --git a/libs/core/tests/unit_tests/utils/test_utils.py b/libs/core/tests/unit_tests/utils/test_utils.py index 95c7cf50a0..0c6b9d61ab 100644 --- a/libs/core/tests/unit_tests/utils/test_utils.py +++ b/libs/core/tests/unit_tests/utils/test_utils.py @@ -129,6 +129,11 @@ def test_check_package_version( # Other integer fields should still be summed (e.g., token counts) ({"tokens": 10}, {"tokens": 5}, {"tokens": 15}), ({"count": 1}, {"count": 2}, {"count": 3}), + # 'status' is enum-like state that a later chunk overwrites, not + # accumulated text (e.g. streamed Responses API items going from + # "in_progress" to "completed"). + ({"status": "in_progress"}, {"status": "completed"}, {"status": "completed"}), + ({"status": "completed"}, {"status": "completed"}, {"status": "completed"}), ], ) def test_merge_dicts(