zenml-nightly 0.70.0.dev20241125__py3-none-any.whl → 0.71.0.dev20241220__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.
- README.md +4 -4
- RELEASE_NOTES.md +112 -0
- zenml/VERSION +1 -1
- zenml/artifact_stores/base_artifact_store.py +2 -2
- zenml/artifacts/artifact_config.py +15 -6
- zenml/artifacts/utils.py +59 -32
- zenml/cli/__init__.py +22 -4
- zenml/cli/base.py +5 -5
- zenml/cli/login.py +26 -0
- zenml/cli/pipeline.py +111 -62
- zenml/cli/server.py +20 -20
- zenml/cli/service_connectors.py +3 -3
- zenml/cli/stack.py +0 -3
- zenml/cli/stack_components.py +0 -1
- zenml/cli/utils.py +0 -5
- zenml/client.py +62 -20
- zenml/config/compiler.py +12 -3
- zenml/config/pipeline_configurations.py +20 -0
- zenml/config/pipeline_run_configuration.py +1 -0
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/config/server_config.py +4 -0
- zenml/config/step_configurations.py +21 -0
- zenml/constants.py +10 -0
- zenml/enums.py +1 -0
- zenml/image_builders/base_image_builder.py +5 -2
- zenml/image_builders/build_context.py +7 -16
- zenml/image_builders/local_image_builder.py +13 -3
- zenml/integrations/__init__.py +1 -0
- zenml/integrations/aws/__init__.py +3 -0
- zenml/integrations/aws/flavors/__init__.py +6 -0
- zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
- zenml/integrations/aws/image_builders/__init__.py +20 -0
- zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +14 -6
- zenml/integrations/constants.py +1 -0
- zenml/integrations/feast/__init__.py +1 -1
- zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
- zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
- zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
- zenml/integrations/kubernetes/orchestrators/kube_utils.py +46 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +13 -2
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +3 -1
- zenml/integrations/kubernetes/orchestrators/manifest_utils.py +3 -2
- zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -2
- zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
- zenml/integrations/modal/__init__.py +46 -0
- zenml/integrations/modal/flavors/__init__.py +26 -0
- zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
- zenml/integrations/modal/step_operators/__init__.py +22 -0
- zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
- zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
- zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
- zenml/integrations/registry.py +2 -2
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
- zenml/io/filesystem.py +2 -2
- zenml/io/local_filesystem.py +3 -3
- zenml/materializers/built_in_materializer.py +18 -1
- zenml/materializers/structured_string_materializer.py +8 -3
- zenml/model/model.py +23 -101
- zenml/model/utils.py +21 -17
- zenml/models/__init__.py +6 -0
- zenml/models/v2/base/filter.py +26 -30
- zenml/models/v2/base/scoped.py +258 -5
- zenml/models/v2/core/artifact_version.py +21 -29
- zenml/models/v2/core/code_repository.py +1 -12
- zenml/models/v2/core/component.py +5 -68
- zenml/models/v2/core/flavor.py +1 -11
- zenml/models/v2/core/model.py +1 -57
- zenml/models/v2/core/model_version.py +11 -36
- zenml/models/v2/core/model_version_artifact.py +11 -3
- zenml/models/v2/core/model_version_pipeline_run.py +14 -3
- zenml/models/v2/core/pipeline.py +47 -55
- zenml/models/v2/core/pipeline_build.py +67 -12
- zenml/models/v2/core/pipeline_deployment.py +0 -10
- zenml/models/v2/core/pipeline_run.py +110 -32
- zenml/models/v2/core/run_metadata.py +30 -9
- zenml/models/v2/core/run_template.py +21 -29
- zenml/models/v2/core/schedule.py +0 -10
- zenml/models/v2/core/secret.py +0 -14
- zenml/models/v2/core/service.py +9 -16
- zenml/models/v2/core/service_connector.py +0 -11
- zenml/models/v2/core/stack.py +21 -30
- zenml/models/v2/core/step_run.py +24 -18
- zenml/models/v2/core/trigger.py +19 -3
- zenml/models/v2/misc/run_metadata.py +38 -0
- zenml/orchestrators/base_orchestrator.py +13 -1
- zenml/orchestrators/input_utils.py +19 -6
- zenml/orchestrators/output_utils.py +5 -1
- zenml/orchestrators/publish_utils.py +12 -5
- zenml/orchestrators/step_launcher.py +16 -16
- zenml/orchestrators/step_run_utils.py +18 -197
- zenml/orchestrators/step_runner.py +40 -3
- zenml/orchestrators/utils.py +79 -50
- zenml/pipelines/build_utils.py +12 -0
- zenml/pipelines/pipeline_decorator.py +4 -0
- zenml/pipelines/pipeline_definition.py +26 -8
- zenml/pipelines/run_utils.py +9 -5
- zenml/service_connectors/service_connector_utils.py +3 -9
- zenml/stack/stack_component.py +1 -1
- zenml/stack_deployments/aws_stack_deployment.py +22 -0
- zenml/steps/base_step.py +11 -1
- zenml/steps/entrypoint_function_utils.py +7 -3
- zenml/steps/step_decorator.py +4 -0
- zenml/steps/utils.py +23 -7
- zenml/types.py +4 -0
- zenml/utils/archivable.py +65 -36
- zenml/utils/code_utils.py +8 -4
- zenml/utils/docker_utils.py +9 -0
- zenml/utils/metadata_utils.py +186 -153
- zenml/utils/string_utils.py +41 -16
- zenml/utils/visualization_utils.py +4 -1
- zenml/zen_server/auth.py +9 -10
- zenml/zen_server/cloud_utils.py +3 -1
- zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
- zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
- zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
- zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
- zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
- zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
- zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
- zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
- zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
- zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
- zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
- zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
- zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
- zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
- zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
- zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
- zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
- zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
- zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
- zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
- zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
- zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
- zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
- zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
- zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
- zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
- zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
- zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
- zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
- zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
- zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
- zenml/zen_server/dashboard/index.html +4 -4
- zenml/zen_server/deploy/helm/Chart.yaml +1 -1
- zenml/zen_server/deploy/helm/README.md +2 -2
- zenml/zen_server/rbac/endpoint_utils.py +6 -4
- zenml/zen_server/rbac/models.py +3 -2
- zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
- zenml/zen_server/rbac/utils.py +4 -7
- zenml/zen_server/routers/auth_endpoints.py +22 -11
- zenml/zen_server/routers/steps_endpoints.py +7 -1
- zenml/zen_server/routers/users_endpoints.py +35 -37
- zenml/zen_server/routers/workspaces_endpoints.py +44 -55
- zenml/zen_server/template_execution/utils.py +4 -1
- zenml/zen_server/utils.py +4 -3
- zenml/zen_stores/base_zen_store.py +10 -2
- zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
- zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
- zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
- zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
- zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
- zenml/zen_stores/rest_zen_store.py +76 -43
- zenml/zen_stores/schemas/__init__.py +5 -1
- zenml/zen_stores/schemas/artifact_schemas.py +12 -11
- zenml/zen_stores/schemas/component_schemas.py +0 -3
- zenml/zen_stores/schemas/model_schemas.py +55 -17
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_run_schemas.py +52 -18
- zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
- zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
- zenml/zen_stores/schemas/step_run_schemas.py +40 -13
- zenml/zen_stores/schemas/utils.py +47 -3
- zenml/zen_stores/sql_zen_store.py +462 -134
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +239 -217
- zenml/utils/cloud_utils.py +0 -40
- zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
- zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
- zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
- zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
- zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
- zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
- zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
- zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
- zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
- zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
- zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
zenml/models/v2/core/model.py
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing models."""
|
15
15
|
|
16
|
-
from typing import TYPE_CHECKING,
|
16
|
+
from typing import TYPE_CHECKING, List, Optional
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from pydantic import BaseModel, Field
|
@@ -30,8 +30,6 @@ from zenml.models.v2.base.scoped import (
|
|
30
30
|
from zenml.utils.pagination_utils import depaginate
|
31
31
|
|
32
32
|
if TYPE_CHECKING:
|
33
|
-
from sqlalchemy.sql.elements import ColumnElement
|
34
|
-
|
35
33
|
from zenml.model.model import Model
|
36
34
|
from zenml.models.v2.core.tag import TagResponse
|
37
35
|
|
@@ -318,61 +316,7 @@ class ModelResponse(
|
|
318
316
|
class ModelFilter(WorkspaceScopedTaggableFilter):
|
319
317
|
"""Model to enable advanced filtering of all Workspaces."""
|
320
318
|
|
321
|
-
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
322
|
-
*WorkspaceScopedTaggableFilter.CLI_EXCLUDE_FIELDS,
|
323
|
-
"workspace_id",
|
324
|
-
"user_id",
|
325
|
-
]
|
326
|
-
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
327
|
-
*WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
|
328
|
-
"user",
|
329
|
-
]
|
330
|
-
|
331
319
|
name: Optional[str] = Field(
|
332
320
|
default=None,
|
333
321
|
description="Name of the Model",
|
334
322
|
)
|
335
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
336
|
-
default=None,
|
337
|
-
description="Workspace of the Model",
|
338
|
-
union_mode="left_to_right",
|
339
|
-
)
|
340
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
341
|
-
default=None,
|
342
|
-
description="User of the Model",
|
343
|
-
union_mode="left_to_right",
|
344
|
-
)
|
345
|
-
user: Optional[Union[UUID, str]] = Field(
|
346
|
-
default=None,
|
347
|
-
description="Name/ID of the user that created the model.",
|
348
|
-
)
|
349
|
-
|
350
|
-
def get_custom_filters(
|
351
|
-
self,
|
352
|
-
) -> List["ColumnElement[bool]"]:
|
353
|
-
"""Get custom filters.
|
354
|
-
|
355
|
-
Returns:
|
356
|
-
A list of custom filters.
|
357
|
-
"""
|
358
|
-
custom_filters = super().get_custom_filters()
|
359
|
-
|
360
|
-
from sqlmodel import and_
|
361
|
-
|
362
|
-
from zenml.zen_stores.schemas import (
|
363
|
-
ModelSchema,
|
364
|
-
UserSchema,
|
365
|
-
)
|
366
|
-
|
367
|
-
if self.user:
|
368
|
-
user_filter = and_(
|
369
|
-
ModelSchema.user_id == UserSchema.id,
|
370
|
-
self.generate_name_or_id_query_conditions(
|
371
|
-
value=self.user,
|
372
|
-
table=UserSchema,
|
373
|
-
additional_columns=["full_name"],
|
374
|
-
),
|
375
|
-
)
|
376
|
-
custom_filters.append(user_filter)
|
377
|
-
|
378
|
-
return custom_filters
|
@@ -77,10 +77,6 @@ class ModelVersionRequest(WorkspaceScopedRequest):
|
|
77
77
|
default=None,
|
78
78
|
)
|
79
79
|
|
80
|
-
number: Optional[int] = Field(
|
81
|
-
description="The number of the model version",
|
82
|
-
default=None,
|
83
|
-
)
|
84
80
|
model: UUID = Field(
|
85
81
|
description="The ID of the model containing version",
|
86
82
|
)
|
@@ -585,7 +581,6 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
|
|
585
581
|
|
586
582
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
587
583
|
*WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
|
588
|
-
"user",
|
589
584
|
"run_metadata",
|
590
585
|
]
|
591
586
|
|
@@ -597,25 +592,11 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
|
|
597
592
|
default=None,
|
598
593
|
description="The number of the Model Version",
|
599
594
|
)
|
600
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
601
|
-
default=None,
|
602
|
-
description="The workspace of the Model Version",
|
603
|
-
union_mode="left_to_right",
|
604
|
-
)
|
605
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
606
|
-
default=None,
|
607
|
-
description="The user of the Model Version",
|
608
|
-
union_mode="left_to_right",
|
609
|
-
)
|
610
595
|
stage: Optional[Union[str, ModelStages]] = Field(
|
611
596
|
description="The model version stage",
|
612
597
|
default=None,
|
613
598
|
union_mode="left_to_right",
|
614
599
|
)
|
615
|
-
user: Optional[Union[UUID, str]] = Field(
|
616
|
-
default=None,
|
617
|
-
description="Name/ID of the user that created the model version.",
|
618
|
-
)
|
619
600
|
run_metadata: Optional[Dict[str, str]] = Field(
|
620
601
|
default=None,
|
621
602
|
description="The run_metadata to filter the model versions by.",
|
@@ -639,43 +620,37 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
|
|
639
620
|
self._model_id = model_id
|
640
621
|
|
641
622
|
def get_custom_filters(
|
642
|
-
self,
|
623
|
+
self, table: Type["AnySchema"]
|
643
624
|
) -> List["ColumnElement[bool]"]:
|
644
625
|
"""Get custom filters.
|
645
626
|
|
627
|
+
Args:
|
628
|
+
table: The query table.
|
629
|
+
|
646
630
|
Returns:
|
647
631
|
A list of custom filters.
|
648
632
|
"""
|
649
|
-
custom_filters = super().get_custom_filters()
|
633
|
+
custom_filters = super().get_custom_filters(table)
|
650
634
|
|
651
635
|
from sqlmodel import and_
|
652
636
|
|
653
637
|
from zenml.zen_stores.schemas import (
|
654
638
|
ModelVersionSchema,
|
639
|
+
RunMetadataResourceSchema,
|
655
640
|
RunMetadataSchema,
|
656
|
-
UserSchema,
|
657
641
|
)
|
658
642
|
|
659
|
-
if self.user:
|
660
|
-
user_filter = and_(
|
661
|
-
ModelVersionSchema.user_id == UserSchema.id,
|
662
|
-
self.generate_name_or_id_query_conditions(
|
663
|
-
value=self.user,
|
664
|
-
table=UserSchema,
|
665
|
-
additional_columns=["full_name"],
|
666
|
-
),
|
667
|
-
)
|
668
|
-
custom_filters.append(user_filter)
|
669
|
-
|
670
643
|
if self.run_metadata is not None:
|
671
644
|
from zenml.enums import MetadataResourceTypes
|
672
645
|
|
673
646
|
for key, value in self.run_metadata.items():
|
674
647
|
additional_filter = and_(
|
675
|
-
|
676
|
-
|
648
|
+
RunMetadataResourceSchema.resource_id
|
649
|
+
== ModelVersionSchema.id,
|
650
|
+
RunMetadataResourceSchema.resource_type
|
677
651
|
== MetadataResourceTypes.MODEL_VERSION,
|
678
|
-
|
652
|
+
RunMetadataResourceSchema.run_metadata_id
|
653
|
+
== RunMetadataSchema.id,
|
679
654
|
self.generate_custom_query_conditions_for_column(
|
680
655
|
value=value,
|
681
656
|
table=RunMetadataSchema,
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing the link between model versions and artifacts."""
|
15
15
|
|
16
|
-
from typing import TYPE_CHECKING, List, Optional, Union
|
16
|
+
from typing import TYPE_CHECKING, List, Optional, Type, TypeVar, Union
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from pydantic import ConfigDict, Field
|
@@ -32,6 +32,9 @@ if TYPE_CHECKING:
|
|
32
32
|
from sqlalchemy.sql.elements import ColumnElement
|
33
33
|
|
34
34
|
from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
|
35
|
+
from zenml.zen_stores.schemas import BaseSchema
|
36
|
+
|
37
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
35
38
|
|
36
39
|
|
37
40
|
# ------------------ Request Model ------------------
|
@@ -164,13 +167,18 @@ class ModelVersionArtifactFilter(BaseFilter):
|
|
164
167
|
# careful we might overwrite some fields protected by pydantic.
|
165
168
|
model_config = ConfigDict(protected_namespaces=())
|
166
169
|
|
167
|
-
def get_custom_filters(
|
170
|
+
def get_custom_filters(
|
171
|
+
self, table: Type["AnySchema"]
|
172
|
+
) -> List[Union["ColumnElement[bool]"]]:
|
168
173
|
"""Get custom filters.
|
169
174
|
|
175
|
+
Args:
|
176
|
+
table: The query table.
|
177
|
+
|
170
178
|
Returns:
|
171
179
|
A list of custom filters.
|
172
180
|
"""
|
173
|
-
custom_filters = super().get_custom_filters()
|
181
|
+
custom_filters = super().get_custom_filters(table)
|
174
182
|
|
175
183
|
from sqlmodel import and_, col
|
176
184
|
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""Models representing the link between model versions and pipeline runs."""
|
15
15
|
|
16
|
-
from typing import List, Optional, Union
|
16
|
+
from typing import TYPE_CHECKING, List, Optional, Type, TypeVar, Union
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from pydantic import ConfigDict, Field
|
@@ -30,6 +30,12 @@ from zenml.models.v2.base.base import (
|
|
30
30
|
from zenml.models.v2.base.filter import BaseFilter, StrFilter
|
31
31
|
from zenml.models.v2.core.pipeline_run import PipelineRunResponse
|
32
32
|
|
33
|
+
if TYPE_CHECKING:
|
34
|
+
from zenml.zen_stores.schemas import BaseSchema
|
35
|
+
|
36
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
37
|
+
|
38
|
+
|
33
39
|
# ------------------ Request Model ------------------
|
34
40
|
|
35
41
|
|
@@ -147,13 +153,18 @@ class ModelVersionPipelineRunFilter(BaseFilter):
|
|
147
153
|
# careful we might overwrite some fields protected by pydantic.
|
148
154
|
model_config = ConfigDict(protected_namespaces=())
|
149
155
|
|
150
|
-
def get_custom_filters(
|
156
|
+
def get_custom_filters(
|
157
|
+
self, table: Type["AnySchema"]
|
158
|
+
) -> List["ColumnElement[bool]"]:
|
151
159
|
"""Get custom filters.
|
152
160
|
|
161
|
+
Args:
|
162
|
+
table: The query table.
|
163
|
+
|
153
164
|
Returns:
|
154
165
|
A list of custom filters.
|
155
166
|
"""
|
156
|
-
custom_filters = super().get_custom_filters()
|
167
|
+
custom_filters = super().get_custom_filters(table)
|
157
168
|
|
158
169
|
from sqlmodel import and_
|
159
170
|
|
zenml/models/v2/core/pipeline.py
CHANGED
@@ -21,7 +21,6 @@ from typing import (
|
|
21
21
|
Optional,
|
22
22
|
Type,
|
23
23
|
TypeVar,
|
24
|
-
Union,
|
25
24
|
)
|
26
25
|
from uuid import UUID
|
27
26
|
|
@@ -45,9 +44,7 @@ from zenml.models.v2.base.scoped import (
|
|
45
44
|
from zenml.models.v2.core.tag import TagResponse
|
46
45
|
|
47
46
|
if TYPE_CHECKING:
|
48
|
-
from
|
49
|
-
|
50
|
-
from zenml.models.v2.core.pipeline_run import PipelineRunResponse
|
47
|
+
from zenml.models import PipelineRunResponse, UserResponse
|
51
48
|
from zenml.zen_stores.schemas import BaseSchema
|
52
49
|
|
53
50
|
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
@@ -122,6 +119,10 @@ class PipelineResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
122
119
|
class PipelineResponseResources(WorkspaceScopedResponseResources):
|
123
120
|
"""Class for all resource models associated with the pipeline entity."""
|
124
121
|
|
122
|
+
latest_run_user: Optional["UserResponse"] = Field(
|
123
|
+
default=None,
|
124
|
+
title="The user that created the latest run of this pipeline.",
|
125
|
+
)
|
125
126
|
tags: List[TagResponse] = Field(
|
126
127
|
title="Tags associated with the pipeline.",
|
127
128
|
)
|
@@ -258,10 +259,12 @@ class PipelineResponse(
|
|
258
259
|
class PipelineFilter(WorkspaceScopedTaggableFilter):
|
259
260
|
"""Pipeline filter model."""
|
260
261
|
|
261
|
-
CUSTOM_SORTING_OPTIONS = [
|
262
|
+
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
263
|
+
*WorkspaceScopedTaggableFilter.CUSTOM_SORTING_OPTIONS,
|
264
|
+
SORT_PIPELINES_BY_LATEST_RUN_KEY,
|
265
|
+
]
|
262
266
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
263
267
|
*WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
|
264
|
-
"user",
|
265
268
|
"latest_run_status",
|
266
269
|
]
|
267
270
|
|
@@ -274,20 +277,6 @@ class PipelineFilter(WorkspaceScopedTaggableFilter):
|
|
274
277
|
description="Filter by the status of the latest run of a pipeline. "
|
275
278
|
"This will always be applied as an `AND` filter for now.",
|
276
279
|
)
|
277
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
278
|
-
default=None,
|
279
|
-
description="Workspace of the Pipeline",
|
280
|
-
union_mode="left_to_right",
|
281
|
-
)
|
282
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
283
|
-
default=None,
|
284
|
-
description="User of the Pipeline",
|
285
|
-
union_mode="left_to_right",
|
286
|
-
)
|
287
|
-
user: Optional[Union[UUID, str]] = Field(
|
288
|
-
default=None,
|
289
|
-
description="Name/ID of the user that created the pipeline.",
|
290
|
-
)
|
291
280
|
|
292
281
|
def apply_filter(
|
293
282
|
self, query: AnyQuery, table: Type["AnySchema"]
|
@@ -343,36 +332,6 @@ class PipelineFilter(WorkspaceScopedTaggableFilter):
|
|
343
332
|
|
344
333
|
return query
|
345
334
|
|
346
|
-
def get_custom_filters(
|
347
|
-
self,
|
348
|
-
) -> List["ColumnElement[bool]"]:
|
349
|
-
"""Get custom filters.
|
350
|
-
|
351
|
-
Returns:
|
352
|
-
A list of custom filters.
|
353
|
-
"""
|
354
|
-
custom_filters = super().get_custom_filters()
|
355
|
-
|
356
|
-
from sqlmodel import and_
|
357
|
-
|
358
|
-
from zenml.zen_stores.schemas import (
|
359
|
-
PipelineSchema,
|
360
|
-
UserSchema,
|
361
|
-
)
|
362
|
-
|
363
|
-
if self.user:
|
364
|
-
user_filter = and_(
|
365
|
-
PipelineSchema.user_id == UserSchema.id,
|
366
|
-
self.generate_name_or_id_query_conditions(
|
367
|
-
value=self.user,
|
368
|
-
table=UserSchema,
|
369
|
-
additional_columns=["full_name"],
|
370
|
-
),
|
371
|
-
)
|
372
|
-
custom_filters.append(user_filter)
|
373
|
-
|
374
|
-
return custom_filters
|
375
|
-
|
376
335
|
def apply_sorting(
|
377
336
|
self,
|
378
337
|
query: AnyQuery,
|
@@ -387,12 +346,45 @@ class PipelineFilter(WorkspaceScopedTaggableFilter):
|
|
387
346
|
Returns:
|
388
347
|
The query with sorting applied.
|
389
348
|
"""
|
390
|
-
|
349
|
+
from sqlmodel import asc, case, col, desc, func, select
|
350
|
+
|
351
|
+
from zenml.enums import SorterOps
|
352
|
+
from zenml.zen_stores.schemas import PipelineRunSchema, PipelineSchema
|
353
|
+
|
354
|
+
sort_by, operand = self.sorting_params
|
355
|
+
|
356
|
+
if sort_by == SORT_PIPELINES_BY_LATEST_RUN_KEY:
|
357
|
+
# Subquery to find the latest run per pipeline
|
358
|
+
latest_run_subquery = (
|
359
|
+
select(
|
360
|
+
PipelineRunSchema.pipeline_id,
|
361
|
+
case(
|
362
|
+
(
|
363
|
+
func.max(PipelineRunSchema.created).is_(None),
|
364
|
+
PipelineSchema.created,
|
365
|
+
),
|
366
|
+
else_=func.max(PipelineRunSchema.created),
|
367
|
+
).label("latest_run"),
|
368
|
+
)
|
369
|
+
.group_by(col(PipelineRunSchema.pipeline_id))
|
370
|
+
.subquery()
|
371
|
+
)
|
372
|
+
|
373
|
+
# Join the subquery with the pipelines
|
374
|
+
query = query.outerjoin(
|
375
|
+
latest_run_subquery,
|
376
|
+
PipelineSchema.id == latest_run_subquery.c.pipeline_id,
|
377
|
+
)
|
378
|
+
|
379
|
+
if operand == SorterOps.ASCENDING:
|
380
|
+
query = query.order_by(
|
381
|
+
asc(latest_run_subquery.c.latest_run)
|
382
|
+
).order_by(col(PipelineSchema.id))
|
383
|
+
else:
|
384
|
+
query = query.order_by(
|
385
|
+
desc(latest_run_subquery.c.latest_run)
|
386
|
+
).order_by(col(PipelineSchema.id))
|
391
387
|
|
392
|
-
if column == SORT_PIPELINES_BY_LATEST_RUN_KEY:
|
393
|
-
# If sorting by the latest run, the sorting is already done in the
|
394
|
-
# base query in `SqlZenStore.list_pipelines(...)` and we don't need
|
395
|
-
# to to anything here
|
396
388
|
return query
|
397
389
|
else:
|
398
390
|
return super().apply_sorting(query=query, table=table)
|
@@ -14,7 +14,17 @@
|
|
14
14
|
"""Models representing pipeline builds."""
|
15
15
|
|
16
16
|
import json
|
17
|
-
from typing import
|
17
|
+
from typing import (
|
18
|
+
TYPE_CHECKING,
|
19
|
+
Any,
|
20
|
+
ClassVar,
|
21
|
+
Dict,
|
22
|
+
List,
|
23
|
+
Optional,
|
24
|
+
Type,
|
25
|
+
TypeVar,
|
26
|
+
Union,
|
27
|
+
)
|
18
28
|
from uuid import UUID
|
19
29
|
|
20
30
|
from pydantic import Field
|
@@ -31,8 +41,13 @@ from zenml.models.v2.base.scoped import (
|
|
31
41
|
from zenml.models.v2.misc.build_item import BuildItem
|
32
42
|
|
33
43
|
if TYPE_CHECKING:
|
44
|
+
from sqlalchemy.sql.elements import ColumnElement
|
45
|
+
|
34
46
|
from zenml.models.v2.core.pipeline import PipelineResponse
|
35
47
|
from zenml.models.v2.core.stack import StackResponse
|
48
|
+
from zenml.zen_stores.schemas import BaseSchema
|
49
|
+
|
50
|
+
AnySchema = TypeVar("AnySchema", bound=BaseSchema)
|
36
51
|
|
37
52
|
|
38
53
|
# ------------------ Request Model ------------------
|
@@ -446,23 +461,23 @@ class PipelineBuildResponse(
|
|
446
461
|
class PipelineBuildFilter(WorkspaceScopedFilter):
|
447
462
|
"""Model to enable advanced filtering of all pipeline builds."""
|
448
463
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
455
|
-
description="User that produced this pipeline build.",
|
456
|
-
default=None,
|
457
|
-
union_mode="left_to_right",
|
458
|
-
)
|
464
|
+
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
465
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
466
|
+
"container_registry_id",
|
467
|
+
]
|
468
|
+
|
459
469
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
460
470
|
description="Pipeline associated with the pipeline build.",
|
461
471
|
default=None,
|
462
472
|
union_mode="left_to_right",
|
463
473
|
)
|
464
474
|
stack_id: Optional[Union[UUID, str]] = Field(
|
465
|
-
description="Stack
|
475
|
+
description="Stack associated with the pipeline build.",
|
476
|
+
default=None,
|
477
|
+
union_mode="left_to_right",
|
478
|
+
)
|
479
|
+
container_registry_id: Optional[Union[UUID, str]] = Field(
|
480
|
+
description="Container registry associated with the pipeline build.",
|
466
481
|
default=None,
|
467
482
|
union_mode="left_to_right",
|
468
483
|
)
|
@@ -484,3 +499,43 @@ class PipelineBuildFilter(WorkspaceScopedFilter):
|
|
484
499
|
checksum: Optional[str] = Field(
|
485
500
|
description="The build checksum.", default=None
|
486
501
|
)
|
502
|
+
stack_checksum: Optional[str] = Field(
|
503
|
+
description="The stack checksum.", default=None
|
504
|
+
)
|
505
|
+
|
506
|
+
def get_custom_filters(
|
507
|
+
self,
|
508
|
+
table: Type["AnySchema"],
|
509
|
+
) -> List["ColumnElement[bool]"]:
|
510
|
+
"""Get custom filters.
|
511
|
+
|
512
|
+
Args:
|
513
|
+
table: The query table.
|
514
|
+
|
515
|
+
Returns:
|
516
|
+
A list of custom filters.
|
517
|
+
"""
|
518
|
+
custom_filters = super().get_custom_filters(table)
|
519
|
+
|
520
|
+
from sqlmodel import and_
|
521
|
+
|
522
|
+
from zenml.enums import StackComponentType
|
523
|
+
from zenml.zen_stores.schemas import (
|
524
|
+
PipelineBuildSchema,
|
525
|
+
StackComponentSchema,
|
526
|
+
StackCompositionSchema,
|
527
|
+
StackSchema,
|
528
|
+
)
|
529
|
+
|
530
|
+
if self.container_registry_id:
|
531
|
+
container_registry_filter = and_(
|
532
|
+
PipelineBuildSchema.stack_id == StackSchema.id,
|
533
|
+
StackSchema.id == StackCompositionSchema.stack_id,
|
534
|
+
StackCompositionSchema.component_id == StackComponentSchema.id,
|
535
|
+
StackComponentSchema.type
|
536
|
+
== StackComponentType.CONTAINER_REGISTRY.value,
|
537
|
+
StackComponentSchema.id == self.container_registry_id,
|
538
|
+
)
|
539
|
+
custom_filters.append(container_registry_filter)
|
540
|
+
|
541
|
+
return custom_filters
|
@@ -358,16 +358,6 @@ class PipelineDeploymentResponse(
|
|
358
358
|
class PipelineDeploymentFilter(WorkspaceScopedFilter):
|
359
359
|
"""Model to enable advanced filtering of all pipeline deployments."""
|
360
360
|
|
361
|
-
workspace_id: Optional[Union[UUID, str]] = Field(
|
362
|
-
default=None,
|
363
|
-
description="Workspace for this deployment.",
|
364
|
-
union_mode="left_to_right",
|
365
|
-
)
|
366
|
-
user_id: Optional[Union[UUID, str]] = Field(
|
367
|
-
default=None,
|
368
|
-
description="User that created this deployment.",
|
369
|
-
union_mode="left_to_right",
|
370
|
-
)
|
371
361
|
pipeline_id: Optional[Union[UUID, str]] = Field(
|
372
362
|
default=None,
|
373
363
|
description="Pipeline associated with the deployment.",
|