diff --git a/pyproject.toml b/pyproject.toml index 2c70ad6..ed7cc77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "uipath-dev" -version = "0.0.10" +version = "0.0.11" description = "UiPath Developer Console" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.11" dependencies = [ - "uipath-core>=0.0.6, <0.1.0", - "uipath-runtime>=0.1.2, <0.2.0", + "uipath-core>=0.0.9, <0.1.0", + "uipath-runtime>=0.1.3, <0.2.0", "textual>=6.7.1, <7.0.0", "pyperclip>=1.11.0, <2.0.0", ] diff --git a/src/uipath/dev/__init__.py b/src/uipath/dev/__init__.py index e1ffbcf..9c9a9fb 100644 --- a/src/uipath/dev/__init__.py +++ b/src/uipath/dev/__init__.py @@ -148,9 +148,7 @@ async def handle_chat_input(self, event: Input.Submitted) -> None: details_panel.current_run.resume_data = {"value": user_text} else: msg = get_user_message(user_text) - msg_ev = get_user_message_event( - user_text, conversation_id=details_panel.current_run.id - ) + msg_ev = get_user_message_event(user_text) self._on_chat_for_ui( ChatMessage( diff --git a/src/uipath/dev/models/chat.py b/src/uipath/dev/models/chat.py index 35a4ec0..6ddf155 100644 --- a/src/uipath/dev/models/chat.py +++ b/src/uipath/dev/models/chat.py @@ -9,8 +9,6 @@ UiPathConversationContentPartEndEvent, UiPathConversationContentPartEvent, UiPathConversationContentPartStartEvent, - UiPathConversationEvent, - UiPathConversationExchangeEvent, UiPathConversationMessage, UiPathConversationMessageEndEvent, UiPathConversationMessageEvent, @@ -30,28 +28,26 @@ def __init__(self) -> None: """Initialize the chat events aggregator.""" self.messages = {} - def add(self, event: UiPathConversationEvent) -> UiPathConversationMessage | None: + def add( + self, event: UiPathConversationMessageEvent + ) -> UiPathConversationMessage | None: """Process an incoming conversation-level event and return the current message snapshot if applicable.""" - if not event.exchange or not event.exchange.message: - return None - - ev = event.exchange.message - msg = self.messages.get(ev.message_id) + msg = self.messages.get(event.message_id) if not msg: msg = UiPathConversationMessage( - message_id=ev.message_id, - role=self.get_role(ev), + message_id=event.message_id, + role=self.get_role(event), content_parts=[], tool_calls=[], - created_at=self.get_timestamp(ev), - updated_at=self.get_timestamp(ev), + created_at=self.get_timestamp(event), + updated_at=self.get_timestamp(event), ) - self.messages[ev.message_id] = msg + self.messages[event.message_id] = msg # --- Handle content parts (text, JSON, etc.) --- - if ev.content_part: - cp_event = ev.content_part + if event.content_part: + cp_event = event.content_part existing = next( ( @@ -100,8 +96,8 @@ def add(self, event: UiPathConversationEvent) -> UiPathConversationMessage | Non existing.is_incomplete = bool(cp_event.end.interrupted) # --- Handle tool calls --- - if ev.tool_call: - tc_event = ev.tool_call + if event.tool_call: + tc_event = event.tool_call existing_tool_call = next( ( tc @@ -152,7 +148,7 @@ def add(self, event: UiPathConversationEvent) -> UiPathConversationMessage | Non cancelled=tc_event.end.cancelled, ) - msg.updated_at = self.get_timestamp(ev) + msg.updated_at = self.get_timestamp(event) return msg @@ -187,8 +183,8 @@ def get_user_message(user_text: str) -> UiPathConversationMessage: def get_user_message_event( - user_text: str, conversation_id: str, role: str = "user" -) -> UiPathConversationEvent: + user_text: str, role: str = "user" +) -> UiPathConversationMessageEvent: """Build a conversation event representing a user message from text input.""" message_id = str(uuid4()) content_part_id = str(uuid4()) @@ -210,24 +206,13 @@ def get_user_message_event( end=cp_end, ) - msg_event = UiPathConversationMessageEvent( + return UiPathConversationMessageEvent( message_id=message_id, start=msg_start, content_part=content_event, end=UiPathConversationMessageEndEvent(), ) - exchange_event = UiPathConversationExchangeEvent( - exchange_id=str(uuid4()), - message=msg_event, - ) - - conversation_event = UiPathConversationEvent( - exchange=exchange_event, conversation_id=conversation_id - ) - - return conversation_event - __all__ = [ "ChatEvents", diff --git a/src/uipath/dev/models/execution.py b/src/uipath/dev/models/execution.py index 5293bd6..4e99702 100644 --- a/src/uipath/dev/models/execution.py +++ b/src/uipath/dev/models/execution.py @@ -7,7 +7,7 @@ from uuid import uuid4 from rich.text import Text -from uipath.core.chat import UiPathConversationEvent, UiPathConversationMessage +from uipath.core.chat import UiPathConversationMessage, UiPathConversationMessageEvent from uipath.runtime.errors import UiPathErrorContract from uipath.dev.models.chat import ChatEvents @@ -98,4 +98,4 @@ def messages(self) -> list[UiPathConversationMessage]: def add_event(self, event: Any) -> UiPathConversationMessage | None: """Add a conversation event to the run's chat aggregator.""" - return self.chat_events.add(cast(UiPathConversationEvent, event)) + return self.chat_events.add(cast(UiPathConversationMessageEvent, event)) diff --git a/src/uipath/dev/models/messages.py b/src/uipath/dev/models/messages.py index ef02347..8564c81 100644 --- a/src/uipath/dev/models/messages.py +++ b/src/uipath/dev/models/messages.py @@ -5,7 +5,7 @@ from rich.console import RenderableType from textual.message import Message -from uipath.core.chat import UiPathConversationEvent, UiPathConversationMessage +from uipath.core.chat import UiPathConversationMessage, UiPathConversationMessageEvent class LogMessage(Message): @@ -59,7 +59,7 @@ class ChatMessage(Message): def __init__( self, - event: UiPathConversationEvent | None, + event: UiPathConversationMessageEvent | None, message: UiPathConversationMessage | None, run_id: str, ): diff --git a/src/uipath/dev/ui/panels/chat_panel.py b/src/uipath/dev/ui/panels/chat_panel.py index d3b7966..7d52aef 100644 --- a/src/uipath/dev/ui/panels/chat_panel.py +++ b/src/uipath/dev/ui/panels/chat_panel.py @@ -155,12 +155,7 @@ def add_chat_message( def should_update() -> bool: event = chat_msg.event - finished = ( - event - and event.exchange - and event.exchange.message - and event.exchange.message.end is not None - ) + finished = event and event.end is not None if finished: # Always paint the final state immediately. diff --git a/uv.lock b/uv.lock index 9ea3232..f9d542f 100644 --- a/uv.lock +++ b/uv.lock @@ -988,21 +988,21 @@ wheels = [ [[package]] name = "uipath-core" -version = "0.0.6" +version = "0.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-sdk" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/79/b7be77e8dda5e5f74b353ed42e5e3fdea37e40f43bb5b06c11b4e9ea2a48/uipath_core-0.0.6.tar.gz", hash = "sha256:a097307b2101d49b1cb554d5808b6ca573640d6a0fe2bada971eb4ff860a648d", size = 81867, upload-time = "2025-12-02T09:30:56.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/fa/d3b2f0ce3c81c051654431a9d05980b6308305bac23c6be2b59e395c1b16/uipath_core-0.0.9.tar.gz", hash = "sha256:362e3d649dc1f650d23d97da7f0afcd396a6a48f30abea9c956b6912198defef", size = 82156, upload-time = "2025-12-03T14:20:58.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/4d/796f6ed63ba64c3b38e6763446c0c8ae9896ef443318a4d554a5dfcf447c/uipath_core-0.0.6-py3-none-any.whl", hash = "sha256:5bdd42b752659779774998ceffaf2672365d40dc8e4290a77cfd50f4e3504113", size = 21392, upload-time = "2025-12-02T09:30:54.899Z" }, + { url = "https://files.pythonhosted.org/packages/c5/ea/0ba722d6c05d1821586e43126a2049184dcb6406d6bfdbcbd002447f2753/uipath_core-0.0.9-py3-none-any.whl", hash = "sha256:0f4770ea3b69025edc76e85697afb6ff0d9bf657b47d71d845ba6c38c12385ae", size = 22151, upload-time = "2025-12-03T14:20:57.473Z" }, ] [[package]] name = "uipath-dev" -version = "0.0.10" +version = "0.0.11" source = { editable = "." } dependencies = [ { name = "pyperclip" }, @@ -1030,8 +1030,8 @@ dev = [ requires-dist = [ { name = "pyperclip", specifier = ">=1.11.0,<2.0.0" }, { name = "textual", specifier = ">=6.7.1,<7.0.0" }, - { name = "uipath-core", specifier = ">=0.0.6,<0.1.0" }, - { name = "uipath-runtime", specifier = ">=0.1.2,<0.2.0" }, + { name = "uipath-core", specifier = ">=0.0.9,<0.1.0" }, + { name = "uipath-runtime", specifier = ">=0.1.3,<0.2.0" }, ] [package.metadata.requires-dev] @@ -1051,14 +1051,14 @@ dev = [ [[package]] name = "uipath-runtime" -version = "0.1.2" +version = "0.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "uipath-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/620a024de7ea2797c441e7b4b45c7e4f596ecf207bc574ed2c35dceca562/uipath_runtime-0.1.2.tar.gz", hash = "sha256:ab322be3d25eb27eb5112837fc29fbe49d98c6cd71de297b8e0f3218fac1cf7d", size = 88027, upload-time = "2025-12-01T07:32:06.299Z" } +sdist = { url = "https://files.pythonhosted.org/packages/80/0d/1e56dadb0274cf83c22d04a7ca59df236d3f7c9e3b76263c9c9e53c1b12d/uipath_runtime-0.1.3.tar.gz", hash = "sha256:5fe3e49eccbc2d5fc0f3587c838b576e2d3602dae79b397dfa75ebbbc5e87594", size = 88203, upload-time = "2025-12-03T14:44:02.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/ef/7f205944f542e66eab981bc0cd02f6b14e08f374c36f10ec90873b376eda/uipath_runtime-0.1.2-py3-none-any.whl", hash = "sha256:9ca7e08cf2b9c1ca32e53c2f293abb5568bfab187a6fe4581a12069feb689124", size = 34268, upload-time = "2025-12-01T07:32:04.806Z" }, + { url = "https://files.pythonhosted.org/packages/27/a0/9a0a6f8c7130223866b1600eb23799b6c3dd50e457d51c6ccb816b9c5ac5/uipath_runtime-0.1.3-py3-none-any.whl", hash = "sha256:2af8d78d85a2d6cba5a1f308f103b3e2f3db68940e0607fc74959320d902bf21", size = 34484, upload-time = "2025-12-03T14:44:01.301Z" }, ] [[package]]