zenml-nightly 0.75.0.dev20250311__py3-none-any.whl → 0.75.0.dev20250313__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/artifacts/utils.py +0 -2
- zenml/cli/login.py +6 -0
- zenml/cli/model.py +7 -15
- zenml/cli/secret.py +47 -44
- zenml/cli/service_connectors.py +0 -1
- zenml/cli/stack.py +0 -1
- zenml/cli/tag.py +3 -5
- zenml/cli/utils.py +25 -23
- zenml/cli/workspace.py +79 -5
- zenml/client.py +618 -348
- zenml/config/global_config.py +16 -3
- 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 +1 -3
- 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/github/plugins/event_sources/github_webhook_event_source.py +1 -4
- zenml/integrations/mlflow/steps/mlflow_registry.py +1 -1
- zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
- zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +3 -3
- zenml/model/model.py +8 -8
- zenml/models/__init__.py +18 -1
- zenml/models/v2/base/base.py +0 -5
- zenml/models/v2/base/filter.py +1 -1
- zenml/models/v2/base/scoped.py +104 -121
- zenml/models/v2/core/api_key.py +1 -1
- zenml/models/v2/core/artifact.py +31 -18
- zenml/models/v2/core/artifact_version.py +42 -25
- zenml/models/v2/core/component.py +22 -33
- zenml/models/v2/core/device.py +3 -2
- zenml/models/v2/core/event_source.py +2 -2
- zenml/models/v2/core/flavor.py +19 -47
- zenml/models/v2/core/logs.py +1 -2
- zenml/models/v2/core/model.py +7 -4
- zenml/models/v2/core/model_version.py +36 -27
- zenml/models/v2/core/pipeline.py +1 -1
- zenml/models/v2/core/pipeline_build.py +18 -0
- zenml/models/v2/core/pipeline_run.py +5 -13
- zenml/models/v2/core/run_template.py +1 -2
- zenml/models/v2/core/schedule.py +0 -9
- zenml/models/v2/core/secret.py +93 -127
- zenml/models/v2/core/server_settings.py +2 -2
- zenml/models/v2/core/service.py +43 -12
- zenml/models/v2/core/service_connector.py +14 -16
- zenml/models/v2/core/stack.py +24 -26
- zenml/models/v2/core/step_run.py +3 -15
- zenml/models/v2/core/tag.py +41 -15
- zenml/models/v2/core/user.py +19 -2
- zenml/models/v2/misc/statistics.py +45 -0
- zenml/models/v2/misc/tag.py +27 -0
- zenml/orchestrators/cache_utils.py +1 -1
- zenml/orchestrators/input_utils.py +1 -0
- zenml/orchestrators/step_launcher.py +0 -1
- zenml/orchestrators/step_run_utils.py +0 -2
- zenml/orchestrators/step_runner.py +10 -1
- zenml/pipelines/build_utils.py +4 -2
- zenml/pipelines/pipeline_decorator.py +3 -2
- zenml/pipelines/pipeline_definition.py +4 -5
- zenml/pipelines/run_utils.py +3 -3
- zenml/service_connectors/service_connector.py +0 -7
- zenml/service_connectors/service_connector_utils.py +0 -1
- zenml/stack/authentication_mixin.py +1 -1
- zenml/stack/flavor.py +3 -14
- zenml/stack/stack_component.py +1 -5
- 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 +156 -29
- zenml/zen_server/rbac/zenml_cloud_rbac.py +43 -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 +56 -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 +102 -23
- zenml/zen_server/routers/models_endpoints.py +51 -68
- zenml/zen_server/routers/pipeline_builds_endpoints.py +58 -4
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +58 -4
- zenml/zen_server/routers/pipelines_endpoints.py +73 -4
- zenml/zen_server/routers/plugin_endpoints.py +0 -1
- zenml/zen_server/routers/run_metadata_endpoints.py +99 -0
- zenml/zen_server/routers/run_templates_endpoints.py +66 -3
- zenml/zen_server/routers/runs_endpoints.py +60 -8
- zenml/zen_server/routers/schedule_endpoints.py +69 -6
- zenml/zen_server/routers/secrets_endpoints.py +40 -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 +96 -14
- zenml/zen_server/routers/service_endpoints.py +20 -7
- zenml/zen_server/routers/stack_components_endpoints.py +68 -7
- zenml/zen_server/routers/stacks_endpoints.py +98 -7
- 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 +47 -12
- zenml/zen_server/routers/workspaces_endpoints.py +56 -1285
- zenml/zen_server/template_execution/utils.py +5 -4
- zenml/zen_server/utils.py +21 -0
- zenml/zen_server/zen_server_api.py +4 -0
- zenml/zen_stores/base_zen_store.py +29 -44
- zenml/zen_stores/migrations/versions/0392807467dc_add_build_duration.py +34 -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/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 +172 -171
- zenml/zen_stores/schemas/action_schemas.py +8 -1
- zenml/zen_stores/schemas/api_key_schemas.py +8 -1
- zenml/zen_stores/schemas/artifact_schemas.py +28 -1
- zenml/zen_stores/schemas/code_repository_schemas.py +8 -1
- zenml/zen_stores/schemas/component_schemas.py +9 -14
- zenml/zen_stores/schemas/event_source_schemas.py +8 -1
- zenml/zen_stores/schemas/flavor_schemas.py +14 -20
- zenml/zen_stores/schemas/model_schemas.py +3 -0
- zenml/zen_stores/schemas/pipeline_build_schemas.py +4 -0
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +3 -1
- zenml/zen_stores/schemas/pipeline_run_schemas.py +0 -3
- zenml/zen_stores/schemas/run_template_schemas.py +8 -4
- zenml/zen_stores/schemas/schedule_schema.py +9 -14
- 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 +0 -1
- zenml/zen_stores/schemas/stack_schemas.py +12 -15
- zenml/zen_stores/schemas/step_run_schemas.py +7 -8
- zenml/zen_stores/schemas/tag_schemas.py +30 -2
- zenml/zen_stores/schemas/trigger_schemas.py +8 -1
- zenml/zen_stores/schemas/user_schemas.py +24 -2
- zenml/zen_stores/schemas/utils.py +16 -0
- zenml/zen_stores/schemas/workspace_schemas.py +7 -25
- zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
- zenml/zen_stores/sql_zen_store.py +2905 -2280
- zenml/zen_stores/template_utils.py +1 -1
- zenml/zen_stores/zen_store_interface.py +82 -58
- {zenml_nightly-0.75.0.dev20250311.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/METADATA +1 -1
- {zenml_nightly-0.75.0.dev20250311.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/RECORD +163 -149
- {zenml_nightly-0.75.0.dev20250311.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.75.0.dev20250311.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.75.0.dev20250311.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/entry_points.txt +0 -0
@@ -32,12 +32,12 @@ from zenml.constants import STR_FIELD_MAX_LENGTH
|
|
32
32
|
from zenml.enums import LogicalOperators, StackComponentType
|
33
33
|
from zenml.models.v2.base.base import BaseUpdate
|
34
34
|
from zenml.models.v2.base.scoped import (
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
UserScopedFilter,
|
36
|
+
UserScopedRequest,
|
37
|
+
UserScopedResponse,
|
38
|
+
UserScopedResponseBody,
|
39
|
+
UserScopedResponseMetadata,
|
40
|
+
UserScopedResponseResources,
|
41
41
|
)
|
42
42
|
from zenml.utils import secret_utils
|
43
43
|
|
@@ -88,8 +88,8 @@ class ComponentBase(BaseModel):
|
|
88
88
|
# ------------------ Request Model ------------------
|
89
89
|
|
90
90
|
|
91
|
-
class ComponentRequest(ComponentBase,
|
92
|
-
"""Request model for components."""
|
91
|
+
class ComponentRequest(ComponentBase, UserScopedRequest):
|
92
|
+
"""Request model for stack components."""
|
93
93
|
|
94
94
|
ANALYTICS_FIELDS: ClassVar[List[str]] = ["type", "flavor"]
|
95
95
|
|
@@ -120,13 +120,8 @@ class ComponentRequest(ComponentBase, WorkspaceScopedRequest):
|
|
120
120
|
return name
|
121
121
|
|
122
122
|
|
123
|
-
class
|
124
|
-
"""Internal component request model."""
|
125
|
-
|
126
|
-
user: Optional[UUID] = Field( # type: ignore[assignment]
|
127
|
-
title="The id of the user that created this resource.",
|
128
|
-
default=None,
|
129
|
-
)
|
123
|
+
class DefaultComponentRequest(ComponentRequest):
|
124
|
+
"""Internal component request model used only for default stack components."""
|
130
125
|
|
131
126
|
|
132
127
|
# ------------------ Update Model ------------------
|
@@ -162,8 +157,8 @@ class ComponentUpdate(BaseUpdate):
|
|
162
157
|
# ------------------ Response Model ------------------
|
163
158
|
|
164
159
|
|
165
|
-
class ComponentResponseBody(
|
166
|
-
"""Response body for components."""
|
160
|
+
class ComponentResponseBody(UserScopedResponseBody):
|
161
|
+
"""Response body for stack components."""
|
167
162
|
|
168
163
|
type: StackComponentType = Field(
|
169
164
|
title="The type of the stack component.",
|
@@ -185,8 +180,8 @@ class ComponentResponseBody(WorkspaceScopedResponseBody):
|
|
185
180
|
)
|
186
181
|
|
187
182
|
|
188
|
-
class ComponentResponseMetadata(
|
189
|
-
"""Response metadata for components."""
|
183
|
+
class ComponentResponseMetadata(UserScopedResponseMetadata):
|
184
|
+
"""Response metadata for stack components."""
|
190
185
|
|
191
186
|
configuration: Dict[str, Any] = Field(
|
192
187
|
title="The stack component configuration.",
|
@@ -206,8 +201,8 @@ class ComponentResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
206
201
|
)
|
207
202
|
|
208
203
|
|
209
|
-
class ComponentResponseResources(
|
210
|
-
"""
|
204
|
+
class ComponentResponseResources(UserScopedResponseResources):
|
205
|
+
"""Response resources for stack components."""
|
211
206
|
|
212
207
|
flavor: "FlavorResponse" = Field(
|
213
208
|
title="The flavor of this stack component.",
|
@@ -215,13 +210,13 @@ class ComponentResponseResources(WorkspaceScopedResponseResources):
|
|
215
210
|
|
216
211
|
|
217
212
|
class ComponentResponse(
|
218
|
-
|
213
|
+
UserScopedResponse[
|
219
214
|
ComponentResponseBody,
|
220
215
|
ComponentResponseMetadata,
|
221
216
|
ComponentResponseResources,
|
222
217
|
]
|
223
218
|
):
|
224
|
-
"""Response model for components."""
|
219
|
+
"""Response model for stack components."""
|
225
220
|
|
226
221
|
ANALYTICS_FIELDS: ClassVar[List[str]] = ["type"]
|
227
222
|
|
@@ -346,22 +341,16 @@ class ComponentResponse(
|
|
346
341
|
# ------------------ Filter Model ------------------
|
347
342
|
|
348
343
|
|
349
|
-
class ComponentFilter(
|
350
|
-
"""Model to enable advanced
|
351
|
-
|
352
|
-
The Component Model needs additional scoping. As such the `_scope_user`
|
353
|
-
field can be set to the user that is doing the filtering. The
|
354
|
-
`generate_filter()` method of the baseclass is overwritten to include the
|
355
|
-
scoping.
|
356
|
-
"""
|
344
|
+
class ComponentFilter(UserScopedFilter):
|
345
|
+
"""Model to enable advanced stack component filtering."""
|
357
346
|
|
358
347
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
359
|
-
*
|
348
|
+
*UserScopedFilter.FILTER_EXCLUDE_FIELDS,
|
360
349
|
"scope_type",
|
361
350
|
"stack_id",
|
362
351
|
]
|
363
352
|
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
364
|
-
*
|
353
|
+
*UserScopedFilter.CLI_EXCLUDE_FIELDS,
|
365
354
|
"scope_type",
|
366
355
|
]
|
367
356
|
scope_type: Optional[str] = Field(
|
zenml/models/v2/core/device.py
CHANGED
@@ -18,11 +18,12 @@ from typing import Optional, Union
|
|
18
18
|
from uuid import UUID
|
19
19
|
|
20
20
|
from passlib.context import CryptContext
|
21
|
-
from pydantic import
|
21
|
+
from pydantic import Field
|
22
22
|
|
23
23
|
from zenml.enums import OAuthDeviceStatus
|
24
24
|
from zenml.models.v2.base.base import (
|
25
25
|
BaseRequest,
|
26
|
+
BaseUpdate,
|
26
27
|
)
|
27
28
|
from zenml.models.v2.base.scoped import (
|
28
29
|
UserScopedFilter,
|
@@ -81,7 +82,7 @@ class OAuthDeviceInternalRequest(BaseRequest):
|
|
81
82
|
# ------------------ Update Model ------------------
|
82
83
|
|
83
84
|
|
84
|
-
class OAuthDeviceUpdate(
|
85
|
+
class OAuthDeviceUpdate(BaseUpdate):
|
85
86
|
"""OAuth2 device update model."""
|
86
87
|
|
87
88
|
locked: Optional[bool] = Field(
|
@@ -20,7 +20,7 @@ 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
26
|
WorkspaceScopedFilter,
|
@@ -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(
|
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,13 +16,14 @@
|
|
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 (
|
27
28
|
TaggableFilter,
|
28
29
|
WorkspaceScopedFilter,
|
@@ -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
|
@@ -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
|
+
workspace=self.workspace.id,
|
316
319
|
)
|
317
320
|
return [
|
318
321
|
mv.to_model_class(suppress_class_validation_warnings=True)
|
@@ -340,7 +343,7 @@ class ModelFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
340
343
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
341
344
|
SORT_BY_LATEST_VERSION_KEY,
|
342
345
|
]
|
343
|
-
CLI_EXCLUDE_FIELDS = [
|
346
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
344
347
|
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
345
348
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
346
349
|
]
|
@@ -25,11 +25,12 @@ 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 (
|
@@ -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,
|
@@ -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,
|
@@ -574,15 +572,17 @@ class ModelVersionFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
574
572
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
575
573
|
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
576
574
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
575
|
+
"model",
|
577
576
|
"run_metadata",
|
578
577
|
]
|
579
|
-
CUSTOM_SORTING_OPTIONS = [
|
578
|
+
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
580
579
|
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
581
580
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
582
581
|
]
|
583
|
-
CLI_EXCLUDE_FIELDS = [
|
582
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
584
583
|
*WorkspaceScopedFilter.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
@@ -270,7 +270,7 @@ class PipelineFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
270
270
|
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
271
271
|
"latest_run_status",
|
272
272
|
]
|
273
|
-
CLI_EXCLUDE_FIELDS = [
|
273
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
274
274
|
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
275
275
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
276
276
|
]
|
@@ -72,6 +72,9 @@ class PipelineBuildBase(BaseZenModel):
|
|
72
72
|
python_version: Optional[str] = Field(
|
73
73
|
title="The Python version used for this build.", default=None
|
74
74
|
)
|
75
|
+
duration: Optional[int] = Field(
|
76
|
+
title="The duration of the build in seconds.", default=None
|
77
|
+
)
|
75
78
|
|
76
79
|
# Helper methods
|
77
80
|
@property
|
@@ -223,6 +226,9 @@ class PipelineBuildResponseMetadata(WorkspaceScopedResponseMetadata):
|
|
223
226
|
contains_code: bool = Field(
|
224
227
|
title="Whether any image of the build contains user code.",
|
225
228
|
)
|
229
|
+
duration: Optional[int] = Field(
|
230
|
+
title="The duration of the build in seconds.", default=None
|
231
|
+
)
|
226
232
|
|
227
233
|
|
228
234
|
class PipelineBuildResponseResources(WorkspaceScopedResponseResources):
|
@@ -454,6 +460,15 @@ class PipelineBuildResponse(
|
|
454
460
|
"""
|
455
461
|
return self.get_metadata().contains_code
|
456
462
|
|
463
|
+
@property
|
464
|
+
def duration(self) -> Optional[int]:
|
465
|
+
"""The `duration` property.
|
466
|
+
|
467
|
+
Returns:
|
468
|
+
the value of the property.
|
469
|
+
"""
|
470
|
+
return self.get_metadata().duration
|
471
|
+
|
457
472
|
|
458
473
|
# ------------------ Filter Model ------------------
|
459
474
|
|
@@ -502,6 +517,9 @@ class PipelineBuildFilter(WorkspaceScopedFilter):
|
|
502
517
|
stack_checksum: Optional[str] = Field(
|
503
518
|
description="The stack checksum.", default=None
|
504
519
|
)
|
520
|
+
duration: Optional[Union[int, str]] = Field(
|
521
|
+
description="The duration of the build in seconds.", default=None
|
522
|
+
)
|
505
523
|
|
506
524
|
def get_custom_filters(
|
507
525
|
self,
|
@@ -28,12 +28,13 @@ from typing import (
|
|
28
28
|
)
|
29
29
|
from uuid import UUID
|
30
30
|
|
31
|
-
from pydantic import
|
31
|
+
from pydantic import ConfigDict, Field
|
32
32
|
|
33
33
|
from zenml.config.pipeline_configurations import PipelineConfiguration
|
34
34
|
from zenml.constants import STR_FIELD_MAX_LENGTH
|
35
35
|
from zenml.enums import ExecutionStatus
|
36
36
|
from zenml.metadata.metadata_types import MetadataType
|
37
|
+
from zenml.models.v2.base.base import BaseUpdate
|
37
38
|
from zenml.models.v2.base.scoped import (
|
38
39
|
TaggableFilter,
|
39
40
|
WorkspaceScopedFilter,
|
@@ -45,6 +46,7 @@ from zenml.models.v2.base.scoped import (
|
|
45
46
|
)
|
46
47
|
from zenml.models.v2.core.model_version import ModelVersionResponse
|
47
48
|
from zenml.models.v2.core.tag import TagResponse
|
49
|
+
from zenml.utils.tag_utils import Tag
|
48
50
|
|
49
51
|
if TYPE_CHECKING:
|
50
52
|
from sqlalchemy.sql.elements import ColumnElement
|
@@ -117,15 +119,10 @@ class PipelineRunRequest(WorkspaceScopedRequest):
|
|
117
119
|
default=None,
|
118
120
|
title="ID of the trigger execution that triggered this run.",
|
119
121
|
)
|
120
|
-
tags: Optional[List[str]] = Field(
|
122
|
+
tags: Optional[List[Union[str, Tag]]] = Field(
|
121
123
|
default=None,
|
122
124
|
title="Tags of the pipeline run.",
|
123
125
|
)
|
124
|
-
model_version_id: Optional[UUID] = Field(
|
125
|
-
title="The ID of the model version that was "
|
126
|
-
"configured by this pipeline run explicitly.",
|
127
|
-
default=None,
|
128
|
-
)
|
129
126
|
|
130
127
|
model_config = ConfigDict(protected_namespaces=())
|
131
128
|
|
@@ -133,16 +130,11 @@ class PipelineRunRequest(WorkspaceScopedRequest):
|
|
133
130
|
# ------------------ Update Model ------------------
|
134
131
|
|
135
132
|
|
136
|
-
class PipelineRunUpdate(
|
133
|
+
class PipelineRunUpdate(BaseUpdate):
|
137
134
|
"""Pipeline run update model."""
|
138
135
|
|
139
136
|
status: Optional[ExecutionStatus] = None
|
140
137
|
end_time: Optional[datetime] = None
|
141
|
-
model_version_id: Optional[UUID] = Field(
|
142
|
-
title="The ID of the model version that was "
|
143
|
-
"configured by this pipeline run explicitly.",
|
144
|
-
default=None,
|
145
|
-
)
|
146
138
|
# TODO: we should maybe have a different update model here, the upper
|
147
139
|
# three attributes should only be for internal use
|
148
140
|
add_tags: Optional[List[str]] = Field(
|
@@ -318,7 +318,6 @@ class RunTemplateFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
318
318
|
"stack_id",
|
319
319
|
"build_id",
|
320
320
|
"pipeline_id",
|
321
|
-
"user",
|
322
321
|
"pipeline",
|
323
322
|
"stack",
|
324
323
|
]
|
@@ -326,7 +325,7 @@ class RunTemplateFilter(WorkspaceScopedFilter, TaggableFilter):
|
|
326
325
|
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
327
326
|
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
328
327
|
]
|
329
|
-
CLI_EXCLUDE_FIELDS = [
|
328
|
+
CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
330
329
|
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
331
330
|
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
332
331
|
]
|
zenml/models/v2/core/schedule.py
CHANGED
@@ -127,15 +127,6 @@ class ScheduleUpdate(BaseUpdate):
|
|
127
127
|
"""Update model for schedules."""
|
128
128
|
|
129
129
|
name: Optional[str] = None
|
130
|
-
active: Optional[bool] = None
|
131
|
-
cron_expression: Optional[str] = None
|
132
|
-
start_time: Optional[datetime] = None
|
133
|
-
end_time: Optional[datetime] = None
|
134
|
-
interval_second: Optional[timedelta] = None
|
135
|
-
catchup: Optional[bool] = None
|
136
|
-
run_once_start_time: Optional[datetime] = None
|
137
|
-
orchestrator_id: Optional[UUID] = None
|
138
|
-
pipeline_id: Optional[UUID] = None
|
139
130
|
|
140
131
|
|
141
132
|
# ------------------ Response Model ------------------
|