From 918e0ddb4ebd4535ad153f22663ae5df819a8701 Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:30:02 -0400 Subject: [PATCH 1/7] fix: revert deferred tool call --- pyproject.toml | 2 +- src/uipath_langchain/runtime/messages.py | 14 ++-- src/uipath_langchain/runtime/runtime.py | 16 ----- tests/runtime/test_chat_message_mapper.py | 87 ++++------------------- uv.lock | 2 +- 5 files changed, 19 insertions(+), 102 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b4668e08b..fc5ca1893 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "uipath-langchain" -version = "0.8.25" +version = "0.8.26" description = "Python SDK that enables developers to build and deploy LangGraph agents to the UiPath Cloud Platform" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.11" diff --git a/src/uipath_langchain/runtime/messages.py b/src/uipath_langchain/runtime/messages.py index 43aba1626..53e6f77be 100644 --- a/src/uipath_langchain/runtime/messages.py +++ b/src/uipath_langchain/runtime/messages.py @@ -58,7 +58,6 @@ def __init__(self, runtime_id: str, storage: UiPathRuntimeStorageProtocol | None """Initialize the mapper with empty state.""" self.runtime_id = runtime_id self.storage = storage - self.tool_names_requiring_confirmation: set[str] = set() self.current_message: AIMessageChunk self.seen_message_ids: set[str] = set() self._storage_lock = asyncio.Lock() @@ -391,16 +390,11 @@ async def map_current_message_to_start_tool_call_events(self): self.current_message.id ) - # if tool requires confirmation, we skip start tool call - if ( - tool_call["name"] - not in self.tool_names_requiring_confirmation - ): - events.append( - self.map_tool_call_to_tool_call_start_event( - self.current_message.id, tool_call - ) + events.append( + self.map_tool_call_to_tool_call_start_event( + self.current_message.id, tool_call ) + ) if self.storage is not None: await self.storage.set_value( diff --git a/src/uipath_langchain/runtime/runtime.py b/src/uipath_langchain/runtime/runtime.py index feb327018..228a5cdb9 100644 --- a/src/uipath_langchain/runtime/runtime.py +++ b/src/uipath_langchain/runtime/runtime.py @@ -29,7 +29,6 @@ ) from uipath.runtime.schema import UiPathRuntimeSchema -from uipath_langchain.chat.hitl import REQUIRE_CONVERSATIONAL_CONFIRMATION from uipath_langchain.runtime.errors import LangGraphErrorCode, LangGraphRuntimeError from uipath_langchain.runtime.messages import UiPathChatMessagesMapper from uipath_langchain.runtime.schema import get_entrypoints_schema, get_graph_schema @@ -65,9 +64,6 @@ def __init__( self.entrypoint: str | None = entrypoint self.callbacks: list[BaseCallbackHandler] = callbacks or [] self.chat = UiPathChatMessagesMapper(self.runtime_id, storage) - self.chat.tool_names_requiring_confirmation = ( - self._get_tool_names_requiring_confirmation() - ) self._middleware_node_names: set[str] = self._detect_middleware_nodes() async def execute( @@ -490,18 +486,6 @@ def _detect_middleware_nodes(self) -> set[str]: return middleware_nodes - def _get_tool_names_requiring_confirmation(self) -> set[str]: - names: set[str] = set() - for node_name, node_spec in self.graph.nodes.items(): - # langgraph's processing node.bound -> runnable.tool -> baseTool (if tool node) - tool = getattr(getattr(node_spec, "bound", None), "tool", None) - if tool is None: - continue - metadata = getattr(tool, "metadata", None) or {} - if metadata.get(REQUIRE_CONVERSATIONAL_CONFIRMATION): - names.add(getattr(tool, "name", node_name)) - return names - def _is_middleware_node(self, node_name: str) -> bool: """Check if a node name represents a middleware node.""" return node_name in self._middleware_node_names diff --git a/tests/runtime/test_chat_message_mapper.py b/tests/runtime/test_chat_message_mapper.py index 35db6a912..82688c375 100644 --- a/tests/runtime/test_chat_message_mapper.py +++ b/tests/runtime/test_chat_message_mapper.py @@ -1720,18 +1720,20 @@ def test_ai_message_with_media_citation(self): assert source.page_number == "3" -class TestConfirmationToolDeferral: - """Tests for deferring startToolCall events for confirmation tools.""" +class TestConfirmationToolStartAlwaysEmitted: + """startToolCall is always emitted, even for confirmation tools. + + The client-side state machine handles suppressing the tool call UI + when a ToolCallConfirmation interrupt follows. + """ @pytest.mark.asyncio - async def test_start_tool_call_skipped_for_confirmation_tool(self): - """AIMessageChunk with confirmation tool should NOT emit startToolCall.""" + async def test_start_tool_call_emitted_for_confirmation_tool(self): + """AIMessageChunk with confirmation tool should still emit startToolCall.""" storage = create_mock_storage() storage.get_value.return_value = {} mapper = UiPathChatMessagesMapper("test-runtime", storage) - mapper.tool_names_requiring_confirmation = {"confirm_tool"} - # First chunk starts the message with a confirmation tool call first_chunk = AIMessageChunk( content="", id="msg-1", @@ -1739,7 +1741,6 @@ async def test_start_tool_call_skipped_for_confirmation_tool(self): ) await mapper.map_event(first_chunk) - # Last chunk triggers tool call start events last_chunk = AIMessageChunk(content="", id="msg-1") object.__setattr__(last_chunk, "chunk_position", "last") result = await mapper.map_event(last_chunk) @@ -1750,76 +1751,15 @@ async def test_start_tool_call_skipped_for_confirmation_tool(self): for e in result if e.tool_call is not None and e.tool_call.start is not None ] - assert len(tool_start_events) == 0 - - @pytest.mark.asyncio - async def test_start_tool_call_emitted_for_non_confirmation_tool(self): - """Normal tools still emit startToolCall even when confirmation set is populated.""" - storage = create_mock_storage() - storage.get_value.return_value = {} - mapper = UiPathChatMessagesMapper("test-runtime", storage) - mapper.tool_names_requiring_confirmation = {"other_tool"} - - first_chunk = AIMessageChunk( - content="", - id="msg-2", - tool_calls=[{"id": "tc-2", "name": "normal_tool", "args": {}}], - ) - await mapper.map_event(first_chunk) - - last_chunk = AIMessageChunk(content="", id="msg-2") - object.__setattr__(last_chunk, "chunk_position", "last") - result = await mapper.map_event(last_chunk) - - assert result is not None - tool_start_events = [ - e - for e in result - if e.tool_call is not None and e.tool_call.start is not None - ] - assert len(tool_start_events) >= 1 - assert tool_start_events[0].tool_call is not None - assert tool_start_events[0].tool_call.start is not None - assert tool_start_events[0].tool_call.start.tool_name == "normal_tool" - - @pytest.mark.asyncio - async def test_confirmation_tool_message_emits_only_end(self): - """ToolMessage for a confirmation tool should only emit endToolCall + messageEnd. - - startToolCall is now emitted by the bridge on HITL approval, not here. - """ - storage = create_mock_storage() - storage.get_value.return_value = {"tc-3": "msg-3"} - mapper = UiPathChatMessagesMapper("test-runtime", storage) - mapper.tool_names_requiring_confirmation = {"confirm_tool"} - - tool_msg = ToolMessage( - content='{"result": "ok"}', - tool_call_id="tc-3", - name="confirm_tool", - ) - - result = await mapper.map_event(tool_msg) - - assert result is not None - # Should have: endToolCall, messageEnd (no startToolCall) - assert len(result) == 2 - - # First event: endToolCall - end_event = result[0] - assert end_event.tool_call is not None - assert end_event.tool_call.end is not None - - # Second event: messageEnd - assert result[1].end is not None + assert len(tool_start_events) == 1 + assert tool_start_events[0].tool_call.start.tool_name == "confirm_tool" @pytest.mark.asyncio - async def test_mixed_tools_only_confirmation_deferred(self): - """Mixed tools in one AIMessage: only confirmation tool's startToolCall is deferred.""" + async def test_mixed_tools_all_emit_start_tool_call(self): + """All tools in one AIMessage emit startToolCall, including confirmation tools.""" storage = create_mock_storage() storage.get_value.return_value = {} mapper = UiPathChatMessagesMapper("test-runtime", storage) - mapper.tool_names_requiring_confirmation = {"confirm_tool"} first_chunk = AIMessageChunk( content="", @@ -1841,6 +1781,5 @@ async def test_mixed_tools_only_confirmation_deferred(self): for e in result if e.tool_call is not None and e.tool_call.start is not None ] - # normal_tool should have startToolCall, confirm_tool should NOT assert "normal_tool" in tool_start_names - assert "confirm_tool" not in tool_start_names + assert "confirm_tool" in tool_start_names diff --git a/uv.lock b/uv.lock index 3665b66c7..0e6d82c19 100644 --- a/uv.lock +++ b/uv.lock @@ -3333,7 +3333,7 @@ wheels = [ [[package]] name = "uipath-langchain" -version = "0.8.25" +version = "0.8.26" source = { editable = "." } dependencies = [ { name = "httpx" }, From 7271dab4c0cb70b514a5567cdedfb93379ec59e3 Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 19:17:54 -0400 Subject: [PATCH 2/7] fix: pass require confirmation into tool metadata --- src/uipath_langchain/runtime/messages.py | 6 ++++++ src/uipath_langchain/runtime/runtime.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/uipath_langchain/runtime/messages.py b/src/uipath_langchain/runtime/messages.py index 53e6f77be..c145789ad 100644 --- a/src/uipath_langchain/runtime/messages.py +++ b/src/uipath_langchain/runtime/messages.py @@ -58,6 +58,7 @@ def __init__(self, runtime_id: str, storage: UiPathRuntimeStorageProtocol | None """Initialize the mapper with empty state.""" self.runtime_id = runtime_id self.storage = storage + self.tool_names_requiring_confirmation: set[str] = set() self.current_message: AIMessageChunk self.seen_message_ids: set[str] = set() self._storage_lock = asyncio.Lock() @@ -493,6 +494,10 @@ async def get_message_id_for_tool_call( def map_tool_call_to_tool_call_start_event( self, message_id: str, tool_call: ToolCall ) -> UiPathConversationMessageEvent: + metadata = None + if tool_call["name"] in self.tool_names_requiring_confirmation: + metadata = {"requiresConfirmation": True} + return UiPathConversationMessageEvent( message_id=message_id, tool_call=UiPathConversationToolCallEvent( @@ -501,6 +506,7 @@ def map_tool_call_to_tool_call_start_event( tool_name=tool_call["name"], timestamp=self.get_timestamp(), input=tool_call["args"], + metadata=metadata, ), ), ) diff --git a/src/uipath_langchain/runtime/runtime.py b/src/uipath_langchain/runtime/runtime.py index 228a5cdb9..5125b9130 100644 --- a/src/uipath_langchain/runtime/runtime.py +++ b/src/uipath_langchain/runtime/runtime.py @@ -29,6 +29,7 @@ ) from uipath.runtime.schema import UiPathRuntimeSchema +from uipath_langchain.chat.hitl import REQUIRE_CONVERSATIONAL_CONFIRMATION from uipath_langchain.runtime.errors import LangGraphErrorCode, LangGraphRuntimeError from uipath_langchain.runtime.messages import UiPathChatMessagesMapper from uipath_langchain.runtime.schema import get_entrypoints_schema, get_graph_schema @@ -64,6 +65,9 @@ def __init__( self.entrypoint: str | None = entrypoint self.callbacks: list[BaseCallbackHandler] = callbacks or [] self.chat = UiPathChatMessagesMapper(self.runtime_id, storage) + self.chat.tool_names_requiring_confirmation = ( + self._get_tool_names_requiring_confirmation() + ) self._middleware_node_names: set[str] = self._detect_middleware_nodes() async def execute( @@ -486,6 +490,17 @@ def _detect_middleware_nodes(self) -> set[str]: return middleware_nodes + def _get_tool_names_requiring_confirmation(self) -> set[str]: + names: set[str] = set() + for node_name, node_spec in self.graph.nodes.items(): + tool = getattr(getattr(node_spec, "bound", None), "tool", None) + if tool is None: + continue + metadata = getattr(tool, "metadata", None) or {} + if metadata.get(REQUIRE_CONVERSATIONAL_CONFIRMATION): + names.add(getattr(tool, "name", node_name)) + return names + def _is_middleware_node(self, node_name: str) -> bool: """Check if a node name represents a middleware node.""" return node_name in self._middleware_node_names From 21b37ceb5377e81559134c3fccba6df174961e18 Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 19:18:37 -0400 Subject: [PATCH 3/7] fix: revert comment --- src/uipath_langchain/runtime/runtime.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/uipath_langchain/runtime/runtime.py b/src/uipath_langchain/runtime/runtime.py index 5125b9130..feb327018 100644 --- a/src/uipath_langchain/runtime/runtime.py +++ b/src/uipath_langchain/runtime/runtime.py @@ -493,6 +493,7 @@ def _detect_middleware_nodes(self) -> set[str]: def _get_tool_names_requiring_confirmation(self) -> set[str]: names: set[str] = set() for node_name, node_spec in self.graph.nodes.items(): + # langgraph's processing node.bound -> runnable.tool -> baseTool (if tool node) tool = getattr(getattr(node_spec, "bound", None), "tool", None) if tool is None: continue From d0bf43be9768267f2b0414f164efff78438cb8e7 Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 19:31:57 -0400 Subject: [PATCH 4/7] fix: tests --- tests/runtime/test_chat_message_mapper.py | 73 +++++++++++++++++------ 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/tests/runtime/test_chat_message_mapper.py b/tests/runtime/test_chat_message_mapper.py index 82688c375..295aee412 100644 --- a/tests/runtime/test_chat_message_mapper.py +++ b/tests/runtime/test_chat_message_mapper.py @@ -1720,19 +1720,16 @@ def test_ai_message_with_media_citation(self): assert source.page_number == "3" -class TestConfirmationToolStartAlwaysEmitted: - """startToolCall is always emitted, even for confirmation tools. - - The client-side state machine handles suppressing the tool call UI - when a ToolCallConfirmation interrupt follows. - """ +class TestConfirmationToolMetadata: + """Confirmation tools emit startToolCall with requiresConfirmation metadata.""" @pytest.mark.asyncio - async def test_start_tool_call_emitted_for_confirmation_tool(self): - """AIMessageChunk with confirmation tool should still emit startToolCall.""" + async def test_confirmation_tool_has_requires_confirmation_metadata(self): + """startToolCall for confirmation tools includes requiresConfirmation in metadata.""" storage = create_mock_storage() storage.get_value.return_value = {} mapper = UiPathChatMessagesMapper("test-runtime", storage) + mapper.tool_names_requiring_confirmation = {"confirm_tool"} first_chunk = AIMessageChunk( content="", @@ -1751,15 +1748,51 @@ async def test_start_tool_call_emitted_for_confirmation_tool(self): for e in result if e.tool_call is not None and e.tool_call.start is not None ] - assert len(tool_start_events) == 1 - assert tool_start_events[0].tool_call.start.tool_name == "confirm_tool" + assert len(tool_start_events) >= 1 + event = tool_start_events[0] + assert event.tool_call is not None + assert event.tool_call.start is not None + assert event.tool_call.start.tool_name == "confirm_tool" + assert event.tool_call.start.metadata == {"requiresConfirmation": True} + + @pytest.mark.asyncio + async def test_normal_tool_has_no_confirmation_metadata(self): + """startToolCall for normal tools has no metadata.""" + storage = create_mock_storage() + storage.get_value.return_value = {} + mapper = UiPathChatMessagesMapper("test-runtime", storage) + mapper.tool_names_requiring_confirmation = {"other_tool"} + + first_chunk = AIMessageChunk( + content="", + id="msg-2", + tool_calls=[{"id": "tc-2", "name": "normal_tool", "args": {}}], + ) + await mapper.map_event(first_chunk) + + last_chunk = AIMessageChunk(content="", id="msg-2") + object.__setattr__(last_chunk, "chunk_position", "last") + result = await mapper.map_event(last_chunk) + + assert result is not None + tool_start_events = [ + e + for e in result + if e.tool_call is not None and e.tool_call.start is not None + ] + assert len(tool_start_events) >= 1 + event = tool_start_events[0] + assert event.tool_call is not None + assert event.tool_call.start is not None + assert event.tool_call.start.metadata is None @pytest.mark.asyncio - async def test_mixed_tools_all_emit_start_tool_call(self): - """All tools in one AIMessage emit startToolCall, including confirmation tools.""" + async def test_mixed_tools_only_confirmation_has_metadata(self): + """In mixed tool calls, only confirmation tools get the metadata flag.""" storage = create_mock_storage() storage.get_value.return_value = {} mapper = UiPathChatMessagesMapper("test-runtime", storage) + mapper.tool_names_requiring_confirmation = {"confirm_tool"} first_chunk = AIMessageChunk( content="", @@ -1776,10 +1809,12 @@ async def test_mixed_tools_all_emit_start_tool_call(self): result = await mapper.map_event(last_chunk) assert result is not None - tool_start_names = [ - e.tool_call.start.tool_name - for e in result - if e.tool_call is not None and e.tool_call.start is not None - ] - assert "normal_tool" in tool_start_names - assert "confirm_tool" in tool_start_names + tool_starts = {} + for e in result: + tc = e.tool_call + if tc is not None and tc.start is not None: + tool_starts[tc.start.tool_name] = tc.start + assert "normal_tool" in tool_starts + assert "confirm_tool" in tool_starts + assert tool_starts["normal_tool"].metadata is None + assert tool_starts["confirm_tool"].metadata == {"requiresConfirmation": True} From ddd3011011aaaf50cfe3b1619e15121c754e8f0b Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 21:23:07 -0400 Subject: [PATCH 5/7] fix: change args modified message --- pyproject.toml | 6 ++ src/uipath_langchain/chat/hitl.py | 3 +- tests/agent/tools/test_tool_node.py | 7 +- tests/chat/test_hitl.py | 3 +- uv.lock | 149 +++++++++++++++++++++++----- 5 files changed, 139 insertions(+), 29 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fc5ca1893..f79e8e881 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,6 +113,12 @@ addopts = "-ra -q" asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" +[tool.uv.sources] +uipath = { path = "../uipath-python/packages/uipath", editable = true } +uipath-core = { path = "../uipath-python/packages/uipath-core", editable = true } +uipath-platform = { path = "../uipath-python/packages/uipath-platform", editable = true } +uipath-runtime = { path = "../uipath-runtime-python", editable = true } + [[tool.uv.index]] name = "testpypi" url = "https://test.pypi.org/simple/" diff --git a/src/uipath_langchain/chat/hitl.py b/src/uipath_langchain/chat/hitl.py index 228d1b365..f70bf98c5 100644 --- a/src/uipath_langchain/chat/hitl.py +++ b/src/uipath_langchain/chat/hitl.py @@ -14,6 +14,7 @@ from uipath_langchain._utils.durable_interrupt import durable_interrupt CANCELLED_MESSAGE = "Cancelled by user" +ARGS_MODIFIED_MESSAGE = "User has modified the tool arguments" CONVERSATIONAL_APPROVED_TOOL_ARGS = "conversational_approved_tool_args" REQUIRE_CONVERSATIONAL_CONFIRMATION = "require_conversational_confirmation" @@ -55,7 +56,7 @@ def annotate_result(self, output: dict[str, Any] | Any) -> None: msg.content = json.dumps( { "meta": { - "args_modified_by_user": True, + "message": ARGS_MODIFIED_MESSAGE, "executed_args": self.approved_args, }, "result": result_value, diff --git a/tests/agent/tools/test_tool_node.py b/tests/agent/tools/test_tool_node.py index 870cedf18..8551c5b07 100644 --- a/tests/agent/tools/test_tool_node.py +++ b/tests/agent/tools/test_tool_node.py @@ -22,6 +22,7 @@ create_tool_node, ) from uipath_langchain.chat.hitl import ( + ARGS_MODIFIED_MESSAGE, CANCELLED_MESSAGE, CONVERSATIONAL_APPROVED_TOOL_ARGS, ) @@ -555,7 +556,7 @@ def test_approved_same_args_no_meta( assert result is not None assert isinstance(result, dict) msg = result["messages"][0] - assert "args_modified_by_user" not in msg.content + assert ARGS_MODIFIED_MESSAGE not in msg.content assert "Mock result:" in msg.content @patch( @@ -576,7 +577,7 @@ def test_approved_modified_args_injects_meta( assert isinstance(msg.content, str) wrapped = json.loads(msg.content) - assert wrapped["meta"]["args_modified_by_user"] is True + assert wrapped["meta"]["message"] == ARGS_MODIFIED_MESSAGE assert wrapped["meta"]["executed_args"] == {"input_text": "edited"} assert "Mock result: edited" in wrapped["result"] @@ -612,7 +613,7 @@ async def test_async_approved_modified_args( assert isinstance(msg.content, str) wrapped = json.loads(msg.content) - assert wrapped["meta"]["args_modified_by_user"] is True + assert wrapped["meta"]["message"] == ARGS_MODIFIED_MESSAGE assert wrapped["meta"]["executed_args"] == {"input_text": "async edited"} assert "Async mock result: async edited" in wrapped["result"] diff --git a/tests/chat/test_hitl.py b/tests/chat/test_hitl.py index 5ef910324..a07f423c8 100644 --- a/tests/chat/test_hitl.py +++ b/tests/chat/test_hitl.py @@ -8,6 +8,7 @@ from langchain_core.tools import BaseTool from uipath_langchain.chat.hitl import ( + ARGS_MODIFIED_MESSAGE, CANCELLED_MESSAGE, CONVERSATIONAL_APPROVED_TOOL_ARGS, ConfirmationResult, @@ -138,7 +139,7 @@ def test_annotate_wraps_content_when_modified(self): assert isinstance(msg.content, str) wrapped = json.loads(msg.content) - assert wrapped["meta"]["args_modified_by_user"] is True + assert wrapped["meta"]["message"] == ARGS_MODIFIED_MESSAGE assert wrapped["meta"]["executed_args"] == {"query": "edited"} assert wrapped["result"] == "result" diff --git a/uv.lock b/uv.lock index 0e6d82c19..19d77b539 100644 --- a/uv.lock +++ b/uv.lock @@ -3289,8 +3289,8 @@ wheels = [ [[package]] name = "uipath" -version = "2.10.13" -source = { registry = "https://pypi.org/simple" } +version = "2.10.17" +source = { editable = "../uipath-python/packages/uipath" } dependencies = [ { name = "applicationinsights" }, { name = "click" }, @@ -3312,23 +3312,89 @@ dependencies = [ { name = "uipath-platform" }, { name = "uipath-runtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/3a/3a93f5c54078b993e6cecdae6069ebafe122fceb639b1f59ad0aa3f1b765/uipath-2.10.13.tar.gz", hash = "sha256:13795c00dfb7391f248efb6ae4b96f096a4a8131d0df5f8ec0b7f265be1d0e10", size = 2456921, upload-time = "2026-03-13T07:51:16.484Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/f9/c8745f866a39047f529ee0413aedd8fbf81f7ffd5dd46862cb5e6221d58d/uipath-2.10.13-py3-none-any.whl", hash = "sha256:fc1c8503b9cc3538cf3003cb10e1e3e736529aba4272086066402fde21154b65", size = 357769, upload-time = "2026-03-13T07:51:14.599Z" }, + +[package.metadata] +requires-dist = [ + { name = "applicationinsights", specifier = ">=0.11.10" }, + { name = "click", specifier = ">=8.3.1" }, + { name = "coverage", specifier = ">=7.8.2" }, + { name = "graphtty", specifier = "==0.1.8" }, + { name = "httpx", specifier = ">=0.28.1" }, + { name = "mermaid-builder", specifier = "==0.0.3" }, + { name = "mockito", specifier = ">=1.5.4" }, + { name = "pathlib", specifier = ">=1.0.1" }, + { name = "pydantic-function-models", specifier = ">=0.1.11" }, + { name = "pyjwt", specifier = ">=2.10.1" }, + { name = "pysignalr", specifier = "==1.3.0" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "python-socketio", specifier = ">=5.15.0,<6.0.0" }, + { name = "rich", specifier = ">=14.2.0" }, + { name = "tenacity", specifier = ">=9.0.0" }, + { name = "truststore", specifier = ">=0.10.1" }, + { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, + { name = "uipath-platform", editable = "../uipath-python/packages/uipath-platform" }, + { name = "uipath-runtime", editable = "../uipath-runtime-python" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "bandit", specifier = ">=1.8.2" }, + { name = "filelock", specifier = ">=3.20.3" }, + { name = "inflection", specifier = ">=0.5.1" }, + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-click", specifier = ">=0.9.0" }, + { name = "mkdocs-llmstxt", specifier = ">=0.5.0" }, + { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.7.0" }, + { name = "mkdocs-open-in-new-tab", specifier = ">=1.0.8" }, + { name = "mkdocs-simple-hooks", specifier = ">=0.1.5" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=0.30.1" }, + { name = "mypy", specifier = ">=1.14.1" }, + { name = "pre-commit", specifier = ">=4.5.1" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", specifier = ">=1.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-httpx", specifier = ">=0.35.0" }, + { name = "pytest-mock", specifier = ">=3.11.1" }, + { name = "pytest-timeout", specifier = ">=2.4.0" }, + { name = "pytest-trio", specifier = ">=0.8.0" }, + { name = "ruff", specifier = ">=0.9.4" }, + { name = "rust-just", specifier = ">=1.39.0" }, + { name = "termynal", specifier = ">=0.13.1" }, + { name = "tomli-w", specifier = ">=1.2.0" }, + { name = "types-toml", specifier = ">=0.10.8" }, + { name = "virtualenv", specifier = ">=20.36.1" }, ] [[package]] name = "uipath-core" -version = "0.5.6" -source = { registry = "https://pypi.org/simple" } +version = "0.5.7" +source = { editable = "../uipath-python/packages/uipath-core" } dependencies = [ { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-sdk" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/8a/d129d33a81865f99d9134391a52f8691f557d95a18a38df4d88917b3e235/uipath_core-0.5.6.tar.gz", hash = "sha256:bebaf2e62111e844739e4f4e4dc47c48bac93b7e6fce6754502a9f4979c41888", size = 112659, upload-time = "2026-03-04T18:04:42.963Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/8f/77ab712518aa2a8485a558a0de245ac425e07fd8b74cfa8951550f0aea63/uipath_core-0.5.6-py3-none-any.whl", hash = "sha256:4a741fc760605165b0541b3abb6ade728bfa386e000ace00054bc43995720e5b", size = 42047, upload-time = "2026-03-04T18:04:41.606Z" }, + +[package.metadata] +requires-dist = [ + { name = "opentelemetry-instrumentation", specifier = ">=0.60b0,<1.0.0" }, + { name = "opentelemetry-sdk", specifier = ">=1.39.0,<2.0.0" }, + { name = "pydantic", specifier = ">=2.12.5,<3.0.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "bandit", specifier = ">=1.8.2" }, + { name = "mypy", specifier = ">=1.14.1" }, + { name = "pre-commit", specifier = ">=4.1.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", specifier = ">=1.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-httpx", specifier = ">=0.35.0" }, + { name = "pytest-mock", specifier = ">=3.11.1" }, + { name = "pytest-trio", specifier = ">=0.8.0" }, + { name = "ruff", specifier = ">=0.9.4" }, + { name = "rust-just", specifier = ">=1.39.0" }, ] [[package]] @@ -3400,10 +3466,10 @@ requires-dist = [ { name = "openinference-instrumentation-langchain", specifier = ">=0.1.56" }, { name = "pydantic-settings", specifier = ">=2.6.0" }, { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "uipath", specifier = ">=2.10.13,<2.11.0" }, - { name = "uipath-core", specifier = ">=0.5.2,<0.6.0" }, - { name = "uipath-platform", specifier = ">=0.0.23,<0.1.0" }, - { name = "uipath-runtime", specifier = ">=0.9.1,<0.10.0" }, + { name = "uipath", editable = "../uipath-python/packages/uipath" }, + { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, + { name = "uipath-platform", editable = "../uipath-python/packages/uipath-platform" }, + { name = "uipath-runtime", editable = "../uipath-runtime-python" }, ] provides-extras = ["vertex", "bedrock"] @@ -3425,8 +3491,8 @@ dev = [ [[package]] name = "uipath-platform" -version = "0.0.23" -source = { registry = "https://pypi.org/simple" } +version = "0.0.25" +source = { editable = "../uipath-python/packages/uipath-platform" } dependencies = [ { name = "httpx" }, { name = "pydantic-function-models" }, @@ -3435,21 +3501,56 @@ dependencies = [ { name = "truststore" }, { name = "uipath-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/c1/f1cfd23d977fc2fec2e880dac42b1fdb78c28fef80008ebf4bd43ca9b12f/uipath_platform-0.0.23.tar.gz", hash = "sha256:a84d9da29865155080efcc837f6c2b2186d480e34fc877dec06f3ec315c1e52c", size = 269669, upload-time = "2026-03-13T07:50:06.953Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/32/167abe3730ab8c0dd89abee6ebea6e1a35e0a1548be620a491a60bc7cc0d/uipath_platform-0.0.23-py3-none-any.whl", hash = "sha256:e2ea4d9341540a5a02baca8e07ba05dfb8947f2d525f8677834f81c735826772", size = 161946, upload-time = "2026-03-13T07:50:04.956Z" }, + +[package.metadata] +requires-dist = [ + { name = "httpx", specifier = ">=0.28.1" }, + { name = "pydantic-function-models", specifier = ">=0.1.11" }, + { name = "sqlparse", specifier = ">=0.5.5" }, + { name = "tenacity", specifier = ">=9.0.0" }, + { name = "truststore", specifier = ">=0.10.1" }, + { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "bandit", specifier = ">=1.8.2" }, + { name = "mypy", specifier = ">=1.19.0" }, + { name = "pre-commit", specifier = ">=4.1.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", specifier = ">=1.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-httpx", specifier = ">=0.35.0" }, + { name = "pytest-mock", specifier = ">=3.11.1" }, + { name = "pytest-trio", specifier = ">=0.8.0" }, + { name = "ruff", specifier = ">=0.9.4" }, + { name = "rust-just", specifier = ">=1.39.0" }, ] [[package]] name = "uipath-runtime" -version = "0.9.3" -source = { registry = "https://pypi.org/simple" } +version = "0.9.4" +source = { editable = "../uipath-runtime-python" } dependencies = [ { name = "uipath-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/eb/774d503e174e17af84eabb9d315683c5616fb0da956f93f99cf79912a6ff/uipath_runtime-0.9.3.tar.gz", hash = "sha256:5010ede13919d6883a6373cd137c06c18de2b6e2e9fa6b65e11f2d255db444e5", size = 139338, upload-time = "2026-03-04T20:49:11.153Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/83/52dc4d5bf534368d753656881306dffeed658e5e7eefcb91fe6c3bd0dfac/uipath_runtime-0.9.3-py3-none-any.whl", hash = "sha256:20aefc8d9b23978032bec67d2057b5457059aaf1ea788a71d218ba8b6816ff98", size = 41766, upload-time = "2026-03-04T20:49:10.005Z" }, + +[package.metadata] +requires-dist = [{ name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }] + +[package.metadata.requires-dev] +dev = [ + { name = "bandit", specifier = ">=1.8.2" }, + { name = "mypy", specifier = ">=1.14.1" }, + { name = "pre-commit", specifier = ">=4.1.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", specifier = ">=1.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-httpx", specifier = ">=0.35.0" }, + { name = "pytest-mock", specifier = ">=3.11.1" }, + { name = "pytest-trio", specifier = ">=0.8.0" }, + { name = "ruff", specifier = ">=0.9.4" }, + { name = "rust-just", specifier = ">=1.39.0" }, ] [[package]] From f10cde74dc1a5796f2bd5dbbb07893684987839c Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Tue, 17 Mar 2026 21:24:18 -0400 Subject: [PATCH 6/7] fix: undo editable commit --- pyproject.toml | 6 -- uv.lock | 149 ++++++++----------------------------------------- 2 files changed, 24 insertions(+), 131 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f79e8e881..fc5ca1893 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -113,12 +113,6 @@ addopts = "-ra -q" asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" -[tool.uv.sources] -uipath = { path = "../uipath-python/packages/uipath", editable = true } -uipath-core = { path = "../uipath-python/packages/uipath-core", editable = true } -uipath-platform = { path = "../uipath-python/packages/uipath-platform", editable = true } -uipath-runtime = { path = "../uipath-runtime-python", editable = true } - [[tool.uv.index]] name = "testpypi" url = "https://test.pypi.org/simple/" diff --git a/uv.lock b/uv.lock index 19d77b539..0e6d82c19 100644 --- a/uv.lock +++ b/uv.lock @@ -3289,8 +3289,8 @@ wheels = [ [[package]] name = "uipath" -version = "2.10.17" -source = { editable = "../uipath-python/packages/uipath" } +version = "2.10.13" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "applicationinsights" }, { name = "click" }, @@ -3312,89 +3312,23 @@ dependencies = [ { name = "uipath-platform" }, { name = "uipath-runtime" }, ] - -[package.metadata] -requires-dist = [ - { name = "applicationinsights", specifier = ">=0.11.10" }, - { name = "click", specifier = ">=8.3.1" }, - { name = "coverage", specifier = ">=7.8.2" }, - { name = "graphtty", specifier = "==0.1.8" }, - { name = "httpx", specifier = ">=0.28.1" }, - { name = "mermaid-builder", specifier = "==0.0.3" }, - { name = "mockito", specifier = ">=1.5.4" }, - { name = "pathlib", specifier = ">=1.0.1" }, - { name = "pydantic-function-models", specifier = ">=0.1.11" }, - { name = "pyjwt", specifier = ">=2.10.1" }, - { name = "pysignalr", specifier = "==1.3.0" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "python-socketio", specifier = ">=5.15.0,<6.0.0" }, - { name = "rich", specifier = ">=14.2.0" }, - { name = "tenacity", specifier = ">=9.0.0" }, - { name = "truststore", specifier = ">=0.10.1" }, - { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, - { name = "uipath-platform", editable = "../uipath-python/packages/uipath-platform" }, - { name = "uipath-runtime", editable = "../uipath-runtime-python" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "bandit", specifier = ">=1.8.2" }, - { name = "filelock", specifier = ">=3.20.3" }, - { name = "inflection", specifier = ">=0.5.1" }, - { name = "mkdocs", specifier = ">=1.6.1" }, - { name = "mkdocs-click", specifier = ">=0.9.0" }, - { name = "mkdocs-llmstxt", specifier = ">=0.5.0" }, - { name = "mkdocs-material", extras = ["imaging"], specifier = ">=9.7.0" }, - { name = "mkdocs-open-in-new-tab", specifier = ">=1.0.8" }, - { name = "mkdocs-simple-hooks", specifier = ">=0.1.5" }, - { name = "mkdocstrings", extras = ["python"], specifier = ">=0.30.1" }, - { name = "mypy", specifier = ">=1.14.1" }, - { name = "pre-commit", specifier = ">=4.5.1" }, - { name = "pytest", specifier = ">=7.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, - { name = "pytest-cov", specifier = ">=4.1.0" }, - { name = "pytest-httpx", specifier = ">=0.35.0" }, - { name = "pytest-mock", specifier = ">=3.11.1" }, - { name = "pytest-timeout", specifier = ">=2.4.0" }, - { name = "pytest-trio", specifier = ">=0.8.0" }, - { name = "ruff", specifier = ">=0.9.4" }, - { name = "rust-just", specifier = ">=1.39.0" }, - { name = "termynal", specifier = ">=0.13.1" }, - { name = "tomli-w", specifier = ">=1.2.0" }, - { name = "types-toml", specifier = ">=0.10.8" }, - { name = "virtualenv", specifier = ">=20.36.1" }, +sdist = { url = "https://files.pythonhosted.org/packages/d4/3a/3a93f5c54078b993e6cecdae6069ebafe122fceb639b1f59ad0aa3f1b765/uipath-2.10.13.tar.gz", hash = "sha256:13795c00dfb7391f248efb6ae4b96f096a4a8131d0df5f8ec0b7f265be1d0e10", size = 2456921, upload-time = "2026-03-13T07:51:16.484Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f9/c8745f866a39047f529ee0413aedd8fbf81f7ffd5dd46862cb5e6221d58d/uipath-2.10.13-py3-none-any.whl", hash = "sha256:fc1c8503b9cc3538cf3003cb10e1e3e736529aba4272086066402fde21154b65", size = 357769, upload-time = "2026-03-13T07:51:14.599Z" }, ] [[package]] name = "uipath-core" -version = "0.5.7" -source = { editable = "../uipath-python/packages/uipath-core" } +version = "0.5.6" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-sdk" }, { name = "pydantic" }, ] - -[package.metadata] -requires-dist = [ - { name = "opentelemetry-instrumentation", specifier = ">=0.60b0,<1.0.0" }, - { name = "opentelemetry-sdk", specifier = ">=1.39.0,<2.0.0" }, - { name = "pydantic", specifier = ">=2.12.5,<3.0.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "bandit", specifier = ">=1.8.2" }, - { name = "mypy", specifier = ">=1.14.1" }, - { name = "pre-commit", specifier = ">=4.1.0" }, - { name = "pytest", specifier = ">=7.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, - { name = "pytest-cov", specifier = ">=4.1.0" }, - { name = "pytest-httpx", specifier = ">=0.35.0" }, - { name = "pytest-mock", specifier = ">=3.11.1" }, - { name = "pytest-trio", specifier = ">=0.8.0" }, - { name = "ruff", specifier = ">=0.9.4" }, - { name = "rust-just", specifier = ">=1.39.0" }, +sdist = { url = "https://files.pythonhosted.org/packages/ea/8a/d129d33a81865f99d9134391a52f8691f557d95a18a38df4d88917b3e235/uipath_core-0.5.6.tar.gz", hash = "sha256:bebaf2e62111e844739e4f4e4dc47c48bac93b7e6fce6754502a9f4979c41888", size = 112659, upload-time = "2026-03-04T18:04:42.963Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/8f/77ab712518aa2a8485a558a0de245ac425e07fd8b74cfa8951550f0aea63/uipath_core-0.5.6-py3-none-any.whl", hash = "sha256:4a741fc760605165b0541b3abb6ade728bfa386e000ace00054bc43995720e5b", size = 42047, upload-time = "2026-03-04T18:04:41.606Z" }, ] [[package]] @@ -3466,10 +3400,10 @@ requires-dist = [ { name = "openinference-instrumentation-langchain", specifier = ">=0.1.56" }, { name = "pydantic-settings", specifier = ">=2.6.0" }, { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "uipath", editable = "../uipath-python/packages/uipath" }, - { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, - { name = "uipath-platform", editable = "../uipath-python/packages/uipath-platform" }, - { name = "uipath-runtime", editable = "../uipath-runtime-python" }, + { name = "uipath", specifier = ">=2.10.13,<2.11.0" }, + { name = "uipath-core", specifier = ">=0.5.2,<0.6.0" }, + { name = "uipath-platform", specifier = ">=0.0.23,<0.1.0" }, + { name = "uipath-runtime", specifier = ">=0.9.1,<0.10.0" }, ] provides-extras = ["vertex", "bedrock"] @@ -3491,8 +3425,8 @@ dev = [ [[package]] name = "uipath-platform" -version = "0.0.25" -source = { editable = "../uipath-python/packages/uipath-platform" } +version = "0.0.23" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "pydantic-function-models" }, @@ -3501,56 +3435,21 @@ dependencies = [ { name = "truststore" }, { name = "uipath-core" }, ] - -[package.metadata] -requires-dist = [ - { name = "httpx", specifier = ">=0.28.1" }, - { name = "pydantic-function-models", specifier = ">=0.1.11" }, - { name = "sqlparse", specifier = ">=0.5.5" }, - { name = "tenacity", specifier = ">=9.0.0" }, - { name = "truststore", specifier = ">=0.10.1" }, - { name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "bandit", specifier = ">=1.8.2" }, - { name = "mypy", specifier = ">=1.19.0" }, - { name = "pre-commit", specifier = ">=4.1.0" }, - { name = "pytest", specifier = ">=7.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, - { name = "pytest-cov", specifier = ">=4.1.0" }, - { name = "pytest-httpx", specifier = ">=0.35.0" }, - { name = "pytest-mock", specifier = ">=3.11.1" }, - { name = "pytest-trio", specifier = ">=0.8.0" }, - { name = "ruff", specifier = ">=0.9.4" }, - { name = "rust-just", specifier = ">=1.39.0" }, +sdist = { url = "https://files.pythonhosted.org/packages/61/c1/f1cfd23d977fc2fec2e880dac42b1fdb78c28fef80008ebf4bd43ca9b12f/uipath_platform-0.0.23.tar.gz", hash = "sha256:a84d9da29865155080efcc837f6c2b2186d480e34fc877dec06f3ec315c1e52c", size = 269669, upload-time = "2026-03-13T07:50:06.953Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/32/167abe3730ab8c0dd89abee6ebea6e1a35e0a1548be620a491a60bc7cc0d/uipath_platform-0.0.23-py3-none-any.whl", hash = "sha256:e2ea4d9341540a5a02baca8e07ba05dfb8947f2d525f8677834f81c735826772", size = 161946, upload-time = "2026-03-13T07:50:04.956Z" }, ] [[package]] name = "uipath-runtime" -version = "0.9.4" -source = { editable = "../uipath-runtime-python" } +version = "0.9.3" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "uipath-core" }, ] - -[package.metadata] -requires-dist = [{ name = "uipath-core", editable = "../uipath-python/packages/uipath-core" }] - -[package.metadata.requires-dev] -dev = [ - { name = "bandit", specifier = ">=1.8.2" }, - { name = "mypy", specifier = ">=1.14.1" }, - { name = "pre-commit", specifier = ">=4.1.0" }, - { name = "pytest", specifier = ">=7.4.0" }, - { name = "pytest-asyncio", specifier = ">=1.0.0" }, - { name = "pytest-cov", specifier = ">=4.1.0" }, - { name = "pytest-httpx", specifier = ">=0.35.0" }, - { name = "pytest-mock", specifier = ">=3.11.1" }, - { name = "pytest-trio", specifier = ">=0.8.0" }, - { name = "ruff", specifier = ">=0.9.4" }, - { name = "rust-just", specifier = ">=1.39.0" }, +sdist = { url = "https://files.pythonhosted.org/packages/68/eb/774d503e174e17af84eabb9d315683c5616fb0da956f93f99cf79912a6ff/uipath_runtime-0.9.3.tar.gz", hash = "sha256:5010ede13919d6883a6373cd137c06c18de2b6e2e9fa6b65e11f2d255db444e5", size = 139338, upload-time = "2026-03-04T20:49:11.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/83/52dc4d5bf534368d753656881306dffeed658e5e7eefcb91fe6c3bd0dfac/uipath_runtime-0.9.3-py3-none-any.whl", hash = "sha256:20aefc8d9b23978032bec67d2057b5457059aaf1ea788a71d218ba8b6816ff98", size = 41766, upload-time = "2026-03-04T20:49:10.005Z" }, ] [[package]] From d7d79ac4a5186dd844bd00c32c76ab22f915e7e1 Mon Sep 17 00:00:00 2001 From: Josh Park <50765702+JoshParkSJ@users.noreply.github.com> Date: Wed, 18 Mar 2026 10:15:31 -0400 Subject: [PATCH 7/7] fix: bump ver --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fc5ca1893..16f5ae19a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "uipath-langchain" -version = "0.8.26" +version = "0.8.27" description = "Python SDK that enables developers to build and deploy LangGraph agents to the UiPath Cloud Platform" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.11" diff --git a/uv.lock b/uv.lock index 0e6d82c19..d4be2e6a6 100644 --- a/uv.lock +++ b/uv.lock @@ -3333,7 +3333,7 @@ wheels = [ [[package]] name = "uipath-langchain" -version = "0.8.26" +version = "0.8.27" source = { editable = "." } dependencies = [ { name = "httpx" },