Skip to content

Commit 101b747

Browse files
authored
Merge pull request #35 from UiPath/fix/resumable_trigger
fix: handle resumable result
2 parents 5141fd3 + 4d2c802 commit 101b747

File tree

4 files changed

+22
-17
lines changed

4 files changed

+22
-17
lines changed

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-runtime"
3-
version = "0.0.22"
3+
version = "0.0.23"
44
description = "Runtime abstractions and interfaces for building agents and automation scripts in the UiPath ecosystem"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

src/uipath/runtime/result.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class UiPathRuntimeStatus(str, Enum):
2121
class UiPathRuntimeResult(UiPathRuntimeEvent):
2222
"""Result of an execution with status and optional error information."""
2323

24-
output: dict[str, Any] | BaseModel | None = None
24+
output: dict[str, Any] | BaseModel | str | None = None
2525
status: UiPathRuntimeStatus = UiPathRuntimeStatus.SUCCESSFUL
2626
trigger: UiPathResumeTrigger | None = None
2727
error: UiPathErrorContract | None = None
@@ -32,6 +32,7 @@ class UiPathRuntimeResult(UiPathRuntimeEvent):
3232

3333
def to_dict(self) -> dict[str, Any]:
3434
"""Convert to dictionary format for output."""
35+
output_data: dict[str, Any] | str
3536
if self.output is None:
3637
output_data = {}
3738
elif isinstance(self.output, BaseModel):

src/uipath/runtime/resumable/runtime.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ async def execute(
6868
result = await self.delegate.execute(input, options=options)
6969

7070
# If suspended, create and persist trigger
71-
await self._handle_suspension(result)
72-
73-
return result
71+
return await self._handle_suspension(result)
7472

7573
async def stream(
7674
self,
@@ -90,18 +88,16 @@ async def stream(
9088
if options and options.resume:
9189
input = await self._restore_resume_input(input)
9290

93-
# Stream from delegate
9491
final_result: UiPathRuntimeResult | None = None
9592
async for event in self.delegate.stream(input, options=options):
96-
yield event
97-
98-
# Capture final result
9993
if isinstance(event, UiPathRuntimeResult):
10094
final_result = event
95+
else:
96+
yield event
10197

10298
# If suspended, create and persist trigger
10399
if final_result:
104-
await self._handle_suspension(final_result)
100+
yield await self._handle_suspension(final_result)
105101

106102
async def _restore_resume_input(
107103
self, input: dict[str, Any] | None
@@ -128,27 +124,35 @@ async def _restore_resume_input(
128124

129125
return resume_data
130126

131-
async def _handle_suspension(self, result: UiPathRuntimeResult) -> None:
127+
async def _handle_suspension(
128+
self, result: UiPathRuntimeResult
129+
) -> UiPathRuntimeResult:
132130
"""Create and persist resume trigger if execution was suspended.
133131
134132
Args:
135133
result: The execution result to check for suspension
136134
"""
137135
# Only handle suspensions
138136
if result.status != UiPathRuntimeStatus.SUSPENDED:
139-
return
137+
return result
140138

141139
# Check if trigger already exists in result
142140
if result.trigger:
143141
await self.storage.save_trigger(result.trigger)
144-
return
142+
return result
143+
144+
suspended_result = UiPathRuntimeResult(
145+
status=UiPathRuntimeStatus.SUSPENDED,
146+
)
145147

146148
if result.output:
147-
trigger = await self.trigger_manager.create_trigger(result.output)
149+
suspended_result.trigger = await self.trigger_manager.create_trigger(
150+
result.output
151+
)
148152

149-
result.trigger = trigger
153+
await self.storage.save_trigger(suspended_result.trigger)
150154

151-
await self.storage.save_trigger(trigger)
155+
return suspended_result
152156

153157
async def get_schema(self) -> UiPathRuntimeSchema:
154158
"""Passthrough schema from delegate runtime."""

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)