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
@@ -13,12 +13,13 @@
13
13
  # permissions and limitations under the License.
14
14
  """Endpoint definitions for artifact versions."""
15
15
 
16
+ from typing import List
16
17
  from uuid import UUID
17
18
 
18
19
  from fastapi import APIRouter, Depends, Security
19
20
 
20
21
  from zenml.artifacts.utils import load_artifact_visualization
21
- from zenml.constants import API, ARTIFACT_VERSIONS, VERSION_1, VISUALIZE
22
+ from zenml.constants import API, ARTIFACT_VERSIONS, BATCH, VERSION_1, VISUALIZE
22
23
  from zenml.models import (
23
24
  ArtifactVersionFilter,
24
25
  ArtifactVersionRequest,
@@ -30,6 +31,7 @@ from zenml.models import (
30
31
  from zenml.zen_server.auth import AuthContext, authorize
31
32
  from zenml.zen_server.exceptions import error_response
32
33
  from zenml.zen_server.rbac.endpoint_utils import (
34
+ verify_permissions_and_batch_create_entity,
33
35
  verify_permissions_and_create_entity,
34
36
  verify_permissions_and_delete_entity,
35
37
  verify_permissions_and_get_entity,
@@ -118,6 +120,30 @@ def create_artifact_version(
118
120
  )
119
121
 
120
122
 
123
+ @artifact_version_router.post(
124
+ BATCH,
125
+ responses={401: error_response, 409: error_response, 422: error_response},
126
+ )
127
+ @handle_exceptions
128
+ def batch_create_artifact_version(
129
+ artifact_versions: List[ArtifactVersionRequest],
130
+ _: AuthContext = Security(authorize),
131
+ ) -> List[ArtifactVersionResponse]:
132
+ """Create a batch of artifact versions.
133
+
134
+ Args:
135
+ artifact_versions: The artifact versions to create.
136
+
137
+ Returns:
138
+ The created artifact versions.
139
+ """
140
+ return verify_permissions_and_batch_create_entity(
141
+ batch=artifact_versions,
142
+ resource_type=ResourceType.ARTIFACT_VERSION,
143
+ create_method=zen_store().batch_create_artifact_versions,
144
+ )
145
+
146
+
121
147
  @artifact_version_router.get(
122
148
  "/{artifact_version_id}",
123
149
  response_model=ArtifactVersionResponse,
@@ -74,7 +74,6 @@ from zenml.models import (
74
74
  PipelineRunRequest,
75
75
  PipelineRunResponse,
76
76
  RunMetadataRequest,
77
- RunMetadataResponse,
78
77
  RunTemplateFilter,
79
78
  RunTemplateRequest,
80
79
  RunTemplateResponse,
@@ -977,7 +976,6 @@ def get_or_create_pipeline_run(
977
976
 
978
977
  @router.post(
979
978
  WORKSPACES + "/{workspace_name_or_id}" + RUN_METADATA,
980
- response_model=List[RunMetadataResponse],
981
979
  responses={401: error_response, 409: error_response, 422: error_response},
982
980
  )
983
981
  @handle_exceptions
@@ -985,7 +983,7 @@ def create_run_metadata(
985
983
  workspace_name_or_id: Union[str, UUID],
986
984
  run_metadata: RunMetadataRequest,
987
985
  auth_context: AuthContext = Security(authorize),
988
- ) -> List[RunMetadataResponse]:
986
+ ) -> None:
989
987
  """Creates run metadata.
990
988
 
991
989
  Args:
@@ -1039,7 +1037,8 @@ def create_run_metadata(
1039
1037
  resource_type=ResourceType.RUN_METADATA, action=Action.CREATE
1040
1038
  )
1041
1039
 
1042
- return zen_store().create_run_metadata(run_metadata)
1040
+ zen_store().create_run_metadata(run_metadata)
1041
+ return None
1043
1042
 
1044
1043
 
1045
1044
  @router.post(
@@ -70,7 +70,6 @@ from zenml.zen_server.routers import (
70
70
  pipeline_deployments_endpoints,
71
71
  pipelines_endpoints,
72
72
  plugin_endpoints,
73
- run_metadata_endpoints,
74
73
  run_templates_endpoints,
75
74
  runs_endpoints,
76
75
  schedule_endpoints,
@@ -423,7 +422,6 @@ app.include_router(pipelines_endpoints.router)
423
422
  app.include_router(pipeline_builds_endpoints.router)
424
423
  app.include_router(pipeline_deployments_endpoints.router)
425
424
  app.include_router(runs_endpoints.router)
426
- app.include_router(run_metadata_endpoints.router)
427
425
  app.include_router(run_templates_endpoints.router)
428
426
  app.include_router(schedule_endpoints.router)
429
427
  app.include_router(secrets_endpoints.router)
@@ -0,0 +1,99 @@
1
+ """move artifact save type [1cb6477f72d6].
2
+
3
+ Revision ID: 1cb6477f72d6
4
+ Revises: c22561cbb3a9
5
+ Create Date: 2024-10-10 15:44:09.465210
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "1cb6477f72d6"
14
+ down_revision = "c22561cbb3a9"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Upgrade database schema and/or data, creating a new revision."""
21
+ # Step 1: Add nullable save_type column to artifact_version
22
+ with op.batch_alter_table("artifact_version", schema=None) as batch_op:
23
+ batch_op.add_column(sa.Column("save_type", sa.TEXT(), nullable=True))
24
+
25
+ # Step 2: Move data from step_run_output_artifact.type to artifact_version.save_type
26
+ op.execute("""
27
+ UPDATE artifact_version
28
+ SET save_type = (
29
+ SELECT max(step_run_output_artifact.type)
30
+ FROM step_run_output_artifact
31
+ WHERE step_run_output_artifact.artifact_id = artifact_version.id
32
+ GROUP BY artifact_id
33
+ )
34
+ """)
35
+ op.execute("""
36
+ UPDATE artifact_version
37
+ SET save_type = 'step_output'
38
+ WHERE artifact_version.save_type = 'default'
39
+ """)
40
+ op.execute("""
41
+ UPDATE artifact_version
42
+ SET save_type = 'external'
43
+ WHERE save_type is NULL
44
+ """)
45
+
46
+ # # Step 3: Set save_type to non-nullable
47
+ with op.batch_alter_table("artifact_version", schema=None) as batch_op:
48
+ batch_op.alter_column(
49
+ "save_type",
50
+ existing_type=sa.TEXT(),
51
+ nullable=False,
52
+ )
53
+
54
+ # Step 4: Remove type column from step_run_output_artifact
55
+ with op.batch_alter_table(
56
+ "step_run_output_artifact", schema=None
57
+ ) as batch_op:
58
+ batch_op.drop_column("type")
59
+
60
+
61
+ def downgrade() -> None:
62
+ """Downgrade database schema and/or data back to the previous revision."""
63
+ # Add type column back to step_run_output_artifact
64
+ with op.batch_alter_table(
65
+ "step_run_output_artifact", schema=None
66
+ ) as batch_op:
67
+ batch_op.add_column(
68
+ sa.Column("type", sa.TEXT(), nullable=True),
69
+ )
70
+
71
+ # Move data back from artifact_version.save_type to step_run_output_artifact.type
72
+ op.execute("""
73
+ UPDATE step_run_output_artifact
74
+ SET type = (
75
+ SELECT max(artifact_version.save_type)
76
+ FROM artifact_version
77
+ WHERE step_run_output_artifact.artifact_id = artifact_version.id
78
+ GROUP BY artifact_id
79
+ )
80
+ """)
81
+ op.execute("""
82
+ UPDATE step_run_output_artifact
83
+ SET type = 'default'
84
+ WHERE step_run_output_artifact.type = 'step_output'
85
+ """)
86
+
87
+ # Set type to non-nullable
88
+ with op.batch_alter_table(
89
+ "step_run_output_artifact", schema=None
90
+ ) as batch_op:
91
+ batch_op.alter_column(
92
+ "type",
93
+ existing_type=sa.TEXT(),
94
+ nullable=False,
95
+ )
96
+
97
+ # Remove save_type column from artifact_version
98
+ with op.batch_alter_table("artifact_version", schema=None) as batch_op:
99
+ batch_op.drop_column("save_type")
@@ -0,0 +1,33 @@
1
+ """Update step run input types [b557b2871693].
2
+
3
+ Revision ID: b557b2871693
4
+ Revises: 1cb6477f72d6
5
+ Create Date: 2024-10-30 13:06:55.147202
6
+
7
+ """
8
+
9
+ from alembic import op
10
+
11
+ # revision identifiers, used by Alembic.
12
+ revision = "b557b2871693"
13
+ down_revision = "1cb6477f72d6"
14
+ branch_labels = None
15
+ depends_on = None
16
+
17
+
18
+ def upgrade() -> None:
19
+ """Upgrade database schema and/or data, creating a new revision."""
20
+ op.execute("""
21
+ UPDATE step_run_input_artifact
22
+ SET type = 'step_output'
23
+ WHERE type = 'default'
24
+ """)
25
+
26
+
27
+ def downgrade() -> None:
28
+ """Downgrade database schema and/or data back to the previous revision."""
29
+ op.execute("""
30
+ UPDATE step_run_input_artifact
31
+ SET type = 'default'
32
+ WHERE type = 'step_output'
33
+ """)
@@ -57,6 +57,7 @@ from zenml.constants import (
57
57
  ARTIFACT_VERSIONS,
58
58
  ARTIFACT_VISUALIZATIONS,
59
59
  ARTIFACTS,
60
+ BATCH,
60
61
  CODE_REFERENCES,
61
62
  CODE_REPOSITORIES,
62
63
  CONFIG,
@@ -200,9 +201,7 @@ from zenml.models import (
200
201
  PipelineRunResponse,
201
202
  PipelineRunUpdate,
202
203
  PipelineUpdate,
203
- RunMetadataFilter,
204
204
  RunMetadataRequest,
205
- RunMetadataResponse,
206
205
  RunTemplateFilter,
207
206
  RunTemplateRequest,
208
207
  RunTemplateResponse,
@@ -991,6 +990,23 @@ class RestZenStore(BaseZenStore):
991
990
  route=ARTIFACT_VERSIONS,
992
991
  )
993
992
 
993
+ def batch_create_artifact_versions(
994
+ self, artifact_versions: List[ArtifactVersionRequest]
995
+ ) -> List[ArtifactVersionResponse]:
996
+ """Creates a batch of artifact versions.
997
+
998
+ Args:
999
+ artifact_versions: The artifact versions to create.
1000
+
1001
+ Returns:
1002
+ The created artifact versions.
1003
+ """
1004
+ return self._batch_create_resources(
1005
+ resources=artifact_versions,
1006
+ response_model=ArtifactVersionResponse,
1007
+ route=ARTIFACT_VERSIONS,
1008
+ )
1009
+
994
1010
  def get_artifact_version(
995
1011
  self, artifact_version_id: UUID, hydrate: bool = True
996
1012
  ) -> ArtifactVersionResponse:
@@ -1996,9 +2012,7 @@ class RestZenStore(BaseZenStore):
1996
2012
 
1997
2013
  # ----------------------------- Run Metadata -----------------------------
1998
2014
 
1999
- def create_run_metadata(
2000
- self, run_metadata: RunMetadataRequest
2001
- ) -> List[RunMetadataResponse]:
2015
+ def create_run_metadata(self, run_metadata: RunMetadataRequest) -> None:
2002
2016
  """Creates run metadata.
2003
2017
 
2004
2018
  Args:
@@ -2008,55 +2022,8 @@ class RestZenStore(BaseZenStore):
2008
2022
  The created run metadata.
2009
2023
  """
2010
2024
  route = f"{WORKSPACES}/{str(run_metadata.workspace)}{RUN_METADATA}"
2011
- response_body = self.post(f"{route}", body=run_metadata)
2012
- result: List[RunMetadataResponse] = []
2013
- if isinstance(response_body, list):
2014
- for metadata in response_body or []:
2015
- result.append(RunMetadataResponse.model_validate(metadata))
2016
- return result
2017
-
2018
- def get_run_metadata(
2019
- self, run_metadata_id: UUID, hydrate: bool = True
2020
- ) -> RunMetadataResponse:
2021
- """Gets run metadata with the given ID.
2022
-
2023
- Args:
2024
- run_metadata_id: The ID of the run metadata to get.
2025
- hydrate: Flag deciding whether to hydrate the output model(s)
2026
- by including metadata fields in the response.
2027
-
2028
- Returns:
2029
- The run metadata.
2030
- """
2031
- return self._get_resource(
2032
- resource_id=run_metadata_id,
2033
- route=RUN_METADATA,
2034
- response_model=RunMetadataResponse,
2035
- params={"hydrate": hydrate},
2036
- )
2037
-
2038
- def list_run_metadata(
2039
- self,
2040
- run_metadata_filter_model: RunMetadataFilter,
2041
- hydrate: bool = False,
2042
- ) -> Page[RunMetadataResponse]:
2043
- """List run metadata.
2044
-
2045
- Args:
2046
- run_metadata_filter_model: All filter parameters including
2047
- pagination params.
2048
- hydrate: Flag deciding whether to hydrate the output model(s)
2049
- by including metadata fields in the response.
2050
-
2051
- Returns:
2052
- The run metadata.
2053
- """
2054
- return self._list_paginated_resources(
2055
- route=RUN_METADATA,
2056
- response_model=RunMetadataResponse,
2057
- filter_model=run_metadata_filter_model,
2058
- params={"hydrate": hydrate},
2059
- )
2025
+ self.post(f"{route}", body=run_metadata)
2026
+ return None
2060
2027
 
2061
2028
  # ----------------------------- Schedules -----------------------------
2062
2029
 
@@ -4518,6 +4485,40 @@ class RestZenStore(BaseZenStore):
4518
4485
 
4519
4486
  return response_model.model_validate(response_body)
4520
4487
 
4488
+ def _batch_create_resources(
4489
+ self,
4490
+ resources: List[AnyRequest],
4491
+ response_model: Type[AnyResponse],
4492
+ route: str,
4493
+ params: Optional[Dict[str, Any]] = None,
4494
+ ) -> List[AnyResponse]:
4495
+ """Create a new batch of resources.
4496
+
4497
+ Args:
4498
+ resources: The resources to create.
4499
+ response_model: The response model of an individual resource.
4500
+ route: The resource REST route to use.
4501
+ params: Optional query parameters to pass to the endpoint.
4502
+
4503
+ Returns:
4504
+ List of response models.
4505
+ """
4506
+ json_data = [
4507
+ resource.model_dump(mode="json") for resource in resources
4508
+ ]
4509
+ response = self._request(
4510
+ "POST",
4511
+ self.url + API + VERSION_1 + route + BATCH,
4512
+ json=json_data,
4513
+ params=params,
4514
+ )
4515
+ assert isinstance(response, list)
4516
+
4517
+ return [
4518
+ response_model.model_validate(model_data)
4519
+ for model_data in response
4520
+ ]
4521
+
4521
4522
  def _create_workspace_scoped_resource(
4522
4523
  self,
4523
4524
  resource: AnyWorkspaceScopedRequest,
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of artifact table."""
15
15
 
16
+ import json
16
17
  from datetime import datetime
17
18
  from typing import TYPE_CHECKING, Any, List, Optional
18
19
  from uuid import UUID
@@ -23,6 +24,7 @@ from sqlmodel import Field, Relationship
23
24
 
24
25
  from zenml.config.source import Source
25
26
  from zenml.enums import (
27
+ ArtifactSaveType,
26
28
  ArtifactType,
27
29
  ExecutionStatus,
28
30
  MetadataResourceTypes,
@@ -196,6 +198,7 @@ class ArtifactVersionSchema(BaseSchema, table=True):
196
198
  overlaps="tags",
197
199
  ),
198
200
  )
201
+ save_type: str = Field(sa_column=Column(TEXT, nullable=False))
199
202
 
200
203
  # Foreign keys
201
204
  artifact_id: UUID = build_foreign_key_field(
@@ -300,6 +303,7 @@ class ArtifactVersionSchema(BaseSchema, table=True):
300
303
  uri=artifact_version_request.uri,
301
304
  materializer=artifact_version_request.materializer.model_dump_json(),
302
305
  data_type=artifact_version_request.data_type.model_dump_json(),
306
+ save_type=artifact_version_request.save_type.value,
303
307
  )
304
308
 
305
309
  def to_model(
@@ -360,6 +364,7 @@ class ArtifactVersionSchema(BaseSchema, table=True):
360
364
  updated=self.updated,
361
365
  tags=[t.tag.to_model() for t in self.tags],
362
366
  producer_pipeline_run_id=producer_pipeline_run_id,
367
+ save_type=ArtifactSaveType(self.save_type),
363
368
  artifact_store_id=self.artifact_store_id,
364
369
  )
365
370
 
@@ -370,7 +375,9 @@ class ArtifactVersionSchema(BaseSchema, table=True):
370
375
  workspace=self.workspace.to_model(),
371
376
  producer_step_run_id=producer_step_run_id,
372
377
  visualizations=[v.to_model() for v in self.visualizations],
373
- run_metadata={m.key: m.to_model() for m in self.run_metadata},
378
+ run_metadata={
379
+ m.key: json.loads(m.value) for m in self.run_metadata
380
+ },
374
381
  )
375
382
 
376
383
  resources = None
@@ -13,6 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of model tables."""
15
15
 
16
+ import json
16
17
  from datetime import datetime
17
18
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
18
19
  from uuid import UUID
@@ -379,8 +380,7 @@ class ModelVersionSchema(NamedSchema, table=True):
379
380
  workspace=self.workspace.to_model(),
380
381
  description=self.description,
381
382
  run_metadata={
382
- rm.key: rm.to_model(include_metadata=True)
383
- for rm in self.run_metadata
383
+ rm.key: json.loads(rm.value) for rm in self.run_metadata
384
384
  },
385
385
  )
386
386
 
@@ -271,7 +271,7 @@ class PipelineRunSchema(NamedSchema, table=True):
271
271
  )
272
272
 
273
273
  run_metadata = {
274
- metadata_schema.key: metadata_schema.to_model()
274
+ metadata_schema.key: json.loads(metadata_schema.value)
275
275
  for metadata_schema in self.run_metadata
276
276
  }
277
277
 
@@ -13,20 +13,13 @@
13
13
  # permissions and limitations under the License.
14
14
  """SQLModel implementation of pipeline run metadata tables."""
15
15
 
16
- import json
17
- from typing import TYPE_CHECKING, Any, List, Optional
16
+ from typing import TYPE_CHECKING, List, Optional
18
17
  from uuid import UUID
19
18
 
20
19
  from sqlalchemy import TEXT, VARCHAR, Column
21
20
  from sqlmodel import Field, Relationship
22
21
 
23
22
  from zenml.enums import MetadataResourceTypes
24
- from zenml.metadata.metadata_types import MetadataTypeEnum
25
- from zenml.models import (
26
- RunMetadataResponse,
27
- RunMetadataResponseBody,
28
- RunMetadataResponseMetadata,
29
- )
30
23
  from zenml.zen_stores.schemas.base_schemas import BaseSchema
31
24
  from zenml.zen_stores.schemas.component_schemas import StackComponentSchema
32
25
  from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
@@ -110,43 +103,3 @@ class RunMetadataSchema(BaseSchema, table=True):
110
103
  key: str
111
104
  value: str = Field(sa_column=Column(TEXT, nullable=False))
112
105
  type: str
113
-
114
- def to_model(
115
- self,
116
- include_metadata: bool = False,
117
- include_resources: bool = False,
118
- **kwargs: Any,
119
- ) -> "RunMetadataResponse":
120
- """Convert a `RunMetadataSchema` to a `RunMetadataResponse`.
121
-
122
- Args:
123
- include_metadata: Whether the metadata will be filled.
124
- include_resources: Whether the resources will be filled.
125
- **kwargs: Keyword arguments to allow schema specific logic
126
-
127
-
128
- Returns:
129
- The created `RunMetadataResponse`.
130
- """
131
- body = RunMetadataResponseBody(
132
- user=self.user.to_model() if self.user else None,
133
- key=self.key,
134
- created=self.created,
135
- updated=self.updated,
136
- value=json.loads(self.value),
137
- type=MetadataTypeEnum(self.type),
138
- )
139
- metadata = None
140
- if include_metadata:
141
- metadata = RunMetadataResponseMetadata(
142
- workspace=self.workspace.to_model(),
143
- resource_id=self.resource_id,
144
- resource_type=MetadataResourceTypes(self.resource_type),
145
- stack_component_id=self.stack_component_id,
146
- )
147
-
148
- return RunMetadataResponse(
149
- id=self.id,
150
- body=body,
151
- metadata=metadata,
152
- )
@@ -15,7 +15,7 @@
15
15
 
16
16
  import json
17
17
  from datetime import datetime
18
- from typing import TYPE_CHECKING, Any, List, Optional
18
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional
19
19
  from uuid import UUID
20
20
 
21
21
  from pydantic import ConfigDict
@@ -28,6 +28,7 @@ from zenml.constants import MEDIUMTEXT_MAX_LENGTH
28
28
  from zenml.enums import (
29
29
  ExecutionStatus,
30
30
  MetadataResourceTypes,
31
+ StepRunInputArtifactType,
31
32
  )
32
33
  from zenml.models import (
33
34
  StepRunRequest,
@@ -36,7 +37,11 @@ from zenml.models import (
36
37
  StepRunResponseMetadata,
37
38
  StepRunUpdate,
38
39
  )
39
- from zenml.models.v2.core.step_run import StepRunResponseResources
40
+ from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
41
+ from zenml.models.v2.core.step_run import (
42
+ StepRunInputResponse,
43
+ StepRunResponseResources,
44
+ )
40
45
  from zenml.zen_stores.schemas.base_schemas import NamedSchema
41
46
  from zenml.zen_stores.schemas.constants import MODEL_VERSION_TABLENAME
42
47
  from zenml.zen_stores.schemas.pipeline_deployment_schemas import (
@@ -214,21 +219,25 @@ class StepRunSchema(NamedSchema, table=True):
214
219
  or a step_configuration.
215
220
  """
216
221
  run_metadata = {
217
- metadata_schema.key: metadata_schema.to_model()
222
+ metadata_schema.key: json.loads(metadata_schema.value)
218
223
  for metadata_schema in self.run_metadata
219
224
  }
220
225
 
221
226
  input_artifacts = {
222
- artifact.name: artifact.artifact_version.to_model()
227
+ artifact.name: StepRunInputResponse(
228
+ input_type=StepRunInputArtifactType(artifact.type),
229
+ **artifact.artifact_version.to_model().model_dump(),
230
+ )
223
231
  for artifact in self.input_artifacts
224
232
  }
225
233
 
226
- output_artifacts = {
227
- artifact.name: artifact.artifact_version.to_model(
228
- pipeline_run_id_in_context=self.pipeline_run_id
234
+ output_artifacts: Dict[str, List["ArtifactVersionResponse"]] = {}
235
+ for artifact in self.output_artifacts:
236
+ if artifact.name not in output_artifacts:
237
+ output_artifacts[artifact.name] = []
238
+ output_artifacts[artifact.name].append(
239
+ artifact.artifact_version.to_model()
229
240
  )
230
- for artifact in self.output_artifacts
231
- }
232
241
 
233
242
  full_step_config = None
234
243
  if self.deployment is not None:
@@ -398,7 +407,6 @@ class StepRunOutputArtifactSchema(SQLModel, table=True):
398
407
 
399
408
  # Fields
400
409
  name: str
401
- type: str
402
410
 
403
411
  # Foreign keys
404
412
  step_id: UUID = build_foreign_key_field(