uipath 2.1.84__py3-none-any.whl → 2.1.86__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uipath might be problematic. Click here for more details.

@@ -432,12 +432,12 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
432
432
  async def execute_runtime(
433
433
  self, eval_item: EvaluationItem
434
434
  ) -> UiPathEvalRunExecutionOutput:
435
- eval_item_id = eval_item.id
435
+ execution_id = str(uuid.uuid4())
436
436
  runtime_context: C = self.factory.new_context(
437
- execution_id=eval_item_id,
437
+ execution_id=execution_id,
438
438
  input_json=eval_item.inputs,
439
439
  is_eval_run=True,
440
- log_handler=self._setup_execution_logging(eval_item_id),
440
+ log_handler=self._setup_execution_logging(execution_id),
441
441
  )
442
442
  if runtime_context.execution_id is None:
443
443
  raise ValueError("execution_id must be set for eval runs")
@@ -445,9 +445,8 @@ class UiPathEvalRuntime(UiPathBaseRuntime, Generic[T, C]):
445
445
  attributes = {
446
446
  "evalId": eval_item.id,
447
447
  "span_type": "eval",
448
+ "execution.id": runtime_context.execution_id,
448
449
  }
449
- if runtime_context.execution_id:
450
- attributes["execution.id"] = runtime_context.execution_id
451
450
 
452
451
  start_time = time()
453
452
  try:
@@ -1,13 +1,22 @@
1
1
  # type: ignore
2
+ import hashlib
2
3
  import json
3
4
  import os
4
5
  import re
6
+ from pathlib import Path
5
7
  from typing import Any, Dict, Optional, Tuple
6
8
 
9
+ import click
7
10
  from pydantic import BaseModel
8
11
 
9
12
  from .._utils._console import ConsoleLogger
10
13
  from ._constants import is_binary_file
14
+ from ._studio_project import (
15
+ ProjectFile,
16
+ ProjectFolder,
17
+ StudioClient,
18
+ get_folder_by_name,
19
+ )
11
20
 
12
21
  try:
13
22
  import tomllib
@@ -431,3 +440,116 @@ def files_to_include(
431
440
  )
432
441
  )
433
442
  return extra_files
443
+
444
+
445
+ def compute_normalized_hash(content: str) -> str:
446
+ """Compute hash of normalized content.
447
+
448
+ Args:
449
+ content: Content to hash
450
+
451
+ Returns:
452
+ str: SHA256 hash of the normalized content
453
+ """
454
+ try:
455
+ # Try to parse as JSON to handle formatting
456
+ json_content = json.loads(content)
457
+ normalized = json.dumps(json_content, indent=2)
458
+ except json.JSONDecodeError:
459
+ # Not JSON, normalize line endings
460
+ normalized = content.replace("\r\n", "\n").replace("\r", "\n")
461
+
462
+ return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
463
+
464
+
465
+ def collect_files_from_folder(
466
+ folder: ProjectFolder, base_path: str, files_dict: Dict[str, ProjectFile]
467
+ ) -> None:
468
+ """Recursively collect all files from a folder and its subfolders.
469
+
470
+ Args:
471
+ folder: The folder to collect files from
472
+ base_path: Base path for file paths
473
+ files_dict: Dictionary to store collected files
474
+ """
475
+ # Add files from current folder
476
+ for file in folder.files:
477
+ file_path = os.path.join(base_path, file.name)
478
+ files_dict[file_path] = file
479
+
480
+ # Recursively process subfolders
481
+ for subfolder in folder.folders:
482
+ subfolder_path = os.path.join(base_path, subfolder.name)
483
+ collect_files_from_folder(subfolder, subfolder_path, files_dict)
484
+
485
+
486
+ async def download_folder_files(
487
+ studio_client: StudioClient,
488
+ folder: ProjectFolder,
489
+ base_path: Path,
490
+ ) -> None:
491
+ """Download files from a folder recursively.
492
+
493
+ Args:
494
+ studio_client: Studio client
495
+ folder: The folder to download files from
496
+ base_path: Base path for local file storage
497
+ """
498
+ files_dict: Dict[str, ProjectFile] = {}
499
+ collect_files_from_folder(folder, "", files_dict)
500
+ for file_path, remote_file in files_dict.items():
501
+ local_path = base_path / file_path
502
+ local_path.parent.mkdir(parents=True, exist_ok=True)
503
+
504
+ # Download remote file
505
+ response = await studio_client.download_file_async(remote_file.id)
506
+ remote_content = response.read().decode("utf-8")
507
+ remote_hash = compute_normalized_hash(remote_content)
508
+
509
+ if os.path.exists(local_path):
510
+ # Read and hash local file
511
+ with open(local_path, "r", encoding="utf-8") as f:
512
+ local_content = f.read()
513
+ local_hash = compute_normalized_hash(local_content)
514
+
515
+ # Compare hashes
516
+ if local_hash != remote_hash:
517
+ styled_path = click.style(str(file_path), fg="cyan")
518
+ console.warning(f"File {styled_path}" + " differs from remote version.")
519
+ response = click.prompt("Do you want to overwrite it? (y/n)", type=str)
520
+ if response.lower() == "y":
521
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
522
+ f.write(remote_content)
523
+ console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
524
+ else:
525
+ console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
526
+ else:
527
+ console.info(
528
+ f"File {click.style(str(file_path), fg='cyan')} is up to date"
529
+ )
530
+ else:
531
+ # File doesn't exist locally, create it
532
+ with open(local_path, "w", encoding="utf-8", newline="\n") as f:
533
+ f.write(remote_content)
534
+ console.success(f"Downloaded {click.style(str(file_path), fg='cyan')}")
535
+
536
+
537
+ async def pull_project(project_id: str, download_configuration: dict[str, Path]):
538
+ studio_client = StudioClient(project_id)
539
+
540
+ with console.spinner("Pulling UiPath project files..."):
541
+ try:
542
+ structure = await studio_client.get_project_structure_async()
543
+ for source_key, destination in download_configuration.items():
544
+ source_folder = get_folder_by_name(structure, source_key)
545
+ if source_folder:
546
+ await download_folder_files(
547
+ studio_client,
548
+ source_folder,
549
+ destination,
550
+ )
551
+ else:
552
+ console.warning(f"No {source_key} folder found in remote project")
553
+
554
+ except Exception as e:
555
+ console.error(f"Failed to pull UiPath project: {str(e)}")
uipath/_cli/cli_pull.py CHANGED
@@ -11,133 +11,27 @@ It handles:
11
11
 
12
12
  # type: ignore
13
13
  import asyncio
14
- import hashlib
15
- import json
16
14
  import os
17
- from typing import Dict, Set
15
+ from pathlib import Path
18
16
 
19
17
  import click
20
18
 
21
19
  from ..telemetry import track
22
20
  from ._utils._console import ConsoleLogger
23
21
  from ._utils._constants import UIPATH_PROJECT_ID
24
- from ._utils._studio_project import (
25
- ProjectFile,
26
- ProjectFolder,
27
- StudioClient,
28
- get_folder_by_name,
29
- )
22
+ from ._utils._project_files import pull_project
30
23
 
31
24
  console = ConsoleLogger()
32
25
 
33
26
 
34
- def compute_normalized_hash(content: str) -> str:
35
- """Compute hash of normalized content.
36
-
37
- Args:
38
- content: Content to hash
39
-
40
- Returns:
41
- str: SHA256 hash of the normalized content
42
- """
43
- try:
44
- # Try to parse as JSON to handle formatting
45
- json_content = json.loads(content)
46
- normalized = json.dumps(json_content, indent=2)
47
- except json.JSONDecodeError:
48
- # Not JSON, normalize line endings
49
- normalized = content.replace("\r\n", "\n").replace("\r", "\n")
50
-
51
- return hashlib.sha256(normalized.encode("utf-8")).hexdigest()
52
-
53
-
54
- def collect_files_from_folder(
55
- folder: ProjectFolder, base_path: str, files_dict: Dict[str, ProjectFile]
56
- ) -> None:
57
- """Recursively collect all files from a folder and its subfolders.
58
-
59
- Args:
60
- folder: The folder to collect files from
61
- base_path: Base path for file paths
62
- files_dict: Dictionary to store collected files
63
- """
64
- # Add files from current folder
65
- for file in folder.files:
66
- file_path = os.path.join(base_path, file.name)
67
- files_dict[file_path] = file
68
-
69
- # Recursively process subfolders
70
- for subfolder in folder.folders:
71
- subfolder_path = os.path.join(base_path, subfolder.name)
72
- collect_files_from_folder(subfolder, subfolder_path, files_dict)
73
-
74
-
75
- async def download_folder_files(
76
- studio_client: StudioClient,
77
- folder: ProjectFolder,
78
- base_path: str,
79
- processed_files: Set[str],
80
- ) -> None:
81
- """Download files from a folder recursively.
82
-
83
- Args:
84
- studio_client: Studio client
85
- folder: The folder to download files from
86
- base_path: Base path for local file storage
87
- processed_files: Set to track processed files
88
- """
89
- files_dict: Dict[str, ProjectFile] = {}
90
- collect_files_from_folder(folder, "", files_dict)
91
-
92
- for file_path, remote_file in files_dict.items():
93
- local_path = os.path.join(base_path, file_path)
94
- local_dir = os.path.dirname(local_path)
95
-
96
- # Create directory if it doesn't exist
97
- if not os.path.exists(local_dir):
98
- os.makedirs(local_dir)
99
-
100
- # Download remote file
101
- response = await studio_client.download_file_async(remote_file.id)
102
- remote_content = response.read().decode("utf-8")
103
- remote_hash = compute_normalized_hash(remote_content)
104
-
105
- if os.path.exists(local_path):
106
- # Read and hash local file
107
- with open(local_path, "r", encoding="utf-8") as f:
108
- local_content = f.read()
109
- local_hash = compute_normalized_hash(local_content)
110
-
111
- # Compare hashes
112
- if local_hash != remote_hash:
113
- styled_path = click.style(str(file_path), fg="cyan")
114
- console.warning(f"File {styled_path}" + " differs from remote version.")
115
- response = click.prompt("Do you want to overwrite it? (y/n)", type=str)
116
- if response.lower() == "y":
117
- with open(local_path, "w", encoding="utf-8", newline="\n") as f:
118
- f.write(remote_content)
119
- console.success(f"Updated {click.style(str(file_path), fg='cyan')}")
120
- else:
121
- console.info(f"Skipped {click.style(str(file_path), fg='cyan')}")
122
- else:
123
- console.info(
124
- f"File {click.style(str(file_path), fg='cyan')} is up to date"
125
- )
126
- else:
127
- # File doesn't exist locally, create it
128
- with open(local_path, "w", encoding="utf-8", newline="\n") as f:
129
- f.write(remote_content)
130
- console.success(f"Downloaded {click.style(str(file_path), fg='cyan')}")
131
-
132
- processed_files.add(file_path)
133
-
134
-
135
27
  @click.command()
136
28
  @click.argument(
137
- "root", type=click.Path(exists=True, file_okay=False, dir_okay=True), default="."
29
+ "root",
30
+ type=click.Path(exists=False, file_okay=False, dir_okay=True, path_type=Path),
31
+ default=Path("."),
138
32
  )
139
33
  @track
140
- def pull(root: str) -> None:
34
+ def pull(root: Path) -> None:
141
35
  """Pull remote project files from Studio Web Project.
142
36
 
143
37
  This command pulls the remote project files from a UiPath Studio Web project.
@@ -158,42 +52,8 @@ def pull(root: str) -> None:
158
52
  if not (project_id := os.getenv(UIPATH_PROJECT_ID, False)):
159
53
  console.error("UIPATH_PROJECT_ID environment variable not found.")
160
54
 
161
- studio_client = StudioClient(project_id)
162
-
163
- with console.spinner("Pulling UiPath project files..."):
164
- try:
165
- structure = asyncio.run(studio_client.get_project_structure_async())
166
-
167
- processed_files: Set[str] = set()
168
-
169
- # Process source_code folder
170
- source_code_folder = get_folder_by_name(structure, "source_code")
171
- if source_code_folder:
172
- asyncio.run(
173
- download_folder_files(
174
- studio_client,
175
- source_code_folder,
176
- root,
177
- processed_files,
178
- )
179
- )
180
- else:
181
- console.warning("No source_code folder found in remote project")
182
-
183
- # Process evals folder
184
- evals_folder = get_folder_by_name(structure, "evals")
185
- if evals_folder:
186
- evals_path = os.path.join(root, "evals")
187
- asyncio.run(
188
- download_folder_files(
189
- studio_client,
190
- evals_folder,
191
- evals_path,
192
- processed_files,
193
- )
194
- )
195
- else:
196
- console.warning("No evals folder found in remote project")
197
-
198
- except Exception as e:
199
- console.error(f"Failed to pull UiPath project: {str(e)}")
55
+ default_download_configuration = {
56
+ "source_code": root,
57
+ "evals": root / "evals",
58
+ }
59
+ asyncio.run(pull_project(project_id, default_download_configuration))
@@ -7,7 +7,7 @@ from httpx import Response
7
7
  from .._config import Config
8
8
  from .._execution_context import ExecutionContext
9
9
  from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
10
- from ..models import Connection, ConnectionToken, EventArguments
10
+ from ..models import Connection, ConnectionMetadata, ConnectionToken, EventArguments
11
11
  from ..models.connections import ConnectionTokenType
12
12
  from ..tracing._traced import traced
13
13
  from ._base_service import BaseService
@@ -54,6 +54,31 @@ class ConnectionsService(BaseService):
54
54
  response = self.request(spec.method, url=spec.endpoint)
55
55
  return Connection.model_validate(response.json())
56
56
 
57
+ @traced(
58
+ name="connections_metadata",
59
+ run_type="uipath",
60
+ hide_output=True,
61
+ )
62
+ def metadata(
63
+ self, element_instance_id: int, tool_path: str, schema_mode: bool = True
64
+ ) -> ConnectionMetadata:
65
+ """Synchronously retrieve connection API metadata.
66
+
67
+ This method fetches the metadata for a connection,
68
+ which can be used to establish communication with an external service.
69
+
70
+ Args:
71
+ element_instance_id (int): The element instance ID of the connection.
72
+ tool_path (str): The tool path to retrieve metadata for.
73
+ schema_mode (bool): Whether or not to represent the output schema in the response fields.
74
+
75
+ Returns:
76
+ ConnectionMetadata: The connection metadata.
77
+ """
78
+ spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
79
+ response = self.request(spec.method, url=spec.endpoint, headers=spec.headers)
80
+ return ConnectionMetadata.model_validate(response.json())
81
+
57
82
  @traced(name="connections_list", run_type="uipath")
58
83
  def list(
59
84
  self,
@@ -186,6 +211,33 @@ class ConnectionsService(BaseService):
186
211
  response = await self.request_async(spec.method, url=spec.endpoint)
187
212
  return Connection.model_validate(response.json())
188
213
 
214
+ @traced(
215
+ name="connections_metadata",
216
+ run_type="uipath",
217
+ hide_output=True,
218
+ )
219
+ async def metadata_async(
220
+ self, element_instance_id: int, tool_path: str, schema_mode: bool = True
221
+ ) -> ConnectionMetadata:
222
+ """Asynchronously retrieve connection API metadata.
223
+
224
+ This method fetches the metadata for a connection,
225
+ which can be used to establish communication with an external service.
226
+
227
+ Args:
228
+ element_instance_id (int): The element instance ID of the connection.
229
+ tool_path (str): The tool path to retrieve metadata for.
230
+ schema_mode (bool): Whether or not to represent the output schema in the response fields.
231
+
232
+ Returns:
233
+ ConnectionMetadata: The connection metadata.
234
+ """
235
+ spec = self._metadata_spec(element_instance_id, tool_path, schema_mode)
236
+ response = await self.request_async(
237
+ spec.method, url=spec.endpoint, headers=spec.headers
238
+ )
239
+ return ConnectionMetadata.model_validate(response.json())
240
+
189
241
  @traced(
190
242
  name="connections_retrieve_token",
191
243
  run_type="uipath",
@@ -324,6 +376,20 @@ class ConnectionsService(BaseService):
324
376
  endpoint=Endpoint(f"/connections_/api/v1/Connections/{key}"),
325
377
  )
326
378
 
379
+ def _metadata_spec(
380
+ self, element_instance_id: int, tool_path: str, schema_mode: bool
381
+ ) -> RequestSpec:
382
+ metadata_endpoint_url = f"/elements_/v3/element/instances/{element_instance_id}/elements/{tool_path}/metadata"
383
+ return RequestSpec(
384
+ method="GET",
385
+ endpoint=Endpoint(metadata_endpoint_url),
386
+ headers={
387
+ "accept": "application/schema+json"
388
+ if schema_mode
389
+ else "application/json"
390
+ },
391
+ )
392
+
327
393
  def _retrieve_token_spec(
328
394
  self, key: str, token_type: ConnectionTokenType = ConnectionTokenType.DIRECT
329
395
  ) -> RequestSpec:
uipath/models/__init__.py CHANGED
@@ -3,7 +3,7 @@ from .actions import Action
3
3
  from .assets import Asset, UserAsset
4
4
  from .attachment import Attachment
5
5
  from .buckets import Bucket
6
- from .connections import Connection, ConnectionToken, EventArguments
6
+ from .connections import Connection, ConnectionMetadata, ConnectionToken, EventArguments
7
7
  from .context_grounding import ContextGroundingQueryResponse
8
8
  from .context_grounding_index import ContextGroundingIndex
9
9
  from .errors import BaseUrlMissingError, SecretMissingError
@@ -38,6 +38,7 @@ __all__ = [
38
38
  "QueueItemPriority",
39
39
  "TransactionItemResult",
40
40
  "Connection",
41
+ "ConnectionMetadata",
41
42
  "ConnectionToken",
42
43
  "EventArguments",
43
44
  "Job",
@@ -4,6 +4,14 @@ from typing import Any, Optional
4
4
  from pydantic import BaseModel, ConfigDict, Field
5
5
 
6
6
 
7
+ class ConnectionMetadata(BaseModel):
8
+ """Metadata about a connection."""
9
+
10
+ fields: dict[str, Any] = Field(default_factory=dict, alias="fields")
11
+
12
+ model_config = ConfigDict(populate_by_name=True, extra="allow")
13
+
14
+
7
15
  class Connection(BaseModel):
8
16
  model_config = ConfigDict(
9
17
  validate_by_name=True,
@@ -0,0 +1,111 @@
1
+ """Json schema to dynamic pydantic model."""
2
+
3
+ from typing import Any, Dict, List, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel, Field, create_model
6
+
7
+
8
+ def jsonschema_to_pydantic(
9
+ schema: dict[str, Any],
10
+ definitions: Optional[dict[str, Any]] = None,
11
+ ) -> Type[BaseModel]:
12
+ """Convert a schema dict to a pydantic model.
13
+
14
+ Modified version of https://github.com/kreneskyp/jsonschema-pydantic to account for two unresolved issues.
15
+
16
+ Args:
17
+ schema: JSON schema.
18
+ definitions: Definitions dict. Defaults to `$def`.
19
+
20
+ Returns: Pydantic model.
21
+ """
22
+ title = schema.get("title", "DynamicModel")
23
+ assert isinstance(title, str), "Title of a model must be a string."
24
+
25
+ description = schema.get("description", None)
26
+
27
+ # top level schema provides definitions
28
+ if definitions is None:
29
+ if "$defs" in schema:
30
+ definitions = schema["$defs"]
31
+ elif "definitions" in schema:
32
+ definitions = schema["definitions"]
33
+ else:
34
+ definitions = {}
35
+
36
+ def convert_type(prop: dict[str, Any]) -> Any:
37
+ if "$ref" in prop:
38
+ ref_path = prop["$ref"].split("/")
39
+ ref = definitions[ref_path[-1]]
40
+ return jsonschema_to_pydantic(ref, definitions)
41
+
42
+ if "type" in prop:
43
+ type_mapping = {
44
+ "string": str,
45
+ "number": float,
46
+ "integer": int,
47
+ "boolean": bool,
48
+ "array": List,
49
+ "object": Dict[str, Any],
50
+ "null": None,
51
+ }
52
+
53
+ type_ = prop["type"]
54
+
55
+ if type_ == "array":
56
+ item_type: Any = convert_type(prop.get("items", {}))
57
+ assert isinstance(item_type, type)
58
+ return List[item_type] # noqa F821
59
+ elif type_ == "object":
60
+ if "properties" in prop:
61
+ return jsonschema_to_pydantic(prop, definitions)
62
+ else:
63
+ return Dict[str, Any]
64
+ else:
65
+ return type_mapping.get(type_, Any)
66
+
67
+ elif "allOf" in prop:
68
+ combined_fields = {}
69
+ for sub_schema in prop["allOf"]:
70
+ model = jsonschema_to_pydantic(sub_schema, definitions)
71
+ combined_fields.update(model.__annotations__)
72
+ return create_model("CombinedModel", **combined_fields)
73
+
74
+ elif "anyOf" in prop:
75
+ unioned_types = tuple(
76
+ convert_type(sub_schema) for sub_schema in prop["anyOf"]
77
+ )
78
+ return Union[unioned_types]
79
+ elif prop == {} or "type" not in prop:
80
+ return Any
81
+ else:
82
+ raise ValueError(f"Unsupported schema: {prop}")
83
+
84
+ fields: dict[str, Any] = {}
85
+ required_fields = schema.get("required", [])
86
+
87
+ for name, prop in schema.get("properties", {}).items():
88
+ pydantic_type = convert_type(prop)
89
+ field_kwargs = {}
90
+ if "default" in prop:
91
+ field_kwargs["default"] = prop["default"]
92
+ if name not in required_fields:
93
+ # Note that we do not make this optional. This is due to a limitation in Pydantic/Python.
94
+ # If we convert the Optional type back to json schema, it is represented as type | None.
95
+ # pydantic_type = Optional[pydantic_type]
96
+
97
+ if "default" not in field_kwargs:
98
+ field_kwargs["default"] = None
99
+ if "description" in prop:
100
+ field_kwargs["description"] = prop["description"]
101
+ if "title" in prop:
102
+ field_kwargs["title"] = prop["title"]
103
+
104
+ fields[name] = (pydantic_type, Field(**field_kwargs))
105
+
106
+ convert_type(schema.get("properties", {}).get("choices", {}))
107
+
108
+ model = create_model(title, **fields)
109
+ if description:
110
+ model.__doc__ = description
111
+ return model
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.1.84
3
+ Version: 2.1.86
4
4
  Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-python
@@ -15,7 +15,7 @@ uipath/_cli/cli_invoke.py,sha256=m-te-EjhDpk_fhFDkt-yQFzmjEHGo5lQDGEQWxSXisQ,439
15
15
  uipath/_cli/cli_new.py,sha256=9378NYUBc9j-qKVXV7oja-jahfJhXBg8zKVyaon7ctY,2102
16
16
  uipath/_cli/cli_pack.py,sha256=NmwZTfwZ2fURiHyiX1BM0juAtBOjPB1Jmcpu-rD7p-4,11025
17
17
  uipath/_cli/cli_publish.py,sha256=DgyfcZjvfV05Ldy0Pk5y_Le_nT9JduEE_x-VpIc_Kq0,6471
18
- uipath/_cli/cli_pull.py,sha256=PZ2hkfsfN-ElNa3FHjNetTux8XH03tDY5kWWqydQ2OY,6832
18
+ uipath/_cli/cli_pull.py,sha256=pLUzS4wrSsTzO69wvJa6C-l9qTomySc15GOwliPPyHU,1785
19
19
  uipath/_cli/cli_push.py,sha256=-j-gDIbT8GyU2SybLQqFl5L8KI9nu3CDijVtltDgX20,3132
20
20
  uipath/_cli/cli_run.py,sha256=1FKv20EjxrrP1I5rNSnL_HzbWtOAIMjB3M--4RPA_Yo,3709
21
21
  uipath/_cli/middlewares.py,sha256=0D9a-wphyetnH9T97F08o7-1OKWF1lMweFHHAR0xiOw,4979
@@ -46,7 +46,7 @@ uipath/_cli/_dev/_terminal/_utils/_logger.py,sha256=_ipTl_oAiMF9I7keGt2AAFAMz40D
46
46
  uipath/_cli/_evals/_console_progress_reporter.py,sha256=HgB6pdMyoS6YVwuI3EpM2LBcH3U69nrdaTyNgPG8ssg,9304
47
47
  uipath/_cli/_evals/_evaluator_factory.py,sha256=Gycv94VtGOpMir_Gba-UoiAyrSRfbSfe8_pTfjzcA9Q,3875
48
48
  uipath/_cli/_evals/_progress_reporter.py,sha256=kX7rNSa-QCLXIzK-vb9Jjf-XLEtucdeiQPgPlSkpp2U,16778
49
- uipath/_cli/_evals/_runtime.py,sha256=5pEAh8ebQFCBGJ-wEXQ0YeEvq3MGxGxRcxrT7kU2L6k,19882
49
+ uipath/_cli/_evals/_runtime.py,sha256=7ePUvkzaYC_sQUNmDgk1IqxvPpicjRlucQmSZkxHzc0,19834
50
50
  uipath/_cli/_evals/_span_collection.py,sha256=RoKoeDFG2XODdlgI27ionCjU7LLD_C0LJJ3gu0wab10,779
51
51
  uipath/_cli/_evals/_models/_evaluation_set.py,sha256=TEinpTAIzy5JLkF7-JrG_623ec2Y-GN9pfz284KKL_8,4567
52
52
  uipath/_cli/_evals/_models/_evaluator.py,sha256=fuC3UOYwPD4d_wdynHeLSCzbu82golNAnnPnxC8Y4rk,3315
@@ -82,7 +82,7 @@ uipath/_cli/_utils/_folders.py,sha256=RsYrXzF0NA1sPxgBoLkLlUY3jDNLg1V-Y8j71Q8a8H
82
82
  uipath/_cli/_utils/_input_args.py,sha256=3LGNqVpJItvof75VGm-ZNTUMUH9-c7-YgleM5b2YgRg,5088
83
83
  uipath/_cli/_utils/_parse_ast.py,sha256=8Iohz58s6bYQ7rgWtOTjrEInLJ-ETikmOMZzZdIY2Co,20072
84
84
  uipath/_cli/_utils/_processes.py,sha256=q7DfEKHISDWf3pngci5za_z0Pbnf_shWiYEcTOTCiyk,1855
85
- uipath/_cli/_utils/_project_files.py,sha256=62VwZrroeKjlnqMqYSy3Aex11n9qYb7J8n3a8IVdo3I,15156
85
+ uipath/_cli/_utils/_project_files.py,sha256=1DQ0dY1oUyCP_y7i1PbqJv_JcDQmHzzsJy1bKcr3xYk,19671
86
86
  uipath/_cli/_utils/_studio_project.py,sha256=8WYwi_CiTPRqo8KV2bsvj0H_KBFxTEN0Q2cXoZb-NnM,17030
87
87
  uipath/_cli/_utils/_tracing.py,sha256=2igb03j3EHjF_A406UhtCKkPfudVfFPjUq5tXUEG4oo,1541
88
88
  uipath/_cli/_utils/_uv_helpers.py,sha256=6SvoLnZPoKIxW0sjMvD1-ENV_HOXDYzH34GjBqwT138,3450
@@ -97,7 +97,7 @@ uipath/_services/api_client.py,sha256=kGm04ijk9AOEQd2BMxvQg-2QoB8dmyoDwFFDPyutAG
97
97
  uipath/_services/assets_service.py,sha256=pG0Io--SeiRRQmfUWPQPl1vq3csZlQgx30LBNKRmmF8,12145
98
98
  uipath/_services/attachments_service.py,sha256=NPQYK7CGjfBaNT_1S5vEAfODmOChTbQZforllFM2ofU,26678
99
99
  uipath/_services/buckets_service.py,sha256=5s8tuivd7GUZYj774DDUYTa0axxlUuesc4EBY1V5sdk,18496
100
- uipath/_services/connections_service.py,sha256=IqhKdRYwNZlRsDL2vY7gyl5nAiYaK1zvj_CLa7WLzVQ,15785
100
+ uipath/_services/connections_service.py,sha256=tKJHHOKQYKR6LkgB-V_2d0vFpLEdFeMzwj_xmBVHUDw,18416
101
101
  uipath/_services/context_grounding_service.py,sha256=Pjx-QQQEiSKD-hY6ityj3QUSALN3fIcKLLHr_NZ0d_g,37117
102
102
  uipath/_services/documents_service.py,sha256=UnFS8EpOZ_Ng2TZk3OiJJ3iNANvFs7QxuoG_v-lQj6c,24815
103
103
  uipath/_services/entities_service.py,sha256=QKCLE6wRgq3HZraF-M2mljy-8il4vsNHrQhUgkewVVk,14028
@@ -144,14 +144,14 @@ uipath/eval/mocks/__init__.py,sha256=Qis6XSN7_WOmrmD_I5Fo5E_OQpflb_SlZM_MDOszUXI
144
144
  uipath/eval/mocks/mockable.py,sha256=FJEE4iz6nchowGhoGR3FgF9VvymHnWJkUyakKOK4fIg,3360
145
145
  uipath/eval/models/__init__.py,sha256=x360CDZaRjUL3q3kh2CcXYYrQ47jwn6p6JnmhEIvMlA,419
146
146
  uipath/eval/models/models.py,sha256=YgPnkQunjEcEiueVQnYRsbQ3Nj1yQttDQZiMCq_DDkY,6321
147
- uipath/models/__init__.py,sha256=d_DkK1AtRUetM1t2NrH5UKgvJOBiynzaKnK5pMY7aIc,1289
147
+ uipath/models/__init__.py,sha256=au-Bhk7w4Jl8Jn-_a1Ae30RX9N6eQJJ0-bd-QSbRiuU,1335
148
148
  uipath/models/action_schema.py,sha256=tBn1qQ3NQLU5nwWlBIzIKIx3XK5pO_D1S51IjFlZ1FA,610
149
149
  uipath/models/actions.py,sha256=1vRsJ3JSmMdPkbiYAiHzY8K44vmW3VlMsmQUBAkSgrQ,3141
150
150
  uipath/models/assets.py,sha256=7x3swJRnG_a4VgjdXKKwraJLT5TF0u4wHsl6coOjX0g,2762
151
151
  uipath/models/attachment.py,sha256=lI6BxBY6DY5U6qZbxhkNu-usseA1zovYSTRtLq50ubI,1029
152
152
  uipath/models/auth.py,sha256=-CEo5KZVtZZgbAMatN6B1vBmGp8lTTumR8sMthRmL8I,345
153
153
  uipath/models/buckets.py,sha256=N3Lj_dVCv709-ywhOOdyCSvsuLn41eGuAfSiik6Q6F8,1285
154
- uipath/models/connections.py,sha256=bTDg8xISSPmKB1GFNEEMD1OEZyBDFHfZVKqw4gab1pE,2524
154
+ uipath/models/connections.py,sha256=jmzlfnddqlxjmiVhqsETRV6TQPH3fFqJGsygG0gUf7g,2745
155
155
  uipath/models/context_grounding.py,sha256=3MaF2Fv2QYle8UUWvKGkCN5XGpx2T4a34fdbBqJ2fCs,1137
156
156
  uipath/models/context_grounding_index.py,sha256=OhRyxZDHDSrEmBFK0-JLqMMMT64jir4XkHtQ54IKtc0,2683
157
157
  uipath/models/documents.py,sha256=g3xAhZlGcLuD6a_DHcUQWoLdzh5dENulouYAwrjGHEw,3963
@@ -172,8 +172,9 @@ uipath/tracing/_traced.py,sha256=yBIY05PCCrYyx50EIHZnwJaKNdHPNx-YTR1sHQl0a98,199
172
172
  uipath/tracing/_utils.py,sha256=X-LFsyIxDeNOGuHPvkb6T5o9Y8ElYhr_rP3CEBJSu4s,13837
173
173
  uipath/utils/__init__.py,sha256=VD-KXFpF_oWexFg6zyiWMkxl2HM4hYJMIUDZ1UEtGx0,105
174
174
  uipath/utils/_endpoints_manager.py,sha256=iRTl5Q0XAm_YgcnMcJOXtj-8052sr6jpWuPNz6CgT0Q,8408
175
- uipath-2.1.84.dist-info/METADATA,sha256=qoHn0sW3KLxB59TgARTElWJm91_930iMUEY-XLpgjaA,6593
176
- uipath-2.1.84.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
177
- uipath-2.1.84.dist-info/entry_points.txt,sha256=9C2_29U6Oq1ExFu7usihR-dnfIVNSKc-0EFbh0rskB4,43
178
- uipath-2.1.84.dist-info/licenses/LICENSE,sha256=-KBavWXepyDjimmzH5fVAsi-6jNVpIKFc2kZs0Ri4ng,1058
179
- uipath-2.1.84.dist-info/RECORD,,
175
+ uipath/utils/dynamic_schema.py,sha256=w0u_54MoeIAB-mf3GmwX1A_X8_HDrRy6p998PvX9evY,3839
176
+ uipath-2.1.86.dist-info/METADATA,sha256=G_FdE5vnRC3-2kjfKVvUdE_W8-SiIDzcsNSj2bTowXs,6593
177
+ uipath-2.1.86.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
178
+ uipath-2.1.86.dist-info/entry_points.txt,sha256=9C2_29U6Oq1ExFu7usihR-dnfIVNSKc-0EFbh0rskB4,43
179
+ uipath-2.1.86.dist-info/licenses/LICENSE,sha256=-KBavWXepyDjimmzH5fVAsi-6jNVpIKFc2kZs0Ri4ng,1058
180
+ uipath-2.1.86.dist-info/RECORD,,