Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -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",
]
Expand Down
4 changes: 1 addition & 3 deletions src/uipath/dev/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
49 changes: 17 additions & 32 deletions src/uipath/dev/models/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
UiPathConversationContentPartEndEvent,
UiPathConversationContentPartEvent,
UiPathConversationContentPartStartEvent,
UiPathConversationEvent,
UiPathConversationExchangeEvent,
UiPathConversationMessage,
UiPathConversationMessageEndEvent,
UiPathConversationMessageEvent,
Expand All @@ -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(
(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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())
Expand All @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions src/uipath/dev/models/execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
4 changes: 2 additions & 2 deletions src/uipath/dev/models/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -59,7 +59,7 @@ class ChatMessage(Message):

def __init__(
self,
event: UiPathConversationEvent | None,
event: UiPathConversationMessageEvent | None,
message: UiPathConversationMessage | None,
run_id: str,
):
Expand Down
7 changes: 1 addition & 6 deletions src/uipath/dev/ui/panels/chat_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
18 changes: 9 additions & 9 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.