zenml-nightly 0.82.0.dev20250506__py3-none-any.whl → 0.82.0.dev20250508__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.
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.82.0.dev20250506
1
+ 0.82.0.dev20250508
@@ -101,6 +101,7 @@ class PipelineRunActionHandler(BaseActionHandler):
101
101
  template=template,
102
102
  run_config=config.run_config,
103
103
  auth_context=auth_context,
104
+ sync=True,
104
105
  )
105
106
 
106
107
  def _validate_configuration(
@@ -40,6 +40,7 @@ from zenml.constants import (
40
40
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME,
41
41
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY,
42
42
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE,
43
+ DEFAULT_ZENML_SERVER_MAX_CONCURRENT_TEMPLATE_RUNS,
43
44
  DEFAULT_ZENML_SERVER_MAX_DEVICE_AUTH_ATTEMPTS,
44
45
  DEFAULT_ZENML_SERVER_MAX_REQUEST_BODY_SIZE_IN_BYTES,
45
46
  DEFAULT_ZENML_SERVER_NAME,
@@ -153,6 +154,8 @@ class ServerConfiguration(BaseModel):
153
154
  server.
154
155
  workload_manager_implementation_source: Source pointing to a class
155
156
  implementing the workload management interface.
157
+ max_concurrent_template_runs: The maximum number of concurrent template
158
+ runs that can be executed on the server.
156
159
  pipeline_run_auth_window: The default time window in minutes for which
157
160
  a pipeline run action is allowed to authenticate with the ZenML
158
161
  server.
@@ -291,6 +294,9 @@ class ServerConfiguration(BaseModel):
291
294
  feature_gate_implementation_source: Optional[str] = None
292
295
  reportable_resources: List[str] = []
293
296
  workload_manager_implementation_source: Optional[str] = None
297
+ max_concurrent_template_runs: int = (
298
+ DEFAULT_ZENML_SERVER_MAX_CONCURRENT_TEMPLATE_RUNS
299
+ )
294
300
  pipeline_run_auth_window: int = (
295
301
  DEFAULT_ZENML_SERVER_PIPELINE_RUN_AUTH_WINDOW
296
302
  )
zenml/constants.py CHANGED
@@ -291,6 +291,7 @@ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME = (
291
291
  60 * 60 * 24 * 7
292
292
  ) # 7 days
293
293
  DEFAULT_ZENML_SERVER_FILE_DOWNLOAD_SIZE_LIMIT = 2 * 1024 * 1024 * 1024 # 20 GB
294
+ DEFAULT_ZENML_SERVER_MAX_CONCURRENT_TEMPLATE_RUNS = 2
294
295
 
295
296
  DEFAULT_ZENML_SERVER_SECURE_HEADERS_HSTS = (
296
297
  "max-age=63072000; includeSubdomains"
zenml/exceptions.py CHANGED
@@ -216,3 +216,7 @@ class BackupSecretsStoreNotConfiguredError(NotImplementedError):
216
216
 
217
217
  class CustomFlavorImportError(ImportError):
218
218
  """Raised when failing to import a custom flavor."""
219
+
220
+
221
+ class MaxConcurrentTasksError(ZenMLBaseException):
222
+ """Raised when the maximum number of concurrent tasks is reached."""
@@ -266,12 +266,21 @@ def push_image(
266
266
  logger.info("Finished pushing Docker image.")
267
267
 
268
268
  image_name_without_tag, _ = image_name.rsplit(":", maxsplit=1)
269
+ prefix_candidates = [f"{image_name_without_tag}@"]
270
+
271
+ if image_name_without_tag.startswith(("index.docker.io/", "docker.io/")):
272
+ # When looking for the repo digest later, Docker sometimes removes the
273
+ # index prefix, so we make sure to check for a digest with and without.
274
+ image_name_without_index = image_name_without_tag.split(
275
+ "/", maxsplit=1
276
+ )[1]
277
+ prefix_candidates.append(f"{image_name_without_index}@")
269
278
 
270
279
  image = docker_client.images.get(image_name)
271
280
  repo_digests: List[str] = image.attrs["RepoDigests"]
272
281
 
273
282
  for digest in repo_digests:
274
- if digest.startswith(f"{image_name_without_tag}@"):
283
+ if digest.startswith(tuple(prefix_candidates)):
275
284
  return digest
276
285
 
277
286
  for info in reversed(aux_info):
@@ -25,6 +25,7 @@ from zenml.exceptions import (
25
25
  EntityCreationError,
26
26
  EntityExistsError,
27
27
  IllegalOperationError,
28
+ MaxConcurrentTasksError,
28
29
  MethodNotAllowedError,
29
30
  SubscriptionUpgradeRequiredError,
30
31
  ValidationError,
@@ -85,6 +86,8 @@ REST_API_EXCEPTIONS: List[Tuple[Type[Exception], int]] = [
85
86
  (ValueError, 400),
86
87
  # 422 Unprocessable Entity
87
88
  (ValueError, 422),
89
+ # 429 Too Many Requests
90
+ (MaxConcurrentTasksError, 429),
88
91
  # 500 Internal Server Error
89
92
  (EntityCreationError, 500),
90
93
  (RuntimeError, 500),
@@ -16,7 +16,11 @@
16
16
  from typing import Optional, Union
17
17
  from uuid import UUID
18
18
 
19
- from fastapi import APIRouter, BackgroundTasks, Depends, Security
19
+ from fastapi import (
20
+ APIRouter,
21
+ Depends,
22
+ Security,
23
+ )
20
24
 
21
25
  from zenml.analytics.enums import AnalyticsEvent
22
26
  from zenml.analytics.utils import track_handler
@@ -220,12 +224,12 @@ if server_config().workload_manager_enabled:
220
224
  401: error_response,
221
225
  404: error_response,
222
226
  422: error_response,
227
+ 429: error_response,
223
228
  },
224
229
  )
225
230
  @handle_exceptions
226
231
  def create_template_run(
227
232
  template_id: UUID,
228
- background_tasks: BackgroundTasks,
229
233
  config: Optional[PipelineRunConfiguration] = None,
230
234
  auth_context: AuthContext = Security(authorize),
231
235
  ) -> PipelineRunResponse:
@@ -233,14 +237,15 @@ if server_config().workload_manager_enabled:
233
237
 
234
238
  Args:
235
239
  template_id: The ID of the template.
236
- background_tasks: Background tasks.
237
240
  config: Configuration for the pipeline run.
238
241
  auth_context: Authentication context.
239
242
 
240
243
  Returns:
241
244
  The created pipeline run.
242
245
  """
243
- from zenml.zen_server.template_execution.utils import run_template
246
+ from zenml.zen_server.template_execution.utils import (
247
+ run_template,
248
+ )
244
249
 
245
250
  with track_handler(
246
251
  event=AnalyticsEvent.EXECUTED_RUN_TEMPLATE,
@@ -268,6 +273,5 @@ if server_config().workload_manager_enabled:
268
273
  return run_template(
269
274
  template=template,
270
275
  auth_context=auth_context,
271
- background_tasks=background_tasks,
272
276
  run_config=config,
273
277
  )
@@ -3,10 +3,11 @@
3
3
  import copy
4
4
  import hashlib
5
5
  import sys
6
- from typing import Any, Dict, List, Optional
6
+ import threading
7
+ from concurrent.futures import Future, ThreadPoolExecutor
8
+ from typing import Any, Callable, Dict, List, Optional
7
9
  from uuid import UUID
8
10
 
9
- from fastapi import BackgroundTasks
10
11
  from packaging import version
11
12
 
12
13
  from zenml.analytics.enums import AnalyticsEvent
@@ -26,6 +27,7 @@ from zenml.constants import (
26
27
  handle_int_env_var,
27
28
  )
28
29
  from zenml.enums import ExecutionStatus, StackComponentType, StoreType
30
+ from zenml.exceptions import MaxConcurrentTasksError
29
31
  from zenml.logger import get_logger
30
32
  from zenml.models import (
31
33
  CodeReferenceRequest,
@@ -50,30 +52,92 @@ from zenml.zen_server.auth import AuthContext, generate_access_token
50
52
  from zenml.zen_server.template_execution.runner_entrypoint_configuration import (
51
53
  RunnerEntrypointConfiguration,
52
54
  )
53
- from zenml.zen_server.utils import server_config, workload_manager, zen_store
55
+ from zenml.zen_server.utils import (
56
+ run_template_executor,
57
+ server_config,
58
+ workload_manager,
59
+ zen_store,
60
+ )
54
61
 
55
62
  logger = get_logger(__name__)
56
63
 
57
64
  RUNNER_IMAGE_REPOSITORY = "zenml-runner"
58
65
 
59
66
 
67
+ class BoundedThreadPoolExecutor:
68
+ """Thread pool executor which only allows a maximum number of concurrent tasks."""
69
+
70
+ def __init__(self, max_workers: int, **kwargs: Any) -> None:
71
+ """Initialize the executor.
72
+
73
+ Args:
74
+ max_workers: The maximum number of workers.
75
+ **kwargs: Arguments to pass to the thread pool executor.
76
+ """
77
+ self._executor = ThreadPoolExecutor(max_workers=max_workers, **kwargs)
78
+ self._semaphore = threading.BoundedSemaphore(value=max_workers)
79
+
80
+ def submit(
81
+ self, fn: Callable[..., Any], *args: Any, **kwargs: Any
82
+ ) -> Future[Any]:
83
+ """Submit a task to the executor.
84
+
85
+ Args:
86
+ fn: The function to execute.
87
+ *args: The arguments to pass to the function.
88
+ **kwargs: The keyword arguments to pass to the function.
89
+
90
+ Raises:
91
+ Exception: If the task submission fails.
92
+ MaxConcurrentTasksError: If the maximum number of concurrent tasks
93
+ is reached.
94
+
95
+ Returns:
96
+ The future of the task.
97
+ """
98
+ if not self._semaphore.acquire(blocking=False):
99
+ raise MaxConcurrentTasksError(
100
+ "Maximum number of concurrent tasks reached."
101
+ )
102
+
103
+ try:
104
+ future = self._executor.submit(fn, *args, **kwargs)
105
+ except Exception:
106
+ self._semaphore.release()
107
+ raise
108
+ else:
109
+ future.add_done_callback(lambda _: self._semaphore.release())
110
+ return future
111
+
112
+ def shutdown(self, **kwargs: Any) -> None:
113
+ """Shutdown the executor.
114
+
115
+ Args:
116
+ **kwargs: Keyword arguments to pass to the shutdown method of the
117
+ executor.
118
+ """
119
+ self._executor.shutdown(**kwargs)
120
+
121
+
60
122
  def run_template(
61
123
  template: RunTemplateResponse,
62
124
  auth_context: AuthContext,
63
- background_tasks: Optional[BackgroundTasks] = None,
64
125
  run_config: Optional[PipelineRunConfiguration] = None,
126
+ sync: bool = False,
65
127
  ) -> PipelineRunResponse:
66
128
  """Run a pipeline from a template.
67
129
 
68
130
  Args:
69
131
  template: The template to run.
70
132
  auth_context: Authentication context.
71
- background_tasks: Background tasks.
72
133
  run_config: The run configuration.
134
+ sync: Whether to run the template synchronously.
73
135
 
74
136
  Raises:
75
137
  ValueError: If the template can not be run.
76
138
  RuntimeError: If the server URL is not set in the server configuration.
139
+ MaxConcurrentTasksError: If the maximum number of concurrent run
140
+ template tasks is reached.
77
141
 
78
142
  Returns:
79
143
  ID of the new pipeline run.
@@ -241,13 +305,18 @@ def run_template(
241
305
  )
242
306
  raise
243
307
 
244
- if background_tasks:
245
- background_tasks.add_task(_task_with_analytics_and_error_handling)
246
- else:
247
- # Run synchronously if no background tasks were passed. This is probably
248
- # when coming from a trigger which itself is already running in the
249
- # background
308
+ if sync:
250
309
  _task_with_analytics_and_error_handling()
310
+ else:
311
+ try:
312
+ run_template_executor().submit(
313
+ _task_with_analytics_and_error_handling
314
+ )
315
+ except MaxConcurrentTasksError:
316
+ zen_store().delete_run(run_id=placeholder_run.id)
317
+ raise MaxConcurrentTasksError(
318
+ "Maximum number of concurrent run template tasks reached."
319
+ ) from None
251
320
 
252
321
  return placeholder_run
253
322
 
zenml/zen_server/utils.py CHANGED
@@ -60,6 +60,9 @@ from zenml.zen_stores.sql_zen_store import SqlZenStore
60
60
  if TYPE_CHECKING:
61
61
  from fastapi import Request
62
62
 
63
+ from zenml.zen_server.template_execution.utils import (
64
+ BoundedThreadPoolExecutor,
65
+ )
63
66
 
64
67
  logger = get_logger(__name__)
65
68
 
@@ -67,6 +70,7 @@ _zen_store: Optional["SqlZenStore"] = None
67
70
  _rbac: Optional[RBACInterface] = None
68
71
  _feature_gate: Optional[FeatureGateInterface] = None
69
72
  _workload_manager: Optional[WorkloadManagerInterface] = None
73
+ _run_template_executor: Optional["BoundedThreadPoolExecutor"] = None
70
74
  _plugin_flavor_registry: Optional[PluginFlavorRegistry] = None
71
75
  _memcache: Optional[MemoryCache] = None
72
76
 
@@ -196,6 +200,35 @@ def initialize_workload_manager() -> None:
196
200
  _workload_manager = workload_manager_class()
197
201
 
198
202
 
203
+ def run_template_executor() -> "BoundedThreadPoolExecutor":
204
+ """Return the initialized run template executor.
205
+
206
+ Raises:
207
+ RuntimeError: If the run template executor is not initialized.
208
+
209
+ Returns:
210
+ The run template executor.
211
+ """
212
+ global _run_template_executor
213
+ if _run_template_executor is None:
214
+ raise RuntimeError("Run template executor not initialized")
215
+
216
+ return _run_template_executor
217
+
218
+
219
+ def initialize_run_template_executor() -> None:
220
+ """Initialize the run template executor."""
221
+ global _run_template_executor
222
+ from zenml.zen_server.template_execution.utils import (
223
+ BoundedThreadPoolExecutor,
224
+ )
225
+
226
+ _run_template_executor = BoundedThreadPoolExecutor(
227
+ max_workers=server_config().max_concurrent_template_runs,
228
+ thread_name_prefix="zenml-run-template-executor",
229
+ )
230
+
231
+
199
232
  def initialize_plugins() -> None:
200
233
  """Initialize the event plugins registry."""
201
234
  plugin_flavor_registry().initialize_plugins()
@@ -102,9 +102,11 @@ from zenml.zen_server.utils import (
102
102
  initialize_memcache,
103
103
  initialize_plugins,
104
104
  initialize_rbac,
105
+ initialize_run_template_executor,
105
106
  initialize_workload_manager,
106
107
  initialize_zen_store,
107
108
  is_user_request,
109
+ run_template_executor,
108
110
  server_config,
109
111
  zen_store,
110
112
  )
@@ -390,6 +392,7 @@ def initialize() -> None:
390
392
  initialize_rbac()
391
393
  initialize_feature_gate()
392
394
  initialize_workload_manager()
395
+ initialize_run_template_executor()
393
396
  initialize_plugins()
394
397
  initialize_secure_headers()
395
398
  initialize_memcache(cfg.memcache_max_capacity, cfg.memcache_default_expiry)
@@ -399,6 +402,12 @@ def initialize() -> None:
399
402
  send_pro_workspace_status_update()
400
403
 
401
404
 
405
+ @app.on_event("shutdown")
406
+ def shutdown() -> None:
407
+ """Shutdown the ZenML server."""
408
+ run_template_executor().shutdown(wait=True)
409
+
410
+
402
411
  DASHBOARD_REDIRECT_URL = None
403
412
  if (
404
413
  server_config().dashboard_url
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.82.0.dev20250506
3
+ Version: 0.82.0.dev20250508
4
4
  Summary: ZenML: Write production-ready ML code.
5
5
  License: Apache-2.0
6
6
  Keywords: machine learning,production,pipeline,mlops,devops
@@ -1,10 +1,10 @@
1
1
  zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
2
- zenml/VERSION,sha256=ppUfeGUhs-NasvRcl6HFrQq-3Bkc5Mvd-jli7V03Ufs,19
2
+ zenml/VERSION,sha256=6ZapUMtAIHQPUp8zaMIANfD4zKfro3i2gKaHktdx2gk,19
3
3
  zenml/__init__.py,sha256=CKEyepFK-7akXYiMrNVh92Nb01Cjs23w4_YyI6sgdc8,2242
4
4
  zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
5
5
  zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
6
6
  zenml/actions/pipeline_run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- zenml/actions/pipeline_run/pipeline_run_action.py,sha256=eJx_V-DfWjP96DGZ_wP21jcKnbAbiffO5OTo68NNiTA,7438
7
+ zenml/actions/pipeline_run/pipeline_run_action.py,sha256=0V0r-PcxYkmnjZ3X2efjs2ttUo4XIgTzjmoq1ei56Ew,7461
8
8
  zenml/alerter/__init__.py,sha256=2t0W_95iKIV_0iKOPLrViyynS5Cg-hswpcNw7lOCbVU,1047
9
9
  zenml/alerter/base_alerter.py,sha256=7g7iK0wKDNDYrugvO3RvbvHT0vzRyTtQfJvWwV_pl3k,3015
10
10
  zenml/analytics/__init__.py,sha256=jXTcNiyH1ZyUCR6NkoBmxQQnDXa2VGfkajpvfyRF6_Q,3064
@@ -77,7 +77,7 @@ zenml/config/retry_config.py,sha256=4UH1xqw0G6fSEbXSNKfmiFEkwadxQef9BGMe3JBm6NI,
77
77
  zenml/config/schedule.py,sha256=qtMWa-mEo7jIKvDzQUstMwe57gdbvyWAQ7ggsoddbCA,5349
78
78
  zenml/config/secret_reference_mixin.py,sha256=YvY68MTd1gE23IVprf0BLkNn62hoxcvb5nqGgc8jMkU,5871
79
79
  zenml/config/secrets_store_config.py,sha256=y05zqyQhr_DGrs3IfBGa_FRoZ043hSYRT5wzrx-zHTU,2818
80
- zenml/config/server_config.py,sha256=xLBOs_fWUM_Imk2IDzLPC1aVUSpwYYRobYAYC9hd2qE,31558
80
+ zenml/config/server_config.py,sha256=or-LKYFl-9yE3MEq_yPa5aCCu3d5_f0tL9MqPtb_3-c,31852
81
81
  zenml/config/settings_resolver.py,sha256=PR9BRm_x1dy7nVKa9UqpeFdck8IEATSW6aWT8FKd-DI,4278
82
82
  zenml/config/source.py,sha256=RzUw8lin8QztUjz-AdoCzVM5Om_cSSPuroaPx-qAO4w,8226
83
83
  zenml/config/step_configurations.py,sha256=mngjobhHRj88f3klMdz6iw2mOj9wzYUPIV8Rp_2hV3g,10433
@@ -85,7 +85,7 @@ zenml/config/step_run_info.py,sha256=KiVRSTtKmZ1GbvseDTap2imr7XwMHD3jSFVpyLNEK1I
85
85
  zenml/config/store_config.py,sha256=Cla5p5dTB6nNlo8_OZDs9hod5hspi64vxwtZj882XgU,3559
86
86
  zenml/config/strict_base_model.py,sha256=t_ULrtJF2eW7TgyYBRobl1fscwwIZXATYky8ER97ev4,860
87
87
  zenml/console.py,sha256=hj_KerPQKwnyKACj0ehSqUQX0mGVCJBKE1QvCt6ik3A,1160
88
- zenml/constants.py,sha256=ZVwWVxE2h54cNbJDyujJmhAc8w3J7I9MkWHOfP4HN9A,16431
88
+ zenml/constants.py,sha256=VI_-MR69Qxx3kEgxyRWL4Tf3wNAQyPYuJwsp6Yk59_Y,16485
89
89
  zenml/container_registries/__init__.py,sha256=ZSPbBIOnzhg88kQSpYgKe_POLuru14m629665-kAVAA,2200
90
90
  zenml/container_registries/azure_container_registry.py,sha256=t1sfDa94Vzbyqtb1iPFNutJ2EXV5_p9CUNITasoiQ70,2667
91
91
  zenml/container_registries/base_container_registry.py,sha256=-9RIkD6oXNPaU59R3PB_PtyCqsFoLPLSn5xYZmEmzbc,8915
@@ -110,7 +110,7 @@ zenml/event_sources/base_event.py,sha256=irrpiYi4fDYewzaXtb6_gPsqyFlYYLSap2BTGQz
110
110
  zenml/event_sources/base_event_source.py,sha256=04ramQhcPhGD9Mo9BcJZR-b9fJb8a4wzvlPVMAb9Dyk,25893
111
111
  zenml/event_sources/webhooks/__init__.py,sha256=VsHzSn1oKFaUs495ZqsKCfXiYxtaeGsnSGuvuqbGXCg,658
112
112
  zenml/event_sources/webhooks/base_webhook_event_source.py,sha256=2zADrL3cNpD-akZRdemUePUnTl8pPMPVX6eFQgWeUSo,7371
113
- zenml/exceptions.py,sha256=KPEz9kQGyC6VbgjNXFTUsVehvAUIe2ayOOy1j5QJdUI,6757
113
+ zenml/exceptions.py,sha256=n69jnFh2KiQJsD5jU4mkSoxheCCu0L9g4FCf2aehzHQ,6883
114
114
  zenml/experiment_trackers/__init__.py,sha256=b5XlKoRtMR1WBQVEiItolkpsa0iJ1IqxTmmRatr4YDw,1119
115
115
  zenml/experiment_trackers/base_experiment_tracker.py,sha256=K92w7c0r45qLPIsA3YmwPflaIl_WTK8-_Hh_1MQiLkE,2218
116
116
  zenml/feature_stores/__init__.py,sha256=tSW7YnDa3NDnlkX3yA_CTdX7ocWB9gsfF-7X9sc6i8Y,1415
@@ -768,7 +768,7 @@ zenml/utils/daemon.py,sha256=GZ7Dx6GLHK04SR50wBxpKYmFhxPBfdLWxJiAWzJC6cM,11863
768
768
  zenml/utils/dashboard_utils.py,sha256=V4pas-zgMn3vOpXWZ-yoW11ZLZi__oFQw9jvhiXhK1A,8345
769
769
  zenml/utils/deprecation_utils.py,sha256=QcWkOnzIRDKPOfkr523n3l2MoY2wE0LIPfbx99t4Gmg,6343
770
770
  zenml/utils/dict_utils.py,sha256=i7KAaKrkaWA_cG5IvVfMnr0CwWlBJ7KAsGvP2wxjZI8,2667
771
- zenml/utils/docker_utils.py,sha256=QvkKnvIYSKAhW7mErXwSaQ432-q1LAsLjo2YWSXD8Bk,13889
771
+ zenml/utils/docker_utils.py,sha256=_zKOVeTWuKJiQVtBP7y-6e4-kBfeWUAvXeM0ujXxDMM,14349
772
772
  zenml/utils/downloaded_repository_context.py,sha256=GyPOzC8M3SaEGnnbPgEgJhUW-m5hx9rLScnCiGw6_PY,1504
773
773
  zenml/utils/enum_utils.py,sha256=0fA0B9v9Wjutuqlu_owUoOit1utIw2UH5J6YHXSqhLU,1368
774
774
  zenml/utils/env_utils.py,sha256=2--2DDUt3gPOvCNVyobBtAciikQ0OEXs5WWp7NvYuKo,5276
@@ -1012,7 +1012,7 @@ zenml/zen_server/deploy/docker/docker_provider.py,sha256=18pNpxvP8xqbxS_KxvYTEIu
1012
1012
  zenml/zen_server/deploy/docker/docker_zen_server.py,sha256=313IXHgZLBPZx-lS9AF0CH0sSdoy3P1htS_d4ZXGuKw,7480
1013
1013
  zenml/zen_server/deploy/exceptions.py,sha256=tX0GNnLB_GMkeN7zGNlJRwtlrpZ5Slvyj_unVYVmGxk,1396
1014
1014
  zenml/zen_server/download_utils.py,sha256=g366TqytIWR4L4u9dd0jg-ouSWpDwdAh_-F2zryFzfo,4224
1015
- zenml/zen_server/exceptions.py,sha256=NAXARDHLvfnVIQ87MHce0mfaWCmKhMKgwmw-_X49HxQ,9625
1015
+ zenml/zen_server/exceptions.py,sha256=hP8zJBofQljxPByFIa4tKpVjKdCAMJlKvk_5Opgusqg,9718
1016
1016
  zenml/zen_server/feature_gate/__init__.py,sha256=yabe4fBY6NSusn-QlKQDLOvXVLERNpcAQgigsyWQIbQ,612
1017
1017
  zenml/zen_server/feature_gate/endpoint_utils.py,sha256=o6sBVlqqlc9KokMaEsRTYeMra7f2a6kCt3FrB-oHhCw,2227
1018
1018
  zenml/zen_server/feature_gate/feature_gate_interface.py,sha256=XCgsqUN5yYCipodHCIDmCHRhyYMyt483Pp5mdpqzwHA,1647
@@ -1044,7 +1044,7 @@ zenml/zen_server/routers/pipelines_endpoints.py,sha256=R6OM-0Tc6ZNPzQmLs5MWTJIE4
1044
1044
  zenml/zen_server/routers/plugin_endpoints.py,sha256=vgIdA0kdYsf8PeF_pqDaqEYnIi2mlYALAv4uB9Nn7S0,3239
1045
1045
  zenml/zen_server/routers/projects_endpoints.py,sha256=iIgCg_0_iR5OddgULvsP4xxMOOmEGmtCuSKYZVRE9f4,8464
1046
1046
  zenml/zen_server/routers/run_metadata_endpoints.py,sha256=UTWQvweZTGuZnLrqhbIRYQ-z_TfOPY3Kn9p4YwU0tqw,3662
1047
- zenml/zen_server/routers/run_templates_endpoints.py,sha256=EsiKxNVv5wvSkq_CqagxBfjeTh8Rnm37Vh1OynQrC-8,8338
1047
+ zenml/zen_server/routers/run_templates_endpoints.py,sha256=rEREmFmG38O_w6ktVJU5iu-dguGZpSC8RN9qH4WkEsA,8254
1048
1048
  zenml/zen_server/routers/runs_endpoints.py,sha256=YoTqWm-Mx97q8ZMYXgIY8gr2ICJpRlk6DxxHKN1utFU,12631
1049
1049
  zenml/zen_server/routers/schedule_endpoints.py,sha256=UXt6TIEX0PYhLoBgU-n5kIvWckX1BY_P5uUA_lK9J9A,5782
1050
1050
  zenml/zen_server/routers/secrets_endpoints.py,sha256=diYTC-jl6Hxd_BHVaNsPf2ZcWUwC99naWHsM1xRjR-g,9198
@@ -1064,10 +1064,10 @@ zenml/zen_server/routers/webhook_endpoints.py,sha256=KOJsuykv_TMjL3oEItpC4OWWP75
1064
1064
  zenml/zen_server/secure_headers.py,sha256=glh6QujnjyeoH1_FK-tAS-105G-qKS_34AqSzqJ6TRc,4182
1065
1065
  zenml/zen_server/template_execution/__init__.py,sha256=79knXLKfegsvVSVSWecpqrepq6iAavTUA4hKuiDk-WE,613
1066
1066
  zenml/zen_server/template_execution/runner_entrypoint_configuration.py,sha256=Y8aYJhqqs8Kv8I1q-dM1WemS5VBIfyoaaYH_YkzC7iY,1541
1067
- zenml/zen_server/template_execution/utils.py,sha256=UGMFeyVB8Os2awUfXsvKvDLdMiT0uxRj7ErF-8RyhA0,17533
1067
+ zenml/zen_server/template_execution/utils.py,sha256=jx_FdkrXKI-LOG1DykedhpNPwoUm_iFDJF9r1UVaE_o,19680
1068
1068
  zenml/zen_server/template_execution/workload_manager_interface.py,sha256=CL9c7z8ajuZE01DaHmdCDCZmsroDcTarvN-nE8jv6qQ,2590
1069
- zenml/zen_server/utils.py,sha256=Jc2Q4UBaYG2ruHdsN9JmbOWfWU_eWD9wTBBEgcGAbqg,17439
1070
- zenml/zen_server/zen_server_api.py,sha256=ALyv5096frXXRNySegEtsmkDbHLLqHd402bbQI7RnII,17941
1069
+ zenml/zen_server/utils.py,sha256=yOwPI0DxzDIxF7Ppnty_DuGMWYJ_ubHUNWfbTQ1_q9Q,18461
1070
+ zenml/zen_server/zen_server_api.py,sha256=1_YHOUmBulXuHWCxDLYtDCMxGze159UmU3f05643PSg,18182
1071
1071
  zenml/zen_stores/__init__.py,sha256=6LTgH6XwDeDxKqVJ1JTfGhmS8II1NLopPloINGmdyI0,691
1072
1072
  zenml/zen_stores/base_zen_store.py,sha256=AplsW2NR-G9_CU54XvNTQJo4W0KJ5TJV22cjKW4n2BY,16124
1073
1073
  zenml/zen_stores/migrations/README.md,sha256=x04jsb6EOP6PBEGMQlDELiqKEham2O-iztAs9AylMFc,4898
@@ -1318,8 +1318,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=LPFW757WCJLP1S8vrvjs
1318
1318
  zenml/zen_stores/sql_zen_store.py,sha256=biOoDb2_zYmpsN-J-FSlKICYdwM9KDIe-_KN_yDf_mA,441414
1319
1319
  zenml/zen_stores/template_utils.py,sha256=GWBP5QEOyvhzndS_MLPmvh28sQaOPpPoZFXCIX9CRL4,9065
1320
1320
  zenml/zen_stores/zen_store_interface.py,sha256=fF_uL_FplnvGvM5o3jOQ8i1zHXhuhKLL2n4nvIKSR7E,92090
1321
- zenml_nightly-0.82.0.dev20250506.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1322
- zenml_nightly-0.82.0.dev20250506.dist-info/METADATA,sha256=_sWp9WjyqeWPdnHJ3RUVzjNOID0vYkZhrN-yKVh7tuM,24315
1323
- zenml_nightly-0.82.0.dev20250506.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1324
- zenml_nightly-0.82.0.dev20250506.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1325
- zenml_nightly-0.82.0.dev20250506.dist-info/RECORD,,
1321
+ zenml_nightly-0.82.0.dev20250508.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1322
+ zenml_nightly-0.82.0.dev20250508.dist-info/METADATA,sha256=HwiVOaLegimi0ZV8nGTInes1CvJnC-FMDRC-eu9bAgw,24315
1323
+ zenml_nightly-0.82.0.dev20250508.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1324
+ zenml_nightly-0.82.0.dev20250508.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1325
+ zenml_nightly-0.82.0.dev20250508.dist-info/RECORD,,