zenml-nightly 0.68.1.dev20241106__py3-none-any.whl → 0.68.1.dev20241108__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 (52) hide show
  1. zenml/VERSION +1 -1
  2. zenml/artifacts/external_artifact.py +2 -1
  3. zenml/artifacts/utils.py +133 -78
  4. zenml/cli/base.py +4 -4
  5. zenml/cli/model.py +1 -6
  6. zenml/cli/stack.py +1 -0
  7. zenml/client.py +21 -73
  8. zenml/constants.py +1 -0
  9. zenml/enums.py +12 -4
  10. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +1 -1
  11. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
  12. zenml/integrations/evidently/__init__.py +1 -1
  13. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  14. zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +60 -54
  15. zenml/integrations/vllm/services/vllm_deployment.py +16 -7
  16. zenml/metadata/lazy_load.py +20 -7
  17. zenml/model/model.py +1 -2
  18. zenml/models/__init__.py +0 -12
  19. zenml/models/v2/core/artifact_version.py +19 -7
  20. zenml/models/v2/core/model_version.py +3 -5
  21. zenml/models/v2/core/pipeline_run.py +3 -5
  22. zenml/models/v2/core/run_metadata.py +2 -217
  23. zenml/models/v2/core/step_run.py +40 -24
  24. zenml/orchestrators/input_utils.py +44 -19
  25. zenml/orchestrators/step_launcher.py +2 -2
  26. zenml/orchestrators/step_run_utils.py +19 -15
  27. zenml/orchestrators/step_runner.py +21 -13
  28. zenml/steps/base_step.py +1 -1
  29. zenml/steps/entrypoint_function_utils.py +3 -5
  30. zenml/steps/step_context.py +3 -2
  31. zenml/steps/utils.py +8 -2
  32. zenml/zen_server/rbac/endpoint_utils.py +43 -1
  33. zenml/zen_server/rbac/utils.py +0 -2
  34. zenml/zen_server/routers/artifact_version_endpoints.py +27 -1
  35. zenml/zen_server/routers/workspaces_endpoints.py +3 -4
  36. zenml/zen_server/zen_server_api.py +0 -2
  37. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
  38. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
  39. zenml/zen_stores/rest_zen_store.py +55 -54
  40. zenml/zen_stores/schemas/artifact_schemas.py +8 -1
  41. zenml/zen_stores/schemas/model_schemas.py +2 -2
  42. zenml/zen_stores/schemas/pipeline_run_schemas.py +1 -1
  43. zenml/zen_stores/schemas/run_metadata_schemas.py +1 -48
  44. zenml/zen_stores/schemas/step_run_schemas.py +18 -10
  45. zenml/zen_stores/sql_zen_store.py +68 -98
  46. zenml/zen_stores/zen_store_interface.py +15 -42
  47. {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/METADATA +1 -1
  48. {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/RECORD +51 -50
  49. zenml/zen_server/routers/run_metadata_endpoints.py +0 -96
  50. {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/LICENSE +0 -0
  51. {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/WHEEL +0 -0
  52. {zenml_nightly-0.68.1.dev20241106.dist-info → zenml_nightly-0.68.1.dev20241108.dist-info}/entry_points.txt +0 -0
@@ -87,41 +87,44 @@ class TensorboardVisualizer:
87
87
  *args: Additional arguments.
88
88
  **kwargs: Additional keyword arguments.
89
89
  """
90
- for _, artifact_view in object.outputs.items():
91
- # filter out anything but model artifacts
92
- if artifact_view.type == ArtifactType.MODEL:
93
- logdir = os.path.dirname(artifact_view.uri)
94
-
95
- # first check if a TensorBoard server is already running for
96
- # the same logdir location and use that one
97
- running_server = self.find_running_tensorboard_server(logdir)
98
- if running_server:
99
- self.visualize_tensorboard(running_server.port, height)
100
- return
101
-
102
- if sys.platform == "win32":
103
- # Daemon service functionality is currently not supported
104
- # on Windows
105
- print(
106
- "You can run:\n"
107
- f"[italic green] tensorboard --logdir {logdir}"
108
- "[/italic green]\n"
109
- "...to visualize the TensorBoard logs for your trained model."
90
+ for output in object.outputs.values():
91
+ for artifact_view in output:
92
+ # filter out anything but model artifacts
93
+ if artifact_view.type == ArtifactType.MODEL:
94
+ logdir = os.path.dirname(artifact_view.uri)
95
+
96
+ # first check if a TensorBoard server is already running for
97
+ # the same logdir location and use that one
98
+ running_server = self.find_running_tensorboard_server(
99
+ logdir
110
100
  )
111
- else:
112
- # start a new TensorBoard server
113
- service = TensorboardService(
114
- TensorboardServiceConfig(
115
- logdir=logdir,
116
- name=f"zenml-tensorboard-{logdir}",
101
+ if running_server:
102
+ self.visualize_tensorboard(running_server.port, height)
103
+ return
104
+
105
+ if sys.platform == "win32":
106
+ # Daemon service functionality is currently not supported
107
+ # on Windows
108
+ print(
109
+ "You can run:\n"
110
+ f"[italic green] tensorboard --logdir {logdir}"
111
+ "[/italic green]\n"
112
+ "...to visualize the TensorBoard logs for your trained model."
117
113
  )
118
- )
119
- service.start(timeout=60)
120
- if service.endpoint.status.port:
121
- self.visualize_tensorboard(
122
- service.endpoint.status.port, height
114
+ else:
115
+ # start a new TensorBoard server
116
+ service = TensorboardService(
117
+ TensorboardServiceConfig(
118
+ logdir=logdir,
119
+ name=f"zenml-tensorboard-{logdir}",
120
+ )
123
121
  )
124
- return
122
+ service.start(timeout=60)
123
+ if service.endpoint.status.port:
124
+ self.visualize_tensorboard(
125
+ service.endpoint.status.port, height
126
+ )
127
+ return
125
128
 
126
129
  def visualize_tensorboard(
127
130
  self,
@@ -154,31 +157,34 @@ class TensorboardVisualizer:
154
157
  Args:
155
158
  object: StepRunResponseModel fetched from get_step().
156
159
  """
157
- for _, artifact_view in object.outputs.items():
158
- # filter out anything but model artifacts
159
- if artifact_view.type == ArtifactType.MODEL:
160
- logdir = os.path.dirname(artifact_view.uri)
161
-
162
- # first check if a TensorBoard server is already running for
163
- # the same logdir location and use that one
164
- running_server = self.find_running_tensorboard_server(logdir)
165
- if not running_server:
166
- return
160
+ for output in object.outputs.values():
161
+ for artifact_view in output:
162
+ # filter out anything but model artifacts
163
+ if artifact_view.type == ArtifactType.MODEL:
164
+ logdir = os.path.dirname(artifact_view.uri)
165
+
166
+ # first check if a TensorBoard server is already running for
167
+ # the same logdir location and use that one
168
+ running_server = self.find_running_tensorboard_server(
169
+ logdir
170
+ )
171
+ if not running_server:
172
+ return
167
173
 
168
- logger.debug(
169
- "Stopping tensorboard server with PID '%d' ...",
170
- running_server.pid,
171
- )
172
- try:
173
- p = psutil.Process(running_server.pid)
174
- except psutil.Error:
175
- logger.error(
176
- "Could not find process for PID '%d' ...",
174
+ logger.debug(
175
+ "Stopping tensorboard server with PID '%d' ...",
177
176
  running_server.pid,
178
177
  )
179
- continue
180
- p.kill()
181
- return
178
+ try:
179
+ p = psutil.Process(running_server.pid)
180
+ except psutil.Error:
181
+ logger.error(
182
+ "Could not find process for PID '%d' ...",
183
+ running_server.pid,
184
+ )
185
+ continue
186
+ p.kill()
187
+ return
182
188
 
183
189
 
184
190
  def get_step(pipeline_name: str, step_name: str) -> "StepRunResponse":
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Implementation of the vLLM Inference Server Service."""
15
15
 
16
+ import argparse
16
17
  import os
17
18
  from typing import Any, List, Optional, Union
18
19
 
@@ -137,15 +138,23 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
137
138
  self.endpoint.prepare_for_start()
138
139
 
139
140
  import uvloop
140
- from vllm.entrypoints.openai.api_server import run_server
141
- from vllm.entrypoints.openai.cli_args import make_arg_parser
142
- from vllm.utils import FlexibleArgumentParser
141
+ from vllm.entrypoints.openai.api_server import (
142
+ run_server,
143
+ )
144
+ from vllm.entrypoints.openai.cli_args import (
145
+ make_arg_parser,
146
+ )
147
+ from vllm.utils import (
148
+ FlexibleArgumentParser,
149
+ )
143
150
 
144
151
  try:
145
- parser = make_arg_parser(FlexibleArgumentParser())
146
- args = parser.parse_args()
152
+ parser: argparse.ArgumentParser = make_arg_parser(
153
+ FlexibleArgumentParser()
154
+ )
155
+ args: argparse.Namespace = parser.parse_args()
147
156
  # Override port with the available port
148
- self.config.port = self.endpoint.status.port
157
+ self.config.port = self.endpoint.status.port or self.config.port
149
158
  # Update the arguments in place
150
159
  args.__dict__.update(self.config.model_dump())
151
160
  uvloop.run(run_server(args=args))
@@ -161,7 +170,7 @@ class VLLMDeploymentService(LocalDaemonService, BaseDeploymentService):
161
170
  """
162
171
  if not self.is_running:
163
172
  return None
164
- return self.endpoint.prediction_url_path
173
+ return self.endpoint.prediction_url
165
174
 
166
175
  def predict(self, data: "Any") -> "Any":
167
176
  """Make a prediction using the service.
@@ -13,10 +13,25 @@
13
13
  # permissions and limitations under the License.
14
14
  """Run Metadata Lazy Loader definition."""
15
15
 
16
- from typing import TYPE_CHECKING, Optional
16
+ from typing import Optional
17
17
 
18
- if TYPE_CHECKING:
19
- from zenml.models import RunMetadataResponse
18
+ from pydantic import BaseModel
19
+
20
+ from zenml.metadata.metadata_types import MetadataType
21
+
22
+
23
+ class LazyRunMetadataResponse(BaseModel):
24
+ """Lazy run metadata response.
25
+
26
+ Used if the run metadata is accessed from the model in
27
+ a pipeline context available only during pipeline compilation.
28
+ """
29
+
30
+ lazy_load_artifact_name: Optional[str] = None
31
+ lazy_load_artifact_version: Optional[str] = None
32
+ lazy_load_metadata_name: Optional[str] = None
33
+ lazy_load_model_name: str
34
+ lazy_load_model_version: Optional[str] = None
20
35
 
21
36
 
22
37
  class RunMetadataLazyGetter:
@@ -47,7 +62,7 @@ class RunMetadataLazyGetter:
47
62
  self._lazy_load_artifact_name = _lazy_load_artifact_name
48
63
  self._lazy_load_artifact_version = _lazy_load_artifact_version
49
64
 
50
- def __getitem__(self, key: str) -> "RunMetadataResponse":
65
+ def __getitem__(self, key: str) -> MetadataType:
51
66
  """Get the metadata for the given key.
52
67
 
53
68
  Args:
@@ -56,9 +71,7 @@ class RunMetadataLazyGetter:
56
71
  Returns:
57
72
  The metadata lazy loader wrapper for the given key.
58
73
  """
59
- from zenml.models.v2.core.run_metadata import LazyRunMetadataResponse
60
-
61
- return LazyRunMetadataResponse(
74
+ return LazyRunMetadataResponse( # type: ignore[return-value]
62
75
  lazy_load_model_name=self._lazy_load_model_name,
63
76
  lazy_load_model_version=self._lazy_load_model_version,
64
77
  lazy_load_artifact_name=self._lazy_load_artifact_name,
zenml/model/model.py CHANGED
@@ -43,7 +43,6 @@ if TYPE_CHECKING:
43
43
  ModelResponse,
44
44
  ModelVersionResponse,
45
45
  PipelineRunResponse,
46
- RunMetadataResponse,
47
46
  StepRunResponse,
48
47
  )
49
48
 
@@ -349,7 +348,7 @@ class Model(BaseModel):
349
348
  )
350
349
 
351
350
  @property
352
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
351
+ def run_metadata(self) -> Dict[str, "MetadataType"]:
353
352
  """Get model version run metadata.
354
353
 
355
354
  Returns:
zenml/models/__init__.py CHANGED
@@ -239,12 +239,7 @@ from zenml.models.v2.core.run_template import (
239
239
  )
240
240
  from zenml.models.v2.base.base_plugin_flavor import BasePluginFlavorResponse
241
241
  from zenml.models.v2.core.run_metadata import (
242
- LazyRunMetadataResponse,
243
242
  RunMetadataRequest,
244
- RunMetadataFilter,
245
- RunMetadataResponse,
246
- RunMetadataResponseBody,
247
- RunMetadataResponseMetadata,
248
243
  )
249
244
  from zenml.models.v2.core.schedule import (
250
245
  ScheduleRequest,
@@ -418,7 +413,6 @@ EventSourceResponseResources.model_rebuild()
418
413
  FlavorResponseBody.model_rebuild()
419
414
  FlavorResponseMetadata.model_rebuild()
420
415
  LazyArtifactVersionResponse.model_rebuild()
421
- LazyRunMetadataResponse.model_rebuild()
422
416
  ModelResponseBody.model_rebuild()
423
417
  ModelResponseMetadata.model_rebuild()
424
418
  ModelVersionResponseBody.model_rebuild()
@@ -444,8 +438,6 @@ RunTemplateResponseBody.model_rebuild()
444
438
  RunTemplateResponseMetadata.model_rebuild()
445
439
  RunTemplateResponseResources.model_rebuild()
446
440
  RunTemplateResponseBody.model_rebuild()
447
- RunMetadataResponseBody.model_rebuild()
448
- RunMetadataResponseMetadata.model_rebuild()
449
441
  ScheduleResponseBody.model_rebuild()
450
442
  ScheduleResponseMetadata.model_rebuild()
451
443
  SecretResponseBody.model_rebuild()
@@ -637,10 +629,6 @@ __all__ = [
637
629
  "RunTemplateResponseResources",
638
630
  "RunTemplateFilter",
639
631
  "RunMetadataRequest",
640
- "RunMetadataFilter",
641
- "RunMetadataResponse",
642
- "RunMetadataResponseBody",
643
- "RunMetadataResponseMetadata",
644
632
  "ScheduleRequest",
645
633
  "ScheduleUpdate",
646
634
  "ScheduleFilter",
@@ -34,7 +34,7 @@ from pydantic import (
34
34
 
35
35
  from zenml.config.source import Source, SourceWithValidator
36
36
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
37
- from zenml.enums import ArtifactType, GenericFilterOps
37
+ from zenml.enums import ArtifactSaveType, ArtifactType, GenericFilterOps
38
38
  from zenml.logger import get_logger
39
39
  from zenml.metadata.metadata_types import MetadataType
40
40
  from zenml.models.v2.base.filter import StrFilter
@@ -57,9 +57,6 @@ if TYPE_CHECKING:
57
57
  ArtifactVisualizationResponse,
58
58
  )
59
59
  from zenml.models.v2.core.pipeline_run import PipelineRunResponse
60
- from zenml.models.v2.core.run_metadata import (
61
- RunMetadataResponse,
62
- )
63
60
  from zenml.models.v2.core.step_run import StepRunResponse
64
61
 
65
62
  logger = get_logger(__name__)
@@ -107,6 +104,9 @@ class ArtifactVersionRequest(WorkspaceScopedRequest):
107
104
  visualizations: Optional[List["ArtifactVisualizationRequest"]] = Field(
108
105
  default=None, title="Visualizations of the artifact."
109
106
  )
107
+ save_type: ArtifactSaveType = Field(
108
+ title="The save type of the artifact version.",
109
+ )
110
110
  metadata: Optional[Dict[str, MetadataType]] = Field(
111
111
  default=None, title="Metadata of the artifact version."
112
112
  )
@@ -193,6 +193,9 @@ class ArtifactVersionResponseBody(WorkspaceScopedResponseBody):
193
193
  title="The ID of the pipeline run that generated this artifact version.",
194
194
  default=None,
195
195
  )
196
+ save_type: ArtifactSaveType = Field(
197
+ title="The save type of the artifact version.",
198
+ )
196
199
  artifact_store_id: Optional[UUID] = Field(
197
200
  title="ID of the artifact store in which this artifact is stored.",
198
201
  default=None,
@@ -230,7 +233,7 @@ class ArtifactVersionResponseMetadata(WorkspaceScopedResponseMetadata):
230
233
  visualizations: Optional[List["ArtifactVisualizationResponse"]] = Field(
231
234
  default=None, title="Visualizations of the artifact."
232
235
  )
233
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
236
+ run_metadata: Dict[str, MetadataType] = Field(
234
237
  default={}, title="Metadata of the artifact."
235
238
  )
236
239
 
@@ -313,6 +316,15 @@ class ArtifactVersionResponse(
313
316
  """
314
317
  return self.get_body().producer_pipeline_run_id
315
318
 
319
+ @property
320
+ def save_type(self) -> ArtifactSaveType:
321
+ """The `save_type` property.
322
+
323
+ Returns:
324
+ the value of the property.
325
+ """
326
+ return self.get_body().save_type
327
+
316
328
  @property
317
329
  def artifact_store_id(self) -> Optional[UUID]:
318
330
  """The `artifact_store_id` property.
@@ -343,7 +355,7 @@ class ArtifactVersionResponse(
343
355
  return self.get_metadata().visualizations
344
356
 
345
357
  @property
346
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
358
+ def run_metadata(self) -> Dict[str, MetadataType]:
347
359
  """The `metadata` property.
348
360
 
349
361
  Returns:
@@ -671,7 +683,7 @@ class LazyArtifactVersionResponse(ArtifactVersionResponse):
671
683
  )
672
684
 
673
685
  @property
674
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
686
+ def run_metadata(self) -> Dict[str, MetadataType]:
675
687
  """The `metadata` property in lazy loading mode.
676
688
 
677
689
  Returns:
@@ -29,6 +29,7 @@ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, field_validator
29
29
 
30
30
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
31
31
  from zenml.enums import ModelStages
32
+ from zenml.metadata.metadata_types import MetadataType
32
33
  from zenml.models.v2.base.filter import AnyQuery
33
34
  from zenml.models.v2.base.page import Page
34
35
  from zenml.models.v2.base.scoped import (
@@ -49,9 +50,6 @@ if TYPE_CHECKING:
49
50
  from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
50
51
  from zenml.models.v2.core.model import ModelResponse
51
52
  from zenml.models.v2.core.pipeline_run import PipelineRunResponse
52
- from zenml.models.v2.core.run_metadata import (
53
- RunMetadataResponse,
54
- )
55
53
  from zenml.zen_stores.schemas import BaseSchema
56
54
 
57
55
  AnySchema = TypeVar("AnySchema", bound=BaseSchema)
@@ -193,7 +191,7 @@ class ModelVersionResponseMetadata(WorkspaceScopedResponseMetadata):
193
191
  max_length=TEXT_FIELD_MAX_LENGTH,
194
192
  default=None,
195
193
  )
196
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
194
+ run_metadata: Dict[str, MetadataType] = Field(
197
195
  description="Metadata linked to the model version",
198
196
  default={},
199
197
  )
@@ -304,7 +302,7 @@ class ModelVersionResponse(
304
302
  return self.get_metadata().description
305
303
 
306
304
  @property
307
- def run_metadata(self) -> Optional[Dict[str, "RunMetadataResponse"]]:
305
+ def run_metadata(self) -> Dict[str, MetadataType]:
308
306
  """The `run_metadata` property.
309
307
 
310
308
  Returns:
@@ -30,6 +30,7 @@ from pydantic import BaseModel, ConfigDict, Field
30
30
  from zenml.config.pipeline_configurations import PipelineConfiguration
31
31
  from zenml.constants import STR_FIELD_MAX_LENGTH
32
32
  from zenml.enums import ExecutionStatus
33
+ from zenml.metadata.metadata_types import MetadataType
33
34
  from zenml.models.v2.base.scoped import (
34
35
  WorkspaceScopedRequest,
35
36
  WorkspaceScopedResponse,
@@ -51,9 +52,6 @@ if TYPE_CHECKING:
51
52
  from zenml.models.v2.core.pipeline_build import (
52
53
  PipelineBuildResponse,
53
54
  )
54
- from zenml.models.v2.core.run_metadata import (
55
- RunMetadataResponse,
56
- )
57
55
  from zenml.models.v2.core.schedule import ScheduleResponse
58
56
  from zenml.models.v2.core.stack import StackResponse
59
57
  from zenml.models.v2.core.step_run import StepRunResponse
@@ -190,7 +188,7 @@ class PipelineRunResponseBody(WorkspaceScopedResponseBody):
190
188
  class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
191
189
  """Response metadata for pipeline runs."""
192
190
 
193
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
191
+ run_metadata: Dict[str, MetadataType] = Field(
194
192
  default={},
195
193
  title="Metadata associated with this pipeline run.",
196
194
  )
@@ -450,7 +448,7 @@ class PipelineRunResponse(
450
448
  return self.get_body().model_version_id
451
449
 
452
450
  @property
453
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
451
+ def run_metadata(self) -> Dict[str, MetadataType]:
454
452
  """The `run_metadata` property.
455
453
 
456
454
  Returns:
@@ -13,21 +13,15 @@
13
13
  # permissions and limitations under the License.
14
14
  """Models representing run metadata."""
15
15
 
16
- from typing import Any, Dict, Optional, Union
16
+ from typing import Dict, Optional
17
17
  from uuid import UUID
18
18
 
19
- from pydantic import Field, field_validator
19
+ from pydantic import Field
20
20
 
21
- from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
22
21
  from zenml.enums import MetadataResourceTypes
23
22
  from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
24
23
  from zenml.models.v2.base.scoped import (
25
- WorkspaceScopedFilter,
26
24
  WorkspaceScopedRequest,
27
- WorkspaceScopedResponse,
28
- WorkspaceScopedResponseBody,
29
- WorkspaceScopedResponseMetadata,
30
- WorkspaceScopedResponseResources,
31
25
  )
32
26
 
33
27
  # ------------------ Request Model ------------------
@@ -51,212 +45,3 @@ class RunMetadataRequest(WorkspaceScopedRequest):
51
45
  types: Dict[str, "MetadataTypeEnum"] = Field(
52
46
  title="The types of the metadata to be created.",
53
47
  )
54
-
55
-
56
- # ------------------ Update Model ------------------
57
-
58
- # There is no update model for run metadata.
59
-
60
- # ------------------ Response Model ------------------
61
-
62
-
63
- class RunMetadataResponseBody(WorkspaceScopedResponseBody):
64
- """Response body for run metadata."""
65
-
66
- key: str = Field(title="The key of the metadata.")
67
- value: MetadataType = Field(
68
- title="The value of the metadata.", union_mode="smart"
69
- )
70
- type: MetadataTypeEnum = Field(title="The type of the metadata.")
71
-
72
- @field_validator("key", "type")
73
- @classmethod
74
- def str_field_max_length_check(cls, value: Any) -> Any:
75
- """Checks if the length of the value exceeds the maximum str length.
76
-
77
- Args:
78
- value: the value set in the field
79
-
80
- Returns:
81
- the value itself.
82
-
83
- Raises:
84
- AssertionError: if the length of the field is longer than the
85
- maximum threshold.
86
- """
87
- assert len(str(value)) < STR_FIELD_MAX_LENGTH, (
88
- "The length of the value for this field can not "
89
- f"exceed {STR_FIELD_MAX_LENGTH}"
90
- )
91
- return value
92
-
93
- @field_validator("value")
94
- @classmethod
95
- def text_field_max_length_check(cls, value: Any) -> Any:
96
- """Checks if the length of the value exceeds the maximum text length.
97
-
98
- Args:
99
- value: the value set in the field
100
-
101
- Returns:
102
- the value itself.
103
-
104
- Raises:
105
- AssertionError: if the length of the field is longer than the
106
- maximum threshold.
107
- """
108
- assert len(str(value)) < TEXT_FIELD_MAX_LENGTH, (
109
- "The length of the value for this field can not "
110
- f"exceed {TEXT_FIELD_MAX_LENGTH}"
111
- )
112
- return value
113
-
114
-
115
- class RunMetadataResponseMetadata(WorkspaceScopedResponseMetadata):
116
- """Response metadata for run metadata."""
117
-
118
- resource_id: UUID = Field(
119
- title="The ID of the resource that this metadata belongs to.",
120
- )
121
- resource_type: MetadataResourceTypes = Field(
122
- title="The type of the resource that this metadata belongs to.",
123
- )
124
- stack_component_id: Optional[UUID] = Field(
125
- title="The ID of the stack component that this metadata belongs to."
126
- )
127
-
128
-
129
- class RunMetadataResponseResources(WorkspaceScopedResponseResources):
130
- """Class for all resource models associated with the run metadata entity."""
131
-
132
-
133
- class RunMetadataResponse(
134
- WorkspaceScopedResponse[
135
- RunMetadataResponseBody,
136
- RunMetadataResponseMetadata,
137
- RunMetadataResponseResources,
138
- ]
139
- ):
140
- """Response model for run metadata."""
141
-
142
- def get_hydrated_version(self) -> "RunMetadataResponse":
143
- """Get the hydrated version of this run metadata.
144
-
145
- Returns:
146
- an instance of the same entity with the metadata field attached.
147
- """
148
- from zenml.client import Client
149
-
150
- return Client().zen_store.get_run_metadata(self.id)
151
-
152
- # Body and metadata properties
153
- @property
154
- def key(self) -> str:
155
- """The `key` property.
156
-
157
- Returns:
158
- the value of the property.
159
- """
160
- return self.get_body().key
161
-
162
- @property
163
- def value(self) -> MetadataType:
164
- """The `value` property.
165
-
166
- Returns:
167
- the value of the property.
168
- """
169
- return self.get_body().value
170
-
171
- @property
172
- def type(self) -> MetadataTypeEnum:
173
- """The `type` property.
174
-
175
- Returns:
176
- the value of the property.
177
- """
178
- return self.get_body().type
179
-
180
- @property
181
- def resource_id(self) -> UUID:
182
- """The `resource_id` property.
183
-
184
- Returns:
185
- the value of the property.
186
- """
187
- return self.get_metadata().resource_id
188
-
189
- @property
190
- def resource_type(self) -> MetadataResourceTypes:
191
- """The `resource_type` property.
192
-
193
- Returns:
194
- the value of the property.
195
- """
196
- return MetadataResourceTypes(self.get_metadata().resource_type)
197
-
198
- @property
199
- def stack_component_id(self) -> Optional[UUID]:
200
- """The `stack_component_id` property.
201
-
202
- Returns:
203
- the value of the property.
204
- """
205
- return self.get_metadata().stack_component_id
206
-
207
-
208
- # ------------------ Filter Model ------------------
209
-
210
-
211
- class RunMetadataFilter(WorkspaceScopedFilter):
212
- """Model to enable advanced filtering of run metadata."""
213
-
214
- resource_id: Optional[Union[str, UUID]] = Field(
215
- default=None, union_mode="left_to_right"
216
- )
217
- resource_type: Optional[MetadataResourceTypes] = None
218
- stack_component_id: Optional[Union[str, UUID]] = Field(
219
- default=None, union_mode="left_to_right"
220
- )
221
- key: Optional[str] = None
222
- type: Optional[Union[str, MetadataTypeEnum]] = Field(
223
- default=None, union_mode="left_to_right"
224
- )
225
-
226
-
227
- # -------------------- Lazy Loader --------------------
228
-
229
-
230
- class LazyRunMetadataResponse(RunMetadataResponse):
231
- """Lazy run metadata response.
232
-
233
- Used if the run metadata is accessed from the model in
234
- a pipeline context available only during pipeline compilation.
235
- """
236
-
237
- id: Optional[UUID] = None # type: ignore[assignment]
238
- lazy_load_artifact_name: Optional[str] = None
239
- lazy_load_artifact_version: Optional[str] = None
240
- lazy_load_metadata_name: Optional[str] = None
241
- lazy_load_model_name: str
242
- lazy_load_model_version: Optional[str] = None
243
-
244
- def get_body(self) -> None: # type: ignore[override]
245
- """Protects from misuse of the lazy loader.
246
-
247
- Raises:
248
- RuntimeError: always
249
- """
250
- raise RuntimeError(
251
- "Cannot access run metadata body before pipeline runs."
252
- )
253
-
254
- def get_metadata(self) -> None: # type: ignore[override]
255
- """Protects from misuse of the lazy loader.
256
-
257
- Raises:
258
- RuntimeError: always
259
- """
260
- raise RuntimeError(
261
- "Cannot access run metadata metadata before pipeline runs."
262
- )