zenml-nightly 0.75.0.dev20250312__py3-none-any.whl → 0.75.0.dev20250314__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 +1 -1
- zenml/__init__.py +2 -0
- zenml/analytics/context.py +7 -0
- zenml/analytics/enums.py +2 -2
- zenml/artifacts/utils.py +2 -4
- zenml/cli/__init__.py +8 -9
- zenml/cli/base.py +2 -2
- zenml/cli/code_repository.py +1 -1
- zenml/cli/login.py +6 -0
- zenml/cli/model.py +7 -15
- zenml/cli/pipeline.py +3 -3
- zenml/cli/project.py +172 -0
- zenml/cli/secret.py +47 -44
- zenml/cli/service_accounts.py +0 -1
- zenml/cli/service_connectors.py +15 -17
- zenml/cli/stack.py +0 -3
- zenml/cli/stack_components.py +2 -2
- zenml/cli/tag.py +3 -5
- zenml/cli/utils.py +25 -23
- zenml/client.py +749 -475
- zenml/config/global_config.py +48 -37
- zenml/config/pipeline_configurations.py +3 -2
- zenml/config/pipeline_run_configuration.py +2 -1
- zenml/config/secret_reference_mixin.py +1 -1
- zenml/constants.py +6 -6
- zenml/enums.py +0 -7
- zenml/event_hub/event_hub.py +3 -1
- zenml/exceptions.py +0 -24
- zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
- zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
- zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
- zenml/integrations/wandb/__init__.py +1 -1
- zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +5 -3
- zenml/model/model.py +10 -10
- zenml/model_registries/base_model_registry.py +1 -1
- zenml/models/__init__.py +45 -28
- zenml/models/v2/base/base.py +0 -5
- zenml/models/v2/base/filter.py +2 -2
- zenml/models/v2/base/scoped.py +135 -156
- zenml/models/v2/core/action.py +12 -12
- zenml/models/v2/core/api_key.py +1 -1
- zenml/models/v2/core/artifact.py +31 -18
- zenml/models/v2/core/artifact_version.py +57 -40
- zenml/models/v2/core/code_repository.py +12 -12
- zenml/models/v2/core/component.py +22 -33
- zenml/models/v2/core/device.py +3 -2
- zenml/models/v2/core/event_source.py +14 -14
- zenml/models/v2/core/flavor.py +19 -47
- zenml/models/v2/core/logs.py +1 -2
- zenml/models/v2/core/model.py +23 -20
- zenml/models/v2/core/model_version.py +51 -42
- zenml/models/v2/core/pipeline.py +16 -16
- zenml/models/v2/core/pipeline_build.py +14 -14
- zenml/models/v2/core/pipeline_deployment.py +12 -14
- zenml/models/v2/core/pipeline_run.py +21 -29
- zenml/models/v2/core/project.py +203 -0
- zenml/models/v2/core/run_metadata.py +2 -2
- zenml/models/v2/core/run_template.py +16 -17
- zenml/models/v2/core/schedule.py +12 -21
- zenml/models/v2/core/secret.py +94 -128
- zenml/models/v2/core/server_settings.py +2 -2
- zenml/models/v2/core/service.py +57 -26
- zenml/models/v2/core/service_connector.py +14 -16
- zenml/models/v2/core/stack.py +24 -26
- zenml/models/v2/core/step_run.py +16 -28
- zenml/models/v2/core/tag.py +41 -15
- zenml/models/v2/core/trigger.py +13 -13
- zenml/models/v2/core/trigger_execution.py +2 -2
- zenml/models/v2/core/user.py +2 -2
- zenml/models/v2/misc/statistics.py +45 -0
- zenml/models/v2/misc/tag.py +27 -0
- zenml/orchestrators/cache_utils.py +7 -7
- zenml/orchestrators/input_utils.py +1 -0
- zenml/orchestrators/step_launcher.py +1 -2
- zenml/orchestrators/step_run_utils.py +2 -4
- zenml/orchestrators/step_runner.py +10 -1
- zenml/orchestrators/utils.py +4 -4
- zenml/pipelines/build_utils.py +2 -4
- zenml/pipelines/pipeline_decorator.py +3 -2
- zenml/pipelines/pipeline_definition.py +8 -9
- zenml/pipelines/run_utils.py +4 -4
- zenml/service_connectors/service_connector.py +0 -10
- zenml/service_connectors/service_connector_utils.py +0 -2
- zenml/stack/authentication_mixin.py +1 -1
- zenml/stack/flavor.py +3 -14
- zenml/stack/stack.py +0 -1
- zenml/stack/stack_component.py +1 -5
- zenml/steps/base_step.py +10 -2
- zenml/steps/step_context.py +19 -0
- zenml/utils/string_utils.py +1 -1
- zenml/utils/tag_utils.py +642 -0
- zenml/zen_server/cloud_utils.py +21 -0
- zenml/zen_server/exceptions.py +0 -6
- zenml/zen_server/rbac/endpoint_utils.py +134 -46
- zenml/zen_server/rbac/models.py +65 -3
- zenml/zen_server/rbac/rbac_interface.py +9 -0
- zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
- zenml/zen_server/rbac/utils.py +155 -30
- zenml/zen_server/rbac/zenml_cloud_rbac.py +39 -11
- zenml/zen_server/routers/actions_endpoints.py +3 -5
- zenml/zen_server/routers/artifact_endpoint.py +0 -5
- zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
- zenml/zen_server/routers/auth_endpoints.py +22 -7
- zenml/zen_server/routers/code_repositories_endpoints.py +54 -3
- zenml/zen_server/routers/devices_endpoints.py +0 -4
- zenml/zen_server/routers/event_source_endpoints.py +0 -5
- zenml/zen_server/routers/flavors_endpoints.py +0 -5
- zenml/zen_server/routers/logs_endpoints.py +0 -1
- zenml/zen_server/routers/model_versions_endpoints.py +100 -23
- zenml/zen_server/routers/models_endpoints.py +50 -69
- zenml/zen_server/routers/pipeline_builds_endpoints.py +55 -3
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +56 -4
- zenml/zen_server/routers/pipelines_endpoints.py +70 -3
- zenml/zen_server/routers/plugin_endpoints.py +0 -1
- zenml/zen_server/routers/projects_endpoints.py +283 -0
- zenml/zen_server/routers/run_metadata_endpoints.py +97 -0
- zenml/zen_server/routers/run_templates_endpoints.py +64 -3
- zenml/zen_server/routers/runs_endpoints.py +58 -8
- zenml/zen_server/routers/schedule_endpoints.py +67 -6
- zenml/zen_server/routers/secrets_endpoints.py +38 -4
- zenml/zen_server/routers/server_endpoints.py +53 -1
- zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
- zenml/zen_server/routers/service_connectors_endpoints.py +94 -14
- zenml/zen_server/routers/service_endpoints.py +18 -7
- zenml/zen_server/routers/stack_components_endpoints.py +66 -7
- zenml/zen_server/routers/stacks_endpoints.py +95 -6
- zenml/zen_server/routers/steps_endpoints.py +17 -11
- zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
- zenml/zen_server/routers/tags_endpoints.py +6 -17
- zenml/zen_server/routers/triggers_endpoints.py +5 -8
- zenml/zen_server/routers/users_endpoints.py +9 -12
- zenml/zen_server/template_execution/utils.py +8 -7
- zenml/zen_server/utils.py +21 -0
- zenml/zen_server/zen_server_api.py +7 -2
- zenml/zen_stores/base_zen_store.py +50 -69
- zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
- zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
- zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
- zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
- zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
- zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
- zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
- zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
- zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
- zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
- zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
- zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
- zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
- zenml/zen_stores/rest_zen_store.py +223 -230
- zenml/zen_stores/schemas/__init__.py +2 -2
- zenml/zen_stores/schemas/action_schemas.py +15 -8
- zenml/zen_stores/schemas/api_key_schemas.py +8 -1
- zenml/zen_stores/schemas/artifact_schemas.py +35 -10
- zenml/zen_stores/schemas/code_repository_schemas.py +22 -17
- zenml/zen_stores/schemas/component_schemas.py +9 -14
- zenml/zen_stores/schemas/event_source_schemas.py +15 -8
- zenml/zen_stores/schemas/flavor_schemas.py +14 -20
- zenml/zen_stores/schemas/model_schemas.py +18 -17
- zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +10 -8
- zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -12
- zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
- zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +53 -65
- zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
- zenml/zen_stores/schemas/run_template_schemas.py +17 -13
- zenml/zen_stores/schemas/schedule_schema.py +16 -21
- zenml/zen_stores/schemas/secret_schemas.py +15 -25
- zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
- zenml/zen_stores/schemas/service_schemas.py +7 -8
- zenml/zen_stores/schemas/stack_schemas.py +12 -15
- zenml/zen_stores/schemas/step_run_schemas.py +14 -15
- zenml/zen_stores/schemas/tag_schemas.py +30 -2
- zenml/zen_stores/schemas/trigger_schemas.py +15 -8
- zenml/zen_stores/schemas/user_schemas.py +12 -2
- zenml/zen_stores/schemas/utils.py +16 -0
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
- zenml/zen_stores/sql_zen_store.py +2984 -2369
- zenml/zen_stores/template_utils.py +1 -1
- zenml/zen_stores/zen_store_interface.py +136 -126
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +188 -173
- zenml/cli/workspace.py +0 -86
- zenml/models/v2/core/workspace.py +0 -131
- zenml/zen_server/routers/workspaces_endpoints.py +0 -1469
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/entry_points.txt +0 -0
@@ -20,22 +20,22 @@ from pydantic import Field
|
|
20
20
|
|
21
21
|
from zenml.constants import STR_FIELD_MAX_LENGTH
|
22
22
|
from zenml.enums import PluginSubType
|
23
|
-
from zenml.models.v2.base.base import
|
23
|
+
from zenml.models.v2.base.base import BaseUpdate
|
24
24
|
from zenml.models.v2.base.page import Page
|
25
25
|
from zenml.models.v2.base.scoped import (
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
ProjectScopedFilter,
|
27
|
+
ProjectScopedRequest,
|
28
|
+
ProjectScopedResponse,
|
29
|
+
ProjectScopedResponseBody,
|
30
|
+
ProjectScopedResponseMetadata,
|
31
|
+
ProjectScopedResponseResources,
|
32
32
|
)
|
33
33
|
from zenml.models.v2.core.trigger import TriggerResponse
|
34
34
|
|
35
35
|
# ------------------ Request Model ------------------
|
36
36
|
|
37
37
|
|
38
|
-
class EventSourceRequest(
|
38
|
+
class EventSourceRequest(ProjectScopedRequest):
|
39
39
|
"""BaseModel for all event sources."""
|
40
40
|
|
41
41
|
name: str = Field(
|
@@ -63,7 +63,7 @@ class EventSourceRequest(WorkspaceScopedRequest):
|
|
63
63
|
# ------------------ Update Model ------------------
|
64
64
|
|
65
65
|
|
66
|
-
class EventSourceUpdate(
|
66
|
+
class EventSourceUpdate(BaseUpdate):
|
67
67
|
"""Update model for event sources."""
|
68
68
|
|
69
69
|
name: Optional[str] = Field(
|
@@ -108,7 +108,7 @@ class EventSourceUpdate(BaseZenModel):
|
|
108
108
|
# ------------------ Response Model ------------------
|
109
109
|
|
110
110
|
|
111
|
-
class EventSourceResponseBody(
|
111
|
+
class EventSourceResponseBody(ProjectScopedResponseBody):
|
112
112
|
"""ResponseBody for event sources."""
|
113
113
|
|
114
114
|
flavor: str = Field(
|
@@ -123,7 +123,7 @@ class EventSourceResponseBody(WorkspaceScopedResponseBody):
|
|
123
123
|
)
|
124
124
|
|
125
125
|
|
126
|
-
class EventSourceResponseMetadata(
|
126
|
+
class EventSourceResponseMetadata(ProjectScopedResponseMetadata):
|
127
127
|
"""Response metadata for event sources."""
|
128
128
|
|
129
129
|
description: str = Field(
|
@@ -136,7 +136,7 @@ class EventSourceResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
136
136
|
)
|
137
137
|
|
138
138
|
|
139
|
-
class EventSourceResponseResources(
|
139
|
+
class EventSourceResponseResources(ProjectScopedResponseResources):
|
140
140
|
"""Class for all resource models associated with the code repository entity."""
|
141
141
|
|
142
142
|
triggers: Page[TriggerResponse] = Field(
|
@@ -145,7 +145,7 @@ class EventSourceResponseResources(WorkspaceScopedResponseResources):
|
|
145
145
|
|
146
146
|
|
147
147
|
class EventSourceResponse(
|
148
|
-
|
148
|
+
ProjectScopedResponse[
|
149
149
|
EventSourceResponseBody,
|
150
150
|
EventSourceResponseMetadata,
|
151
151
|
EventSourceResponseResources,
|
@@ -226,7 +226,7 @@ class EventSourceResponse(
|
|
226
226
|
# ------------------ Filter Model ------------------
|
227
227
|
|
228
228
|
|
229
|
-
class EventSourceFilter(
|
229
|
+
class EventSourceFilter(ProjectScopedFilter):
|
230
230
|
"""Model to enable advanced filtering of all EventSourceModels."""
|
231
231
|
|
232
232
|
name: Optional[str] = Field(
|
zenml/models/v2/core/flavor.py
CHANGED
@@ -14,7 +14,6 @@
|
|
14
14
|
"""Models representing flavors."""
|
15
15
|
|
16
16
|
from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional
|
17
|
-
from uuid import UUID
|
18
17
|
|
19
18
|
from pydantic import Field
|
20
19
|
|
@@ -22,25 +21,24 @@ from zenml.constants import STR_FIELD_MAX_LENGTH
|
|
22
21
|
from zenml.enums import StackComponentType
|
23
22
|
from zenml.models.v2.base.base import BaseUpdate
|
24
23
|
from zenml.models.v2.base.scoped import (
|
24
|
+
UserScopedFilter,
|
25
25
|
UserScopedRequest,
|
26
26
|
UserScopedResponse,
|
27
27
|
UserScopedResponseBody,
|
28
28
|
UserScopedResponseMetadata,
|
29
29
|
UserScopedResponseResources,
|
30
|
-
WorkspaceScopedFilter,
|
31
30
|
)
|
32
31
|
|
33
32
|
if TYPE_CHECKING:
|
34
33
|
from zenml.models import (
|
35
34
|
ServiceConnectorRequirements,
|
36
35
|
)
|
37
|
-
from zenml.models.v2.core.workspace import WorkspaceResponse
|
38
36
|
|
39
37
|
# ------------------ Request Model ------------------
|
40
38
|
|
41
39
|
|
42
40
|
class FlavorRequest(UserScopedRequest):
|
43
|
-
"""Request model for flavors."""
|
41
|
+
"""Request model for stack component flavors."""
|
44
42
|
|
45
43
|
ANALYTICS_FIELDS: ClassVar[List[str]] = [
|
46
44
|
"type",
|
@@ -98,25 +96,13 @@ class FlavorRequest(UserScopedRequest):
|
|
98
96
|
title="Whether or not this flavor is a custom, user created flavor.",
|
99
97
|
default=True,
|
100
98
|
)
|
101
|
-
workspace: Optional[UUID] = Field(
|
102
|
-
default=None, title="The workspace to which this resource belongs."
|
103
|
-
)
|
104
|
-
|
105
|
-
|
106
|
-
class InternalFlavorRequest(FlavorRequest):
|
107
|
-
"""Internal flavor request model."""
|
108
|
-
|
109
|
-
user: Optional[UUID] = Field( # type: ignore[assignment]
|
110
|
-
title="The id of the user that created this resource.",
|
111
|
-
default=None,
|
112
|
-
)
|
113
99
|
|
114
100
|
|
115
101
|
# ------------------ Update Model ------------------
|
116
102
|
|
117
103
|
|
118
104
|
class FlavorUpdate(BaseUpdate):
|
119
|
-
"""Update model for flavors."""
|
105
|
+
"""Update model for stack component flavors."""
|
120
106
|
|
121
107
|
name: Optional[str] = Field(
|
122
108
|
title="The name of the Flavor.",
|
@@ -175,17 +161,13 @@ class FlavorUpdate(BaseUpdate):
|
|
175
161
|
title="Whether or not this flavor is a custom, user created flavor.",
|
176
162
|
default=None,
|
177
163
|
)
|
178
|
-
workspace: Optional[UUID] = Field(
|
179
|
-
title="The workspace to which this resource belongs.",
|
180
|
-
default=None,
|
181
|
-
)
|
182
164
|
|
183
165
|
|
184
166
|
# ------------------ Response Model ------------------
|
185
167
|
|
186
168
|
|
187
169
|
class FlavorResponseBody(UserScopedResponseBody):
|
188
|
-
"""Response body for
|
170
|
+
"""Response body for stack component flavors."""
|
189
171
|
|
190
172
|
type: StackComponentType = Field(title="The type of the Flavor.")
|
191
173
|
integration: Optional[str] = Field(
|
@@ -201,14 +183,15 @@ class FlavorResponseBody(UserScopedResponseBody):
|
|
201
183
|
title="Optionally, a url pointing to a png,"
|
202
184
|
"svg or jpg can be attached.",
|
203
185
|
)
|
186
|
+
is_custom: bool = Field(
|
187
|
+
title="Whether or not this flavor is a custom, user created flavor.",
|
188
|
+
default=True,
|
189
|
+
)
|
204
190
|
|
205
191
|
|
206
192
|
class FlavorResponseMetadata(UserScopedResponseMetadata):
|
207
|
-
"""Response metadata for flavors."""
|
193
|
+
"""Response metadata for stack component flavors."""
|
208
194
|
|
209
|
-
workspace: Optional["WorkspaceResponse"] = Field(
|
210
|
-
title="The project of this resource."
|
211
|
-
)
|
212
195
|
config_schema: Dict[str, Any] = Field(
|
213
196
|
title="The JSON schema of this flavor's corresponding configuration.",
|
214
197
|
)
|
@@ -238,22 +221,20 @@ class FlavorResponseMetadata(UserScopedResponseMetadata):
|
|
238
221
|
title="Optionally, a url pointing to SDK docs,"
|
239
222
|
"within sdkdocs.zenml.io.",
|
240
223
|
)
|
241
|
-
is_custom: bool = Field(
|
242
|
-
title="Whether or not this flavor is a custom, user created flavor.",
|
243
|
-
default=True,
|
244
|
-
)
|
245
224
|
|
246
225
|
|
247
226
|
class FlavorResponseResources(UserScopedResponseResources):
|
248
|
-
"""
|
227
|
+
"""Response resources for stack component flavors."""
|
249
228
|
|
250
229
|
|
251
230
|
class FlavorResponse(
|
252
231
|
UserScopedResponse[
|
253
|
-
FlavorResponseBody,
|
232
|
+
FlavorResponseBody,
|
233
|
+
FlavorResponseMetadata,
|
234
|
+
FlavorResponseResources,
|
254
235
|
]
|
255
236
|
):
|
256
|
-
"""Response model for flavors."""
|
237
|
+
"""Response model for stack component flavors."""
|
257
238
|
|
258
239
|
# Analytics
|
259
240
|
ANALYTICS_FIELDS: ClassVar[List[str]] = [
|
@@ -338,13 +319,13 @@ class FlavorResponse(
|
|
338
319
|
return self.get_body().logo_url
|
339
320
|
|
340
321
|
@property
|
341
|
-
def
|
342
|
-
"""The `
|
322
|
+
def is_custom(self) -> bool:
|
323
|
+
"""The `is_custom` property.
|
343
324
|
|
344
325
|
Returns:
|
345
326
|
the value of the property.
|
346
327
|
"""
|
347
|
-
return self.
|
328
|
+
return self.get_body().is_custom
|
348
329
|
|
349
330
|
@property
|
350
331
|
def config_schema(self) -> Dict[str, Any]:
|
@@ -400,21 +381,12 @@ class FlavorResponse(
|
|
400
381
|
"""
|
401
382
|
return self.get_metadata().sdk_docs_url
|
402
383
|
|
403
|
-
@property
|
404
|
-
def is_custom(self) -> bool:
|
405
|
-
"""The `is_custom` property.
|
406
|
-
|
407
|
-
Returns:
|
408
|
-
the value of the property.
|
409
|
-
"""
|
410
|
-
return self.get_metadata().is_custom
|
411
|
-
|
412
384
|
|
413
385
|
# ------------------ Filter Model ------------------
|
414
386
|
|
415
387
|
|
416
|
-
class FlavorFilter(
|
417
|
-
"""Model to enable advanced
|
388
|
+
class FlavorFilter(UserScopedFilter):
|
389
|
+
"""Model to enable advanced stack component flavor filtering."""
|
418
390
|
|
419
391
|
name: Optional[str] = Field(
|
420
392
|
default=None,
|
zenml/models/v2/core/logs.py
CHANGED
@@ -35,9 +35,8 @@ class LogsRequest(BaseRequest):
|
|
35
35
|
|
36
36
|
uri: str = Field(title="The uri of the logs file")
|
37
37
|
|
38
|
-
artifact_store_id:
|
38
|
+
artifact_store_id: UUID = Field(
|
39
39
|
title="The artifact store ID to associate the logs with.",
|
40
|
-
union_mode="left_to_right",
|
41
40
|
)
|
42
41
|
|
43
42
|
@field_validator("uri")
|
zenml/models/v2/core/model.py
CHANGED
@@ -16,21 +16,22 @@
|
|
16
16
|
from typing import TYPE_CHECKING, Any, ClassVar, List, Optional, Type, TypeVar
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
|
-
from pydantic import
|
19
|
+
from pydantic import Field
|
20
20
|
|
21
21
|
from zenml.constants import (
|
22
22
|
SORT_BY_LATEST_VERSION_KEY,
|
23
23
|
STR_FIELD_MAX_LENGTH,
|
24
24
|
TEXT_FIELD_MAX_LENGTH,
|
25
25
|
)
|
26
|
+
from zenml.models.v2.base.base import BaseUpdate
|
26
27
|
from zenml.models.v2.base.scoped import (
|
28
|
+
ProjectScopedFilter,
|
29
|
+
ProjectScopedRequest,
|
30
|
+
ProjectScopedResponse,
|
31
|
+
ProjectScopedResponseBody,
|
32
|
+
ProjectScopedResponseMetadata,
|
33
|
+
ProjectScopedResponseResources,
|
27
34
|
TaggableFilter,
|
28
|
-
WorkspaceScopedFilter,
|
29
|
-
WorkspaceScopedRequest,
|
30
|
-
WorkspaceScopedResponse,
|
31
|
-
WorkspaceScopedResponseBody,
|
32
|
-
WorkspaceScopedResponseMetadata,
|
33
|
-
WorkspaceScopedResponseResources,
|
34
35
|
)
|
35
36
|
from zenml.utils.pagination_utils import depaginate
|
36
37
|
|
@@ -46,7 +47,7 @@ AnyQuery = TypeVar("AnyQuery", bound=Any)
|
|
46
47
|
# ------------------ Request Model ------------------
|
47
48
|
|
48
49
|
|
49
|
-
class ModelRequest(
|
50
|
+
class ModelRequest(ProjectScopedRequest):
|
50
51
|
"""Request model for models."""
|
51
52
|
|
52
53
|
name: str = Field(
|
@@ -101,7 +102,7 @@ class ModelRequest(WorkspaceScopedRequest):
|
|
101
102
|
# ------------------ Update Model ------------------
|
102
103
|
|
103
104
|
|
104
|
-
class ModelUpdate(
|
105
|
+
class ModelUpdate(BaseUpdate):
|
105
106
|
"""Update model for models."""
|
106
107
|
|
107
108
|
name: Optional[str] = None
|
@@ -120,7 +121,7 @@ class ModelUpdate(BaseModel):
|
|
120
121
|
# ------------------ Response Model ------------------
|
121
122
|
|
122
123
|
|
123
|
-
class ModelResponseBody(
|
124
|
+
class ModelResponseBody(ProjectScopedResponseBody):
|
124
125
|
"""Response body for models."""
|
125
126
|
|
126
127
|
tags: List["TagResponse"] = Field(
|
@@ -130,7 +131,7 @@ class ModelResponseBody(WorkspaceScopedResponseBody):
|
|
130
131
|
latest_version_id: Optional[UUID] = None
|
131
132
|
|
132
133
|
|
133
|
-
class ModelResponseMetadata(
|
134
|
+
class ModelResponseMetadata(ProjectScopedResponseMetadata):
|
134
135
|
"""Response metadata for models."""
|
135
136
|
|
136
137
|
license: Optional[str] = Field(
|
@@ -174,12 +175,12 @@ class ModelResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
174
175
|
)
|
175
176
|
|
176
177
|
|
177
|
-
class ModelResponseResources(
|
178
|
+
class ModelResponseResources(ProjectScopedResponseResources):
|
178
179
|
"""Class for all resource models associated with the model entity."""
|
179
180
|
|
180
181
|
|
181
182
|
class ModelResponse(
|
182
|
-
|
183
|
+
ProjectScopedResponse[
|
183
184
|
ModelResponseBody, ModelResponseMetadata, ModelResponseResources
|
184
185
|
]
|
185
186
|
):
|
@@ -312,7 +313,9 @@ class ModelResponse(
|
|
312
313
|
|
313
314
|
client = Client()
|
314
315
|
model_versions = depaginate(
|
315
|
-
client.list_model_versions,
|
316
|
+
client.list_model_versions,
|
317
|
+
model_name_or_id=self.id,
|
318
|
+
project=self.project.id,
|
316
319
|
)
|
317
320
|
return [
|
318
321
|
mv.to_model_class(suppress_class_validation_warnings=True)
|
@@ -323,8 +326,8 @@ class ModelResponse(
|
|
323
326
|
# ------------------ Filter Model ------------------
|
324
327
|
|
325
328
|
|
326
|
-
class ModelFilter(
|
327
|
-
"""Model to enable advanced filtering of all
|
329
|
+
class ModelFilter(ProjectScopedFilter, TaggableFilter):
|
330
|
+
"""Model to enable advanced filtering of all models."""
|
328
331
|
|
329
332
|
name: Optional[str] = Field(
|
330
333
|
default=None,
|
@@ -332,16 +335,16 @@ class ModelFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
332
335
|
)
|
333
336
|
|
334
337
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
335
|
-
*
|
338
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
336
339
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
337
340
|
]
|
338
341
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
339
|
-
*
|
342
|
+
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
340
343
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
341
344
|
SORT_BY_LATEST_VERSION_KEY,
|
342
345
|
]
|
343
|
-
CLI_EXCLUDE_FIELDS = [
|
344
|
-
*
|
346
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
347
|
+
*ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
|
345
348
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
346
349
|
]
|
347
350
|
|
@@ -25,21 +25,22 @@ from typing import (
|
|
25
25
|
)
|
26
26
|
from uuid import UUID
|
27
27
|
|
28
|
-
from pydantic import
|
28
|
+
from pydantic import ConfigDict, Field, field_validator
|
29
29
|
|
30
30
|
from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
31
31
|
from zenml.enums import ArtifactType, ModelStages
|
32
32
|
from zenml.metadata.metadata_types import MetadataType
|
33
|
+
from zenml.models.v2.base.base import BaseUpdate
|
33
34
|
from zenml.models.v2.base.filter import AnyQuery
|
34
35
|
from zenml.models.v2.base.page import Page
|
35
36
|
from zenml.models.v2.base.scoped import (
|
37
|
+
ProjectScopedFilter,
|
38
|
+
ProjectScopedRequest,
|
39
|
+
ProjectScopedResponse,
|
40
|
+
ProjectScopedResponseBody,
|
41
|
+
ProjectScopedResponseMetadata,
|
42
|
+
ProjectScopedResponseResources,
|
36
43
|
TaggableFilter,
|
37
|
-
WorkspaceScopedFilter,
|
38
|
-
WorkspaceScopedRequest,
|
39
|
-
WorkspaceScopedResponse,
|
40
|
-
WorkspaceScopedResponseBody,
|
41
|
-
WorkspaceScopedResponseMetadata,
|
42
|
-
WorkspaceScopedResponseResources,
|
43
44
|
)
|
44
45
|
from zenml.models.v2.core.service import ServiceResponse
|
45
46
|
from zenml.models.v2.core.tag import TagResponse
|
@@ -59,7 +60,7 @@ if TYPE_CHECKING:
|
|
59
60
|
# ------------------ Request Model ------------------
|
60
61
|
|
61
62
|
|
62
|
-
class ModelVersionRequest(
|
63
|
+
class ModelVersionRequest(ProjectScopedRequest):
|
63
64
|
"""Request model for model versions."""
|
64
65
|
|
65
66
|
name: Optional[str] = Field(
|
@@ -90,12 +91,9 @@ class ModelVersionRequest(WorkspaceScopedRequest):
|
|
90
91
|
# ------------------ Update Model ------------------
|
91
92
|
|
92
93
|
|
93
|
-
class ModelVersionUpdate(
|
94
|
+
class ModelVersionUpdate(BaseUpdate):
|
94
95
|
"""Update model for model versions."""
|
95
96
|
|
96
|
-
model: UUID = Field(
|
97
|
-
description="The ID of the model containing version",
|
98
|
-
)
|
99
97
|
stage: Optional[Union[str, ModelStages]] = Field(
|
100
98
|
description="Target model version stage to be set",
|
101
99
|
default=None,
|
@@ -137,7 +135,7 @@ class ModelVersionUpdate(BaseModel):
|
|
137
135
|
# ------------------ Response Model ------------------
|
138
136
|
|
139
137
|
|
140
|
-
class ModelVersionResponseBody(
|
138
|
+
class ModelVersionResponseBody(ProjectScopedResponseBody):
|
141
139
|
"""Response body for model versions."""
|
142
140
|
|
143
141
|
stage: Optional[str] = Field(
|
@@ -180,7 +178,7 @@ class ModelVersionResponseBody(WorkspaceScopedResponseBody):
|
|
180
178
|
model_config = ConfigDict(protected_namespaces=())
|
181
179
|
|
182
180
|
|
183
|
-
class ModelVersionResponseMetadata(
|
181
|
+
class ModelVersionResponseMetadata(ProjectScopedResponseMetadata):
|
184
182
|
"""Response metadata for model versions."""
|
185
183
|
|
186
184
|
description: Optional[str] = Field(
|
@@ -194,7 +192,7 @@ class ModelVersionResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
194
192
|
)
|
195
193
|
|
196
194
|
|
197
|
-
class ModelVersionResponseResources(
|
195
|
+
class ModelVersionResponseResources(ProjectScopedResponseResources):
|
198
196
|
"""Class for all resource models associated with the model version entity."""
|
199
197
|
|
200
198
|
services: Page[ServiceResponse] = Field(
|
@@ -203,7 +201,7 @@ class ModelVersionResponseResources(WorkspaceScopedResponseResources):
|
|
203
201
|
|
204
202
|
|
205
203
|
class ModelVersionResponse(
|
206
|
-
|
204
|
+
ProjectScopedResponse[
|
207
205
|
ModelVersionResponseBody,
|
208
206
|
ModelVersionResponseMetadata,
|
209
207
|
ModelVersionResponseResources,
|
@@ -446,7 +444,7 @@ class ModelVersionResponse(
|
|
446
444
|
artifact_versions = Client().list_artifact_versions(
|
447
445
|
sort_by="desc:created",
|
448
446
|
size=1,
|
449
|
-
|
447
|
+
artifact=name,
|
450
448
|
version=version,
|
451
449
|
model_version_id=self.id,
|
452
450
|
type=type,
|
@@ -568,21 +566,23 @@ class ModelVersionResponse(
|
|
568
566
|
# ------------------ Filter Model ------------------
|
569
567
|
|
570
568
|
|
571
|
-
class ModelVersionFilter(
|
569
|
+
class ModelVersionFilter(ProjectScopedFilter, TaggableFilter):
|
572
570
|
"""Filter model for model versions."""
|
573
571
|
|
574
572
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
575
|
-
*
|
573
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
576
574
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
575
|
+
"model",
|
577
576
|
"run_metadata",
|
578
577
|
]
|
579
|
-
CUSTOM_SORTING_OPTIONS = [
|
580
|
-
*
|
578
|
+
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
579
|
+
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
581
580
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
582
581
|
]
|
583
|
-
CLI_EXCLUDE_FIELDS = [
|
584
|
-
*
|
582
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
583
|
+
*ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
|
585
584
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
585
|
+
"model",
|
586
586
|
]
|
587
587
|
|
588
588
|
name: Optional[str] = Field(
|
@@ -602,23 +602,14 @@ class ModelVersionFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
602
602
|
default=None,
|
603
603
|
description="The run_metadata to filter the model versions by.",
|
604
604
|
)
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
"
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
"""
|
614
|
-
try:
|
615
|
-
model_id = UUID(str(model_name_or_id))
|
616
|
-
except ValueError:
|
617
|
-
from zenml.client import Client
|
618
|
-
|
619
|
-
model_id = Client().get_model(model_name_or_id).id
|
620
|
-
|
621
|
-
self._model_id = model_id
|
605
|
+
model: Optional[Union[str, UUID]] = Field(
|
606
|
+
default=None,
|
607
|
+
description="The name or ID of the model which the search is scoped "
|
608
|
+
"to. This field must always be set and is always applied in addition "
|
609
|
+
"to the other filters, regardless of the value of the "
|
610
|
+
"logical_operator field.",
|
611
|
+
union_mode="left_to_right",
|
612
|
+
)
|
622
613
|
|
623
614
|
def get_custom_filters(
|
624
615
|
self, table: Type["AnySchema"]
|
@@ -675,10 +666,28 @@ class ModelVersionFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
675
666
|
|
676
667
|
Returns:
|
677
668
|
The query with filter applied.
|
669
|
+
|
670
|
+
Raises:
|
671
|
+
ValueError: if the filter is not scoped to a model.
|
678
672
|
"""
|
679
673
|
query = super().apply_filter(query=query, table=table)
|
680
674
|
|
681
|
-
|
682
|
-
|
675
|
+
# The model scope must always be set and must be a UUID. If the
|
676
|
+
# client sets this to a string, the server will try to resolve it to a
|
677
|
+
# model ID.
|
678
|
+
#
|
679
|
+
# If not set by the client, the server will raise a ValueError.
|
680
|
+
#
|
681
|
+
# See: SqlZenStore._set_filter_model_id
|
682
|
+
|
683
|
+
if not self.model:
|
684
|
+
raise ValueError("Model scope missing from the filter.")
|
685
|
+
|
686
|
+
if not isinstance(self.model, UUID):
|
687
|
+
raise ValueError(
|
688
|
+
f"Model scope must be a UUID, got {type(self.model)}."
|
689
|
+
)
|
690
|
+
|
691
|
+
query = query.where(getattr(table, "model_id") == self.model)
|
683
692
|
|
684
693
|
return query
|
zenml/models/v2/core/pipeline.py
CHANGED
@@ -34,13 +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
|
+
ProjectScopedFilter,
|
38
|
+
ProjectScopedRequest,
|
39
|
+
ProjectScopedResponse,
|
40
|
+
ProjectScopedResponseBody,
|
41
|
+
ProjectScopedResponseMetadata,
|
42
|
+
ProjectScopedResponseResources,
|
37
43
|
TaggableFilter,
|
38
|
-
WorkspaceScopedFilter,
|
39
|
-
WorkspaceScopedRequest,
|
40
|
-
WorkspaceScopedResponse,
|
41
|
-
WorkspaceScopedResponseBody,
|
42
|
-
WorkspaceScopedResponseMetadata,
|
43
|
-
WorkspaceScopedResponseResources,
|
44
44
|
)
|
45
45
|
from zenml.models.v2.core.tag import TagResponse
|
46
46
|
|
@@ -55,7 +55,7 @@ AnyQuery = TypeVar("AnyQuery", bound=Any)
|
|
55
55
|
# ------------------ Request Model ------------------
|
56
56
|
|
57
57
|
|
58
|
-
class PipelineRequest(
|
58
|
+
class PipelineRequest(ProjectScopedRequest):
|
59
59
|
"""Request model for pipelines."""
|
60
60
|
|
61
61
|
name: str = Field(
|
@@ -95,7 +95,7 @@ class PipelineUpdate(BaseUpdate):
|
|
95
95
|
# ------------------ Response Model ------------------
|
96
96
|
|
97
97
|
|
98
|
-
class PipelineResponseBody(
|
98
|
+
class PipelineResponseBody(ProjectScopedResponseBody):
|
99
99
|
"""Response body for pipelines."""
|
100
100
|
|
101
101
|
latest_run_id: Optional[UUID] = Field(
|
@@ -108,7 +108,7 @@ class PipelineResponseBody(WorkspaceScopedResponseBody):
|
|
108
108
|
)
|
109
109
|
|
110
110
|
|
111
|
-
class PipelineResponseMetadata(
|
111
|
+
class PipelineResponseMetadata(ProjectScopedResponseMetadata):
|
112
112
|
"""Response metadata for pipelines."""
|
113
113
|
|
114
114
|
description: Optional[str] = Field(
|
@@ -117,7 +117,7 @@ class PipelineResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
117
117
|
)
|
118
118
|
|
119
119
|
|
120
|
-
class PipelineResponseResources(
|
120
|
+
class PipelineResponseResources(ProjectScopedResponseResources):
|
121
121
|
"""Class for all resource models associated with the pipeline entity."""
|
122
122
|
|
123
123
|
latest_run_user: Optional["UserResponse"] = Field(
|
@@ -130,7 +130,7 @@ class PipelineResponseResources(WorkspaceScopedResponseResources):
|
|
130
130
|
|
131
131
|
|
132
132
|
class PipelineResponse(
|
133
|
-
|
133
|
+
ProjectScopedResponse[
|
134
134
|
PipelineResponseBody,
|
135
135
|
PipelineResponseMetadata,
|
136
136
|
PipelineResponseResources,
|
@@ -257,21 +257,21 @@ class PipelineResponse(
|
|
257
257
|
# ------------------ Filter Model ------------------
|
258
258
|
|
259
259
|
|
260
|
-
class PipelineFilter(
|
260
|
+
class PipelineFilter(ProjectScopedFilter, TaggableFilter):
|
261
261
|
"""Pipeline filter model."""
|
262
262
|
|
263
263
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
264
|
-
*
|
264
|
+
*ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
|
265
265
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
266
266
|
SORT_PIPELINES_BY_LATEST_RUN_KEY,
|
267
267
|
]
|
268
268
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
269
|
-
*
|
269
|
+
*ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
|
270
270
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
271
271
|
"latest_run_status",
|
272
272
|
]
|
273
|
-
CLI_EXCLUDE_FIELDS = [
|
274
|
-
*
|
273
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
274
|
+
*ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
|
275
275
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
276
276
|
]
|
277
277
|
|