diff --git a/libs/core/langchain_core/messages/utils.py b/libs/core/langchain_core/messages/utils.py index 2fce9f7dbca..452d59a5d78 100644 --- a/libs/core/langchain_core/messages/utils.py +++ b/libs/core/langchain_core/messages/utils.py @@ -556,6 +556,8 @@ def merge_message_runs( else: last_chunk = _msg_to_chunk(last) curr_chunk = _msg_to_chunk(curr) + if curr_chunk.response_metadata: + curr_chunk.response_metadata.clear() if ( isinstance(last_chunk.content, str) and isinstance(curr_chunk.content, str) diff --git a/libs/core/tests/unit_tests/messages/test_utils.py b/libs/core/tests/unit_tests/messages/test_utils.py index 5941c14831a..9f4a9a4cc6c 100644 --- a/libs/core/tests/unit_tests/messages/test_utils.py +++ b/libs/core/tests/unit_tests/messages/test_utils.py @@ -59,6 +59,24 @@ def test_merge_message_runs_str_without_separator( assert messages == messages_model_copy +def test_merge_message_runs_response_metadata() -> None: + messages = [ + AIMessage("foo", id="1", response_metadata={"input_tokens": 1}), + AIMessage("bar", id="2", response_metadata={"input_tokens": 2}), + ] + expected = [ + AIMessage( + "foo\nbar", + id="1", + response_metadata={"input_tokens": 1}, + ) + ] + actual = merge_message_runs(messages) + assert actual == expected + # Check it's not mutated + assert messages[1].response_metadata == {"input_tokens": 2} + + def test_merge_message_runs_content() -> None: messages = [ AIMessage("foo", id="1"),