From 767720a3b24ddadc261094f4267c20de4e1a3566 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Tue, 13 Jan 2026 16:42:41 -0800 Subject: [PATCH 1/7] feat: add ecs jit sdk --- .../_context_grounding_service.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index 31cadcc0a..4655538d7 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -1,3 +1,4 @@ +import uuid from pathlib import Path from typing import Annotated, Any, Dict, List, Optional, Tuple, Union @@ -398,6 +399,32 @@ def create_index( return ContextGroundingIndex.model_validate(response.json()) + @resource_override(resource_type="index") + @traced(name="contextgrounding_create_jit_index", run_type="uipath") + def create_jit_index( + self, + usage: str, + attachments: list[uuid.UUID], + folder_key: Optional[str] = None, + folder_path: Optional[str] = None, + ) -> ContextGroundingIndex: + """Create a new context jit grounding index.""" + spec = self._create_jit_spec( + usage, + attachments, + folder_path=folder_path, + folder_key=folder_key, + ) + + response = self.request( + spec.method, + spec.endpoint, + json=spec.json, + headers=spec.headers, + ) + + return ContextGroundingIndex.model_validate(response.json()) + @resource_override(resource_type="index") @traced(name="contextgrounding_create_index", run_type="uipath") async def create_index_async( From 1821101646211930b76a071e661f3fc0cb518ee7 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Thu, 15 Jan 2026 17:13:49 -0800 Subject: [PATCH 2/7] add create ephemeral index --- .../_context_grounding_service.py | 32 ++++--------------- .../platform/resume_triggers/_protocol.py | 23 +++++++++++++ 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index 4655538d7..470682a08 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -292,17 +292,11 @@ def retrieve_by_id( Args: id (str): The unique identifier of the context index. - folder_key (Optional[str]): The key of the folder where the index resides. - folder_path (Optional[str]): The path of the folder where the index resides. Returns: Any: The index information, including its configuration and metadata. """ - spec = self._retrieve_by_id_spec( - id, - folder_key=folder_key, - folder_path=folder_path, - ) + spec = self._retrieve_by_id_spec(id) return self.request( spec.method, @@ -324,17 +318,11 @@ async def retrieve_by_id_async( Args: id (str): The unique identifier of the context index. - folder_key (Optional[str]): The key of the folder where the index resides. - folder_path (Optional[str]): The path of the folder where the index resides. Returns: Any: The index information, including its configuration and metadata. """ - spec = self._retrieve_by_id_spec( - id, - folder_key=folder_key, - folder_path=folder_path, - ) + spec = self._retrieve_by_id_spec(id) response = await self.request_async( spec.method, @@ -400,20 +388,16 @@ def create_index( return ContextGroundingIndex.model_validate(response.json()) @resource_override(resource_type="index") - @traced(name="contextgrounding_create_jit_index", run_type="uipath") - def create_jit_index( + @traced(name="contextgrounding_create_ephemeral_index", run_type="uipath") + def create_ephemeral_index( self, usage: str, attachments: list[uuid.UUID], - folder_key: Optional[str] = None, - folder_path: Optional[str] = None, ) -> ContextGroundingIndex: - """Create a new context jit grounding index.""" - spec = self._create_jit_spec( + """Create a new context ephemeral grounding index.""" + spec = self._create_ephemeral_spec( usage, attachments, - folder_path=folder_path, - folder_key=folder_key, ) response = self.request( @@ -1407,9 +1391,7 @@ def _retrieve_by_id_spec( return RequestSpec( method="GET", endpoint=Endpoint(f"/ecs_/v2/indexes/{id}"), - headers={ - **header_folder(folder_key, None), - }, + headers={}, ) def _delete_by_id_spec( diff --git a/src/uipath/platform/resume_triggers/_protocol.py b/src/uipath/platform/resume_triggers/_protocol.py index b9af806d4..126b74acf 100644 --- a/src/uipath/platform/resume_triggers/_protocol.py +++ b/src/uipath/platform/resume_triggers/_protocol.py @@ -260,7 +260,11 @@ async def read_trigger(self, trigger: UiPathResumeTrigger) -> Any | None: f"Index ingestion '{ephemeral_index.name}' did not finish successfully.", ) +<<<<<<< HEAD trigger_response = ephemeral_index.model_dump() +======= + trigger_response = ephemeral_index +>>>>>>> cf1f8f3 (add create ephemeral index) return trigger_response @@ -390,6 +394,10 @@ async def create_trigger(self, suspend_value: Any) -> UiPathResumeTrigger: await self._handle_ephemeral_index_job_trigger( suspend_value, resume_trigger ) + case UiPathResumeTriggerType.EPHEMERAL_INDEX: + await self._handle_ephemeral_index_job_trigger( + suspend_value, resume_trigger, uipath + ) case UiPathResumeTriggerType.BATCH_RAG: await self._handle_batch_rag_job_trigger( suspend_value, resume_trigger @@ -525,6 +533,7 @@ async def _handle_deep_rag_job_trigger( resume_trigger.item_key = deep_rag.id async def _handle_ephemeral_index_job_trigger( +<<<<<<< HEAD self, value: Any, resume_trigger: UiPathResumeTrigger ) -> None: """Handle ephemeral index. @@ -546,6 +555,20 @@ async def _handle_ephemeral_index_job_trigger( ) if not ephemeral_index: raise Exception("Failed to create ephemeral index") +======= + self, value: Any, resume_trigger: UiPathResumeTrigger, uipath: UiPath + ) -> None: + """Handle ephemeral index""" + if isinstance(value, WaitEphemeralIndex): + resume_trigger.item_key = value.ephemeral_index.id + elif isinstance(value, CreateEphemeralIndex): + ephemeral_index = uipath.context_grounding.create_ephemeral_index( + usage=value.usage, + attachments=value.attachments, + ) + if not ephemeral_index: + raise Exception("Failed to start ephemeral index") +>>>>>>> cf1f8f3 (add create ephemeral index) resume_trigger.item_key = ephemeral_index.id async def _handle_batch_rag_job_trigger( From ad2e9c0fa6292947ab634d83d4b424defd986c80 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Fri, 16 Jan 2026 15:10:47 -0800 Subject: [PATCH 3/7] add tests --- src/uipath/platform/resume_triggers/_protocol.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/uipath/platform/resume_triggers/_protocol.py b/src/uipath/platform/resume_triggers/_protocol.py index 126b74acf..2fe3eebae 100644 --- a/src/uipath/platform/resume_triggers/_protocol.py +++ b/src/uipath/platform/resume_triggers/_protocol.py @@ -260,11 +260,7 @@ async def read_trigger(self, trigger: UiPathResumeTrigger) -> Any | None: f"Index ingestion '{ephemeral_index.name}' did not finish successfully.", ) -<<<<<<< HEAD trigger_response = ephemeral_index.model_dump() -======= - trigger_response = ephemeral_index ->>>>>>> cf1f8f3 (add create ephemeral index) return trigger_response @@ -560,15 +556,19 @@ async def _handle_ephemeral_index_job_trigger( ) -> None: """Handle ephemeral index""" if isinstance(value, WaitEphemeralIndex): - resume_trigger.item_key = value.ephemeral_index.id + resume_trigger.item_key = value.index.id elif isinstance(value, CreateEphemeralIndex): ephemeral_index = uipath.context_grounding.create_ephemeral_index( usage=value.usage, attachments=value.attachments, ) if not ephemeral_index: +<<<<<<< HEAD raise Exception("Failed to start ephemeral index") >>>>>>> cf1f8f3 (add create ephemeral index) +======= + raise Exception("Failed to create ephemeral index") +>>>>>>> aca152a (add tests) resume_trigger.item_key = ephemeral_index.id async def _handle_batch_rag_job_trigger( From d5704ccffa791c0b6e790d4be17e08cc1aa20d19 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Mon, 19 Jan 2026 13:54:22 -0800 Subject: [PATCH 4/7] fix tests --- .../_context_grounding_service.py | 23 ------------------- .../platform/resume_triggers/_protocol.py | 8 ++++--- .../test_context_grounding_service.py | 4 ++++ 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index 470682a08..9eb01140f 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -1,4 +1,3 @@ -import uuid from pathlib import Path from typing import Annotated, Any, Dict, List, Optional, Tuple, Union @@ -387,28 +386,6 @@ def create_index( return ContextGroundingIndex.model_validate(response.json()) - @resource_override(resource_type="index") - @traced(name="contextgrounding_create_ephemeral_index", run_type="uipath") - def create_ephemeral_index( - self, - usage: str, - attachments: list[uuid.UUID], - ) -> ContextGroundingIndex: - """Create a new context ephemeral grounding index.""" - spec = self._create_ephemeral_spec( - usage, - attachments, - ) - - response = self.request( - spec.method, - spec.endpoint, - json=spec.json, - headers=spec.headers, - ) - - return ContextGroundingIndex.model_validate(response.json()) - @resource_override(resource_type="index") @traced(name="contextgrounding_create_index", run_type="uipath") async def create_index_async( diff --git a/src/uipath/platform/resume_triggers/_protocol.py b/src/uipath/platform/resume_triggers/_protocol.py index 2fe3eebae..8baa970d7 100644 --- a/src/uipath/platform/resume_triggers/_protocol.py +++ b/src/uipath/platform/resume_triggers/_protocol.py @@ -558,9 +558,11 @@ async def _handle_ephemeral_index_job_trigger( if isinstance(value, WaitEphemeralIndex): resume_trigger.item_key = value.index.id elif isinstance(value, CreateEphemeralIndex): - ephemeral_index = uipath.context_grounding.create_ephemeral_index( - usage=value.usage, - attachments=value.attachments, + ephemeral_index = ( + await uipath.context_grounding.create_ephemeral_index_async( + usage=value.usage, + attachments=value.attachments, + ) ) if not ephemeral_index: <<<<<<< HEAD diff --git a/tests/sdk/services/test_context_grounding_service.py b/tests/sdk/services/test_context_grounding_service.py index a746d9e39..e25123acf 100644 --- a/tests/sdk/services/test_context_grounding_service.py +++ b/tests/sdk/services/test_context_grounding_service.py @@ -1837,7 +1837,11 @@ async def test_create_ephemeral_index_async( }, ) +<<<<<<< HEAD attachment_ids = [str(uuid.uuid4()), str(uuid.uuid4())] +======= + attachment_ids = [uuid.uuid4(), uuid.uuid4()] +>>>>>>> 7addb23 (fix tests) index = await service.create_ephemeral_index_async( usage="DeepRAG", attachments=attachment_ids, From c9296756b8d85086c5880e4d1c3cf13cf71fb318 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Thu, 22 Jan 2026 01:01:47 -0800 Subject: [PATCH 5/7] add new tool definitions --- src/uipath/agent/models/agent.py | 61 ++++++++++++++++++- .../platform/common/interrupt_models.py | 1 + .../_context_grounding_service.py | 29 ++++++--- .../platform/resume_triggers/_protocol.py | 1 + 4 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/uipath/agent/models/agent.py b/src/uipath/agent/models/agent.py index bdb5e05d5..145e0ff61 100644 --- a/src/uipath/agent/models/agent.py +++ b/src/uipath/agent/models/agent.py @@ -62,6 +62,7 @@ class AgentInternalToolType(str, Enum): """Agent internal tool type enumeration.""" ANALYZE_FILES = "analyze-attachments" + DEEP_RAG = "deep-rag" class AgentEscalationRecipientType(str, Enum): @@ -119,6 +120,20 @@ class TextTokenType(str, Enum): EXPRESSION = "expression" +class CitationMode(str, Enum): + """Citation mode enumeration.""" + + INLINE = "Inline" + SKIP = "Skip" + + +class FileExtension(str, Enum): + """File extension enumeration.""" + + PDF = "pdf" + TXT = "txt" + + class BaseCfg(BaseModel): """Base configuration model with common settings.""" @@ -245,6 +260,18 @@ class AgentContextValueSetting(BaseCfg): value: Any = Field(...) +class DeepRagCitationModeSetting(BaseCfg): + """DeepRAG citation mode setting model.""" + + value: CitationMode = Field(...) + + +class DeepRagFileExtensionSetting(BaseCfg): + """DeepRAG file extension setting model.""" + + value: FileExtension = Field(...) + + class AgentContextOutputColumn(BaseCfg): """Agent context output column model.""" @@ -505,14 +532,42 @@ class AgentIntegrationToolProperties(BaseResourceProperties): ) -class AgentInternalToolProperties(BaseResourceProperties): - """Agent internal tool properties model.""" +class AgentInternalAnalyzeFilesToolProperties(BaseResourceProperties): + """Agent internal analyze files tool properties model.""" tool_type: Literal[AgentInternalToolType.ANALYZE_FILES] = Field( - ..., alias="toolType" + alias="toolType", default=AgentInternalToolType.ANALYZE_FILES, frozen=True ) +class AgentInternalDeepRagToolProperties(BaseResourceProperties): + """Agent internal DeepRAG tool properties model.""" + + tool_type: Literal[AgentInternalToolType.DEEP_RAG] = Field( + alias="toolType", default=AgentInternalToolType.DEEP_RAG, frozen=True + ) + settings: AgentInternalDeepRagSettings = Field(..., alias="settings") + + +AgentInternalToolProperties = Annotated[ + Union[ + AgentInternalAnalyzeFilesToolProperties, + AgentInternalDeepRagToolProperties, + ], + Field(discriminator="tool_type"), +] + + +class AgentInternalDeepRagSettings(BaseCfg): + """Agent internal DeepRAG tool settings model.""" + + context_type: str = Field(..., alias="contextType") + query: AgentContextQuerySetting = Field(None) + folder_path_prefix: AgentContextQuerySetting = Field(None, alias="folderPathPrefix") + citation_mode: DeepRagCitationModeSetting = Field(..., alias="citationMode") + file_extension: DeepRagFileExtensionSetting = Field(..., alias="fileExtension") + + class AgentIntegrationToolResourceConfig(BaseAgentToolResourceConfig): """Agent integration tool resource configuration model.""" diff --git a/src/uipath/platform/common/interrupt_models.py b/src/uipath/platform/common/interrupt_models.py index 6754c48e2..6a8005914 100644 --- a/src/uipath/platform/common/interrupt_models.py +++ b/src/uipath/platform/common/interrupt_models.py @@ -75,6 +75,7 @@ class CreateDeepRag(BaseModel): name: str index_name: Annotated[str, Field(max_length=512)] + index_id: Annotated[str, Field(max_length=512)] | None = None prompt: Annotated[str, Field(max_length=250000)] glob_pattern: Annotated[str, Field(max_length=512, default="*")] = "**" citation_mode: CitationMode = CitationMode.SKIP diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index 9eb01140f..d425b74e2 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -447,6 +447,8 @@ def create_ephemeral_index( self, usage: EphemeralIndexUsage, attachments: list[str], + folder_key: Optional[str] = None, + folder_path: Optional[str] = None, ) -> ContextGroundingIndex: """Create a new ephemeral context grounding index. @@ -460,6 +462,8 @@ def create_ephemeral_index( spec = self._create_ephemeral_spec( usage, attachments, + folder_path=folder_path, + folder_key=folder_key, ) response = self.request( @@ -477,6 +481,8 @@ async def create_ephemeral_index_async( self, usage: EphemeralIndexUsage, attachments: list[str], + folder_key: Optional[str] = None, + folder_path: Optional[str] = None, ) -> ContextGroundingIndex: """Create a new ephemeral context grounding index. @@ -490,6 +496,8 @@ async def create_ephemeral_index_async( spec = self._create_ephemeral_spec( usage, attachments, + folder_path=folder_path, + folder_key=folder_key, ) response = await self.request_async( @@ -883,6 +891,7 @@ async def start_deep_rag_async( self, name: str, index_name: Annotated[str, Field(max_length=512)], + index_id: Annotated[str, Field(max_length=512)], prompt: Annotated[str, Field(max_length=250000)], glob_pattern: Annotated[str, Field(max_length=512, default="*")] = "**", citation_mode: CitationMode = CitationMode.SKIP, @@ -904,14 +913,16 @@ async def start_deep_rag_async( Returns: DeepRagCreationResponse: The Deep RAG task creation response. """ - index = await self.retrieve_async( - index_name, folder_key=folder_key, folder_path=folder_path - ) - if index and index.in_progress_ingestion(): - raise IngestionInProgressException(index_name=index_name) + if not index_id: + index = await self.retrieve_async( + index_name, folder_key=folder_key, folder_path=folder_path + ) + if index and index.in_progress_ingestion(): + raise IngestionInProgressException(index_name=index_name) + index_id = index.id spec = self._deep_rag_creation_spec( - index_id=index.id, + index_id=index_id, name=name, glob_pattern=glob_pattern, prompt=prompt, @@ -1261,6 +1272,8 @@ def _create_ephemeral_spec( """ data_source_dict = self._build_ephemeral_data_source(attachments) + folder_key = self._resolve_folder_key(folder_key, folder_path) + payload = CreateEphemeralIndexPayload( usage=usage, data_source=data_source_dict, @@ -1270,7 +1283,9 @@ def _create_ephemeral_spec( method="POST", endpoint=Endpoint("/ecs_/v2/indexes/createephemeral"), json=payload.model_dump(by_alias=True, exclude_none=True), - headers={}, + headers={ + **header_folder(folder_key, None), + }, ) def _build_data_source(self, source: SourceConfig) -> Dict[str, Any]: diff --git a/src/uipath/platform/resume_triggers/_protocol.py b/src/uipath/platform/resume_triggers/_protocol.py index 8baa970d7..262e89b04 100644 --- a/src/uipath/platform/resume_triggers/_protocol.py +++ b/src/uipath/platform/resume_triggers/_protocol.py @@ -518,6 +518,7 @@ async def _handle_deep_rag_job_trigger( deep_rag = await uipath.context_grounding.start_deep_rag_async( name=value.name, index_name=value.index_name, + index_id=value.index_id, prompt=value.prompt, glob_pattern=value.glob_pattern, citation_mode=value.citation_mode, From e56638e9b1c633e1f137387d309d4828030da86c Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Sun, 25 Jan 2026 11:44:01 -0800 Subject: [PATCH 6/7] cleanup --- .../_context_grounding_service.py | 42 +++++++++---------- .../platform/resume_triggers/_protocol.py | 25 ----------- .../test_context_grounding_service.py | 5 +-- 3 files changed, 21 insertions(+), 51 deletions(-) diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index d425b74e2..991a9f798 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -291,11 +291,17 @@ def retrieve_by_id( Args: id (str): The unique identifier of the context index. + folder_key (Optional[str]): The key of the folder where the index resides. + folder_path (Optional[str]): The path of the folder where the index resides. Returns: Any: The index information, including its configuration and metadata. """ - spec = self._retrieve_by_id_spec(id) + spec = self._retrieve_by_id_spec( + id, + folder_key=folder_key, + folder_path=folder_path, + ) return self.request( spec.method, @@ -317,11 +323,17 @@ async def retrieve_by_id_async( Args: id (str): The unique identifier of the context index. + folder_key (Optional[str]): The key of the folder where the index resides. + folder_path (Optional[str]): The path of the folder where the index resides. Returns: Any: The index information, including its configuration and metadata. """ - spec = self._retrieve_by_id_spec(id) + spec = self._retrieve_by_id_spec( + id, + folder_key=folder_key, + folder_path=folder_path, + ) response = await self.request_async( spec.method, @@ -444,11 +456,7 @@ async def create_index_async( @resource_override(resource_type="index") @traced(name="contextgrounding_create_ephemeral_index", run_type="uipath") def create_ephemeral_index( - self, - usage: EphemeralIndexUsage, - attachments: list[str], - folder_key: Optional[str] = None, - folder_path: Optional[str] = None, + self, usage: EphemeralIndexUsage, attachments: list[str] ) -> ContextGroundingIndex: """Create a new ephemeral context grounding index. @@ -462,8 +470,6 @@ def create_ephemeral_index( spec = self._create_ephemeral_spec( usage, attachments, - folder_path=folder_path, - folder_key=folder_key, ) response = self.request( @@ -478,11 +484,7 @@ def create_ephemeral_index( @resource_override(resource_type="index") @traced(name="contextgrounding_create_ephemeral_index", run_type="uipath") async def create_ephemeral_index_async( - self, - usage: EphemeralIndexUsage, - attachments: list[str], - folder_key: Optional[str] = None, - folder_path: Optional[str] = None, + self, usage: EphemeralIndexUsage, attachments: list[str] ) -> ContextGroundingIndex: """Create a new ephemeral context grounding index. @@ -496,8 +498,6 @@ async def create_ephemeral_index_async( spec = self._create_ephemeral_spec( usage, attachments, - folder_path=folder_path, - folder_key=folder_key, ) response = await self.request_async( @@ -1272,8 +1272,6 @@ def _create_ephemeral_spec( """ data_source_dict = self._build_ephemeral_data_source(attachments) - folder_key = self._resolve_folder_key(folder_key, folder_path) - payload = CreateEphemeralIndexPayload( usage=usage, data_source=data_source_dict, @@ -1283,9 +1281,7 @@ def _create_ephemeral_spec( method="POST", endpoint=Endpoint("/ecs_/v2/indexes/createephemeral"), json=payload.model_dump(by_alias=True, exclude_none=True), - headers={ - **header_folder(folder_key, None), - }, + headers={}, ) def _build_data_source(self, source: SourceConfig) -> Dict[str, Any]: @@ -1383,7 +1379,9 @@ def _retrieve_by_id_spec( return RequestSpec( method="GET", endpoint=Endpoint(f"/ecs_/v2/indexes/{id}"), - headers={}, + headers={ + **header_folder(folder_key, None), + }, ) def _delete_by_id_spec( diff --git a/src/uipath/platform/resume_triggers/_protocol.py b/src/uipath/platform/resume_triggers/_protocol.py index 262e89b04..6da49aefd 100644 --- a/src/uipath/platform/resume_triggers/_protocol.py +++ b/src/uipath/platform/resume_triggers/_protocol.py @@ -390,10 +390,6 @@ async def create_trigger(self, suspend_value: Any) -> UiPathResumeTrigger: await self._handle_ephemeral_index_job_trigger( suspend_value, resume_trigger ) - case UiPathResumeTriggerType.EPHEMERAL_INDEX: - await self._handle_ephemeral_index_job_trigger( - suspend_value, resume_trigger, uipath - ) case UiPathResumeTriggerType.BATCH_RAG: await self._handle_batch_rag_job_trigger( suspend_value, resume_trigger @@ -530,7 +526,6 @@ async def _handle_deep_rag_job_trigger( resume_trigger.item_key = deep_rag.id async def _handle_ephemeral_index_job_trigger( -<<<<<<< HEAD self, value: Any, resume_trigger: UiPathResumeTrigger ) -> None: """Handle ephemeral index. @@ -552,26 +547,6 @@ async def _handle_ephemeral_index_job_trigger( ) if not ephemeral_index: raise Exception("Failed to create ephemeral index") -======= - self, value: Any, resume_trigger: UiPathResumeTrigger, uipath: UiPath - ) -> None: - """Handle ephemeral index""" - if isinstance(value, WaitEphemeralIndex): - resume_trigger.item_key = value.index.id - elif isinstance(value, CreateEphemeralIndex): - ephemeral_index = ( - await uipath.context_grounding.create_ephemeral_index_async( - usage=value.usage, - attachments=value.attachments, - ) - ) - if not ephemeral_index: -<<<<<<< HEAD - raise Exception("Failed to start ephemeral index") ->>>>>>> cf1f8f3 (add create ephemeral index) -======= - raise Exception("Failed to create ephemeral index") ->>>>>>> aca152a (add tests) resume_trigger.item_key = ephemeral_index.id async def _handle_batch_rag_job_trigger( diff --git a/tests/sdk/services/test_context_grounding_service.py b/tests/sdk/services/test_context_grounding_service.py index e25123acf..b85e6d192 100644 --- a/tests/sdk/services/test_context_grounding_service.py +++ b/tests/sdk/services/test_context_grounding_service.py @@ -1837,11 +1837,8 @@ async def test_create_ephemeral_index_async( }, ) -<<<<<<< HEAD attachment_ids = [str(uuid.uuid4()), str(uuid.uuid4())] -======= - attachment_ids = [uuid.uuid4(), uuid.uuid4()] ->>>>>>> 7addb23 (fix tests) + index = await service.create_ephemeral_index_async( usage="DeepRAG", attachments=attachment_ids, From 2d41733b06006d6299a6a6cb443f089bbb1b8fc0 Mon Sep 17 00:00:00 2001 From: Caleb Martin Date: Sun, 25 Jan 2026 17:36:40 -0800 Subject: [PATCH 7/7] add batch rag --- src/uipath/agent/models/agent.py | 59 +++++++++++++++++-- .../_context_grounding_service.py | 18 +++--- .../test_context_grounding_service.py | 1 - 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/uipath/agent/models/agent.py b/src/uipath/agent/models/agent.py index 145e0ff61..d966533e2 100644 --- a/src/uipath/agent/models/agent.py +++ b/src/uipath/agent/models/agent.py @@ -63,6 +63,7 @@ class AgentInternalToolType(str, Enum): ANALYZE_FILES = "analyze-attachments" DEEP_RAG = "deep-rag" + BATCH_TRANSFORM = "batch-transform" class AgentEscalationRecipientType(str, Enum): @@ -127,13 +128,26 @@ class CitationMode(str, Enum): SKIP = "Skip" -class FileExtension(str, Enum): - """File extension enumeration.""" +class DeepRagFileExtension(str, Enum): + """File extension enumeration for DeepRAG.""" PDF = "pdf" TXT = "txt" +class BatchTransformFileExtension(str, Enum): + """File extension enumeration for Batch Transform.""" + + CSV = "csv" + + +class BatchTransformWebSearchGrounding(str, Enum): + """Batch Transform web search grounding enumeration.""" + + ENABLED = "Enabled" + DISABLED = "Disabled" + + class BaseCfg(BaseModel): """Base configuration model with common settings.""" @@ -269,7 +283,19 @@ class DeepRagCitationModeSetting(BaseCfg): class DeepRagFileExtensionSetting(BaseCfg): """DeepRAG file extension setting model.""" - value: FileExtension = Field(...) + value: DeepRagFileExtension = Field(...) + + +class BatchTransformFileExtensionSetting(BaseCfg): + """Batch Transform file extension setting model.""" + + value: BatchTransformFileExtension = Field(...) + + +class BatchTransformWebSearchGroundingSetting(BaseCfg): + """DeepRAG file extension setting model.""" + + value: BatchTransformWebSearchGrounding = Field(...) class AgentContextOutputColumn(BaseCfg): @@ -549,10 +575,20 @@ class AgentInternalDeepRagToolProperties(BaseResourceProperties): settings: AgentInternalDeepRagSettings = Field(..., alias="settings") +class AgentInternalBatchTransformToolProperties(BaseResourceProperties): + """Agent internal Batch Tranform tool properties model.""" + + tool_type: Literal[AgentInternalToolType.BATCH_TRANSFORM] = Field( + alias="toolType", default=AgentInternalToolType.BATCH_TRANSFORM, frozen=True + ) + settings: AgentInternalBatchTransformSettings = Field(..., alias="settings") + + AgentInternalToolProperties = Annotated[ Union[ AgentInternalAnalyzeFilesToolProperties, AgentInternalDeepRagToolProperties, + AgentInternalBatchTransformToolProperties, ], Field(discriminator="tool_type"), ] @@ -562,12 +598,27 @@ class AgentInternalDeepRagSettings(BaseCfg): """Agent internal DeepRAG tool settings model.""" context_type: str = Field(..., alias="contextType") - query: AgentContextQuerySetting = Field(None) + query: AgentContextQuerySetting = Field(...) folder_path_prefix: AgentContextQuerySetting = Field(None, alias="folderPathPrefix") citation_mode: DeepRagCitationModeSetting = Field(..., alias="citationMode") file_extension: DeepRagFileExtensionSetting = Field(..., alias="fileExtension") +class AgentInternalBatchTransformSettings(BaseCfg): + """Agent internal DeepRAG tool settings model.""" + + context_type: str = Field(..., alias="contextType") + query: AgentContextQuerySetting = Field(...) + folder_path_prefix: AgentContextQuerySetting = Field(None, alias="folderPathPrefix") + file_extension: BatchTransformFileExtensionSetting = Field( + ..., alias="fileExtension" + ) + output_columns: List[AgentContextOutputColumn] = Field(..., alias="outputColumns") + web_search_grounding: BatchTransformWebSearchGroundingSetting = Field( + ..., alias="folderPathPrefix" + ) + + class AgentIntegrationToolResourceConfig(BaseAgentToolResourceConfig): """Agent integration tool resource configuration model.""" diff --git a/src/uipath/platform/context_grounding/_context_grounding_service.py b/src/uipath/platform/context_grounding/_context_grounding_service.py index 991a9f798..283764a57 100644 --- a/src/uipath/platform/context_grounding/_context_grounding_service.py +++ b/src/uipath/platform/context_grounding/_context_grounding_service.py @@ -842,6 +842,7 @@ def start_deep_rag( prompt: Annotated[str, Field(max_length=250000)], glob_pattern: Annotated[str, Field(max_length=512, default="*")] = "**", citation_mode: CitationMode = CitationMode.SKIP, + index_id: Annotated[str, Field(max_length=512)] | None = None, folder_key: str | None = None, folder_path: str | None = None, ) -> DeepRagCreationResponse: @@ -855,18 +856,20 @@ def start_deep_rag( citation_mode (CitationMode): The citation mode to use. Defaults to SKIP. folder_key (str, optional): The folder key where the index resides. Defaults to None. folder_path (str, optional): The folder path where the index resides. Defaults to None. + index_id (str): The id of the context index to search in, used in place of name if present Returns: DeepRagCreationResponse: The Deep RAG task creation response. """ - index = self.retrieve( - index_name, folder_key=folder_key, folder_path=folder_path - ) - if index and index.in_progress_ingestion(): - raise IngestionInProgressException(index_name=index_name) + if not index_id: + index = self.retrieve( + index_name, folder_key=folder_key, folder_path=folder_path + ) + if index and index.in_progress_ingestion(): + raise IngestionInProgressException(index_name=index_name) spec = self._deep_rag_creation_spec( - index_id=index.id, + index_id=index_id, name=name, glob_pattern=glob_pattern, prompt=prompt, @@ -891,10 +894,10 @@ async def start_deep_rag_async( self, name: str, index_name: Annotated[str, Field(max_length=512)], - index_id: Annotated[str, Field(max_length=512)], prompt: Annotated[str, Field(max_length=250000)], glob_pattern: Annotated[str, Field(max_length=512, default="*")] = "**", citation_mode: CitationMode = CitationMode.SKIP, + index_id: Annotated[str, Field(max_length=512)] | None = None, folder_key: str | None = None, folder_path: str | None = None, ) -> DeepRagCreationResponse: @@ -909,6 +912,7 @@ async def start_deep_rag_async( citation_mode (CitationMode): The citation mode to use. Defaults to SKIP. folder_key (str, optional): The folder key where the index resides. Defaults to None. folder_path (str, optional): The folder path where the index resides. Defaults to None. + index_id (str): The id of the context index to search in, used in place of name if present Returns: DeepRagCreationResponse: The Deep RAG task creation response. diff --git a/tests/sdk/services/test_context_grounding_service.py b/tests/sdk/services/test_context_grounding_service.py index b85e6d192..a746d9e39 100644 --- a/tests/sdk/services/test_context_grounding_service.py +++ b/tests/sdk/services/test_context_grounding_service.py @@ -1838,7 +1838,6 @@ async def test_create_ephemeral_index_async( ) attachment_ids = [str(uuid.uuid4()), str(uuid.uuid4())] - index = await service.create_ephemeral_index_async( usage="DeepRAG", attachments=attachment_ids,