From 100d9d1b319d2828e6c884d8ae813cbeb099dddb Mon Sep 17 00:00:00 2001 From: Mayank Jha Date: Fri, 20 Feb 2026 12:24:01 -0800 Subject: [PATCH 1/2] fix: use resource.name for mockable decorator in process_tool PR #546 changed the @mockable name from resource.name to tool_name.lower(), which breaks tool simulation. The sanitized and lowercased name (e.g. "api_workflow") no longer matches the original name in simulation.json (e.g. "API Workflow"), causing the LLM mocker to skip simulation for process tools. Co-Authored-By: Claude Opus 4.6 --- src/uipath_langchain/agent/tools/process_tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uipath_langchain/agent/tools/process_tool.py b/src/uipath_langchain/agent/tools/process_tool.py index 3d58f2aa..b3923757 100644 --- a/src/uipath_langchain/agent/tools/process_tool.py +++ b/src/uipath_langchain/agent/tools/process_tool.py @@ -44,7 +44,7 @@ async def process_tool_fn(**kwargs: Any): input_arguments = input_model.model_validate(kwargs).model_dump(mode="json") @mockable( - name=tool_name.lower(), + name=resource.name, description=resource.description, input_schema=input_model.model_json_schema(), output_schema=output_model.model_json_schema(), From 092366f34b75410f95d6f94a2c8b2a2468099fdd Mon Sep 17 00:00:00 2001 From: Mayank Jha Date: Fri, 20 Feb 2026 14:15:14 -0800 Subject: [PATCH 2/2] fix: pass kwargs through @mockable-decorated nested functions for simulation --- src/uipath_langchain/agent/tools/escalation_tool.py | 6 +++--- .../agent/tools/internal_tools/batch_transform_tool.py | 4 ++-- .../agent/tools/internal_tools/deeprag_tool.py | 4 ++-- src/uipath_langchain/agent/tools/process_tool.py | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/uipath_langchain/agent/tools/escalation_tool.py b/src/uipath_langchain/agent/tools/escalation_tool.py index a0cd7a39..fbc51b6a 100644 --- a/src/uipath_langchain/agent/tools/escalation_tool.py +++ b/src/uipath_langchain/agent/tools/escalation_tool.py @@ -170,13 +170,13 @@ async def escalation_tool_fn(**kwargs: Any) -> dict[str, Any]: serialized_data = input_model.model_validate(kwargs).model_dump(mode="json") @mockable( - name=tool_name.lower(), + name=resource.name, description=resource.description, input_schema=input_model.model_json_schema(), output_schema=EscalationToolOutput.model_json_schema(), example_calls=channel.properties.example_calls, ) - async def escalate(): + async def escalate(**_tool_kwargs: Any): @durable_interrupt async def create_escalation_task(): client = UiPath() @@ -200,7 +200,7 @@ async def create_escalation_task(): return await create_escalation_task() - result = await escalate() + result = await escalate(**kwargs) if isinstance(result, dict): result = TypeAdapter(EscalationToolOutput).validate_python(result) diff --git a/src/uipath_langchain/agent/tools/internal_tools/batch_transform_tool.py b/src/uipath_langchain/agent/tools/internal_tools/batch_transform_tool.py index 3443b0a0..1bc00fb9 100644 --- a/src/uipath_langchain/agent/tools/internal_tools/batch_transform_tool.py +++ b/src/uipath_langchain/agent/tools/internal_tools/batch_transform_tool.py @@ -116,7 +116,7 @@ async def batch_transform_tool_fn(**kwargs: Any) -> dict[str, Any]: output_schema=output_model.model_json_schema(), example_calls=[], # Examples cannot be provided for internal tools ) - async def invoke_batch_transform(): + async def invoke_batch_transform(**_tool_kwargs: Any): @durable_interrupt async def create_ephemeral_index(): uipath = UiPath() @@ -169,7 +169,7 @@ async def upload_result_attachment(): "MimeType": "text/csv", } - result_attachment = await invoke_batch_transform() + result_attachment = await invoke_batch_transform(**kwargs) return {"result": result_attachment} diff --git a/src/uipath_langchain/agent/tools/internal_tools/deeprag_tool.py b/src/uipath_langchain/agent/tools/internal_tools/deeprag_tool.py index 2e4895e7..16802ca8 100644 --- a/src/uipath_langchain/agent/tools/internal_tools/deeprag_tool.py +++ b/src/uipath_langchain/agent/tools/internal_tools/deeprag_tool.py @@ -101,7 +101,7 @@ async def deeprag_tool_fn(**kwargs: Any) -> dict[str, Any]: output_schema=output_model.model_json_schema(), example_calls=[], # Examples cannot be provided for internal tools ) - async def invoke_deeprag(): + async def invoke_deeprag(**_tool_kwargs: Any): @durable_interrupt async def create_ephemeral_index(): uipath = UiPath() @@ -134,7 +134,7 @@ async def create_deeprag(): return await create_deeprag() - return await invoke_deeprag() + return await invoke_deeprag(**kwargs) # Import here to avoid circular dependency from uipath_langchain.agent.wrappers import get_job_attachment_wrapper diff --git a/src/uipath_langchain/agent/tools/process_tool.py b/src/uipath_langchain/agent/tools/process_tool.py index b3923757..b098fa3b 100644 --- a/src/uipath_langchain/agent/tools/process_tool.py +++ b/src/uipath_langchain/agent/tools/process_tool.py @@ -50,7 +50,7 @@ async def process_tool_fn(**kwargs: Any): output_schema=output_model.model_json_schema(), example_calls=resource.properties.example_calls, ) - async def invoke_process(): + async def invoke_process(**_tool_kwargs: Any): parent_span_id = _span_context.pop("parent_span_id", None) @durable_interrupt @@ -67,7 +67,7 @@ async def start_job(): return await start_job() - return await invoke_process() + return await invoke_process(**kwargs) job_attachment_wrapper = get_job_attachment_wrapper(output_type=output_model)