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
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ on:

jobs:
commit-lint:
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/commitlint.yml
lint:
uses: ./.github/workflows/lint.yml
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
[project]
name = "uipath-langchain"
version = "0.0.89"
version = "0.0.90"
description = "UiPath Langchain"
readme = { file = "README.md", content-type = "text/markdown" }
requires-python = ">=3.10"
dependencies = [
"uipath>=2.0.7, <2.1.0",
"uipath>=2.0.9, <2.1.0",
"langgraph>=0.2.70",
"langchain-core>=0.3.34",
"langgraph-checkpoint-sqlite>=2.0.3",
Expand Down
12 changes: 7 additions & 5 deletions src/uipath_langchain/_cli/_runtime/_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,12 @@ async def process(self) -> Any:
if not trigger:
return Command(resume=self.context.input_json)

type, key = trigger
type, key, folder_path, folder_key, payload = trigger
logger.debug(f"ResumeTrigger: {type} {key}")
if type == UiPathResumeTriggerType.ACTION.value and key:
action = self.uipath.actions.retrieve(key)
action = await self.uipath.actions.retrieve_async(
key, app_folder_key=folder_key, app_folder_path=folder_path
)
logger.debug(f"Action: {action}")
if action.data is None:
return Command(resume={})
Expand Down Expand Up @@ -95,7 +97,7 @@ async def process(self) -> Any:
return Command(resume=try_convert_to_json_format(job.output_arguments))
return Command(resume=self.context.input_json)

async def _get_latest_trigger(self) -> Optional[tuple[str, str]]:
async def _get_latest_trigger(self) -> Optional[tuple[str, str, str, str, str]]:
"""Fetch the most recent trigger from the database."""
if self.context.memory is None:
return None
Expand All @@ -106,15 +108,15 @@ async def _get_latest_trigger(self) -> Optional[tuple[str, str]]:
self.context.memory.conn.cursor() as cur,
):
await cur.execute(f"""
SELECT type, key
SELECT type, key, folder_path, folder_key, payload
FROM {self.context.resume_triggers_table}
ORDER BY timestamp DESC
LIMIT 1
""")
result = await cur.fetchone()
if result is None:
return None
return cast(tuple[str, str], tuple(result))
return cast(tuple[str, str, str, str, str], tuple(result))
except Exception as e:
raise LangGraphRuntimeError(
"DB_QUERY_FAILED",
Expand Down
33 changes: 31 additions & 2 deletions src/uipath_langchain/_cli/_runtime/_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,9 @@ async def _save_resume_trigger(self) -> None:
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL,
key TEXT,
folder_key TEXT,
folder_path TEXT,
payload TEXT,
timestamp DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'utc'))
)
""")
Expand Down Expand Up @@ -280,6 +283,12 @@ async def _save_resume_trigger(self) -> None:
app_name=self.interrupt_value.app_name
if self.interrupt_value.app_name
else "",
app_folder_path=self.interrupt_value.app_folder_path
if self.interrupt_value.app_folder_path
else "",
app_folder_key=self.interrupt_value.app_folder_key
if self.interrupt_value.app_folder_key
else "",
app_key=self.interrupt_value.app_key
if self.interrupt_value.app_key
else "",
Expand All @@ -295,11 +304,25 @@ async def _save_resume_trigger(self) -> None:
self._resume_trigger = UiPathResumeTrigger(
trigger_type=UiPathResumeTriggerType.ACTION,
item_key=action.key,
payload=self.interrupt_value.model_dump_json(),
folder_path=self.interrupt_value.app_folder_path
if self.interrupt_value.app_folder_path
else None,
folder_key=self.interrupt_value.app_folder_key
if self.interrupt_value.app_folder_key
else None,
)
elif isinstance(self.interrupt_value, WaitAction):
self._resume_trigger = UiPathResumeTrigger(
triggerType=UiPathResumeTriggerType.ACTION,
itemKey=self.interrupt_value.action.key,
payload=self.interrupt_value.model_dump_json(),
folder_path=self.interrupt_value.app_folder_path
if self.interrupt_value.app_folder_path
else None,
folder_key=self.interrupt_value.app_folder_key
if self.interrupt_value.app_folder_key
else None,
)

except Exception as e:
Expand All @@ -324,8 +347,14 @@ async def _save_resume_trigger(self) -> None:
try:
logger.debug(f"ResumeTrigger: {trigger_type} {trigger_key}")
await cur.execute(
f"INSERT INTO {self.context.resume_triggers_table} (type, key) VALUES (?, ?)",
(trigger_type, trigger_key),
f"INSERT INTO {self.context.resume_triggers_table} (type, key, payload, folder_path, folder_key) VALUES (?, ?, ?, ?, ?)",
(
trigger_type,
trigger_key,
self.resume_trigger.payload,
self.resume_trigger.folder_path,
self.resume_trigger.folder_key,
),
)
await self.context.memory.conn.commit()
except Exception as e:
Expand Down
11 changes: 6 additions & 5 deletions uv.lock

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

Loading