zenml-nightly 0.73.0.dev20250205__py3-none-any.whl → 0.73.0.dev20250206__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.73.0.dev20250205
1
+ 0.73.0.dev20250206
zenml/cli/utils.py CHANGED
@@ -18,6 +18,7 @@ import json
18
18
  import os
19
19
  import platform
20
20
  import re
21
+ import shutil
21
22
  import subprocess
22
23
  import sys
23
24
  from typing import (
@@ -1048,22 +1049,18 @@ def install_packages(
1048
1049
  # just return without doing anything
1049
1050
  return
1050
1051
 
1051
- pip_command = ["uv", "pip"] if use_uv else ["pip"]
1052
- if upgrade:
1053
- command = (
1054
- [
1055
- sys.executable,
1056
- "-m",
1057
- ]
1058
- + pip_command
1059
- + [
1060
- "install",
1061
- "--upgrade",
1062
- ]
1063
- + packages
1064
- )
1052
+ if use_uv and not is_installed_in_python_environment("uv"):
1053
+ # If uv is installed globally, don't run as a python module
1054
+ command = []
1065
1055
  else:
1066
- command = [sys.executable, "-m"] + pip_command + ["install"] + packages
1056
+ command = [sys.executable, "-m"]
1057
+
1058
+ command += ["uv", "pip", "install"] if use_uv else ["pip", "install"]
1059
+
1060
+ if upgrade:
1061
+ command += ["--upgrade"]
1062
+
1063
+ command += packages
1067
1064
 
1068
1065
  if not IS_DEBUG_ENV:
1069
1066
  quiet_flag = "-q" if use_uv else "-qqq"
@@ -1094,62 +1091,54 @@ def uninstall_package(package: str, use_uv: bool = False) -> None:
1094
1091
  package: The package to uninstall.
1095
1092
  use_uv: Whether to use uv for package uninstallation.
1096
1093
  """
1097
- pip_command = ["uv", "pip"] if use_uv else ["pip"]
1098
- quiet_flag = "-q" if use_uv else "-qqq"
1099
-
1100
- if use_uv:
1101
- subprocess.check_call(
1102
- [
1103
- sys.executable,
1104
- "-m",
1105
- ]
1106
- + pip_command
1107
- + [
1108
- "uninstall",
1109
- quiet_flag,
1110
- package,
1111
- ]
1112
- )
1094
+ if use_uv and not is_installed_in_python_environment("uv"):
1095
+ # If uv is installed globally, don't run as a python module
1096
+ command = []
1113
1097
  else:
1114
- subprocess.check_call(
1115
- [
1116
- sys.executable,
1117
- "-m",
1118
- ]
1119
- + pip_command
1120
- + [
1121
- "uninstall",
1122
- quiet_flag,
1123
- "-y",
1124
- package,
1125
- ]
1126
- )
1098
+ command = [sys.executable, "-m"]
1127
1099
 
1100
+ command += (
1101
+ ["uv", "pip", "uninstall", "-q"]
1102
+ if use_uv
1103
+ else ["pip", "uninstall", "-y", "-qqq"]
1104
+ )
1105
+ command += [package]
1128
1106
 
1129
- def is_uv_installed() -> bool:
1130
- """Check if uv is installed in the current environment.
1107
+ subprocess.check_call(command)
1108
+
1109
+
1110
+ def is_installed_in_python_environment(package: str) -> bool:
1111
+ """Check if a package is installed in the current python environment.
1112
+
1113
+ Args:
1114
+ package: The package to check.
1131
1115
 
1132
1116
  Returns:
1133
- True if uv is installed, False otherwise.
1117
+ True if the package is installed, False otherwise.
1134
1118
  """
1135
1119
  try:
1136
- pkg_resources.get_distribution("uv")
1120
+ pkg_resources.get_distribution(package)
1137
1121
  return True
1138
1122
  except pkg_resources.DistributionNotFound:
1139
1123
  return False
1140
1124
 
1141
1125
 
1126
+ def is_uv_installed() -> bool:
1127
+ """Check if uv is installed.
1128
+
1129
+ Returns:
1130
+ True if uv is installed, False otherwise.
1131
+ """
1132
+ return shutil.which("uv") is not None
1133
+
1134
+
1142
1135
  def is_pip_installed() -> bool:
1143
1136
  """Check if pip is installed in the current environment.
1144
1137
 
1145
1138
  Returns:
1146
1139
  True if pip is installed, False otherwise.
1147
1140
  """
1148
- try:
1149
- pkg_resources.get_distribution("pip")
1150
- return True
1151
- except pkg_resources.DistributionNotFound:
1152
- return False
1141
+ return is_installed_in_python_environment("pip")
1153
1142
 
1154
1143
 
1155
1144
  def pretty_print_secret(
zenml/client.py CHANGED
@@ -3821,7 +3821,7 @@ class Client(metaclass=ClientMetaClass):
3821
3821
  templatable: Optional[bool] = None,
3822
3822
  tag: Optional[str] = None,
3823
3823
  user: Optional[Union[UUID, str]] = None,
3824
- run_metadata: Optional[Dict[str, str]] = None,
3824
+ run_metadata: Optional[Dict[str, Any]] = None,
3825
3825
  pipeline: Optional[Union[UUID, str]] = None,
3826
3826
  code_repository: Optional[Union[UUID, str]] = None,
3827
3827
  model: Optional[Union[UUID, str]] = None,
@@ -3974,6 +3974,7 @@ class Client(metaclass=ClientMetaClass):
3974
3974
  user: Optional[Union[UUID, str]] = None,
3975
3975
  model_version_id: Optional[Union[str, UUID]] = None,
3976
3976
  model: Optional[Union[UUID, str]] = None,
3977
+ run_metadata: Optional[Dict[str, Any]] = None,
3977
3978
  hydrate: bool = False,
3978
3979
  ) -> Page[StepRunResponse]:
3979
3980
  """List all pipelines.
@@ -4000,6 +4001,7 @@ class Client(metaclass=ClientMetaClass):
4000
4001
  cache_key: The cache key of the step run to filter by.
4001
4002
  code_hash: The code hash of the step run to filter by.
4002
4003
  status: The name of the run to filter by.
4004
+ run_metadata: Filter by run metadata.
4003
4005
  hydrate: Flag deciding whether to hydrate the output model(s)
4004
4006
  by including metadata fields in the response.
4005
4007
 
@@ -4028,6 +4030,7 @@ class Client(metaclass=ClientMetaClass):
4028
4030
  user=user,
4029
4031
  model_version_id=model_version_id,
4030
4032
  model=model,
4033
+ run_metadata=run_metadata,
4031
4034
  )
4032
4035
  step_run_filter_model.set_scope_workspace(self.active_workspace.id)
4033
4036
  return self.zen_store.list_run_steps(
@@ -4254,7 +4257,7 @@ class Client(metaclass=ClientMetaClass):
4254
4257
  user: Optional[Union[UUID, str]] = None,
4255
4258
  model: Optional[Union[UUID, str]] = None,
4256
4259
  pipeline_run: Optional[Union[UUID, str]] = None,
4257
- run_metadata: Optional[Dict[str, str]] = None,
4260
+ run_metadata: Optional[Dict[str, Any]] = None,
4258
4261
  tag: Optional[str] = None,
4259
4262
  hydrate: bool = False,
4260
4263
  ) -> Page[ArtifactVersionResponse]:
@@ -4320,6 +4323,7 @@ class Client(metaclass=ClientMetaClass):
4320
4323
  user=user,
4321
4324
  model=model,
4322
4325
  pipeline_run=pipeline_run,
4326
+ run_metadata=run_metadata,
4323
4327
  )
4324
4328
  artifact_version_filter_model.set_scope_workspace(
4325
4329
  self.active_workspace.id
zenml/models/__init__.py CHANGED
@@ -28,6 +28,7 @@ from zenml.models.v2.base.base import (
28
28
  BaseDatedResponseBody,
29
29
  )
30
30
  from zenml.models.v2.base.scoped import (
31
+ TaggableFilter,
31
32
  UserScopedRequest,
32
33
  UserScopedFilter,
33
34
  UserScopedResponse,
@@ -39,7 +40,7 @@ from zenml.models.v2.base.scoped import (
39
40
  WorkspaceScopedResponseBody,
40
41
  WorkspaceScopedResponseMetadata,
41
42
  WorkspaceScopedResponseResources,
42
- WorkspaceScopedTaggableFilter,
43
+ WorkspaceScopedFilter,
43
44
  )
44
45
  from zenml.models.v2.base.filter import (
45
46
  BaseFilter,
@@ -497,12 +498,13 @@ __all__ = [
497
498
  "WorkspaceScopedResponseBody",
498
499
  "WorkspaceScopedResponseMetadata",
499
500
  "WorkspaceScopedResponseResources",
500
- "WorkspaceScopedTaggableFilter",
501
+ "WorkspaceScopedFilter",
501
502
  "BaseFilter",
502
503
  "StrFilter",
503
504
  "BoolFilter",
504
505
  "NumericFilter",
505
506
  "UUIDFilter",
507
+ "TaggableFilter",
506
508
  "Page",
507
509
  # V2 Core
508
510
  "ActionFilter",
@@ -171,6 +171,8 @@ class BoolFilter(Filter):
171
171
  class StrFilter(Filter):
172
172
  """Filter for all string fields."""
173
173
 
174
+ json_encode_value: bool = False
175
+
174
176
  ALLOWED_OPS: ClassVar[List[str]] = [
175
177
  GenericFilterOps.EQUALS,
176
178
  GenericFilterOps.NOT_EQUALS,
@@ -211,16 +213,6 @@ class StrFilter(Filter):
211
213
  Raises:
212
214
  ValueError: the comparison of the column to a numeric value fails.
213
215
  """
214
- if self.operation == GenericFilterOps.CONTAINS:
215
- return column.like(f"%{self.value}%")
216
- if self.operation == GenericFilterOps.STARTSWITH:
217
- return column.startswith(f"{self.value}")
218
- if self.operation == GenericFilterOps.ENDSWITH:
219
- return column.endswith(f"{self.value}")
220
- if self.operation == GenericFilterOps.NOT_EQUALS:
221
- return column != self.value
222
- if self.operation == GenericFilterOps.ONEOF:
223
- return column.in_(self.value)
224
216
  if self.operation in {
225
217
  GenericFilterOps.GT,
226
218
  GenericFilterOps.LT,
@@ -254,7 +246,33 @@ class StrFilter(Filter):
254
246
  f"value '{self.value}' (must be numeric): {e}"
255
247
  )
256
248
 
257
- return column == self.value
249
+ if self.operation == GenericFilterOps.ONEOF:
250
+ assert isinstance(self.value, list)
251
+ # Convert the list of values to a list of json strings
252
+ json_list = (
253
+ [json.dumps(v) for v in self.value]
254
+ if self.json_encode_value
255
+ else self.value
256
+ )
257
+ return column.in_(json_list)
258
+
259
+ # Don't convert the value to a json string if the operation is contains
260
+ # because the quotes around strings will mess with the comparison
261
+ if self.operation == GenericFilterOps.CONTAINS:
262
+ return column.like(f"%{self.value}%")
263
+
264
+ json_value = (
265
+ json.dumps(self.value) if self.json_encode_value else self.value
266
+ )
267
+
268
+ if self.operation == GenericFilterOps.STARTSWITH:
269
+ return column.startswith(f"{json_value}")
270
+ if self.operation == GenericFilterOps.ENDSWITH:
271
+ return column.endswith(f"{json_value}")
272
+ if self.operation == GenericFilterOps.NOT_EQUALS:
273
+ return column != json_value
274
+
275
+ return column == json_value
258
276
 
259
277
 
260
278
  class UUIDFilter(StrFilter):
@@ -733,6 +751,7 @@ class BaseFilter(BaseModel):
733
751
  value: Any,
734
752
  table: Type[SQLModel],
735
753
  column: str,
754
+ json_encode_value: bool = False,
736
755
  ) -> "ColumnElement[bool]":
737
756
  """Generate custom filter conditions for a column of a table.
738
757
 
@@ -740,6 +759,7 @@ class BaseFilter(BaseModel):
740
759
  value: The filter value.
741
760
  table: The table which contains the column.
742
761
  column: The column name.
762
+ json_encode_value: Whether to json encode the value.
743
763
 
744
764
  Returns:
745
765
  The query conditions.
@@ -748,6 +768,9 @@ class BaseFilter(BaseModel):
748
768
  filter_ = FilterGenerator(table).define_filter(
749
769
  column=column, value=value, operator=operator
750
770
  )
771
+ if isinstance(filter_, StrFilter):
772
+ filter_.json_encode_value = json_encode_value
773
+
751
774
  return filter_.generate_query_conditions(table=table)
752
775
 
753
776
  @property
@@ -464,19 +464,19 @@ class WorkspaceScopedFilter(UserScopedFilter):
464
464
  return super().apply_sorting(query=query, table=table)
465
465
 
466
466
 
467
- class WorkspaceScopedTaggableFilter(WorkspaceScopedFilter):
468
- """Model to enable advanced scoping with workspace and tagging."""
467
+ class TaggableFilter(BaseFilter):
468
+ """Model to enable filtering and sorting by tags."""
469
469
 
470
470
  tag: Optional[str] = Field(
471
471
  description="Tag to apply to the filter query.", default=None
472
472
  )
473
473
 
474
474
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
475
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
475
+ *BaseFilter.FILTER_EXCLUDE_FIELDS,
476
476
  "tag",
477
477
  ]
478
478
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
479
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
479
+ *BaseFilter.CUSTOM_SORTING_OPTIONS,
480
480
  "tags",
481
481
  ]
482
482
 
@@ -35,7 +35,7 @@ from zenml.models.v2.base.base import (
35
35
  BaseResponseMetadata,
36
36
  BaseResponseResources,
37
37
  )
38
- from zenml.models.v2.base.scoped import WorkspaceScopedTaggableFilter
38
+ from zenml.models.v2.base.scoped import TaggableFilter
39
39
  from zenml.models.v2.core.tag import TagResponse
40
40
 
41
41
  if TYPE_CHECKING:
@@ -183,14 +183,14 @@ class ArtifactResponse(
183
183
  # ------------------ Filter Model ------------------
184
184
 
185
185
 
186
- class ArtifactFilter(WorkspaceScopedTaggableFilter):
186
+ class ArtifactFilter(TaggableFilter):
187
187
  """Model to enable advanced filtering of artifacts."""
188
188
 
189
189
  name: Optional[str] = None
190
190
  has_custom_name: Optional[bool] = None
191
191
 
192
192
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
193
- *WorkspaceScopedTaggableFilter.CUSTOM_SORTING_OPTIONS,
193
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
194
194
  SORT_BY_LATEST_VERSION_KEY,
195
195
  ]
196
196
 
@@ -41,12 +41,13 @@ from zenml.logger import get_logger
41
41
  from zenml.metadata.metadata_types import MetadataType
42
42
  from zenml.models.v2.base.filter import FilterGenerator, StrFilter
43
43
  from zenml.models.v2.base.scoped import (
44
+ TaggableFilter,
45
+ WorkspaceScopedFilter,
44
46
  WorkspaceScopedRequest,
45
47
  WorkspaceScopedResponse,
46
48
  WorkspaceScopedResponseBody,
47
49
  WorkspaceScopedResponseMetadata,
48
50
  WorkspaceScopedResponseResources,
49
- WorkspaceScopedTaggableFilter,
50
51
  )
51
52
  from zenml.models.v2.core.artifact import ArtifactResponse
52
53
  from zenml.models.v2.core.tag import TagResponse
@@ -469,11 +470,12 @@ class ArtifactVersionResponse(
469
470
  # ------------------ Filter Model ------------------
470
471
 
471
472
 
472
- class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
473
+ class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
473
474
  """Model to enable advanced filtering of artifact versions."""
474
475
 
475
476
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
476
- *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
477
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
478
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
477
479
  "name",
478
480
  "only_unused",
479
481
  "has_custom_name",
@@ -482,6 +484,15 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
482
484
  "model_version_id",
483
485
  "run_metadata",
484
486
  ]
487
+ CUSTOM_SORTING_OPTIONS = [
488
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
489
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
490
+ ]
491
+ CLI_EXCLUDE_FIELDS = [
492
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
493
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
494
+ ]
495
+
485
496
  artifact_id: Optional[Union[UUID, str]] = Field(
486
497
  default=None,
487
498
  description="ID of the artifact to which this version belongs.",
@@ -548,7 +559,7 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
548
559
  description="Name/ID of a pipeline run that is associated with this "
549
560
  "artifact version.",
550
561
  )
551
- run_metadata: Optional[Dict[str, str]] = Field(
562
+ run_metadata: Optional[Dict[str, Any]] = Field(
552
563
  default=None,
553
564
  description="The run_metadata to filter the artifact versions by.",
554
565
  )
@@ -672,13 +683,19 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
672
683
  RunMetadataResourceSchema.resource_id
673
684
  == ArtifactVersionSchema.id,
674
685
  RunMetadataResourceSchema.resource_type
675
- == MetadataResourceTypes.ARTIFACT_VERSION,
686
+ == MetadataResourceTypes.ARTIFACT_VERSION.value,
676
687
  RunMetadataResourceSchema.run_metadata_id
677
688
  == RunMetadataSchema.id,
689
+ self.generate_custom_query_conditions_for_column(
690
+ value=key,
691
+ table=RunMetadataSchema,
692
+ column="key",
693
+ ),
678
694
  self.generate_custom_query_conditions_for_column(
679
695
  value=value,
680
696
  table=RunMetadataSchema,
681
697
  column="value",
698
+ json_encode_value=True,
682
699
  ),
683
700
  )
684
701
  custom_filters.append(additional_filter)
@@ -24,12 +24,13 @@ from zenml.constants import (
24
24
  TEXT_FIELD_MAX_LENGTH,
25
25
  )
26
26
  from zenml.models.v2.base.scoped import (
27
+ TaggableFilter,
28
+ WorkspaceScopedFilter,
27
29
  WorkspaceScopedRequest,
28
30
  WorkspaceScopedResponse,
29
31
  WorkspaceScopedResponseBody,
30
32
  WorkspaceScopedResponseMetadata,
31
33
  WorkspaceScopedResponseResources,
32
- WorkspaceScopedTaggableFilter,
33
34
  )
34
35
  from zenml.utils.pagination_utils import depaginate
35
36
 
@@ -322,7 +323,7 @@ class ModelResponse(
322
323
  # ------------------ Filter Model ------------------
323
324
 
324
325
 
325
- class ModelFilter(WorkspaceScopedTaggableFilter):
326
+ class ModelFilter(WorkspaceScopedFilter, TaggableFilter):
326
327
  """Model to enable advanced filtering of all Workspaces."""
327
328
 
328
329
  name: Optional[str] = Field(
@@ -330,10 +331,19 @@ class ModelFilter(WorkspaceScopedTaggableFilter):
330
331
  description="Name of the Model",
331
332
  )
332
333
 
334
+ FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
335
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
336
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
337
+ ]
333
338
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
334
- *WorkspaceScopedTaggableFilter.CUSTOM_SORTING_OPTIONS,
339
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
340
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
335
341
  SORT_BY_LATEST_VERSION_KEY,
336
342
  ]
343
+ CLI_EXCLUDE_FIELDS = [
344
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
345
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
346
+ ]
337
347
 
338
348
  def apply_sorting(
339
349
  self,
@@ -33,12 +33,13 @@ from zenml.metadata.metadata_types import MetadataType
33
33
  from zenml.models.v2.base.filter import AnyQuery
34
34
  from zenml.models.v2.base.page import Page
35
35
  from zenml.models.v2.base.scoped import (
36
+ TaggableFilter,
37
+ WorkspaceScopedFilter,
36
38
  WorkspaceScopedRequest,
37
39
  WorkspaceScopedResponse,
38
40
  WorkspaceScopedResponseBody,
39
41
  WorkspaceScopedResponseMetadata,
40
42
  WorkspaceScopedResponseResources,
41
- WorkspaceScopedTaggableFilter,
42
43
  )
43
44
  from zenml.models.v2.core.service import ServiceResponse
44
45
  from zenml.models.v2.core.tag import TagResponse
@@ -576,13 +577,22 @@ class ModelVersionResponse(
576
577
  # ------------------ Filter Model ------------------
577
578
 
578
579
 
579
- class ModelVersionFilter(WorkspaceScopedTaggableFilter):
580
+ class ModelVersionFilter(WorkspaceScopedFilter, TaggableFilter):
580
581
  """Filter model for model versions."""
581
582
 
582
583
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
583
- *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
584
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
585
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
584
586
  "run_metadata",
585
587
  ]
588
+ CUSTOM_SORTING_OPTIONS = [
589
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
590
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
591
+ ]
592
+ CLI_EXCLUDE_FIELDS = [
593
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
594
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
595
+ ]
586
596
 
587
597
  name: Optional[str] = Field(
588
598
  default=None,
@@ -34,12 +34,13 @@ from zenml.constants import (
34
34
  from zenml.enums import ExecutionStatus
35
35
  from zenml.models.v2.base.base import BaseUpdate
36
36
  from zenml.models.v2.base.scoped import (
37
+ TaggableFilter,
38
+ WorkspaceScopedFilter,
37
39
  WorkspaceScopedRequest,
38
40
  WorkspaceScopedResponse,
39
41
  WorkspaceScopedResponseBody,
40
42
  WorkspaceScopedResponseMetadata,
41
43
  WorkspaceScopedResponseResources,
42
- WorkspaceScopedTaggableFilter,
43
44
  )
44
45
  from zenml.models.v2.core.tag import TagResponse
45
46
 
@@ -256,17 +257,23 @@ class PipelineResponse(
256
257
  # ------------------ Filter Model ------------------
257
258
 
258
259
 
259
- class PipelineFilter(WorkspaceScopedTaggableFilter):
260
+ class PipelineFilter(WorkspaceScopedFilter, TaggableFilter):
260
261
  """Pipeline filter model."""
261
262
 
262
263
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
263
- *WorkspaceScopedTaggableFilter.CUSTOM_SORTING_OPTIONS,
264
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
265
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
264
266
  SORT_PIPELINES_BY_LATEST_RUN_KEY,
265
267
  ]
266
268
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
267
- *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
269
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
270
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
268
271
  "latest_run_status",
269
272
  ]
273
+ CLI_EXCLUDE_FIELDS = [
274
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
275
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
276
+ ]
270
277
 
271
278
  name: Optional[str] = Field(
272
279
  default=None,
@@ -35,12 +35,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH
35
35
  from zenml.enums import ExecutionStatus
36
36
  from zenml.metadata.metadata_types import MetadataType
37
37
  from zenml.models.v2.base.scoped import (
38
+ TaggableFilter,
39
+ WorkspaceScopedFilter,
38
40
  WorkspaceScopedRequest,
39
41
  WorkspaceScopedResponse,
40
42
  WorkspaceScopedResponseBody,
41
43
  WorkspaceScopedResponseMetadata,
42
44
  WorkspaceScopedResponseResources,
43
- WorkspaceScopedTaggableFilter,
44
45
  )
45
46
  from zenml.models.v2.core.model_version import ModelVersionResponse
46
47
  from zenml.models.v2.core.tag import TagResponse
@@ -589,20 +590,21 @@ class PipelineRunResponse(
589
590
  # ------------------ Filter Model ------------------
590
591
 
591
592
 
592
- class PipelineRunFilter(WorkspaceScopedTaggableFilter):
593
+ class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
593
594
  """Model to enable advanced filtering of all Workspaces."""
594
595
 
595
596
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
596
- *WorkspaceScopedTaggableFilter.CUSTOM_SORTING_OPTIONS,
597
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
598
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
597
599
  "tag",
598
600
  "stack",
599
601
  "pipeline",
600
602
  "model",
601
603
  "model_version",
602
604
  ]
603
-
604
605
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
605
- *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
606
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
607
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
606
608
  "unlisted",
607
609
  "code_repository_id",
608
610
  "build_id",
@@ -618,6 +620,11 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
618
620
  "templatable",
619
621
  "run_metadata",
620
622
  ]
623
+ CLI_EXCLUDE_FIELDS = [
624
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
625
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
626
+ ]
627
+
621
628
  name: Optional[str] = Field(
622
629
  default=None,
623
630
  description="Name of the Pipeline Run",
@@ -681,7 +688,7 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
681
688
  union_mode="left_to_right",
682
689
  )
683
690
  unlisted: Optional[bool] = None
684
- run_metadata: Optional[Dict[str, str]] = Field(
691
+ run_metadata: Optional[Dict[str, Any]] = Field(
685
692
  default=None,
686
693
  description="The run_metadata to filter the pipeline runs by.",
687
694
  )
@@ -908,13 +915,19 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
908
915
  RunMetadataResourceSchema.resource_id
909
916
  == PipelineRunSchema.id,
910
917
  RunMetadataResourceSchema.resource_type
911
- == MetadataResourceTypes.PIPELINE_RUN,
918
+ == MetadataResourceTypes.PIPELINE_RUN.value,
912
919
  RunMetadataResourceSchema.run_metadata_id
913
920
  == RunMetadataSchema.id,
921
+ self.generate_custom_query_conditions_for_column(
922
+ value=key,
923
+ table=RunMetadataSchema,
924
+ column="key",
925
+ ),
914
926
  self.generate_custom_query_conditions_for_column(
915
927
  value=value,
916
928
  table=RunMetadataSchema,
917
929
  column="value",
930
+ json_encode_value=True,
918
931
  ),
919
932
  )
920
933
  custom_filters.append(additional_filter)
@@ -33,12 +33,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
33
33
  from zenml.enums import ExecutionStatus
34
34
  from zenml.models.v2.base.base import BaseUpdate
35
35
  from zenml.models.v2.base.scoped import (
36
+ TaggableFilter,
37
+ WorkspaceScopedFilter,
36
38
  WorkspaceScopedRequest,
37
39
  WorkspaceScopedResponse,
38
40
  WorkspaceScopedResponseBody,
39
41
  WorkspaceScopedResponseMetadata,
40
42
  WorkspaceScopedResponseResources,
41
- WorkspaceScopedTaggableFilter,
42
43
  )
43
44
  from zenml.models.v2.core.code_reference import (
44
45
  CodeReferenceResponse,
@@ -307,11 +308,12 @@ class RunTemplateResponse(
307
308
  # ------------------ Filter Model ------------------
308
309
 
309
310
 
310
- class RunTemplateFilter(WorkspaceScopedTaggableFilter):
311
+ class RunTemplateFilter(WorkspaceScopedFilter, TaggableFilter):
311
312
  """Model for filtering of run templates."""
312
313
 
313
314
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
314
- *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
315
+ *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
316
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
315
317
  "code_repository_id",
316
318
  "stack_id",
317
319
  "build_id",
@@ -320,6 +322,14 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
320
322
  "pipeline",
321
323
  "stack",
322
324
  ]
325
+ CUSTOM_SORTING_OPTIONS = [
326
+ *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
327
+ *TaggableFilter.CUSTOM_SORTING_OPTIONS,
328
+ ]
329
+ CLI_EXCLUDE_FIELDS = [
330
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
331
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
332
+ ]
323
333
 
324
334
  name: Optional[str] = Field(
325
335
  default=None,
@@ -16,6 +16,7 @@
16
16
  from datetime import datetime
17
17
  from typing import (
18
18
  TYPE_CHECKING,
19
+ Any,
19
20
  ClassVar,
20
21
  Dict,
21
22
  List,
@@ -574,7 +575,7 @@ class StepRunFilter(WorkspaceScopedFilter):
574
575
  default=None,
575
576
  description="Name/ID of the model associated with the step run.",
576
577
  )
577
- run_metadata: Optional[Dict[str, str]] = Field(
578
+ run_metadata: Optional[Dict[str, Any]] = Field(
578
579
  default=None,
579
580
  description="The run_metadata to filter the step runs by.",
580
581
  )
@@ -619,13 +620,19 @@ class StepRunFilter(WorkspaceScopedFilter):
619
620
  additional_filter = and_(
620
621
  RunMetadataResourceSchema.resource_id == StepRunSchema.id,
621
622
  RunMetadataResourceSchema.resource_type
622
- == MetadataResourceTypes.STEP_RUN,
623
+ == MetadataResourceTypes.STEP_RUN.value,
623
624
  RunMetadataResourceSchema.run_metadata_id
624
625
  == RunMetadataSchema.id,
626
+ self.generate_custom_query_conditions_for_column(
627
+ value=key,
628
+ table=RunMetadataSchema,
629
+ column="key",
630
+ ),
625
631
  self.generate_custom_query_conditions_for_column(
626
632
  value=value,
627
633
  table=RunMetadataSchema,
628
634
  column="value",
635
+ json_encode_value=True,
629
636
  ),
630
637
  )
631
638
  custom_filters.append(additional_filter)
@@ -407,17 +407,31 @@ class Pipeline:
407
407
  return self
408
408
 
409
409
  @property
410
- def requires_parameters(self) -> bool:
411
- """If the pipeline entrypoint requires parameters.
410
+ def required_parameters(self) -> List[str]:
411
+ """List of required parameters for the pipeline entrypoint.
412
412
 
413
413
  Returns:
414
- If the pipeline entrypoint requires parameters.
414
+ List of required parameters for the pipeline entrypoint.
415
415
  """
416
416
  signature = inspect.signature(self.entrypoint, follow_wrapped=True)
417
- return any(
418
- parameter.default is inspect.Parameter.empty
417
+ return [
418
+ parameter.name
419
419
  for parameter in signature.parameters.values()
420
- )
420
+ if parameter.default is inspect.Parameter.empty
421
+ ]
422
+
423
+ @property
424
+ def missing_parameters(self) -> List[str]:
425
+ """List of missing parameters for the pipeline entrypoint.
426
+
427
+ Returns:
428
+ List of missing parameters for the pipeline entrypoint.
429
+ """
430
+ available_parameters = set(self.configuration.parameters or {})
431
+ if params_from_file := self._from_config_file.get("parameters", None):
432
+ available_parameters.update(params_from_file)
433
+
434
+ return list(set(self.required_parameters) - available_parameters)
421
435
 
422
436
  @property
423
437
  def is_prepared(self) -> bool:
@@ -1412,7 +1426,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
1412
1426
  except ValidationError as e:
1413
1427
  raise ValueError(
1414
1428
  "Invalid or missing pipeline function entrypoint arguments. "
1415
- "Only JSON serializable inputs are allowed as pipeline inputs."
1429
+ "Only JSON serializable inputs are allowed as pipeline inputs. "
1416
1430
  "Check out the pydantic error above for more details."
1417
1431
  ) from e
1418
1432
 
@@ -1427,15 +1441,17 @@ To avoid this consider setting pipeline parameters only in one place (config or
1427
1441
  requires parameters.
1428
1442
  """
1429
1443
  if not self.is_prepared:
1430
- if self.requires_parameters:
1444
+ if missing_parameters := self.missing_parameters:
1431
1445
  raise RuntimeError(
1432
1446
  f"Failed while trying to prepare pipeline {self.name}. "
1433
1447
  "The entrypoint function of the pipeline requires "
1434
- "arguments. Please prepare the pipeline by calling "
1435
- "`pipeline_instance.prepare(...)` and try again."
1448
+ "arguments which have not been configured yet: "
1449
+ f"{missing_parameters}. Please provide those parameters by "
1450
+ "calling `pipeline_instance.configure(parameters=...)` or "
1451
+ "by calling `pipeline_instance.prepare(...)` and try again."
1436
1452
  )
1437
- else:
1438
- self.prepare()
1453
+
1454
+ self.prepare()
1439
1455
 
1440
1456
  def create_run_template(
1441
1457
  self, name: str, **kwargs: Any
@@ -18,7 +18,8 @@ from uuid import UUID
18
18
 
19
19
  from pydantic import ValidationError
20
20
  from sqlalchemy import TEXT, Column, UniqueConstraint
21
- from sqlmodel import Field, Relationship
21
+ from sqlalchemy.orm import object_session
22
+ from sqlmodel import Field, Relationship, desc, select
22
23
 
23
24
  from zenml.config.source import Source
24
25
  from zenml.enums import (
@@ -90,6 +91,32 @@ class ArtifactSchema(NamedSchema, table=True):
90
91
  ),
91
92
  )
92
93
 
94
+ @property
95
+ def latest_version(self) -> Optional["ArtifactVersionSchema"]:
96
+ """Fetch the latest version for this artifact.
97
+
98
+ Raises:
99
+ RuntimeError: If no session for the schema exists.
100
+
101
+ Returns:
102
+ The latest version for this artifact.
103
+ """
104
+ if session := object_session(self):
105
+ return (
106
+ session.execute(
107
+ select(ArtifactVersionSchema)
108
+ .where(ArtifactVersionSchema.artifact_id == self.id)
109
+ .order_by(desc(ArtifactVersionSchema.created))
110
+ .limit(1)
111
+ )
112
+ .scalars()
113
+ .one_or_none()
114
+ )
115
+ else:
116
+ raise RuntimeError(
117
+ "Missing DB session to fetch latest version for artifact."
118
+ )
119
+
93
120
  @classmethod
94
121
  def from_request(
95
122
  cls,
@@ -127,9 +154,9 @@ class ArtifactSchema(NamedSchema, table=True):
127
154
  The created `ArtifactResponse`.
128
155
  """
129
156
  latest_id, latest_name = None, None
130
- if self.versions:
131
- latest_version = max(self.versions, key=lambda x: x.created)
132
- latest_id, latest_name = latest_version.id, latest_version.version
157
+ if latest_version := self.latest_version:
158
+ latest_id = latest_version.id
159
+ latest_name = latest_version.version
133
160
 
134
161
  # Create the body of the model
135
162
  body = ArtifactResponseBody(
@@ -24,7 +24,8 @@ from sqlalchemy import (
24
24
  Column,
25
25
  UniqueConstraint,
26
26
  )
27
- from sqlmodel import Field, Relationship
27
+ from sqlalchemy.orm import object_session
28
+ from sqlmodel import Field, Relationship, desc, select
28
29
 
29
30
  from zenml.enums import (
30
31
  ArtifactType,
@@ -126,6 +127,32 @@ class ModelSchema(NamedSchema, table=True):
126
127
  sa_relationship_kwargs={"cascade": "delete"},
127
128
  )
128
129
 
130
+ @property
131
+ def latest_version(self) -> Optional["ModelVersionSchema"]:
132
+ """Fetch the latest version for this model.
133
+
134
+ Raises:
135
+ RuntimeError: If no session for the schema exists.
136
+
137
+ Returns:
138
+ The latest version for this model.
139
+ """
140
+ if session := object_session(self):
141
+ return (
142
+ session.execute(
143
+ select(ModelVersionSchema)
144
+ .where(ModelVersionSchema.model_id == self.id)
145
+ .order_by(desc(ModelVersionSchema.number))
146
+ .limit(1)
147
+ )
148
+ .scalars()
149
+ .one_or_none()
150
+ )
151
+ else:
152
+ raise RuntimeError(
153
+ "Missing DB session to fetch latest version for model."
154
+ )
155
+
129
156
  @classmethod
130
157
  def from_request(cls, model_request: ModelRequest) -> "ModelSchema":
131
158
  """Convert an `ModelRequest` to an `ModelSchema`.
@@ -169,11 +196,9 @@ class ModelSchema(NamedSchema, table=True):
169
196
  """
170
197
  tags = [tag.to_model() for tag in self.tags]
171
198
 
172
- if self.model_versions:
173
- version_numbers = [mv.number for mv in self.model_versions]
174
- latest_version_idx = version_numbers.index(max(version_numbers))
175
- latest_version_name = self.model_versions[latest_version_idx].name
176
- latest_version_id = self.model_versions[latest_version_idx].id
199
+ if latest_version := self.latest_version:
200
+ latest_version_name = latest_version.name
201
+ latest_version_id = latest_version.id
177
202
  else:
178
203
  latest_version_name = None
179
204
  latest_version_id = None
@@ -208,7 +208,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
208
208
  stack: Optional["StackSchema"] = Relationship()
209
209
  build: Optional["PipelineBuildSchema"] = Relationship()
210
210
  schedule: Optional["ScheduleSchema"] = Relationship()
211
- pipeline: Optional["PipelineSchema"] = Relationship(back_populates="runs")
211
+ pipeline: Optional["PipelineSchema"] = Relationship()
212
212
  trigger_execution: Optional["TriggerExecutionSchema"] = Relationship()
213
213
 
214
214
  services: List["ServiceSchema"] = Relationship(
@@ -17,7 +17,8 @@ from typing import TYPE_CHECKING, Any, List, Optional
17
17
  from uuid import UUID
18
18
 
19
19
  from sqlalchemy import TEXT, Column, UniqueConstraint
20
- from sqlmodel import Field, Relationship
20
+ from sqlalchemy.orm import object_session
21
+ from sqlmodel import Field, Relationship, desc, select
21
22
 
22
23
  from zenml.enums import TaggableResourceTypes
23
24
  from zenml.models import (
@@ -85,10 +86,6 @@ class PipelineSchema(NamedSchema, table=True):
85
86
  schedules: List["ScheduleSchema"] = Relationship(
86
87
  back_populates="pipeline",
87
88
  )
88
- runs: List["PipelineRunSchema"] = Relationship(
89
- back_populates="pipeline",
90
- sa_relationship_kwargs={"order_by": "PipelineRunSchema.created"},
91
- )
92
89
  builds: List["PipelineBuildSchema"] = Relationship(
93
90
  back_populates="pipeline"
94
91
  )
@@ -105,6 +102,34 @@ class PipelineSchema(NamedSchema, table=True):
105
102
  ),
106
103
  )
107
104
 
105
+ @property
106
+ def latest_run(self) -> Optional["PipelineRunSchema"]:
107
+ """Fetch the latest run for this pipeline.
108
+
109
+ Raises:
110
+ RuntimeError: If no session for the schema exists.
111
+
112
+ Returns:
113
+ The latest run for this pipeline.
114
+ """
115
+ from zenml.zen_stores.schemas import PipelineRunSchema
116
+
117
+ if session := object_session(self):
118
+ return (
119
+ session.execute(
120
+ select(PipelineRunSchema)
121
+ .where(PipelineRunSchema.pipeline_id == self.id)
122
+ .order_by(desc(PipelineRunSchema.created))
123
+ .limit(1)
124
+ )
125
+ .scalars()
126
+ .one_or_none()
127
+ )
128
+ else:
129
+ raise RuntimeError(
130
+ "Missing DB session to fetch latest run for pipeline."
131
+ )
132
+
108
133
  @classmethod
109
134
  def from_request(
110
135
  cls,
@@ -141,10 +166,12 @@ class PipelineSchema(NamedSchema, table=True):
141
166
  Returns:
142
167
  The created PipelineResponse.
143
168
  """
169
+ latest_run = self.latest_run
170
+
144
171
  body = PipelineResponseBody(
145
172
  user=self.user.to_model() if self.user else None,
146
- latest_run_id=self.runs[-1].id if self.runs else None,
147
- latest_run_status=self.runs[-1].status if self.runs else None,
173
+ latest_run_id=latest_run.id if latest_run else None,
174
+ latest_run_status=latest_run.status if latest_run else None,
148
175
  created=self.created,
149
176
  updated=self.updated,
150
177
  )
@@ -158,7 +185,7 @@ class PipelineSchema(NamedSchema, table=True):
158
185
 
159
186
  resources = None
160
187
  if include_resources:
161
- latest_run_user = self.runs[-1].user if self.runs else None
188
+ latest_run_user = latest_run.user if latest_run else None
162
189
 
163
190
  resources = PipelineResponseResources(
164
191
  latest_run_user=latest_run_user.to_model()
@@ -18,7 +18,8 @@ from uuid import UUID
18
18
 
19
19
  from sqlalchemy import Column, String, UniqueConstraint
20
20
  from sqlalchemy.dialects.mysql import MEDIUMTEXT
21
- from sqlmodel import Field, Relationship
21
+ from sqlalchemy.orm import object_session
22
+ from sqlmodel import Field, Relationship, col, desc, select
22
23
 
23
24
  from zenml.constants import MEDIUMTEXT_MAX_LENGTH
24
25
  from zenml.enums import TaggableResourceTypes
@@ -99,17 +100,6 @@ class RunTemplateSchema(BaseSchema, table=True):
99
100
  }
100
101
  )
101
102
 
102
- runs: List["PipelineRunSchema"] = Relationship(
103
- sa_relationship_kwargs={
104
- "primaryjoin": "RunTemplateSchema.id==PipelineDeploymentSchema.template_id",
105
- "secondaryjoin": "PipelineDeploymentSchema.id==PipelineRunSchema.deployment_id",
106
- "secondary": "pipeline_deployment",
107
- "cascade": "delete",
108
- "viewonly": True,
109
- "order_by": "PipelineRunSchema.created",
110
- }
111
- )
112
-
113
103
  tags: List["TagSchema"] = Relationship(
114
104
  sa_relationship_kwargs=dict(
115
105
  primaryjoin=f"and_(foreign(TagResourceSchema.resource_type)=='{TaggableResourceTypes.RUN_TEMPLATE.value}', foreign(TagResourceSchema.resource_id)==RunTemplateSchema.id)",
@@ -120,6 +110,42 @@ class RunTemplateSchema(BaseSchema, table=True):
120
110
  ),
121
111
  )
122
112
 
113
+ @property
114
+ def latest_run(self) -> Optional["PipelineRunSchema"]:
115
+ """Fetch the latest run for this template.
116
+
117
+ Raises:
118
+ RuntimeError: If no session for the schema exists.
119
+
120
+ Returns:
121
+ The latest run for this template.
122
+ """
123
+ from zenml.zen_stores.schemas import (
124
+ PipelineDeploymentSchema,
125
+ PipelineRunSchema,
126
+ )
127
+
128
+ if session := object_session(self):
129
+ return (
130
+ session.execute(
131
+ select(PipelineRunSchema)
132
+ .join(
133
+ PipelineDeploymentSchema,
134
+ col(PipelineDeploymentSchema.id)
135
+ == col(PipelineRunSchema.deployment_id),
136
+ )
137
+ .where(PipelineDeploymentSchema.template_id == self.id)
138
+ .order_by(desc(PipelineRunSchema.created))
139
+ .limit(1)
140
+ )
141
+ .scalars()
142
+ .one_or_none()
143
+ )
144
+ else:
145
+ raise RuntimeError(
146
+ "Missing DB session to fetch latest run for template."
147
+ )
148
+
123
149
  @classmethod
124
150
  def from_request(
125
151
  cls,
@@ -184,13 +210,15 @@ class RunTemplateSchema(BaseSchema, table=True):
184
210
  ):
185
211
  runnable = True
186
212
 
213
+ latest_run = self.latest_run
214
+
187
215
  body = RunTemplateResponseBody(
188
216
  user=self.user.to_model() if self.user else None,
189
217
  created=self.created,
190
218
  updated=self.updated,
191
219
  runnable=runnable,
192
- latest_run_id=self.runs[-1].id if self.runs else None,
193
- latest_run_status=self.runs[-1].status if self.runs else None,
220
+ latest_run_id=latest_run.id if latest_run else None,
221
+ latest_run_status=latest_run.status if latest_run else None,
194
222
  )
195
223
 
196
224
  metadata = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.73.0.dev20250205
3
+ Version: 0.73.0.dev20250206
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=BRNvbbNFEwdyrIEopU926a0ad2FzMvnprZW8ctT0PFw,19
2
+ zenml/VERSION,sha256=ji5Aj9EhfhLiyX0DtPoxdFiamKZSRAvGE4VKg4u9TaA,19
3
3
  zenml/__init__.py,sha256=SkMObQA41ajqdZqGErN00S1Vf3KAxpLvbZ-OBy5uYoo,2130
4
4
  zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
5
5
  zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
@@ -52,10 +52,10 @@ zenml/cli/stack_components.py,sha256=7RXVCJTX6sU-CiyDeu4kGYPJZ7QRQjDTptsvl__sI_A
52
52
  zenml/cli/tag.py,sha256=Co-AL1eNZMf_AsqlcnJpoZ_k7UKa0l5X_g_TLpJdGes,4884
53
53
  zenml/cli/text_utils.py,sha256=bY1GIjoULt1cW2FyrPlMoAXNS2R7cSOjDFEZQqrpVQ8,3553
54
54
  zenml/cli/user_management.py,sha256=fTuRworQahst_j78qPYTtgciUeUOxwo7efiyPwmj2tI,13075
55
- zenml/cli/utils.py,sha256=kqTFuEyXgx0eP_7mtWwmDwF3JvDSQ7dnOMhlNYSSJfM,86594
55
+ zenml/cli/utils.py,sha256=oQm8clYsuATzEjXJNVMwmdTiygOwxErvUGONPIxb7no,86478
56
56
  zenml/cli/version.py,sha256=nm1iSU_1V6-MUwpMKeXcwFhLYGUMLswvQL67cEuCpxA,3635
57
57
  zenml/cli/workspace.py,sha256=bp02aXou574ToWPD8OAIB_cg3mvpE011H8aMKegT-nU,2970
58
- zenml/client.py,sha256=B2xEX39nePNAl5TcFVyvIMYBQqAba5IQ5BFhLC2enxQ,283388
58
+ zenml/client.py,sha256=VGpvUNfs6D_7JthAjocEO6pDNfjeNkWwNudWVYrbgqo,283571
59
59
  zenml/client_lazy_loader.py,sha256=MOBgS1ITYqGvPUnWQ6edn9s8Hr_72YfWbwEIfHKUr9g,7104
60
60
  zenml/code_repositories/__init__.py,sha256=W5bDfzAG8OXIKZSV1L-VHuzMcSCYa9qzTdPb3jqfyYw,920
61
61
  zenml/code_repositories/base_code_repository.py,sha256=Id6VjbUu8N3ZpNvBGhOgbahtoMiCAtYXed3G7YQ_iAc,5225
@@ -615,20 +615,20 @@ zenml/model_deployers/__init__.py,sha256=oVBLtTfrNenl5OI1iqtQUvJ0vpocRVUN_HIt8qp
615
615
  zenml/model_deployers/base_model_deployer.py,sha256=Xg5lxBFYM41vqxQhaB54Dxu_zLCyPDgqwrTyMcAxiS4,24609
616
616
  zenml/model_registries/__init__.py,sha256=wA9Vzo0w_e9zuXOVURB9w8oMLSnTaimXcxg_Nb7O3b0,1238
617
617
  zenml/model_registries/base_model_registry.py,sha256=nK__C6IfoIRxnOHA9qyPErLvIsbakyac4ZltUZ8t3tk,17526
618
- zenml/models/__init__.py,sha256=zKOStbjGZPfDJcsIYZdYZitTFQWISUciN8poXCNbeEM,21614
618
+ zenml/models/__init__.py,sha256=sLMSaAWnoHYKAE0Tq8vi5o2k0fVeYiM7z72TwQyUZbI,21640
619
619
  zenml/models/v2/__init__.py,sha256=LGMIUJi19sOsvo54roZSQwDp_czNQYtenqd_frTLIhU,613
620
620
  zenml/models/v2/base/__init__.py,sha256=knhroJ2h0uHBCGzAiBBGJEiuhEA3cwI6XYBRIyXdbkQ,613
621
621
  zenml/models/v2/base/base.py,sha256=tXzNTIwGNz7MEgfii3-6ASBNFg4SkR9D9ZM48tlNr84,16242
622
622
  zenml/models/v2/base/base_plugin_flavor.py,sha256=BfPL4gm5i7ad7_vuRmPtC-rE2kl0W_8SmpWme8Akv1c,2608
623
- zenml/models/v2/base/filter.py,sha256=uCZa3MFdEmUL91DYa43vZVuHYBQDC-z3gZWUzzqd63U,36990
623
+ zenml/models/v2/base/filter.py,sha256=ScuQusfFOPUU52eAiLDditU7_IFcD6CeFVqrJwP6H20,37783
624
624
  zenml/models/v2/base/page.py,sha256=yBpWB-8iUmyRwXKSJvX3v9SB7WOnyRa25O8SAss24xk,2601
625
- zenml/models/v2/base/scoped.py,sha256=fOZpuTTUjkg2xE8LvPFUP8lpU9HC-chSQ8xNpmWAW-c,17578
625
+ zenml/models/v2/base/scoped.py,sha256=FrM-pSE2gKoVffMg-Zoei6lu4C4Rvpp-icIdbk6q9dE,17516
626
626
  zenml/models/v2/core/__init__.py,sha256=LGMIUJi19sOsvo54roZSQwDp_czNQYtenqd_frTLIhU,613
627
627
  zenml/models/v2/core/action.py,sha256=6n6Lep_2-OVUDCWs6eKiUHFKLvcoMjHWP4ZSbua1JRY,7911
628
628
  zenml/models/v2/core/action_flavor.py,sha256=DlGlJTOcgLSDYAsrbAyXOJVdo7X2GYTFQTTEG5BEf-Q,1718
629
629
  zenml/models/v2/core/api_key.py,sha256=Zv2N4NDraZUIrBOW1sSQtVp0Ik6zpdTFymYCOo17c-4,11534
630
- zenml/models/v2/core/artifact.py,sha256=VZDjn3xjwafh3M6Jq38wDKkzdYI3t3eOsIFnM6STMf8,7655
631
- zenml/models/v2/core/artifact_version.py,sha256=CWVLWzmeyvQrHRevTPkFBAcJTxIlwMx3drcV3f2bJ7k,23134
630
+ zenml/models/v2/core/artifact.py,sha256=dmw36qIwtPDptU09nWGlwXhE0v0xXQ_4naIvndKh1ec,7610
631
+ zenml/models/v2/core/artifact_version.py,sha256=0eJFj9DJ7T6yfNp6W0qqjLwKIzfNOeiENAk9tk51I7o,23731
632
632
  zenml/models/v2/core/artifact_visualization.py,sha256=milAHTpfuYd8Dx_oB4hcPYJL-TMoiU0FwUI0UhB3F-E,3115
633
633
  zenml/models/v2/core/code_reference.py,sha256=9xy3Gzychq16lLUs01va3gGfwdu-AMrFgys_ua89uFY,3557
634
634
  zenml/models/v2/core/code_repository.py,sha256=W4BuE8oterWPmtbCUCtOVsw8RfaOgiZ5aefuQHxL8dk,5580
@@ -638,16 +638,16 @@ zenml/models/v2/core/event_source.py,sha256=kOexFvxj3iqsQGiGHPe549v9cSTo2GfsPCK0
638
638
  zenml/models/v2/core/event_source_flavor.py,sha256=TgrGkypnJUutMvvHE7Y9MbUiEeNXZxitc3eYlIbbsas,2077
639
639
  zenml/models/v2/core/flavor.py,sha256=tcn2GDbkOyYjXTor_7_kR7FuLwcXjlfzvAV2rU1NVM4,12806
640
640
  zenml/models/v2/core/logs.py,sha256=UhaPOTJD7IFKH8YozsaVgXYNNDHre8amheIm5JMZYQU,5824
641
- zenml/models/v2/core/model.py,sha256=My56dONvNkN95C121M0RS3lB_oQIRJpd9z_mHHZkU6A,11572
642
- zenml/models/v2/core/model_version.py,sha256=nDj8A4BUMBFwkKXF8VW1QiDwP6MXqrP6P9pIKB5XjXQ,20735
641
+ zenml/models/v2/core/model.py,sha256=yok73T2D4hzYGP0nhDs5mq-1LKA9iol_k5DQyCVwf1o,11918
642
+ zenml/models/v2/core/model_version.py,sha256=q3fTYRSLR7i_84VFWqCmcm4FqGhwtlq2Wfhtm6G0u8M,21062
643
643
  zenml/models/v2/core/model_version_artifact.py,sha256=ZyupuEsfPSjgaHDIUOojwJepJt1LTXDoUyE2h9htB_s,9086
644
644
  zenml/models/v2/core/model_version_pipeline_run.py,sha256=JbPZZEQvOK9I32htkWdAONy7gvtoz_Jo45B5gYrh2vs,7036
645
- zenml/models/v2/core/pipeline.py,sha256=TGsxPvFzGwHebEVNyNc2kHCQQlMB8CCWWveKXDkACYY,11817
645
+ zenml/models/v2/core/pipeline.py,sha256=cql05iz2jqrlyRfn3jB4iQ_AgpHapD6Sr5Kd_6Q1W30,12044
646
646
  zenml/models/v2/core/pipeline_build.py,sha256=bjSvmNnTF9xAycYfmTHO2wzgR-ZVWyy5V5-9ajZUxag,16399
647
647
  zenml/models/v2/core/pipeline_deployment.py,sha256=6PbpnEUAbTT-_jPmyNtKuTJHFGdGLD2h5Zu_pXIHW1I,12108
648
- zenml/models/v2/core/pipeline_run.py,sha256=HwZtUGDdjfxUmlbTdkI6Fnvlt0jiLk2aatwYwbhjonI,32699
648
+ zenml/models/v2/core/pipeline_run.py,sha256=mmr3EP5jWq7sQ5FnUTD4kXYWY-yF5x6SW9Ei2a78Stc,33195
649
649
  zenml/models/v2/core/run_metadata.py,sha256=YDiPVRzTUMVHqW4T_Ke4GJMdscp0aS_g8I4P8n70szc,2436
650
- zenml/models/v2/core/run_template.py,sha256=A_dezNA9o1uJW-o1B9fYaSSWHwwglJYP3jvhWhGcJK4,12971
650
+ zenml/models/v2/core/run_template.py,sha256=R2ADxFbBi_zmJE7FA4M0DStIc-mfTiOMuVosniZH9XA,13298
651
651
  zenml/models/v2/core/schedule.py,sha256=JNYTGPXDPMz7A9OjhnHIXyOLQuoFnrzOwChGibz2xQY,10774
652
652
  zenml/models/v2/core/secret.py,sha256=LoY5BMZIrU6KYa39layHt6cbAnmMR7yXizv_1Qqse6Q,11460
653
653
  zenml/models/v2/core/server_settings.py,sha256=al6LAXhoQHsBiTv2qlwFn1AlI2F8miogGB4xjDE6KeA,6267
@@ -655,7 +655,7 @@ zenml/models/v2/core/service.py,sha256=lwCDOFk-OXmfhB_bOOJy7rhbkR40tCScQsWnllgL7
655
655
  zenml/models/v2/core/service_account.py,sha256=-1c9Et9Ma4_OHOZxIHjVnLJAaLLxhpoLEyGKkwc1Yx8,6619
656
656
  zenml/models/v2/core/service_connector.py,sha256=-Fgi2bilbG99Fo0TWdelpTHMqi8l7E5M5S757b0VjdQ,37411
657
657
  zenml/models/v2/core/stack.py,sha256=K5WVJ3vqjoHUlZ4Ezx-Bff3aSgTiBwpH7eViGVSx4YI,12083
658
- zenml/models/v2/core/step_run.py,sha256=6plyAHt5r9z5TQHh_g_USx8zkO41US8GeeO745iDf-U,19216
658
+ zenml/models/v2/core/step_run.py,sha256=3LyE6z3K4cQgNC2B7nkyWHSUlaRNdLv-abAcxpnd1MM,19494
659
659
  zenml/models/v2/core/tag.py,sha256=gQNkxmcksMxx5RJf1U_ug5-VxPhfaS11j--J3dl6muk,3534
660
660
  zenml/models/v2/core/tag_resource.py,sha256=H7CPj9oaUpym8vSkwuYSJ6_rWfHMEKVRedPw2kyxmII,2640
661
661
  zenml/models/v2/core/trigger.py,sha256=CDbKrJnHoYgYzFlS6gYIjrWihMSQkRyUwdUHNSgHSxY,12808
@@ -695,7 +695,7 @@ zenml/pipelines/__init__.py,sha256=hpIX7hN8jsQRHT5R-xSXZL88qrHwkmrvGLQeu1rWt4o,8
695
695
  zenml/pipelines/build_utils.py,sha256=DkID1YnRYkw569uU-gidpF8WR8E7K55_wn3CzRPQ3Cs,27562
696
696
  zenml/pipelines/pipeline_context.py,sha256=V_p-F9W7cBIlTjS0iv5-uJYMzaOj8bAUkc_uNhQgBms,3579
697
697
  zenml/pipelines/pipeline_decorator.py,sha256=FIbflYOMavbuyGmqsx3F5zZgg0oXMTi1eAcGXciljOs,4293
698
- zenml/pipelines/pipeline_definition.py,sha256=M4r2EqpXzAAPG_asK76fYE855U4nlCkZe1To-D4yDM4,56206
698
+ zenml/pipelines/pipeline_definition.py,sha256=Pi4OGs7-WXbsm8_zczY5lpQEyLJPqkKZHjXAKfnk3HY,56936
699
699
  zenml/pipelines/run_utils.py,sha256=4KuHIQFtLXTZNQBScTEkIG5pqNtu6xGm6UZT7ptyyKs,11623
700
700
  zenml/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
701
701
  zenml/plugins/base_plugin_flavor.py,sha256=88IxFW91UB_rQ8xPlfRnIhIJh7A308NEq2epMMdlOng,2530
@@ -1234,7 +1234,7 @@ zenml/zen_stores/rest_zen_store.py,sha256=tB890hOnYaixDKWr7xddpNsNI0GxLV7D4PQd-T
1234
1234
  zenml/zen_stores/schemas/__init__.py,sha256=vMb0Pyf94aMWZDWpPKuRaxNoMsTp9DZNKSQScm9Vd5I,4339
1235
1235
  zenml/zen_stores/schemas/action_schemas.py,sha256=uAWlV3Uy8LERBlu7PHCsWEEF4ww6olsVetzVBWmdDSc,6298
1236
1236
  zenml/zen_stores/schemas/api_key_schemas.py,sha256=d_ewTrIJpRjLWupOZFpWcPSlRiHxiBsZJc_qSU7tMMk,7262
1237
- zenml/zen_stores/schemas/artifact_schemas.py,sha256=_hXytHqa0BYrBLgZt8RdAid1n291d8wQ0HxNMIAjlJQ,14317
1237
+ zenml/zen_stores/schemas/artifact_schemas.py,sha256=7xzoiDpMvGu02YV4JGQ7If-5XKpW3-SErs3yOQTK62w,15176
1238
1238
  zenml/zen_stores/schemas/artifact_visualization_schemas.py,sha256=_gMNjOF0oJ0ruW5Ua86hDocvO4MT3ACAIx_BwFBJFWk,3693
1239
1239
  zenml/zen_stores/schemas/base_schemas.py,sha256=-MDYnS4ZLDe6x75nTXuVrOSbcYOuECLNk-yxjfEdJh4,2043
1240
1240
  zenml/zen_stores/schemas/code_repository_schemas.py,sha256=K2EFvu_bkF9-cDAVYpMntNidSu-zb3By7CVq6rLj97c,7489
@@ -1244,13 +1244,13 @@ zenml/zen_stores/schemas/device_schemas.py,sha256=voVBknm14NmFpij1EGb_HhVlUng0cg
1244
1244
  zenml/zen_stores/schemas/event_source_schemas.py,sha256=qhkyKg3zl7pFaxDYcXsDvJEIQAGWzWDrH1S88-cbxFQ,6391
1245
1245
  zenml/zen_stores/schemas/flavor_schemas.py,sha256=cEKHrQp4fr16SDjOqBubM-jAbq4dK3MVyZSe-70e-ME,5054
1246
1246
  zenml/zen_stores/schemas/logs_schemas.py,sha256=qv6fs3JiVgzlmTXJqb_gG5NsU5q_50e0167JiWIxR14,3588
1247
- zenml/zen_stores/schemas/model_schemas.py,sha256=--ep8SeYEjVb3k8hn_lqLVryz9Errh6AIZiW88DEaXU,24770
1247
+ zenml/zen_stores/schemas/model_schemas.py,sha256=95q5OaQ9DFmTno76wLaLmeBj3cePrVju20flWiJHPOk,25460
1248
1248
  zenml/zen_stores/schemas/pipeline_build_schemas.py,sha256=QK3sVPYhumUx_x-H3YZ-RfnsxGhKfkMGdP5FC9WrQgU,5718
1249
1249
  zenml/zen_stores/schemas/pipeline_deployment_schemas.py,sha256=fdsROPBE1QrWKvSkaZYz2Sc1MwXogAembs8TfZML3ks,10201
1250
- zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=vGH8-onUSmXwZz-qabZjl2F5bJ06pwVSU5vVr5WtdT8,18067
1251
- zenml/zen_stores/schemas/pipeline_schemas.py,sha256=G8YH5g_kp4QHcijchO5SUNvePXErqoF9qNNzgDg8K_k,6366
1250
+ zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=ylodIinwKGqKCIcZaKJwiA27g0rkNjKY3DLx_E2lylo,18046
1251
+ zenml/zen_stores/schemas/pipeline_schemas.py,sha256=tUgBics0QOszIN870_-ADcBHINH8v32-CLjPW0vHzMg,7159
1252
1252
  zenml/zen_stores/schemas/run_metadata_schemas.py,sha256=yDDWEl9q4CExCL47uf72fDEodKNqA60PptBPydCJTwk,3619
1253
- zenml/zen_stores/schemas/run_template_schemas.py,sha256=W3ADwqG6xe9a-zhtvtTREn48onE5uYi6YMI26yU37Xo,8950
1253
+ zenml/zen_stores/schemas/run_template_schemas.py,sha256=vnwAHPkjpHyRSSZmKjBemICUOPHSJWuKJmn9JqOstmM,9760
1254
1254
  zenml/zen_stores/schemas/schedule_schema.py,sha256=zLh2LlgRWl-m1ANLpUnwh8LEpKykIR8JpJS7angMGW4,8169
1255
1255
  zenml/zen_stores/schemas/schema_utils.py,sha256=Xahifq2fJ5szXCM00ZZ6461Div9Suatzl6sy9hVhPkk,3612
1256
1256
  zenml/zen_stores/schemas/secret_schemas.py,sha256=H-DGSmVmsH9OPh4BOBC0QXMjV6u-KiKT_KDbfOtkt8M,9889
@@ -1276,8 +1276,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=nEO0bAPlULBLxLVk-UTR
1276
1276
  zenml/zen_stores/sql_zen_store.py,sha256=tKOghX2Wa0f0xSYu_ReqHgCwslvHrBhE3RePJG2tcA0,415921
1277
1277
  zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
1278
1278
  zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
1279
- zenml_nightly-0.73.0.dev20250205.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1280
- zenml_nightly-0.73.0.dev20250205.dist-info/METADATA,sha256=4aKyp4ElvyYZyzp3o1VprHUTmBBphTITDQ4BFQVD_NM,21428
1281
- zenml_nightly-0.73.0.dev20250205.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1282
- zenml_nightly-0.73.0.dev20250205.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1283
- zenml_nightly-0.73.0.dev20250205.dist-info/RECORD,,
1279
+ zenml_nightly-0.73.0.dev20250206.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1280
+ zenml_nightly-0.73.0.dev20250206.dist-info/METADATA,sha256=ENIa7gJ176ZakUYpcBlt4HELhVscA_YSwNd917ZeNdg,21428
1281
+ zenml_nightly-0.73.0.dev20250206.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1282
+ zenml_nightly-0.73.0.dev20250206.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1283
+ zenml_nightly-0.73.0.dev20250206.dist-info/RECORD,,