zenml-nightly 0.82.0.dev20250509__py3-none-any.whl → 0.82.0.dev20250510__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.
Files changed (33) hide show
  1. zenml/VERSION +1 -1
  2. zenml/config/compiler.py +16 -37
  3. zenml/config/pipeline_configurations.py +13 -6
  4. zenml/config/step_configurations.py +89 -14
  5. zenml/constants.py +1 -0
  6. zenml/models/v2/base/scoped.py +2 -0
  7. zenml/models/v2/core/artifact_version.py +1 -0
  8. zenml/orchestrators/step_launcher.py +2 -2
  9. zenml/pipelines/run_utils.py +3 -2
  10. zenml/stack/stack_component.py +6 -3
  11. zenml/zen_server/rbac/utils.py +1 -2
  12. zenml/zen_server/routers/pipeline_deployments_endpoints.py +81 -10
  13. zenml/zen_server/template_execution/utils.py +38 -46
  14. zenml/zen_stores/schemas/action_schemas.py +1 -0
  15. zenml/zen_stores/schemas/artifact_schemas.py +2 -0
  16. zenml/zen_stores/schemas/code_repository_schemas.py +1 -0
  17. zenml/zen_stores/schemas/event_source_schemas.py +1 -0
  18. zenml/zen_stores/schemas/model_schemas.py +2 -0
  19. zenml/zen_stores/schemas/pipeline_build_schemas.py +1 -0
  20. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +14 -5
  21. zenml/zen_stores/schemas/pipeline_run_schemas.py +3 -4
  22. zenml/zen_stores/schemas/pipeline_schemas.py +1 -0
  23. zenml/zen_stores/schemas/run_template_schemas.py +1 -0
  24. zenml/zen_stores/schemas/schedule_schema.py +1 -0
  25. zenml/zen_stores/schemas/service_schemas.py +1 -0
  26. zenml/zen_stores/schemas/step_run_schemas.py +29 -41
  27. zenml/zen_stores/schemas/trigger_schemas.py +1 -0
  28. zenml/zen_stores/template_utils.py +7 -3
  29. {zenml_nightly-0.82.0.dev20250509.dist-info → zenml_nightly-0.82.0.dev20250510.dist-info}/METADATA +1 -1
  30. {zenml_nightly-0.82.0.dev20250509.dist-info → zenml_nightly-0.82.0.dev20250510.dist-info}/RECORD +33 -33
  31. {zenml_nightly-0.82.0.dev20250509.dist-info → zenml_nightly-0.82.0.dev20250510.dist-info}/LICENSE +0 -0
  32. {zenml_nightly-0.82.0.dev20250509.dist-info → zenml_nightly-0.82.0.dev20250510.dist-info}/WHEEL +0 -0
  33. {zenml_nightly-0.82.0.dev20250509.dist-info → zenml_nightly-0.82.0.dev20250510.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.82.0.dev20250509
1
+ 0.82.0.dev20250510
zenml/config/compiler.py CHANGED
@@ -27,6 +27,7 @@ from typing import (
27
27
 
28
28
  from zenml import __version__
29
29
  from zenml.config.base_settings import BaseSettings, ConfigurationLevel
30
+ from zenml.config.pipeline_configurations import PipelineConfiguration
30
31
  from zenml.config.pipeline_run_configuration import PipelineRunConfiguration
31
32
  from zenml.config.pipeline_spec import PipelineSpec
32
33
  from zenml.config.settings_resolver import SettingsResolver
@@ -43,7 +44,6 @@ from zenml.pipelines.run_utils import get_default_run_name
43
44
  from zenml.utils import pydantic_utils, settings_utils
44
45
 
45
46
  if TYPE_CHECKING:
46
- from zenml.config.source import Source
47
47
  from zenml.pipelines.pipeline_definition import Pipeline
48
48
  from zenml.stack import Stack, StackComponent
49
49
  from zenml.steps.step_invocation import StepInvocation
@@ -112,21 +112,12 @@ class Compiler:
112
112
  with pipeline.__suppress_configure_warnings__():
113
113
  pipeline.configure(settings=pipeline_settings, merge=False)
114
114
 
115
- settings_to_passdown = {
116
- key: settings
117
- for key, settings in pipeline_settings.items()
118
- if ConfigurationLevel.STEP in settings.LEVEL
119
- }
120
-
121
115
  steps = {
122
116
  invocation_id: self._compile_step_invocation(
123
117
  invocation=invocation,
124
- pipeline_settings=settings_to_passdown,
125
- pipeline_extra=pipeline.configuration.extra,
126
118
  stack=stack,
127
119
  step_config=run_configuration.steps.get(invocation_id),
128
- pipeline_failure_hook_source=pipeline.configuration.failure_hook_source,
129
- pipeline_success_hook_source=pipeline.configuration.success_hook_source,
120
+ pipeline_configuration=pipeline.configuration,
130
121
  )
131
122
  for invocation_id, invocation in self._get_sorted_invocations(
132
123
  pipeline=pipeline
@@ -447,24 +438,17 @@ class Compiler:
447
438
  def _compile_step_invocation(
448
439
  self,
449
440
  invocation: "StepInvocation",
450
- pipeline_settings: Dict[str, "BaseSettings"],
451
- pipeline_extra: Dict[str, Any],
452
441
  stack: "Stack",
453
442
  step_config: Optional["StepConfigurationUpdate"],
454
- pipeline_failure_hook_source: Optional["Source"] = None,
455
- pipeline_success_hook_source: Optional["Source"] = None,
443
+ pipeline_configuration: "PipelineConfiguration",
456
444
  ) -> Step:
457
445
  """Compiles a ZenML step.
458
446
 
459
447
  Args:
460
448
  invocation: The step invocation to compile.
461
- pipeline_settings: settings configured on the
462
- pipeline of the step.
463
- pipeline_extra: Extra values configured on the pipeline of the step.
464
449
  stack: The stack on which the pipeline will be run.
465
450
  step_config: Run configuration for the step.
466
- pipeline_failure_hook_source: Source for the failure hook.
467
- pipeline_success_hook_source: Source for the success hook.
451
+ pipeline_configuration: Configuration for the pipeline.
468
452
 
469
453
  Returns:
470
454
  The compiled step.
@@ -488,32 +472,27 @@ class Compiler:
488
472
  configuration_level=ConfigurationLevel.STEP,
489
473
  stack=stack,
490
474
  )
491
- step_extra = step.configuration.extra
492
- step_on_failure_hook_source = step.configuration.failure_hook_source
493
- step_on_success_hook_source = step.configuration.success_hook_source
494
-
495
- step.configure(
496
- settings=pipeline_settings,
497
- extra=pipeline_extra,
498
- on_failure=pipeline_failure_hook_source,
499
- on_success=pipeline_success_hook_source,
500
- merge=False,
501
- )
502
475
  step.configure(
503
476
  settings=step_settings,
504
- extra=step_extra,
505
- on_failure=step_on_failure_hook_source,
506
- on_success=step_on_success_hook_source,
507
- merge=True,
477
+ merge=False,
508
478
  )
509
479
 
510
480
  parameters_to_ignore = (
511
481
  set(step_config.parameters) if step_config else set()
512
482
  )
513
- complete_step_configuration = invocation.finalize(
483
+ step_configuration_overrides = invocation.finalize(
514
484
  parameters_to_ignore=parameters_to_ignore
515
485
  )
516
- return Step(spec=step_spec, config=complete_step_configuration)
486
+ full_step_config = (
487
+ step_configuration_overrides.apply_pipeline_configuration(
488
+ pipeline_configuration=pipeline_configuration
489
+ )
490
+ )
491
+ return Step(
492
+ spec=step_spec,
493
+ config=full_step_config,
494
+ step_config_overrides=step_configuration_overrides,
495
+ )
517
496
 
518
497
  def _get_sorted_invocations(
519
498
  self,
@@ -52,23 +52,30 @@ class PipelineConfigurationUpdate(StrictBaseModel):
52
52
  retry: Optional[StepRetryConfig] = None
53
53
  substitutions: Dict[str, str] = {}
54
54
 
55
- def _get_full_substitutions(
56
- self, start_time: Optional[datetime]
55
+ def finalize_substitutions(
56
+ self, start_time: Optional[datetime] = None, inplace: bool = False
57
57
  ) -> Dict[str, str]:
58
58
  """Returns the full substitutions dict.
59
59
 
60
60
  Args:
61
61
  start_time: Start time of the pipeline run.
62
+ inplace: Whether to update the substitutions in place.
62
63
 
63
64
  Returns:
64
65
  The full substitutions dict including date and time.
65
66
  """
66
67
  if start_time is None:
67
68
  start_time = utc_now()
68
- ret = self.substitutions.copy()
69
- ret.setdefault("date", start_time.strftime("%Y_%m_%d"))
70
- ret.setdefault("time", start_time.strftime("%H_%M_%S_%f"))
71
- return ret
69
+
70
+ if inplace:
71
+ dict_ = self.substitutions
72
+ else:
73
+ dict_ = self.substitutions.copy()
74
+
75
+ dict_.setdefault("date", start_time.strftime("%Y_%m_%d"))
76
+ dict_.setdefault("time", start_time.strftime("%H_%M_%S_%f"))
77
+
78
+ return dict_
72
79
 
73
80
 
74
81
  class PipelineConfiguration(PipelineConfigurationUpdate):
@@ -13,7 +13,6 @@
13
13
  # permissions and limitations under the License.
14
14
  """Pipeline configuration classes."""
15
15
 
16
- from datetime import datetime
17
16
  from typing import (
18
17
  TYPE_CHECKING,
19
18
  Any,
@@ -46,7 +45,7 @@ from zenml.logger import get_logger
46
45
  from zenml.model.lazy_load import ModelVersionDataLazyLoader
47
46
  from zenml.model.model import Model
48
47
  from zenml.utils import deprecation_utils
49
- from zenml.utils.pydantic_utils import before_validator_handler
48
+ from zenml.utils.pydantic_utils import before_validator_handler, update_model
50
49
 
51
50
  if TYPE_CHECKING:
52
51
  from zenml.config import DockerSettings, ResourceSettings
@@ -241,23 +240,43 @@ class StepConfiguration(PartialStepConfiguration):
241
240
  model_or_dict = model_or_dict.model_dump()
242
241
  return DockerSettings.model_validate(model_or_dict)
243
242
 
244
- def _get_full_substitutions(
245
- self,
246
- pipeline_config: "PipelineConfiguration",
247
- start_time: Optional[datetime],
248
- ) -> Dict[str, str]:
249
- """Get the full set of substitutions for this step configuration.
243
+ def apply_pipeline_configuration(
244
+ self, pipeline_configuration: "PipelineConfiguration"
245
+ ) -> "StepConfiguration":
246
+ """Apply the pipeline configuration to this step configuration.
250
247
 
251
248
  Args:
252
- pipeline_config: The pipeline configuration.
253
- start_time: The start time of the pipeline run.
249
+ pipeline_configuration: The pipeline configuration to apply.
254
250
 
255
251
  Returns:
256
- The full set of substitutions for this step configuration.
252
+ The updated step configuration.
257
253
  """
258
- ret = pipeline_config._get_full_substitutions(start_time)
259
- ret.update(self.substitutions)
260
- return ret
254
+ pipeline_values = pipeline_configuration.model_dump(
255
+ include={
256
+ "settings",
257
+ "extra",
258
+ "failure_hook_source",
259
+ "success_hook_source",
260
+ "substitutions",
261
+ },
262
+ exclude_none=True,
263
+ )
264
+ if pipeline_values:
265
+ original_values = self.model_dump(
266
+ include={
267
+ "settings",
268
+ "extra",
269
+ "failure_hook_source",
270
+ "success_hook_source",
271
+ "substitutions",
272
+ },
273
+ exclude_none=True,
274
+ )
275
+
276
+ updated_config = self.model_copy(update=pipeline_values, deep=True)
277
+ return update_model(updated_config, original_values)
278
+ else:
279
+ return self.model_copy(deep=True)
261
280
 
262
281
 
263
282
  class InputSpec(StrictBaseModel):
@@ -311,3 +330,59 @@ class Step(StrictBaseModel):
311
330
 
312
331
  spec: StepSpec
313
332
  config: StepConfiguration
333
+ step_config_overrides: StepConfiguration
334
+
335
+ @model_validator(mode="before")
336
+ @classmethod
337
+ @before_validator_handler
338
+ def _add_step_config_overrides_if_missing(cls, data: Any) -> Any:
339
+ """Add step config overrides if missing.
340
+
341
+ This is to ensure backwards compatibility with data stored in the DB
342
+ before the `step_config_overrides` field was added. In that case, only
343
+ the `config` field, which contains the merged pipeline and step configs,
344
+ existed. We have no way to figure out which of those values were defined
345
+ on the step vs the pipeline level, so we just use the entire `config`
346
+ object as the `step_config_overrides`.
347
+
348
+ Args:
349
+ data: The values dict used to instantiate the model.
350
+
351
+ Returns:
352
+ The values dict with the step config overrides added if missing.
353
+ """
354
+ if "step_config_overrides" not in data:
355
+ data["step_config_overrides"] = data["config"]
356
+
357
+ return data
358
+
359
+ @classmethod
360
+ def from_dict(
361
+ cls,
362
+ data: Dict[str, Any],
363
+ pipeline_configuration: "PipelineConfiguration",
364
+ ) -> "Step":
365
+ """Create a step from a dictionary.
366
+
367
+ This method can create a step from data stored without the merged
368
+ `config` attribute, by merging the `step_config_overrides` with the
369
+ pipeline configuration.
370
+
371
+ Args:
372
+ data: The dictionary to create the `Step` object from.
373
+ pipeline_configuration: The pipeline configuration to apply to the
374
+ step configuration.
375
+
376
+ Returns:
377
+ The instantiated object.
378
+ """
379
+ if "config" not in data:
380
+ config = StepConfiguration.model_validate(
381
+ data["step_config_overrides"]
382
+ )
383
+ config = config.apply_pipeline_configuration(
384
+ pipeline_configuration
385
+ )
386
+ data["config"] = config
387
+
388
+ return cls.model_validate(data)
zenml/constants.py CHANGED
@@ -199,6 +199,7 @@ ENV_ZENML_RUN_SINGLE_STEPS_WITHOUT_STACK = (
199
199
  )
200
200
  ENV_ZENML_PREVENT_CLIENT_SIDE_CACHING = "ZENML_PREVENT_CLIENT_SIDE_CACHING"
201
201
  ENV_ZENML_DISABLE_CREDENTIALS_DISK_CACHING = "DISABLE_CREDENTIALS_DISK_CACHING"
202
+ ENV_ZENML_RUNNER_PARENT_IMAGE = "ZENML_RUNNER_PARENT_IMAGE"
202
203
  ENV_ZENML_RUNNER_IMAGE_DISABLE_UV = "ZENML_RUNNER_IMAGE_DISABLE_UV"
203
204
  ENV_ZENML_RUNNER_POD_TIMEOUT = "ZENML_RUNNER_POD_TIMEOUT"
204
205
  ENV_ZENML_WORKLOAD_TOKEN_EXPIRATION_LEEWAY = (
@@ -318,6 +318,8 @@ class ProjectScopedResponse(
318
318
  Used as a base class for all domain models that are project-scoped.
319
319
  """
320
320
 
321
+ project_id: UUID = Field(title="The project id.")
322
+
321
323
  # Analytics
322
324
  def get_analytics_metadata(self) -> Dict[str, Any]:
323
325
  """Fetches the analytics metadata for project scoped models.
@@ -710,6 +710,7 @@ class LazyArtifactVersionResponse(ArtifactVersionResponse):
710
710
  """
711
711
 
712
712
  id: Optional[UUID] = None # type: ignore[assignment]
713
+ project_id: Optional[UUID] = None # type: ignore[assignment]
713
714
  lazy_load_name: Optional[str] = None
714
715
  lazy_load_version: Optional[str] = None
715
716
  lazy_load_model_name: str
@@ -308,8 +308,8 @@ class StepLauncher:
308
308
  start_time = utc_now()
309
309
  run_name = string_utils.format_name_template(
310
310
  name_template=self._deployment.run_name_template,
311
- substitutions=self._deployment.pipeline_configuration._get_full_substitutions(
312
- start_time
311
+ substitutions=self._deployment.pipeline_configuration.finalize_substitutions(
312
+ start_time=start_time,
313
313
  ),
314
314
  )
315
315
 
@@ -72,8 +72,8 @@ def create_placeholder_run(
72
72
  run_request = PipelineRunRequest(
73
73
  name=string_utils.format_name_template(
74
74
  name_template=deployment.run_name_template,
75
- substitutions=deployment.pipeline_configuration._get_full_substitutions(
76
- start_time
75
+ substitutions=deployment.pipeline_configuration.finalize_substitutions(
76
+ start_time=start_time,
77
77
  ),
78
78
  ),
79
79
  # We set the start time on the placeholder run already to
@@ -113,6 +113,7 @@ def get_placeholder_run(
113
113
  size=1,
114
114
  deployment_id=deployment_id,
115
115
  status=ExecutionStatus.INITIALIZING,
116
+ hydrate=True,
116
117
  )
117
118
  if len(runs.items) == 0:
118
119
  return None
@@ -529,10 +529,13 @@ class StackComponent:
529
529
  else container.pipeline_configuration.settings
530
530
  )
531
531
 
532
+ # Use the current config as a base
533
+ settings_dict = self.config.model_dump()
534
+
532
535
  if key in all_settings:
533
- return self.settings_class.model_validate(dict(all_settings[key]))
534
- else:
535
- return self.settings_class()
536
+ settings_dict.update(dict(all_settings[key]))
537
+
538
+ return self.settings_class.model_validate(settings_dict)
536
539
 
537
540
  def connector_has_expired(self) -> bool:
538
541
  """Checks whether the connector linked to this stack component has expired.
@@ -373,8 +373,7 @@ def get_resource_for_model(model: AnyModel) -> Optional[Resource]:
373
373
 
374
374
  project_id: Optional[UUID] = None
375
375
  if isinstance(model, ProjectScopedResponse):
376
- # A project scoped response is always scoped to a specific project
377
- project_id = model.project.id
376
+ project_id = model.project_id
378
377
  elif isinstance(model, ProjectScopedRequest):
379
378
  # A project scoped request is always scoped to a specific project
380
379
  project_id = model.project
@@ -13,18 +13,16 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for deployments."""
15
15
 
16
- from typing import Optional, Union
16
+ from typing import Any, Optional, Union
17
17
  from uuid import UUID
18
18
 
19
- from fastapi import APIRouter, Depends, Security
19
+ from fastapi import APIRouter, Depends, Request, Security
20
20
 
21
21
  from zenml.constants import API, PIPELINE_DEPLOYMENTS, VERSION_1
22
22
  from zenml.logging.step_logging import fetch_logs
23
23
  from zenml.models import (
24
- Page,
25
24
  PipelineDeploymentFilter,
26
25
  PipelineDeploymentRequest,
27
- PipelineDeploymentResponse,
28
26
  PipelineRunFilter,
29
27
  )
30
28
  from zenml.zen_server.auth import AuthContext, authorize
@@ -45,6 +43,37 @@ from zenml.zen_server.utils import (
45
43
  zen_store,
46
44
  )
47
45
 
46
+
47
+ # TODO: Remove this as soon as there is only a low number of users running
48
+ # versions < 0.82.0. Also change back the return type to
49
+ # `PipelineDeploymentResponse` once we have removed the `exclude` logic.
50
+ def _should_remove_step_config_overrides(
51
+ request: Request,
52
+ ) -> bool:
53
+ """Check if the step config overrides should be removed from the response.
54
+
55
+ Args:
56
+ request: The request object.
57
+
58
+ Returns:
59
+ If the step config overrides should be removed from the response.
60
+ """
61
+ from packaging import version
62
+
63
+ user_agent = request.headers.get("User-Agent", "")
64
+
65
+ if not user_agent.startswith("zenml/"):
66
+ # This request is not coming from a ZenML client
67
+ return False
68
+
69
+ client_version = version.parse(user_agent.removeprefix("zenml/"))
70
+
71
+ # Versions before 0.82.0 did have `extra="forbid"` in the pydantic model
72
+ # that stores the step configurations. This means it would crash if we
73
+ # included the `step_config_overrides` in the response.
74
+ return client_version < version.parse("0.82.0")
75
+
76
+
48
77
  router = APIRouter(
49
78
  prefix=API + VERSION_1 + PIPELINE_DEPLOYMENTS,
50
79
  tags=["deployments"],
@@ -66,13 +95,15 @@ router = APIRouter(
66
95
  )
67
96
  @handle_exceptions
68
97
  def create_deployment(
98
+ request: Request,
69
99
  deployment: PipelineDeploymentRequest,
70
100
  project_name_or_id: Optional[Union[str, UUID]] = None,
71
101
  _: AuthContext = Security(authorize),
72
- ) -> PipelineDeploymentResponse:
102
+ ) -> Any:
73
103
  """Creates a deployment.
74
104
 
75
105
  Args:
106
+ request: The request object.
76
107
  deployment: Deployment to create.
77
108
  project_name_or_id: Optional name or ID of the project.
78
109
 
@@ -83,11 +114,21 @@ def create_deployment(
83
114
  project = zen_store().get_project(project_name_or_id)
84
115
  deployment.project = project.id
85
116
 
86
- return verify_permissions_and_create_entity(
117
+ deployment_response = verify_permissions_and_create_entity(
87
118
  request_model=deployment,
88
119
  create_method=zen_store().create_deployment,
89
120
  )
90
121
 
122
+ exclude = None
123
+ if _should_remove_step_config_overrides(request):
124
+ exclude = {
125
+ "metadata": {
126
+ "step_configurations": {"__all__": {"step_config_overrides"}}
127
+ }
128
+ }
129
+
130
+ return deployment_response.model_dump(mode="json", exclude=exclude)
131
+
91
132
 
92
133
  @router.get(
93
134
  "",
@@ -103,16 +144,18 @@ def create_deployment(
103
144
  )
104
145
  @handle_exceptions
105
146
  def list_deployments(
147
+ request: Request,
106
148
  deployment_filter_model: PipelineDeploymentFilter = Depends(
107
149
  make_dependable(PipelineDeploymentFilter)
108
150
  ),
109
151
  project_name_or_id: Optional[Union[str, UUID]] = None,
110
152
  hydrate: bool = False,
111
153
  _: AuthContext = Security(authorize),
112
- ) -> Page[PipelineDeploymentResponse]:
154
+ ) -> Any:
113
155
  """Gets a list of deployments.
114
156
 
115
157
  Args:
158
+ request: The request object.
116
159
  deployment_filter_model: Filter model used for pagination, sorting,
117
160
  filtering.
118
161
  project_name_or_id: Optional name or ID of the project to filter by.
@@ -125,13 +168,29 @@ def list_deployments(
125
168
  if project_name_or_id:
126
169
  deployment_filter_model.project = project_name_or_id
127
170
 
128
- return verify_permissions_and_list_entities(
171
+ page = verify_permissions_and_list_entities(
129
172
  filter_model=deployment_filter_model,
130
173
  resource_type=ResourceType.PIPELINE_DEPLOYMENT,
131
174
  list_method=zen_store().list_deployments,
132
175
  hydrate=hydrate,
133
176
  )
134
177
 
178
+ exclude = None
179
+ if _should_remove_step_config_overrides(request):
180
+ exclude = {
181
+ "items": {
182
+ "__all__": {
183
+ "metadata": {
184
+ "step_configurations": {
185
+ "__all__": {"step_config_overrides"}
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ return page.model_dump(mode="json", exclude=exclude)
193
+
135
194
 
136
195
  @router.get(
137
196
  "/{deployment_id}",
@@ -139,13 +198,15 @@ def list_deployments(
139
198
  )
140
199
  @handle_exceptions
141
200
  def get_deployment(
201
+ request: Request,
142
202
  deployment_id: UUID,
143
203
  hydrate: bool = True,
144
204
  _: AuthContext = Security(authorize),
145
- ) -> PipelineDeploymentResponse:
205
+ ) -> Any:
146
206
  """Gets a specific deployment using its unique id.
147
207
 
148
208
  Args:
209
+ request: The request object.
149
210
  deployment_id: ID of the deployment to get.
150
211
  hydrate: Flag deciding whether to hydrate the output model(s)
151
212
  by including metadata fields in the response.
@@ -153,12 +214,22 @@ def get_deployment(
153
214
  Returns:
154
215
  A specific deployment object.
155
216
  """
156
- return verify_permissions_and_get_entity(
217
+ deployment = verify_permissions_and_get_entity(
157
218
  id=deployment_id,
158
219
  get_method=zen_store().get_deployment,
159
220
  hydrate=hydrate,
160
221
  )
161
222
 
223
+ exclude = None
224
+ if _should_remove_step_config_overrides(request):
225
+ exclude = {
226
+ "metadata": {
227
+ "step_configurations": {"__all__": {"step_config_overrides"}}
228
+ }
229
+ }
230
+
231
+ return deployment.model_dump(mode="json", exclude=exclude)
232
+
162
233
 
163
234
  @router.delete(
164
235
  "/{deployment_id}",
@@ -1,7 +1,7 @@
1
1
  """Utility functions to run a pipeline from the server."""
2
2
 
3
- import copy
4
3
  import hashlib
4
+ import os
5
5
  import sys
6
6
  import threading
7
7
  from concurrent.futures import Future, ThreadPoolExecutor
@@ -17,11 +17,12 @@ from zenml.config.pipeline_configurations import PipelineConfiguration
17
17
  from zenml.config.pipeline_run_configuration import (
18
18
  PipelineRunConfiguration,
19
19
  )
20
- from zenml.config.step_configurations import Step, StepConfiguration
20
+ from zenml.config.step_configurations import Step, StepConfigurationUpdate
21
21
  from zenml.constants import (
22
22
  ENV_ZENML_ACTIVE_PROJECT_ID,
23
23
  ENV_ZENML_ACTIVE_STACK_ID,
24
24
  ENV_ZENML_RUNNER_IMAGE_DISABLE_UV,
25
+ ENV_ZENML_RUNNER_PARENT_IMAGE,
25
26
  ENV_ZENML_RUNNER_POD_TIMEOUT,
26
27
  handle_bool_env_var,
27
28
  handle_int_env_var,
@@ -47,7 +48,7 @@ from zenml.pipelines.run_utils import (
47
48
  validate_stack_is_runnable_from_server,
48
49
  )
49
50
  from zenml.stack.flavor import Flavor
50
- from zenml.utils import dict_utils, requirements_utils, settings_utils
51
+ from zenml.utils import pydantic_utils, requirements_utils, settings_utils
51
52
  from zenml.zen_server.auth import AuthContext, generate_access_token
52
53
  from zenml.zen_server.template_execution.runner_entrypoint_configuration import (
53
54
  RunnerEntrypointConfiguration,
@@ -172,7 +173,6 @@ def run_template(
172
173
  deployment_request = deployment_request_from_template(
173
174
  template=template,
174
175
  config=run_config or PipelineRunConfiguration(),
175
- user_id=auth_context.user.id,
176
176
  )
177
177
 
178
178
  ensure_async_orchestrator(deployment=deployment_request, stack=stack)
@@ -386,7 +386,10 @@ def generate_dockerfile(
386
386
  Returns:
387
387
  The Dockerfile.
388
388
  """
389
- parent_image = f"zenmldocker/zenml:{zenml_version}-py{python_version}"
389
+ parent_image = os.environ.get(
390
+ ENV_ZENML_RUNNER_PARENT_IMAGE,
391
+ f"zenmldocker/zenml:{zenml_version}-py{python_version}",
392
+ )
390
393
 
391
394
  lines = [f"FROM {parent_image}"]
392
395
  if apt_packages:
@@ -420,14 +423,12 @@ def generate_dockerfile(
420
423
  def deployment_request_from_template(
421
424
  template: RunTemplateResponse,
422
425
  config: PipelineRunConfiguration,
423
- user_id: UUID,
424
426
  ) -> "PipelineDeploymentRequest":
425
427
  """Generate a deployment request from a template.
426
428
 
427
429
  Args:
428
430
  template: The template from which to create the deployment request.
429
431
  config: The run configuration.
430
- user_id: ID of the user that is trying to run the template.
431
432
 
432
433
  Raises:
433
434
  ValueError: If there are missing/extra step parameters in the run
@@ -438,49 +439,37 @@ def deployment_request_from_template(
438
439
  """
439
440
  deployment = template.source_deployment
440
441
  assert deployment
441
- pipeline_configuration = PipelineConfiguration(
442
- **config.model_dump(
443
- include=set(PipelineConfiguration.model_fields),
444
- exclude={"name", "parameters"},
445
- ),
446
- name=deployment.pipeline_configuration.name,
447
- parameters=deployment.pipeline_configuration.parameters,
448
- )
449
442
 
450
- step_config_dict_base = pipeline_configuration.model_dump(
451
- exclude={"name", "parameters", "tags", "enable_pipeline_logs"}
443
+ pipeline_update = config.model_dump(
444
+ include=set(PipelineConfiguration.model_fields),
445
+ exclude={"name", "parameters"},
446
+ exclude_unset=True,
447
+ exclude_none=True,
448
+ )
449
+ pipeline_configuration = pydantic_utils.update_model(
450
+ deployment.pipeline_configuration, pipeline_update
452
451
  )
452
+
453
453
  steps = {}
454
454
  for invocation_id, step in deployment.step_configurations.items():
455
- step_config_dict = {
456
- **copy.deepcopy(step_config_dict_base),
457
- **step.config.model_dump(
458
- # TODO: Maybe we need to make some of these configurable via
459
- # yaml as well, e.g. the lazy loaders?
460
- include={
461
- "name",
462
- "caching_parameters",
463
- "external_input_artifacts",
464
- "model_artifacts_or_metadata",
465
- "client_lazy_loaders",
466
- "substitutions",
467
- "outputs",
468
- }
469
- ),
470
- }
471
-
472
- required_parameters = set(step.config.parameters)
473
- configured_parameters = set()
474
-
475
- if update := config.steps.get(invocation_id):
476
- update_dict = update.model_dump()
455
+ step_update = config.steps.get(
456
+ invocation_id, StepConfigurationUpdate()
457
+ ).model_dump(
477
458
  # Get rid of deprecated name to prevent overriding the step name
478
459
  # with `None`.
479
- update_dict.pop("name", None)
480
- configured_parameters = set(update.parameters)
481
- step_config_dict = dict_utils.recursive_update(
482
- step_config_dict, update=update_dict
483
- )
460
+ exclude={"name"},
461
+ exclude_unset=True,
462
+ exclude_none=True,
463
+ )
464
+ step_config = pydantic_utils.update_model(
465
+ step.step_config_overrides, step_update
466
+ )
467
+ merged_step_config = step_config.apply_pipeline_configuration(
468
+ pipeline_configuration
469
+ )
470
+
471
+ required_parameters = set(step.config.parameters)
472
+ configured_parameters = set(step_config.parameters)
484
473
 
485
474
  unknown_parameters = configured_parameters - required_parameters
486
475
  if unknown_parameters:
@@ -496,8 +485,11 @@ def deployment_request_from_template(
496
485
  f"parameters for step {invocation_id}: {missing_parameters}."
497
486
  )
498
487
 
499
- step_config = StepConfiguration.model_validate(step_config_dict)
500
- steps[invocation_id] = Step(spec=step.spec, config=step_config)
488
+ steps[invocation_id] = Step(
489
+ spec=step.spec,
490
+ config=merged_step_config,
491
+ step_config_overrides=step_config,
492
+ )
501
493
 
502
494
  code_reference_request = None
503
495
  if deployment.code_reference:
@@ -192,6 +192,7 @@ class ActionSchema(NamedSchema, table=True):
192
192
  )
193
193
  return ActionResponse(
194
194
  id=self.id,
195
+ project_id=self.project_id,
195
196
  name=self.name,
196
197
  body=body,
197
198
  metadata=metadata,
@@ -203,6 +203,7 @@ class ArtifactSchema(NamedSchema, table=True):
203
203
 
204
204
  return ArtifactResponse(
205
205
  id=self.id,
206
+ project_id=self.project_id,
206
207
  name=self.name,
207
208
  body=body,
208
209
  metadata=metadata,
@@ -437,6 +438,7 @@ class ArtifactVersionSchema(BaseSchema, RunMetadataInterface, table=True):
437
438
 
438
439
  return ArtifactVersionResponse(
439
440
  id=self.id,
441
+ project_id=self.project_id,
440
442
  body=body,
441
443
  metadata=metadata,
442
444
  resources=resources,
@@ -133,6 +133,7 @@ class CodeRepositorySchema(NamedSchema, table=True):
133
133
  )
134
134
  return CodeRepositoryResponse(
135
135
  id=self.id,
136
+ project_id=self.project_id,
136
137
  name=self.name,
137
138
  metadata=metadata,
138
139
  body=body,
@@ -165,6 +165,7 @@ class EventSourceSchema(NamedSchema, table=True):
165
165
  )
166
166
  return EventSourceResponse(
167
167
  id=self.id,
168
+ project_id=self.project_id,
168
169
  name=self.name,
169
170
  body=body,
170
171
  metadata=metadata,
@@ -228,6 +228,7 @@ class ModelSchema(NamedSchema, table=True):
228
228
 
229
229
  return ModelResponse(
230
230
  id=self.id,
231
+ project_id=self.project_id,
231
232
  name=self.name,
232
233
  body=body,
233
234
  metadata=metadata,
@@ -502,6 +503,7 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
502
503
 
503
504
  return ModelVersionResponse(
504
505
  id=self.id,
506
+ project_id=self.project_id,
505
507
  name=self.name,
506
508
  body=body,
507
509
  metadata=metadata,
@@ -169,6 +169,7 @@ class PipelineBuildSchema(BaseSchema, table=True):
169
169
  )
170
170
  return PipelineBuildResponse(
171
171
  id=self.id,
172
+ project_id=self.project_id,
172
173
  body=body,
173
174
  metadata=metadata,
174
175
  )
@@ -32,7 +32,6 @@ from zenml.models import (
32
32
  PipelineDeploymentResponseBody,
33
33
  PipelineDeploymentResponseMetadata,
34
34
  )
35
- from zenml.utils.json_utils import pydantic_encoder
36
35
  from zenml.zen_stores.schemas.base_schemas import BaseSchema
37
36
  from zenml.zen_stores.schemas.code_repository_schemas import (
38
37
  CodeReferenceSchema,
@@ -188,6 +187,14 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
188
187
  Returns:
189
188
  The created `PipelineDeploymentSchema`.
190
189
  """
190
+ # Don't include the merged config in the step configurations, we
191
+ # reconstruct it in the `to_model` method using the pipeline
192
+ # configuration.
193
+ step_configurations = {
194
+ invocation_id: step.model_dump(mode="json", exclude={"config"})
195
+ for invocation_id, step in request.step_configurations.items()
196
+ }
197
+
191
198
  client_env = json.dumps(request.client_environment)
192
199
  if len(client_env) > TEXT_FIELD_MAX_LENGTH:
193
200
  logger.warning(
@@ -208,9 +215,8 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
208
215
  run_name_template=request.run_name_template,
209
216
  pipeline_configuration=request.pipeline_configuration.model_dump_json(),
210
217
  step_configurations=json.dumps(
211
- request.step_configurations,
218
+ step_configurations,
212
219
  sort_keys=False,
213
- default=pydantic_encoder,
214
220
  ),
215
221
  client_environment=client_env,
216
222
  client_version=request.client_version,
@@ -254,8 +260,10 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
254
260
  self.pipeline_configuration
255
261
  )
256
262
  step_configurations = json.loads(self.step_configurations)
257
- for s, c in step_configurations.items():
258
- step_configurations[s] = Step.model_validate(c)
263
+ for invocation_id, step in step_configurations.items():
264
+ step_configurations[invocation_id] = Step.from_dict(
265
+ step, pipeline_configuration
266
+ )
259
267
 
260
268
  client_environment = json.loads(self.client_environment)
261
269
  if not include_python_packages:
@@ -287,6 +295,7 @@ class PipelineDeploymentSchema(BaseSchema, table=True):
287
295
  )
288
296
  return PipelineDeploymentResponse(
289
297
  id=self.id,
298
+ project_id=self.project_id,
290
299
  body=body,
291
300
  metadata=metadata,
292
301
  )
@@ -317,10 +317,6 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
317
317
  )
318
318
 
319
319
  config = deployment.pipeline_configuration
320
- new_substitutions = config._get_full_substitutions(self.start_time)
321
- config = config.model_copy(
322
- update={"substitutions": new_substitutions}
323
- )
324
320
  client_environment = deployment.client_environment
325
321
 
326
322
  stack = deployment.stack
@@ -352,6 +348,8 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
352
348
  "pipeline_configuration."
353
349
  )
354
350
 
351
+ config.finalize_substitutions(start_time=self.start_time, inplace=True)
352
+
355
353
  body = PipelineRunResponseBody(
356
354
  user=self.user.to_model() if self.user else None,
357
355
  status=ExecutionStatus(self.status),
@@ -437,6 +435,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
437
435
 
438
436
  return PipelineRunResponse(
439
437
  id=self.id,
438
+ project_id=self.project_id,
440
439
  name=self.name,
441
440
  body=body,
442
441
  metadata=metadata,
@@ -196,6 +196,7 @@ class PipelineSchema(NamedSchema, table=True):
196
196
 
197
197
  return PipelineResponse(
198
198
  id=self.id,
199
+ project_id=self.project_id,
199
200
  name=self.name,
200
201
  body=body,
201
202
  metadata=metadata,
@@ -299,6 +299,7 @@ class RunTemplateSchema(NamedSchema, table=True):
299
299
 
300
300
  return RunTemplateResponse(
301
301
  id=self.id,
302
+ project_id=self.project_id,
302
303
  name=self.name,
303
304
  body=body,
304
305
  metadata=metadata,
@@ -211,6 +211,7 @@ class ScheduleSchema(NamedSchema, RunMetadataInterface, table=True):
211
211
 
212
212
  return ScheduleResponse(
213
213
  id=self.id,
214
+ project_id=self.project_id,
214
215
  name=self.name,
215
216
  body=body,
216
217
  metadata=metadata,
@@ -171,6 +171,7 @@ class ServiceSchema(NamedSchema, table=True):
171
171
  )
172
172
  return ServiceResponse(
173
173
  id=self.id,
174
+ project_id=self.project_id,
174
175
  name=self.name,
175
176
  body=body,
176
177
  metadata=metadata,
@@ -232,9 +232,7 @@ class StepRunSchema(NamedSchema, RunMetadataInterface, table=True):
232
232
  The created StepRunResponse.
233
233
 
234
234
  Raises:
235
- ValueError: In case the step run configuration can not be loaded.
236
- RuntimeError: If the step run schema does not have a deployment_id
237
- or a step_configuration.
235
+ ValueError: In case the step run configuration is missing.
238
236
  """
239
237
  input_artifacts = {
240
238
  artifact.name: StepRunInputResponse(
@@ -252,49 +250,38 @@ class StepRunSchema(NamedSchema, RunMetadataInterface, table=True):
252
250
  artifact.artifact_version.to_model()
253
251
  )
254
252
 
255
- full_step_config = None
253
+ step = None
256
254
  if self.deployment is not None:
257
- step_configuration = json.loads(
255
+ step_configurations = json.loads(
258
256
  self.deployment.step_configurations
259
257
  )
260
- if self.name in step_configuration:
261
- full_step_config = Step.model_validate(
262
- step_configuration[self.name]
263
- )
264
- new_substitutions = (
265
- full_step_config.config._get_full_substitutions(
266
- PipelineConfiguration.model_validate_json(
267
- self.deployment.pipeline_configuration
268
- ),
269
- self.pipeline_run.start_time,
258
+ if self.name in step_configurations:
259
+ pipeline_configuration = (
260
+ PipelineConfiguration.model_validate_json(
261
+ self.deployment.pipeline_configuration
270
262
  )
271
263
  )
272
- full_step_config = full_step_config.model_copy(
273
- update={
274
- "config": full_step_config.config.model_copy(
275
- update={"substitutions": new_substitutions}
276
- )
277
- }
278
- )
279
- elif not self.step_configuration:
280
- raise ValueError(
281
- f"Unable to load the configuration for step `{self.name}` from the"
282
- f"database. To solve this please delete the pipeline run that this"
283
- f"step run belongs to. Pipeline Run ID: `{self.pipeline_run_id}`."
264
+ pipeline_configuration.finalize_substitutions(
265
+ start_time=self.pipeline_run.start_time,
266
+ inplace=True,
284
267
  )
285
-
286
- # the step configuration moved into the deployment - the following case is to ensure
287
- # backwards compatibility
288
- if full_step_config is None:
289
- if self.step_configuration:
290
- full_step_config = Step.model_validate_json(
291
- self.step_configuration
292
- )
293
- else:
294
- raise RuntimeError(
295
- "Step run model creation has failed. Each step run entry "
296
- "should either have a deployment_id or step_configuration."
268
+ step = Step.from_dict(
269
+ step_configurations[self.name],
270
+ pipeline_configuration=pipeline_configuration,
297
271
  )
272
+ if not step and self.step_configuration:
273
+ # In this legacy case, we're guaranteed to have the merged
274
+ # config stored in the DB, which means we can instantiate the
275
+ # `Step` object directly without passing the pipeline
276
+ # configuration.
277
+ step = Step.model_validate_json(self.step_configuration)
278
+ elif not step:
279
+ raise ValueError(
280
+ f"Unable to load the configuration for step `{self.name}` from "
281
+ "the database. To solve this please delete the pipeline run "
282
+ "that this step run belongs to. Pipeline Run ID: "
283
+ f"`{self.pipeline_run_id}`."
284
+ )
298
285
 
299
286
  body = StepRunResponseBody(
300
287
  user=self.user.to_model() if self.user else None,
@@ -311,8 +298,8 @@ class StepRunSchema(NamedSchema, RunMetadataInterface, table=True):
311
298
  if include_metadata:
312
299
  metadata = StepRunResponseMetadata(
313
300
  project=self.project.to_model(),
314
- config=full_step_config.config,
315
- spec=full_step_config.spec,
301
+ config=step.config,
302
+ spec=step.spec,
316
303
  cache_key=self.cache_key,
317
304
  code_hash=self.code_hash,
318
305
  docstring=self.docstring,
@@ -335,6 +322,7 @@ class StepRunSchema(NamedSchema, RunMetadataInterface, table=True):
335
322
 
336
323
  return StepRunResponse(
337
324
  id=self.id,
325
+ project_id=self.project_id,
338
326
  name=self.name,
339
327
  body=body,
340
328
  metadata=metadata,
@@ -239,6 +239,7 @@ class TriggerSchema(NamedSchema, table=True):
239
239
  )
240
240
  return TriggerResponse(
241
241
  id=self.id,
242
+ project_id=self.project_id,
242
243
  name=self.name,
243
244
  body=body,
244
245
  metadata=metadata,
@@ -96,22 +96,26 @@ def generate_config_template(
96
96
  deployment_model = deployment.to_model(include_metadata=True)
97
97
 
98
98
  steps_configs = {
99
- name: step.config.model_dump(
99
+ name: step.step_config_overrides.model_dump(
100
100
  include=set(StepConfigurationUpdate.model_fields),
101
101
  exclude={"name", "outputs"},
102
+ exclude_none=True,
103
+ exclude_defaults=True,
102
104
  )
103
105
  for name, step in deployment_model.step_configurations.items()
104
106
  }
105
107
 
106
108
  for config in steps_configs.values():
107
- config["settings"].pop("docker", None)
109
+ config.get("settings", {}).pop("docker", None)
108
110
 
109
111
  pipeline_config = deployment_model.pipeline_configuration.model_dump(
110
112
  include=set(PipelineRunConfiguration.model_fields),
111
113
  exclude={"schedule", "build", "parameters"},
114
+ exclude_none=True,
115
+ exclude_defaults=True,
112
116
  )
113
117
 
114
- pipeline_config["settings"].pop("docker", None)
118
+ pipeline_config.get("settings", {}).pop("docker", None)
115
119
 
116
120
  config_template = {
117
121
  "run_name": deployment_model.run_name_template,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.82.0.dev20250509
3
+ Version: 0.82.0.dev20250510
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,5 +1,5 @@
1
1
  zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
2
- zenml/VERSION,sha256=N0gO4bt86dg_dhEgiYxH8Ak0yGLW-basYq9JJugfjPA,19
2
+ zenml/VERSION,sha256=eaRPDCAgEJmLXLgg5v4jrpfJSgHb2NuaaKIEh_1T1tc,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
@@ -65,11 +65,11 @@ zenml/code_repositories/local_repository_context.py,sha256=1VyiYkJBDVg0iGusgRQDT
65
65
  zenml/config/__init__.py,sha256=DZEic7euSbwI9Yb3FMRQhTgfhqz-C6OdAiYmOb0-opI,1519
66
66
  zenml/config/base_settings.py,sha256=itoLqc1cOwEYhgSGdZmSKSaBevQkvYH7NQh7PUamazc,1700
67
67
  zenml/config/build_configuration.py,sha256=tEAIXwAGS8Flxo4mK5BGHsBk7LPWW16MOa6oRDymZ7k,6172
68
- zenml/config/compiler.py,sha256=jzyyTmM8nTxtpIVTSjZ-jrVOBJ1roVoJ3fs1A1nwv9M,24130
68
+ zenml/config/compiler.py,sha256=bK3LCDkrFc9SapJYH-vuQZ_o8scHNs-FdC5DblIUU4U,23024
69
69
  zenml/config/constants.py,sha256=QvSgMwXWxtspcJ45CrFDP1ZY3w6gS3bIhXLOtIDAbZA,713
70
70
  zenml/config/docker_settings.py,sha256=w62SDW2Qo5jFxcikHr8p-Lk6ymC2ieh3MnEfkte9Lf0,13322
71
71
  zenml/config/global_config.py,sha256=ZD3WodfcWMBJZOl1FNn3ztzwilGDDv9EKdHClLqSO8s,29562
72
- zenml/config/pipeline_configurations.py,sha256=hHhAyol2kE2kiFISOO-TB7wBJOpUUt4Ubv-T1holzbI,3799
72
+ zenml/config/pipeline_configurations.py,sha256=7trCbElpqGGgawii2FrdLW8fKaAWCR8jACkNqdG_vcQ,3983
73
73
  zenml/config/pipeline_run_configuration.py,sha256=Y9C5mVUH-w4gc1w1PCQFpjEmfBBpSMvb8riA_sL78hY,2311
74
74
  zenml/config/pipeline_spec.py,sha256=uWpiIfznJvXAiKs1yMIUDT1h1tYEFNO-RDVTYcIv9CE,2821
75
75
  zenml/config/resource_settings.py,sha256=0taXGHvDfXuvpMplxsuzpznB1sAvWJIGnXoVJ9-ySfw,3899
@@ -80,12 +80,12 @@ zenml/config/secrets_store_config.py,sha256=y05zqyQhr_DGrs3IfBGa_FRoZ043hSYRT5wz
80
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
- zenml/config/step_configurations.py,sha256=mngjobhHRj88f3klMdz6iw2mOj9wzYUPIV8Rp_2hV3g,10433
83
+ zenml/config/step_configurations.py,sha256=vjGtCoHneUJeaMkTiuzl7TTPBO94MefxNlFIAL1l5rU,13038
84
84
  zenml/config/step_run_info.py,sha256=KiVRSTtKmZ1GbvseDTap2imr7XwMHD3jSFVpyLNEK1I,1888
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=VI_-MR69Qxx3kEgxyRWL4Tf3wNAQyPYuJwsp6Yk59_Y,16485
88
+ zenml/constants.py,sha256=Lkm9EWkhAEwxdOuVHxSmLB6XEpa6-sw1TfKvpaVNEhk,16545
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
@@ -624,13 +624,13 @@ zenml/models/v2/base/base.py,sha256=Oz6iWCaJw1ykoYe2tTvGJqalGmDp0tRS9r1NpBx8WsM,
624
624
  zenml/models/v2/base/base_plugin_flavor.py,sha256=BfPL4gm5i7ad7_vuRmPtC-rE2kl0W_8SmpWme8Akv1c,2608
625
625
  zenml/models/v2/base/filter.py,sha256=hNPUR_BJ0vomb9fgB8D64p8nHMUAvS7Izv3BHFQ6bh4,40834
626
626
  zenml/models/v2/base/page.py,sha256=yBpWB-8iUmyRwXKSJvX3v9SB7WOnyRa25O8SAss24xk,2601
627
- zenml/models/v2/base/scoped.py,sha256=28OEN7Y0zINvVSqD_ATpeVvAEjqw6aGCbvaO7N_3o4g,22499
627
+ zenml/models/v2/base/scoped.py,sha256=XxBqIJnj8QYUjAdLE4uGIj1euG0BMbO9pmBTmbzdKgQ,22554
628
628
  zenml/models/v2/core/__init__.py,sha256=LGMIUJi19sOsvo54roZSQwDp_czNQYtenqd_frTLIhU,613
629
629
  zenml/models/v2/core/action.py,sha256=IsgL4y9MUqEEbSNRSx03J9Bnv1uurOwLq7V2Jz9Kjnc,7887
630
630
  zenml/models/v2/core/action_flavor.py,sha256=DlGlJTOcgLSDYAsrbAyXOJVdo7X2GYTFQTTEG5BEf-Q,1718
631
631
  zenml/models/v2/core/api_key.py,sha256=0iye9ftNk-Gjg4izZqYqbNgF1UR51WdRfasiAE2TqPw,11536
632
632
  zenml/models/v2/core/artifact.py,sha256=m8Tw_DNaum3P-jP7pV2GdHvvv0EbsLkpwEbUx9JDMNM,8084
633
- zenml/models/v2/core/artifact_version.py,sha256=PQRWWkOHztQVNUBDhe2pTcHr_kNMnYjYQXRh69zWqXk,23565
633
+ zenml/models/v2/core/artifact_version.py,sha256=vkzVWN7cJ9go8D_vIHbKG-pn3TA7LSMbg-09tbxB67M,23631
634
634
  zenml/models/v2/core/artifact_visualization.py,sha256=milAHTpfuYd8Dx_oB4hcPYJL-TMoiU0FwUI0UhB3F-E,3115
635
635
  zenml/models/v2/core/code_reference.py,sha256=9xy3Gzychq16lLUs01va3gGfwdu-AMrFgys_ua89uFY,3557
636
636
  zenml/models/v2/core/code_repository.py,sha256=qMqHF4uU2LkSShdBKb14Sg3XLGHLd7aMUEOyc_H0uZs,5556
@@ -690,7 +690,7 @@ zenml/orchestrators/local_docker/__init__.py,sha256=k8J68ydy6HmmvE9tWo32g761H8P_
690
690
  zenml/orchestrators/local_docker/local_docker_orchestrator.py,sha256=4b4oiCQ_PnfzgsHZuGrWeVEvjsrq_0yvVqtBUqz3Ai4,9353
691
691
  zenml/orchestrators/output_utils.py,sha256=01vqke1ZfmfuLpgxNerF-QL2wA0VPv1zUdvlMw0OwUY,3508
692
692
  zenml/orchestrators/publish_utils.py,sha256=_77t2sVq3Tm-yAYg2NPxcCD7Y8lwe0lm55NNrtMUzQQ,4741
693
- zenml/orchestrators/step_launcher.py,sha256=b0TWQRjhEAMylKf6H4W29PSyOAoGQzc2J89RIQ3OkdY,17846
693
+ zenml/orchestrators/step_launcher.py,sha256=YOeQtvmI__c8ugrqk2KSyITYVOxoLIAZxUIxkLyv-UY,17857
694
694
  zenml/orchestrators/step_run_utils.py,sha256=7GOWAW3izFopGPkvvjYyJKiYgYuHuHJ8V6eZfwjAx8E,13401
695
695
  zenml/orchestrators/step_runner.py,sha256=EUgKG_g0fOQ6gnB1hPSSa6UXwUKVkguC-Yj-Q0yEQXg,26632
696
696
  zenml/orchestrators/topsort.py,sha256=D8evz3X47zwpXd90NMLsJD-_uCeXtV6ClzNfDUrq7cM,5784
@@ -701,7 +701,7 @@ zenml/pipelines/build_utils.py,sha256=FYflpfK8i9jLgy8Ybr2dhQZarUDA1_0shvEARPkBMY
701
701
  zenml/pipelines/pipeline_context.py,sha256=4BixReLcPo33VtNBDrMwnJqjKTinHjmO5AOfmoeIOQM,3659
702
702
  zenml/pipelines/pipeline_decorator.py,sha256=LB21QYrbFeBdUGwKBUNbdpXAxO4OOtYl5Vs_mzJNXqU,4600
703
703
  zenml/pipelines/pipeline_definition.py,sha256=954y2DmoY9luHhutC2nVRXzZ_KLnTWFnS5LSzrq_OZo,59637
704
- zenml/pipelines/run_utils.py,sha256=nY56k7ITTCkRt6ejPRKIXtSU8EIK1BEJb6w-4lR4QPA,12282
704
+ zenml/pipelines/run_utils.py,sha256=uhccBmXcS_4GkIV33wom4R9bT_AKHr385DXnHAN8iGo,12315
705
705
  zenml/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
706
706
  zenml/plugins/base_plugin_flavor.py,sha256=88IxFW91UB_rQ8xPlfRnIhIJh7A308NEq2epMMdlOng,2530
707
707
  zenml/plugins/plugin_flavor_registry.py,sha256=LsN2Q0K-7EQ9H4uvlEG62Y0C1_Ro1UwppX4cnGbEcOA,10862
@@ -736,7 +736,7 @@ zenml/stack/authentication_mixin.py,sha256=_Rn6SurHnyBuU_CJBOkwPR305yQFfqN60t6nE
736
736
  zenml/stack/flavor.py,sha256=wFLjajCw_G2NMR2UJzEGH2dcLj1dvmU9dDI5iS8b9rk,10544
737
737
  zenml/stack/flavor_registry.py,sha256=IL0fRrxxQJ9YkCYCeADP7nwWEQo4XBElJY4owMjKGbQ,6108
738
738
  zenml/stack/stack.py,sha256=3mLGNBuep0PeBcoFfOEaB6Ya206yav1ppiH5YEjp9xA,33042
739
- zenml/stack/stack_component.py,sha256=hPlAOpNTUteoCkicMHEnHFOXPMbMLzPhxKN0Kt_CLWk,29244
739
+ zenml/stack/stack_component.py,sha256=D6rSPvbOIiTCX0k1iLfdnmPwycPf2jnnkcMY2xCnZiA,29327
740
740
  zenml/stack/stack_validator.py,sha256=hWbvvGIeWLj6NwSsF4GCc6RAxAWvxHXTcBZL9nJvcak,3111
741
741
  zenml/stack/utils.py,sha256=CHs9rxdqHkUT12KPhJX1YPtIWnZBoVlRlq5PzNymq3E,6406
742
742
  zenml/stack_deployments/__init__.py,sha256=-7593cQ_ZgRn774Ol-8AKXXQquIU4DSiaThVEr6TfWM,644
@@ -1024,7 +1024,7 @@ zenml/zen_server/rbac/endpoint_utils.py,sha256=l6V6DwsPGmT6dLJmY4MHMRfRXdc0lZVib
1024
1024
  zenml/zen_server/rbac/models.py,sha256=Xhz0XqmVqg3ji9uTwjlhQ4IuQ2ivrT4gVdHi5ZkjFC4,4933
1025
1025
  zenml/zen_server/rbac/rbac_interface.py,sha256=VPMNnUIPcqJWDngITX6cfaPlM6zJwzCApXAnT_oaxSQ,3431
1026
1026
  zenml/zen_server/rbac/rbac_sql_zen_store.py,sha256=djGycBkciChk48q8oL7mHM0c-cHJM-S7inv5f3gcDgg,5942
1027
- zenml/zen_server/rbac/utils.py,sha256=8hBvCGWnz517hL5gn53dcjcrKePE2OGqZV_ojJ8XZEw,24329
1027
+ zenml/zen_server/rbac/utils.py,sha256=09r1dSZ04hcag21rg6Ug2fMCdYfNjSBnx_W8C336GzE,24254
1028
1028
  zenml/zen_server/rbac/zenml_cloud_rbac.py,sha256=L1Tio4IcNNxNWnVpAqBWYgdVfrqR20ddvdhWAo1i3f4,6055
1029
1029
  zenml/zen_server/routers/__init__.py,sha256=ViyAhWL-ogHxE9wBvB_iMcur5H1NRVrzXkpogVY7FBA,641
1030
1030
  zenml/zen_server/routers/actions_endpoints.py,sha256=MFausi27i5QBB5s4vbjQQTVqFiRlk5jF5lRM6vsRM2o,9422
@@ -1039,7 +1039,7 @@ zenml/zen_server/routers/logs_endpoints.py,sha256=qq7vLfJzmjIZ9C4DSw_IPjqHi5LdPb
1039
1039
  zenml/zen_server/routers/model_versions_endpoints.py,sha256=VhmBUuMFef8bXvDIRncPD5hLa851lmIvmASI_lw2F5o,15483
1040
1040
  zenml/zen_server/routers/models_endpoints.py,sha256=Bh_f7wvw1ZNwmZ51LRiiz3ftatkp_J5t622bJinmOaY,5680
1041
1041
  zenml/zen_server/routers/pipeline_builds_endpoints.py,sha256=PQRSrDcyor6laZyOl74BODcdg0JSdFr-hbNvEJkJIG0,5333
1042
- zenml/zen_server/routers/pipeline_deployments_endpoints.py,sha256=-art7WP8X1LzSaPPDZe484fZWLcJhnutltTiK5bx73s,7361
1042
+ zenml/zen_server/routers/pipeline_deployments_endpoints.py,sha256=f45O7dQqZnFWA7C62N5VGAtBsqpt38cRYsGgTaBS3Dw,9534
1043
1043
  zenml/zen_server/routers/pipelines_endpoints.py,sha256=R6OM-0Tc6ZNPzQmLs5MWTJIE4FaksHt6xuDqCBtmr1U,7782
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
@@ -1064,7 +1064,7 @@ 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=jx_FdkrXKI-LOG1DykedhpNPwoUm_iFDJF9r1UVaE_o,19680
1067
+ zenml/zen_server/template_execution/utils.py,sha256=6a62U0hLDe79xLbZM-WbzY-miOeTejQ7vpIkmch0ggU,19086
1068
1068
  zenml/zen_server/template_execution/workload_manager_interface.py,sha256=CL9c7z8ajuZE01DaHmdCDCZmsroDcTarvN-nE8jv6qQ,2590
1069
1069
  zenml/zen_server/utils.py,sha256=yOwPI0DxzDIxF7Ppnty_DuGMWYJ_ubHUNWfbTQ1_q9Q,18461
1070
1070
  zenml/zen_server/zen_server_api.py,sha256=1_YHOUmBulXuHWCxDLYtDCMxGze159UmU3f05643PSg,18182
@@ -1274,36 +1274,36 @@ zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_length
1274
1274
  zenml/zen_stores/migrations/versions/ff538a321a92_migrate_onboarding_state.py,sha256=gsUFLJQ32_o9U35JCVqkqJVVk-zfq3yel25hXhzVFm4,3829
1275
1275
  zenml/zen_stores/rest_zen_store.py,sha256=-Xjw9QTY6lvgp5mDE4bBIhU_ANADS83Si88xMcLTFIE,158371
1276
1276
  zenml/zen_stores/schemas/__init__.py,sha256=4EXqExiVyxdnGxhQ_Hz79mOdRuMD0LsGlw0PaP2Ef6o,4333
1277
- zenml/zen_stores/schemas/action_schemas.py,sha256=2OiUiskFSg5qXGxA6AFq71bWzUczxA563LGFokLZmac,6456
1277
+ zenml/zen_stores/schemas/action_schemas.py,sha256=sv2J2TP12MeyGPQR2JsOPIivbPQ5OImg64exYS7CZBM,6496
1278
1278
  zenml/zen_stores/schemas/api_key_schemas.py,sha256=0pK7b9HlJuQL3DuKT4eGjFb87tyd4x-E2VyxJLpRv3o,7459
1279
- zenml/zen_stores/schemas/artifact_schemas.py,sha256=alVpqfaovnZLy4Xl0kPICVOd9OIQGUSftpirRTzMktg,16008
1279
+ zenml/zen_stores/schemas/artifact_schemas.py,sha256=wefj8m1RUeTrfU3rJwFYKYkdJq5Ycpqxm_zbbFrOCvI,16088
1280
1280
  zenml/zen_stores/schemas/artifact_visualization_schemas.py,sha256=zv_Mg--WMTtAPEy5PXIkZlxq-oLrXZNLHXb_YgZbm0g,3667
1281
1281
  zenml/zen_stores/schemas/base_schemas.py,sha256=-MDYnS4ZLDe6x75nTXuVrOSbcYOuECLNk-yxjfEdJh4,2043
1282
- zenml/zen_stores/schemas/code_repository_schemas.py,sha256=cJh4LMtGGSEsZftUYVJIrwSDpYZrTyxQw5k3AJYRTX0,7622
1282
+ zenml/zen_stores/schemas/code_repository_schemas.py,sha256=24g-ZyuW9buDhGTJ_5B2WXVv6waBAtwH6X1DNdIzEbA,7662
1283
1283
  zenml/zen_stores/schemas/component_schemas.py,sha256=sk_xs0OGInStSJltMPbVaktnVUk_oC5oX0R3ClkPeS8,7948
1284
1284
  zenml/zen_stores/schemas/constants.py,sha256=bcadtiWEWkpzRzvnj46yuAaC7DE09g2H9L9r398lV00,704
1285
1285
  zenml/zen_stores/schemas/device_schemas.py,sha256=voVBknm14NmFpij1EGb_HhVlUng0cglCMXkYSxDRq1s,9126
1286
- zenml/zen_stores/schemas/event_source_schemas.py,sha256=st706lmxNiQx0qT7jBFApbqogJC7KuwnsRuQ2DCpxy8,6555
1286
+ zenml/zen_stores/schemas/event_source_schemas.py,sha256=Psj2xcPLN30MEDiihrEahJGh4jL4N7XwxzXvPDzbQRw,6595
1287
1287
  zenml/zen_stores/schemas/flavor_schemas.py,sha256=jlEhhhpqvhzsdwShE_J3mJ7sqgfRKou6KKAh6bOvhkM,4690
1288
1288
  zenml/zen_stores/schemas/logs_schemas.py,sha256=qv6fs3JiVgzlmTXJqb_gG5NsU5q_50e0167JiWIxR14,3588
1289
- zenml/zen_stores/schemas/model_schemas.py,sha256=5QqdQYXoe-XjFBg-LtugJG8314avcqZRD7RKDhmrHgs,25500
1290
- zenml/zen_stores/schemas/pipeline_build_schemas.py,sha256=O13x8VPPZ3FirX9wkRLZD3IdvQpfohh4935qxXjgf24,5842
1291
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py,sha256=rJEnDbHqFwLfdJmEm2wZ6Gy2uxpaQ5Gzo8dt8i3GSTM,10867
1292
- zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=XDwLVYhnXGEhLSwAXLooJEf_EHzPQ64xvC2Hzj4aoWs,18681
1293
- zenml/zen_stores/schemas/pipeline_schemas.py,sha256=oC0A4zE22DXiX3jl7fDM7dHTTbwQcfvemC8OaX5TGg4,7133
1289
+ zenml/zen_stores/schemas/model_schemas.py,sha256=RpW78rHclJ7hyq789F6R6VUrluPWLvtpfpBTTgwGx5Y,25580
1290
+ zenml/zen_stores/schemas/pipeline_build_schemas.py,sha256=zAF8OVAAPgAeg-pmihlayIljwiAj3eoF7GVCCGNnP68,5882
1291
+ zenml/zen_stores/schemas/pipeline_deployment_schemas.py,sha256=FBXkV19_KhpjRYTkx3QkfK07WdVTbjkiotydsQVS71I,11253
1292
+ zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=quxso7FC-VxxBiJyrDjpDsE-ZtfDxWw2XIay-cla1Vg,18608
1293
+ zenml/zen_stores/schemas/pipeline_schemas.py,sha256=5m4IyFu8bSF4kqMIeu9cJl04mjlAoAqX6CMLUQoFCp4,7173
1294
1294
  zenml/zen_stores/schemas/project_schemas.py,sha256=X2GClPNQz0COsEZX8xI-I8Sm68Hb6f20Obm24mQyLS0,6013
1295
1295
  zenml/zen_stores/schemas/run_metadata_schemas.py,sha256=G94rT4ldluMSnf9rm7R_9rw_GlgaAyq72ptkHl0gHeg,3605
1296
- zenml/zen_stores/schemas/run_template_schemas.py,sha256=sM3pcegx7qOs5tlwqVnFvc7JmWcSPOFxmk7LAndnwdY,10043
1297
- zenml/zen_stores/schemas/schedule_schema.py,sha256=E9hmq8-PBRHxEH5UYEpD_Oc2cHkNp4FG0sTvhiLZ6D4,7653
1296
+ zenml/zen_stores/schemas/run_template_schemas.py,sha256=WVi_B4wFzoCtHOsRhb8qOONUih1vGGxanviefW8uKKg,10083
1297
+ zenml/zen_stores/schemas/schedule_schema.py,sha256=DdVXlNn62tg5m2gqKAuWhIvvl8y-MQBjIplUapYPvQQ,7693
1298
1298
  zenml/zen_stores/schemas/schema_utils.py,sha256=Xahifq2fJ5szXCM00ZZ6461Div9Suatzl6sy9hVhPkk,3612
1299
1299
  zenml/zen_stores/schemas/secret_schemas.py,sha256=HrihLSUPJKmWbQHogGmi6e0lYPoQHUGWGRl69sLnZMk,9430
1300
1300
  zenml/zen_stores/schemas/server_settings_schemas.py,sha256=usBE-idRrmK-LeLN0zDtCRCGP51YTnyKfIx5GZ0_ATg,4275
1301
1301
  zenml/zen_stores/schemas/service_connector_schemas.py,sha256=kNJ6TmM2RA16wc73zusosHxWUm6gVpyowlY_OJv-Oww,9709
1302
- zenml/zen_stores/schemas/service_schemas.py,sha256=yg9OJ2QWa1qQy_gqraGvN3JQrOJDLjhkSL-UVSFJy-s,9517
1302
+ zenml/zen_stores/schemas/service_schemas.py,sha256=X9Z8yYM6AmOC69EO8kmWDU9EnO_KW10CXrQzM6EQ2Rc,9557
1303
1303
  zenml/zen_stores/schemas/stack_schemas.py,sha256=SkMspxsnR420KU4mZlulPbEOR4DMSRyrcspe3HSYjHc,5393
1304
- zenml/zen_stores/schemas/step_run_schemas.py,sha256=NuJtCXZ_Zacz4_X7GZ5PQ-fLpzVBhnhScGx2fBqAlDg,16333
1304
+ zenml/zen_stores/schemas/step_run_schemas.py,sha256=xZc7ABtwcCdzulw06_OHLva2XGRl_NI7HjeuN1ae71M,15762
1305
1305
  zenml/zen_stores/schemas/tag_schemas.py,sha256=GMKdyT5pZb977vscOW41N2beVt-IHcELSiSSIBHqlUI,6377
1306
- zenml/zen_stores/schemas/trigger_schemas.py,sha256=IOfd6enpAr9mwN5p4KbA2jvQEHlMEUXDXAMqIULS4lc,10711
1306
+ zenml/zen_stores/schemas/trigger_schemas.py,sha256=KfEQlXZh537cieEwvqY9g4VifG7PfAdll_BPZ5Q9xBA,10751
1307
1307
  zenml/zen_stores/schemas/user_schemas.py,sha256=wLSHtfjjrYBWnX_PXv5KPz_DRdheTxZVjcgBe-cP__c,11497
1308
1308
  zenml/zen_stores/schemas/utils.py,sha256=82-LQj1EV4jp69kKE2GolQw_zTDBvAkyA4cHDaSIj6U,4160
1309
1309
  zenml/zen_stores/secrets_stores/__init__.py,sha256=VGMVerFv3xUWxnp5X_bHyQJwGCeN7BTovUDwho_w-4w,651
@@ -1316,10 +1316,10 @@ zenml/zen_stores/secrets_stores/secrets_store_interface.py,sha256=Q2Jbnt2Pp7NGlR
1316
1316
  zenml/zen_stores/secrets_stores/service_connector_secrets_store.py,sha256=S87ne23D08PAwtfRVlVnBn8R0ilTpEh6r8blauNV5WQ,6941
1317
1317
  zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=LPFW757WCJLP1S8vrvjsrl2Tf1yo281xUTjSBsos4qk,8788
1318
1318
  zenml/zen_stores/sql_zen_store.py,sha256=biOoDb2_zYmpsN-J-FSlKICYdwM9KDIe-_KN_yDf_mA,441414
1319
- zenml/zen_stores/template_utils.py,sha256=GWBP5QEOyvhzndS_MLPmvh28sQaOPpPoZFXCIX9CRL4,9065
1319
+ zenml/zen_stores/template_utils.py,sha256=GbJ7LgGVYHSCKPEA8RNTxPoVTWqpC77F_lGzjJ4O1Fw,9220
1320
1320
  zenml/zen_stores/zen_store_interface.py,sha256=fF_uL_FplnvGvM5o3jOQ8i1zHXhuhKLL2n4nvIKSR7E,92090
1321
- zenml_nightly-0.82.0.dev20250509.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1322
- zenml_nightly-0.82.0.dev20250509.dist-info/METADATA,sha256=hp3yQJ8a4QIIXoLyCUlSkrCGaQs3SG09N2E4s_EEsCY,24315
1323
- zenml_nightly-0.82.0.dev20250509.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1324
- zenml_nightly-0.82.0.dev20250509.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1325
- zenml_nightly-0.82.0.dev20250509.dist-info/RECORD,,
1321
+ zenml_nightly-0.82.0.dev20250510.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1322
+ zenml_nightly-0.82.0.dev20250510.dist-info/METADATA,sha256=Gobb7aYkERWvhJCiqbTdtpK4tJxcDNu7tpg9qxRo6cY,24315
1323
+ zenml_nightly-0.82.0.dev20250510.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1324
+ zenml_nightly-0.82.0.dev20250510.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1325
+ zenml_nightly-0.82.0.dev20250510.dist-info/RECORD,,