Skip to content

Commit 6335f72

Browse files
authored
fix: close content part before tool calls to prevent no-start-event error (#786)
1 parent f7c6fe8 commit 6335f72

4 files changed

Lines changed: 24 additions & 7 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-langchain"
3-
version = "0.9.32"
3+
version = "0.9.33"
44
description = "Python SDK that enables developers to build and deploy LangGraph agents to the UiPath Cloud Platform"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

src/uipath_langchain/runtime/messages.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ async def map_ai_message_chunk_to_events(
355355
events.append(self._chunk_to_message_event(message.id, chunk))
356356
self._citation_stream_processor = CitationStreamProcessor()
357357

358+
events.append(self.map_to_content_part_end_event(message.id))
358359
if (
359360
self.current_message.tool_calls is not None
360361
and len(self.current_message.tool_calls) > 0
@@ -389,6 +390,7 @@ async def map_ai_message_to_events(
389390
events.append(self._chunk_to_message_event(message.id, chunk))
390391
self._citation_stream_processor = CitationStreamProcessor()
391392

393+
events.append(self.map_to_content_part_end_event(message.id))
392394
if message.tool_calls:
393395
events.extend(await self.map_current_message_to_start_tool_call_events())
394396
else:
@@ -578,6 +580,13 @@ def map_to_message_end_event(
578580
return UiPathConversationMessageEvent(
579581
message_id=message_id,
580582
end=UiPathConversationMessageEndEvent(),
583+
)
584+
585+
def map_to_content_part_end_event(
586+
self, message_id: str
587+
) -> UiPathConversationMessageEvent:
588+
return UiPathConversationMessageEvent(
589+
message_id=message_id,
581590
content_part=UiPathConversationContentPartEvent(
582591
content_part_id=self.get_content_part_id(message_id),
583592
end=UiPathConversationContentPartEndEvent(),

tests/runtime/test_chat_message_mapper.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,11 +1136,15 @@ async def test_map_event_emits_end_event_for_last_chunk_without_tool_calls(self)
11361136
result = await mapper.map_event(last_chunk)
11371137

11381138
assert result is not None
1139-
# Should have the end event
1139+
# Should have content part end event followed by message end event
1140+
content_part_end_event = result[-2]
1141+
assert content_part_end_event.content_part is not None
1142+
assert content_part_end_event.content_part.end is not None
1143+
assert content_part_end_event.end is None
1144+
11401145
end_event = result[-1]
11411146
assert end_event.end is not None
1142-
assert end_event.content_part is not None
1143-
assert end_event.content_part.end is not None
1147+
assert end_event.content_part is None
11441148

11451149
@pytest.mark.asyncio
11461150
async def test_map_event_emits_tool_call_start_events_on_last_chunk(self):
@@ -1771,10 +1775,14 @@ async def test_emits_start_and_end_events(self):
17711775
assert start_event.content_part is not None
17721776
assert start_event.content_part.start is not None
17731777

1778+
content_part_end_event = result[-2]
1779+
assert content_part_end_event.content_part is not None
1780+
assert content_part_end_event.content_part.end is not None
1781+
assert content_part_end_event.end is None
1782+
17741783
end_event = result[-1]
17751784
assert end_event.end is not None
1776-
assert end_event.content_part is not None
1777-
assert end_event.content_part.end is not None
1785+
assert end_event.content_part is None
17781786

17791787
@pytest.mark.asyncio
17801788
async def test_emits_content_chunk_for_string_content(self):

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)