uipath 2.0.53__py3-none-any.whl → 2.0.55__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.

@@ -2,7 +2,6 @@ import http.server
2
2
  import json
3
3
  import os
4
4
  import socketserver
5
- import ssl
6
5
  import time
7
6
 
8
7
  import click
@@ -109,19 +108,15 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
109
108
  return SimpleHTTPSRequestHandler
110
109
 
111
110
 
112
- class HTTPSServer:
113
- def __init__(self, port=6234, cert_file="localhost.crt", key_file="localhost.key"):
114
- """Initialize HTTPS server with configurable parameters.
111
+ class HTTPServer:
112
+ def __init__(self, port=6234):
113
+ """Initialize HTTP server with configurable parameters.
115
114
 
116
115
  Args:
117
116
  port (int, optional): Port number to run the server on. Defaults to 6234.
118
- cert_file (str, optional): SSL certificate file. Defaults to "localhost.crt".
119
- key_file (str, optional): SSL key file. Defaults to "localhost.key".
120
117
  """
121
118
  self.current_path = os.path.dirname(os.path.abspath(__file__))
122
119
  self.port = port
123
- self.cert_file = os.path.join(self.current_path, "localhost.crt")
124
- self.key_file = os.path.join(self.current_path, "localhost.key")
125
120
  self.httpd = None
126
121
  self.token_data = None
127
122
  self.should_shutdown = False
@@ -136,7 +131,7 @@ class HTTPSServer:
136
131
  self.should_shutdown = True
137
132
 
138
133
  def create_server(self, state, code_verifier, domain):
139
- """Create and configure the HTTPS server.
134
+ """Create and configure the HTTP server.
140
135
 
141
136
  Args:
142
137
  state (str): The OAuth state parameter.
@@ -144,20 +139,14 @@ class HTTPSServer:
144
139
  domain (str): The domain for authentication.
145
140
 
146
141
  Returns:
147
- socketserver.TCPServer: The configured HTTPS server.
142
+ socketserver.TCPServer: The configured HTTP server.
148
143
  """
149
- # Create SSL context
150
- context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
151
- context.load_cert_chain(self.cert_file, self.key_file)
152
-
153
144
  # Create server with address reuse
154
145
  socketserver.TCPServer.allow_reuse_address = True
155
146
  handler = make_request_handler_class(
156
147
  state, code_verifier, self.token_received_callback, domain
157
148
  )
158
149
  self.httpd = socketserver.TCPServer(("", self.port), handler)
159
- self.httpd.socket = context.wrap_socket(self.httpd.socket, server_side=True)
160
-
161
150
  return self.httpd
162
151
 
163
152
  def start(self, state, code_verifier, domain):
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "client_id": "36dea5b8-e8bb-423d-8e7b-c808df8f1c00",
3
- "redirect_uri": "https://localhost:__PY_REPLACE_PORT__/oidc/login",
3
+ "redirect_uri": "http://localhost:__PY_REPLACE_PORT__/oidc/login",
4
4
  "scope": "offline_access OrchestratorApiUserAccess ConnectionService DataService DocumentUnderstanding EnterpriseContextService Directory JamJamApi LLMGateway LLMOps OMS RCS.FolderAuthorization",
5
5
  "port": 8104
6
- }
6
+ }
uipath/_cli/cli_auth.py CHANGED
@@ -8,7 +8,7 @@ import click
8
8
  from dotenv import load_dotenv
9
9
 
10
10
  from ..telemetry import track
11
- from ._auth._auth_server import HTTPSServer
11
+ from ._auth._auth_server import HTTPServer
12
12
  from ._auth._oidc_utils import get_auth_config, get_auth_url
13
13
  from ._auth._portal_service import PortalService, select_tenant
14
14
  from ._auth._utils import update_auth_file, update_env_file
@@ -97,7 +97,7 @@ def auth(domain, force: None | bool = False):
97
97
  auth_url,
98
98
  )
99
99
 
100
- server = HTTPSServer(port=auth_config["port"])
100
+ server = HTTPServer(port=auth_config["port"])
101
101
  token_data = server.start(state, code_verifier, domain)
102
102
 
103
103
  if token_data:
uipath/_cli/cli_run.py CHANGED
@@ -42,14 +42,14 @@ def python_run_middleware(
42
42
  if not entrypoint:
43
43
  return MiddlewareResult(
44
44
  should_continue=False,
45
- info_message="""Error: No entrypoint specified. Please provide a path to a Python script.
45
+ error_message="""No entrypoint specified. Please provide a path to a Python script.
46
46
  Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path>]`""",
47
47
  )
48
48
 
49
49
  if not os.path.exists(entrypoint):
50
50
  return MiddlewareResult(
51
51
  should_continue=False,
52
- error_message=f"""Error: Script not found at path {entrypoint}.
52
+ error_message=f"""Script not found at path {entrypoint}.
53
53
  Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path>]`""",
54
54
  )
55
55
 
@@ -1,6 +1,7 @@
1
1
  from .actions_service import ActionsService
2
2
  from .api_client import ApiClient
3
3
  from .assets_service import AssetsService
4
+ from .attachments_service import AttachmentsService
4
5
  from .buckets_service import BucketsService
5
6
  from .connections_service import ConnectionsService
6
7
  from .context_grounding_service import ContextGroundingService
@@ -13,6 +14,7 @@ from .queues_service import QueuesService
13
14
  __all__ = [
14
15
  "ActionsService",
15
16
  "AssetsService",
17
+ "AttachmentsService",
16
18
  "BucketsService",
17
19
  "ConnectionsService",
18
20
  "ContextGroundingService",
@@ -1,6 +1,6 @@
1
1
  import inspect
2
2
  from logging import getLogger
3
- from typing import Any, Union
3
+ from typing import Any, Literal, Union
4
4
 
5
5
  from httpx import (
6
6
  URL,
@@ -22,7 +22,7 @@ from uipath._utils._read_overwrites import OverwritesManager
22
22
 
23
23
  from .._config import Config
24
24
  from .._execution_context import ExecutionContext
25
- from .._utils import user_agent_value
25
+ from .._utils import UiPathUrl, user_agent_value
26
26
  from .._utils.constants import HEADER_USER_AGENT
27
27
 
28
28
 
@@ -39,24 +39,17 @@ class BaseService:
39
39
  self._logger = getLogger("uipath")
40
40
  self._config = config
41
41
  self._execution_context = execution_context
42
- self._tenant_scope_client = Client(
43
- base_url=self._config.base_url,
44
- headers=Headers(self.default_headers),
45
- timeout=30.0,
46
- )
47
- self._tenant_scope_client_async = AsyncClient(
48
- base_url=self._config.base_url,
49
- headers=Headers(self.default_headers),
50
- timeout=30.0,
51
- )
52
- org_scope_base_url = self.__get_org_scope_base_url()
53
- self._org_scope_client = Client(
54
- base_url=org_scope_base_url,
42
+
43
+ self._url = UiPathUrl(self._config.base_url)
44
+
45
+ self._client = Client(
46
+ base_url=self._url.base_url,
55
47
  headers=Headers(self.default_headers),
56
48
  timeout=30.0,
57
49
  )
58
- self._org_scope_client_async = AsyncClient(
59
- base_url=org_scope_base_url,
50
+
51
+ self._client_async = AsyncClient(
52
+ base_url=self._url.base_url,
60
53
  headers=Headers(self.default_headers),
61
54
  timeout=30.0,
62
55
  )
@@ -77,12 +70,12 @@ class BaseService:
77
70
  self,
78
71
  method: str,
79
72
  url: Union[URL, str],
73
+ *,
74
+ scoped: Literal["org", "tenant"] = "tenant",
80
75
  **kwargs: Any,
81
76
  ) -> Response:
82
77
  self._logger.debug(f"Request: {method} {url}")
83
- self._logger.debug(
84
- f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
85
- )
78
+ self._logger.debug(f"HEADERS: {kwargs.get('headers', self._client.headers)}")
86
79
 
87
80
  try:
88
81
  stack = inspect.stack()
@@ -104,10 +97,13 @@ class BaseService:
104
97
  specific_component = (
105
98
  f"{module_name}.{function_name}" if module_name and function_name else ""
106
99
  )
107
- headers = kwargs.get("headers", {})
108
- headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
109
100
 
110
- response = self._tenant_scope_client.request(method, url, **kwargs)
101
+ kwargs.setdefault("headers", {})
102
+ kwargs["headers"][HEADER_USER_AGENT] = user_agent_value(specific_component)
103
+
104
+ scoped_url = self._url.scope_url(str(url), scoped)
105
+
106
+ response = self._client.request(method, scoped_url, **kwargs)
111
107
  response.raise_for_status()
112
108
 
113
109
  return response
@@ -123,96 +119,51 @@ class BaseService:
123
119
  self,
124
120
  method: str,
125
121
  url: Union[URL, str],
122
+ *,
123
+ scoped: Literal["org", "tenant"] = "tenant",
126
124
  **kwargs: Any,
127
125
  ) -> Response:
128
126
  self._logger.debug(f"Request: {method} {url}")
129
127
  self._logger.debug(
130
- f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
128
+ f"HEADERS: {kwargs.get('headers', self._client_async.headers)}"
131
129
  )
132
130
 
133
- try:
134
- stack = inspect.stack()
135
-
136
- # use the third frame because of the retry decorator
137
- caller_frame = stack[3].frame
138
- function_name = caller_frame.f_code.co_name
139
-
140
- if "self" in caller_frame.f_locals:
141
- module_name = type(caller_frame.f_locals["self"]).__name__
142
- elif "cls" in caller_frame.f_locals:
143
- module_name = caller_frame.f_locals["cls"].__name__
144
- else:
145
- module_name = ""
146
- except Exception:
147
- function_name = ""
148
- module_name = ""
149
-
150
- specific_component = (
151
- f"{module_name}.{function_name}" if module_name and function_name else ""
131
+ kwargs.setdefault("headers", {})
132
+ kwargs["headers"][HEADER_USER_AGENT] = user_agent_value(
133
+ self._specific_component
152
134
  )
153
- headers = kwargs.get("headers", {})
154
- headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
155
135
 
156
- response = await self._tenant_scope_client_async.request(method, url, **kwargs)
136
+ scoped_url = self._url.scope_url(str(url), scoped)
137
+
138
+ response = await self._client_async.request(method, scoped_url, **kwargs)
157
139
  response.raise_for_status()
158
140
 
159
141
  return response
160
142
 
161
- def request_org_scope(
162
- self,
163
- method: str,
164
- url: Union[URL, str],
165
- **kwargs: Any,
166
- ) -> Response:
167
- self._logger.debug(f"Request: {method} {url}")
168
- self._logger.debug(
169
- f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
170
- )
171
-
172
- try:
173
- stack = inspect.stack()
174
-
175
- # use the third frame because of the retry decorator
176
- caller_frame = stack[3].frame
177
- function_name = caller_frame.f_code.co_name
178
-
179
- if "self" in caller_frame.f_locals:
180
- module_name = type(caller_frame.f_locals["self"]).__name__
181
- elif "cls" in caller_frame.f_locals:
182
- module_name = caller_frame.f_locals["cls"].__name__
183
- else:
184
- module_name = ""
185
- except Exception:
186
- function_name = ""
187
- module_name = ""
188
-
189
- specific_component = (
190
- f"{module_name}.{function_name}" if module_name and function_name else ""
191
- )
192
- headers = kwargs.get("headers", {})
193
- headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
194
-
195
- response = self._org_scope_client.request(method, url, **kwargs)
196
- response.raise_for_status()
143
+ @property
144
+ def default_headers(self) -> dict[str, str]:
145
+ return {
146
+ "Accept": "application/json",
147
+ "Content-Type": "application/json",
148
+ **self.auth_headers,
149
+ **self.custom_headers,
150
+ }
197
151
 
198
- return response
152
+ @property
153
+ def auth_headers(self) -> dict[str, str]:
154
+ header = f"Bearer {self._config.secret}"
155
+ return {"Authorization": header}
199
156
 
200
- async def request_org_scope_async(
201
- self,
202
- method: str,
203
- url: Union[URL, str],
204
- **kwargs: Any,
205
- ) -> Response:
206
- self._logger.debug(f"Request: {method} {url}")
207
- self._logger.debug(
208
- f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
209
- )
157
+ @property
158
+ def custom_headers(self) -> dict[str, str]:
159
+ return {}
210
160
 
161
+ @property
162
+ def _specific_component(self) -> str:
211
163
  try:
212
164
  stack = inspect.stack()
213
165
 
214
- # use the third frame because of the retry decorator
215
- caller_frame = stack[3].frame
166
+ caller_frame = stack[4].frame
216
167
  function_name = caller_frame.f_code.co_name
217
168
 
218
169
  if "self" in caller_frame.f_locals:
@@ -228,34 +179,5 @@ class BaseService:
228
179
  specific_component = (
229
180
  f"{module_name}.{function_name}" if module_name and function_name else ""
230
181
  )
231
- headers = kwargs.get("headers", {})
232
- headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
233
-
234
- response = await self._org_scope_client_async.request(method, url, **kwargs)
235
- response.raise_for_status()
236
-
237
- return response
238
-
239
- @property
240
- def default_headers(self) -> dict[str, str]:
241
- return {
242
- "Accept": "application/json",
243
- "Content-Type": "application/json",
244
- **self.auth_headers,
245
- **self.custom_headers,
246
- }
247
-
248
- @property
249
- def auth_headers(self) -> dict[str, str]:
250
- header = f"Bearer {self._config.secret}"
251
- return {"Authorization": header}
252
-
253
- @property
254
- def custom_headers(self) -> dict[str, str]:
255
- return {}
256
182
 
257
- def __get_org_scope_base_url(self) -> str:
258
- base_url = str(self._config.base_url)
259
- if base_url.endswith("/"):
260
- base_url = base_url[:-1]
261
- return base_url.rsplit("/", 1)[0] + "/"
183
+ return specific_component
@@ -349,8 +349,12 @@ class ActionsService(FolderContext, BaseService):
349
349
  raise Exception("appName or appKey is required")
350
350
  spec = _retrieve_app_key_spec(app_name=app_name)
351
351
 
352
- response = await self.request_org_scope_async(
353
- spec.method, spec.endpoint, params=spec.params, headers=spec.headers
352
+ response = await self.request_async(
353
+ spec.method,
354
+ spec.endpoint,
355
+ params=spec.params,
356
+ headers=spec.headers,
357
+ scoped="org",
354
358
  )
355
359
  try:
356
360
  deployed_app = self._extract_deployed_app(
@@ -382,8 +386,12 @@ class ActionsService(FolderContext, BaseService):
382
386
 
383
387
  spec = _retrieve_app_key_spec(app_name=app_name)
384
388
 
385
- response = self.request_org_scope(
386
- spec.method, spec.endpoint, params=spec.params, headers=spec.headers
389
+ response = self.request(
390
+ spec.method,
391
+ spec.endpoint,
392
+ params=spec.params,
393
+ headers=spec.headers,
394
+ scoped="org",
387
395
  )
388
396
 
389
397
  try:
@@ -28,7 +28,7 @@ class ApiClient(FolderContext, BaseService):
28
28
  ) -> Response:
29
29
  if kwargs.get("include_folder_headers", False):
30
30
  kwargs["headers"] = {
31
- **kwargs.get("headers", self._tenant_scope_client.headers),
31
+ **kwargs.get("headers", self._client.headers),
32
32
  **self.folder_headers,
33
33
  }
34
34
 
@@ -45,7 +45,7 @@ class ApiClient(FolderContext, BaseService):
45
45
  ) -> Response:
46
46
  if kwargs.get("include_folder_headers", False):
47
47
  kwargs["headers"] = {
48
- **kwargs.get("headers", self._tenant_scope_client_async.headers),
48
+ **kwargs.get("headers", self._client_async.headers),
49
49
  **self.folder_headers,
50
50
  }
51
51
 
@@ -53,37 +53,3 @@ class ApiClient(FolderContext, BaseService):
53
53
  del kwargs["include_folder_headers"]
54
54
 
55
55
  return await super().request_async(method, url, **kwargs)
56
-
57
- def request_org_scope(
58
- self,
59
- method: str,
60
- url: Union[URL, str],
61
- **kwargs: Any,
62
- ) -> Response:
63
- if kwargs.get("include_folder_headers", False):
64
- kwargs["headers"] = {
65
- **kwargs.get("headers", self._org_scope_client.headers),
66
- **self.folder_headers,
67
- }
68
-
69
- if "include_folder_headers" in kwargs:
70
- del kwargs["include_folder_headers"]
71
-
72
- return super().request_org_scope(method, url, **kwargs)
73
-
74
- async def request_org_scope_async(
75
- self,
76
- method: str,
77
- url: Union[URL, str],
78
- **kwargs: Any,
79
- ) -> Response:
80
- if kwargs.get("include_folder_headers", False):
81
- kwargs["headers"] = {
82
- **kwargs.get("headers", self._org_scope_client_async.headers),
83
- **self.folder_headers,
84
- }
85
-
86
- if "include_folder_headers" in kwargs:
87
- del kwargs["include_folder_headers"]
88
-
89
- return await super().request_org_scope_async(method, url, **kwargs)
@@ -7,7 +7,7 @@ from .._execution_context import ExecutionContext
7
7
  from .._folder_context import FolderContext
8
8
  from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
9
9
  from .._utils._read_overwrites import OverwritesManager, read_resource_overwrites
10
- from ..models import UserAsset
10
+ from ..models import Asset, UserAsset
11
11
  from ..tracing._traced import traced
12
12
  from ._base_service import BaseService
13
13
 
@@ -34,7 +34,7 @@ class AssetsService(FolderContext, BaseService):
34
34
  *,
35
35
  folder_key: Optional[str] = None,
36
36
  folder_path: Optional[str] = None,
37
- ) -> UserAsset:
37
+ ) -> UserAsset | Asset:
38
38
  """Retrieve an asset by its name.
39
39
 
40
40
  Related Activity: [Get Asset](https://docs.uipath.com/activities/other/latest/workflow/get-robot-asset)
@@ -56,6 +56,11 @@ class AssetsService(FolderContext, BaseService):
56
56
  client.assets.retrieve(name="MyAsset")
57
57
  ```
58
58
  """
59
+ try:
60
+ is_user = self._execution_context.robot_key is not None
61
+ except ValueError:
62
+ is_user = False
63
+
59
64
  with read_resource_overwrites("asset", name, folder_path) as (
60
65
  overwritten_name,
61
66
  overwritten_folder_path,
@@ -68,11 +73,15 @@ class AssetsService(FolderContext, BaseService):
68
73
  response = self.request(
69
74
  spec.method,
70
75
  url=spec.endpoint,
76
+ params=spec.params,
71
77
  content=spec.content,
72
78
  headers=spec.headers,
73
79
  )
74
80
 
75
- return UserAsset.model_validate(response.json())
81
+ if is_user:
82
+ return UserAsset.model_validate(response.json())
83
+ else:
84
+ return Asset.model_validate(response.json()["value"][0])
76
85
 
77
86
  @traced(
78
87
  name="assets_retrieve", run_type="uipath", hide_input=True, hide_output=True
@@ -83,7 +92,7 @@ class AssetsService(FolderContext, BaseService):
83
92
  *,
84
93
  folder_key: Optional[str] = None,
85
94
  folder_path: Optional[str] = None,
86
- ) -> UserAsset:
95
+ ) -> UserAsset | Asset:
87
96
  """Asynchronously retrieve an asset by its name.
88
97
 
89
98
  Related Activity: [Get Asset](https://docs.uipath.com/activities/other/latest/workflow/get-robot-asset)
@@ -96,6 +105,11 @@ class AssetsService(FolderContext, BaseService):
96
105
  Returns:
97
106
  UserAsset: The asset data.
98
107
  """
108
+ try:
109
+ is_user = self._execution_context.robot_key is not None
110
+ except ValueError:
111
+ is_user = False
112
+
99
113
  with read_resource_overwrites("asset", name, folder_path) as (
100
114
  overwritten_name,
101
115
  overwritten_folder_path,
@@ -108,11 +122,15 @@ class AssetsService(FolderContext, BaseService):
108
122
  response = await self.request_async(
109
123
  spec.method,
110
124
  url=spec.endpoint,
125
+ params=spec.params,
111
126
  content=spec.content,
112
127
  headers=spec.headers,
113
128
  )
114
129
 
115
- return UserAsset.model_validate(response.json())
130
+ if is_user:
131
+ return UserAsset.model_validate(response.json())
132
+ else:
133
+ return Asset.model_validate(response.json()["value"][0])
116
134
 
117
135
  @infer_bindings()
118
136
  @traced(
@@ -138,7 +156,18 @@ class AssetsService(FolderContext, BaseService):
138
156
 
139
157
  Returns:
140
158
  Optional[str]: The decrypted credential password.
159
+
160
+ Raises:
161
+ ValueError: If the method is called for a user asset.
141
162
  """
163
+ try:
164
+ is_user = self._execution_context.robot_key is not None
165
+ except ValueError:
166
+ is_user = False
167
+
168
+ if not is_user:
169
+ raise ValueError("This method can only be used for robot assets.")
170
+
142
171
  with read_resource_overwrites("asset", name, folder_path) as (
143
172
  overwritten_name,
144
173
  overwritten_folder_path,
@@ -185,7 +214,17 @@ class AssetsService(FolderContext, BaseService):
185
214
  Returns:
186
215
  Optional[str]: The decrypted credential password.
187
216
 
217
+ Raises:
218
+ ValueError: If the method is called for a user asset.
188
219
  """
220
+ try:
221
+ is_user = self._execution_context.robot_key is not None
222
+ except ValueError:
223
+ is_user = False
224
+
225
+ if not is_user:
226
+ raise ValueError("This method can only be used for robot assets.")
227
+
189
228
  with read_resource_overwrites("asset", name, folder_path) as (
190
229
  overwritten_name,
191
230
  overwritten_folder_path,
@@ -224,7 +263,18 @@ class AssetsService(FolderContext, BaseService):
224
263
 
225
264
  Returns:
226
265
  Response: The HTTP response confirming the update.
266
+
267
+ Raises:
268
+ ValueError: If the method is called for a user asset.
227
269
  """
270
+ try:
271
+ is_user = self._execution_context.robot_key is not None
272
+ except ValueError:
273
+ is_user = False
274
+
275
+ if not is_user:
276
+ raise ValueError("This method can only be used for robot assets.")
277
+
228
278
  with read_resource_overwrites("asset", robot_asset.name or "", folder_path) as (
229
279
  overwritten_name,
230
280
  overwritten_folder_path,
@@ -288,14 +338,29 @@ class AssetsService(FolderContext, BaseService):
288
338
  folder_key: Optional[str] = None,
289
339
  folder_path: Optional[str] = None,
290
340
  ) -> RequestSpec:
341
+ try:
342
+ robot_key = self._execution_context.robot_key
343
+ except ValueError:
344
+ robot_key = None
345
+
346
+ if robot_key is None:
347
+ return RequestSpec(
348
+ method="GET",
349
+ endpoint=Endpoint(
350
+ "/orchestrator_/odata/Assets/UiPath.Server.Configuration.OData.GetFiltered",
351
+ ),
352
+ params={"$filter": f"Name eq '{name}'", "$top": 1},
353
+ headers={
354
+ **header_folder(folder_key, folder_path),
355
+ },
356
+ )
357
+
291
358
  return RequestSpec(
292
359
  method="POST",
293
360
  endpoint=Endpoint(
294
361
  "/orchestrator_/odata/Assets/UiPath.Server.Configuration.OData.GetRobotAssetByNameForRobotKey"
295
362
  ),
296
- content=str(
297
- {"assetName": name, "robotKey": self._execution_context.robot_key}
298
- ),
363
+ content=str({"assetName": name, "robotKey": robot_key}),
299
364
  headers={
300
365
  **header_folder(folder_key, folder_path),
301
366
  },