mirror of
https://github.com/hwchase17/langchain.git
synced 2025-06-21 06:14:37 +00:00
core[patch]: Treat type as a special field when merging lists (#22750)
Should we even log a warning? At least for Anthropic, it's expected to get e.g. `text_block` followed by `text_delta`. @ccurme @baskaryan @efriis
This commit is contained in:
parent
bae82e966a
commit
bcbb43480c
@ -105,6 +105,9 @@ def merge_content(
|
|||||||
# Add the second content to the last element
|
# Add the second content to the last element
|
||||||
if isinstance(first_content[-1], str):
|
if isinstance(first_content[-1], str):
|
||||||
return first_content[:-1] + [first_content[-1] + second_content]
|
return first_content[:-1] + [first_content[-1] + second_content]
|
||||||
|
# If second content is an empty string, treat as a no-op
|
||||||
|
elif second_content == "":
|
||||||
|
return first_content
|
||||||
else:
|
else:
|
||||||
# Otherwise, add the second content as a new element of the list
|
# Otherwise, add the second content as a new element of the list
|
||||||
return first_content + [second_content]
|
return first_content + [second_content]
|
||||||
|
@ -60,6 +60,10 @@ def merge_lists(left: Optional[List], right: Optional[List]) -> Optional[List]:
|
|||||||
if e_left["index"] == e["index"]
|
if e_left["index"] == e["index"]
|
||||||
]
|
]
|
||||||
if to_merge:
|
if to_merge:
|
||||||
|
# If a top-level "type" has been set for a chunk, it should no
|
||||||
|
# longer be overridden by the "type" field in future chunks.
|
||||||
|
if "type" in merged[to_merge[0]] and "type" in e:
|
||||||
|
e.pop("type")
|
||||||
merged[to_merge[0]] = merge_dicts(merged[to_merge[0]], e)
|
merged[to_merge[0]] = merge_dicts(merged[to_merge[0]], e)
|
||||||
else:
|
else:
|
||||||
merged = merged + [e]
|
merged = merged + [e]
|
||||||
|
@ -203,6 +203,35 @@ def test_complex_ai_message_chunks() -> None:
|
|||||||
)
|
)
|
||||||
), "Concatenating when both content arrays are dicts with separate indexes should not merge" # noqa: E501
|
), "Concatenating when both content arrays are dicts with separate indexes should not merge" # noqa: E501
|
||||||
|
|
||||||
|
assert (
|
||||||
|
AIMessageChunk(content=[{"index": 0, "text": "I am", "type": "text_block"}])
|
||||||
|
+ AIMessageChunk(
|
||||||
|
content=[{"index": 0, "text": " indeed.", "type": "text_block"}]
|
||||||
|
)
|
||||||
|
== AIMessageChunk(
|
||||||
|
content=[{"index": 0, "text": "I am indeed.", "type": "text_block"}]
|
||||||
|
)
|
||||||
|
), "Concatenating when both content arrays are dicts with the same index and type should merge" # noqa: E501
|
||||||
|
|
||||||
|
assert (
|
||||||
|
AIMessageChunk(content=[{"index": 0, "text": "I am", "type": "text_block"}])
|
||||||
|
+ AIMessageChunk(
|
||||||
|
content=[{"index": 0, "text": " indeed.", "type": "text_block_delta"}]
|
||||||
|
)
|
||||||
|
== AIMessageChunk(
|
||||||
|
content=[{"index": 0, "text": "I am indeed.", "type": "text_block"}]
|
||||||
|
)
|
||||||
|
), "Concatenating when both content arrays are dicts with the same index and different types should merge without updating type" # noqa: E501
|
||||||
|
|
||||||
|
assert (
|
||||||
|
AIMessageChunk(content=[{"index": 0, "text": "I am", "type": "text_block"}])
|
||||||
|
+ AIMessageChunk(content="", response_metadata={"extra": "value"})
|
||||||
|
== AIMessageChunk(
|
||||||
|
content=[{"index": 0, "text": "I am", "type": "text_block"}],
|
||||||
|
response_metadata={"extra": "value"},
|
||||||
|
)
|
||||||
|
), "Concatenating when one content is an array and one is an empty string should not add a new item, but should concat other fields" # noqa: E501
|
||||||
|
|
||||||
|
|
||||||
def test_function_message_chunks() -> None:
|
def test_function_message_chunks() -> None:
|
||||||
assert FunctionMessageChunk(
|
assert FunctionMessageChunk(
|
||||||
|
Loading…
Reference in New Issue
Block a user