diff --git a/libs/core/langchain_core/messages/base.py b/libs/core/langchain_core/messages/base.py index 1c2f97a139..dd9d81a57a 100644 --- a/libs/core/langchain_core/messages/base.py +++ b/libs/core/langchain_core/messages/base.py @@ -71,7 +71,17 @@ class BaseMessageChunk(BaseMessage): def _merge_kwargs_dict( self, left: Dict[str, Any], right: Dict[str, Any] ) -> Dict[str, Any]: - """Merge additional_kwargs from another BaseMessageChunk into this one.""" + """Merge additional_kwargs from another BaseMessageChunk into this one, + handling specific scenarios where a key exists in both dictionaries + but has a value of None in 'left'. In such cases, the method uses the + value from 'right' for that key in the merged dictionary. + Example: + If left = {"function_call": {"arguments": None}} and + right = {"function_call": {"arguments": "{\n"}} + then, after merging, for the key "function_call", + the value from 'right' is used, + resulting in merged = {"function_call": {"arguments": "{\n"}}. + """ merged = left.copy() for k, v in right.items(): if k not in merged: diff --git a/libs/core/tests/unit_tests/test_messages.py b/libs/core/tests/unit_tests/test_messages.py index cac2f5d232..bcb8bc88ce 100644 --- a/libs/core/tests/unit_tests/test_messages.py +++ b/libs/core/tests/unit_tests/test_messages.py @@ -42,6 +42,9 @@ def test_message_chunks() -> None: AIMessageChunk( content="", additional_kwargs={"function_call": {"name": "web_search"}} ) + + AIMessageChunk( + content="", additional_kwargs={"function_call": {"arguments": None}} + ) + AIMessageChunk( content="", additional_kwargs={"function_call": {"arguments": "{\n"}} )