zenml-nightly 0.75.0.dev20250312__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.
Files changed (160) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +2 -0
  3. zenml/analytics/context.py +7 -0
  4. zenml/artifacts/utils.py +0 -2
  5. zenml/cli/login.py +6 -0
  6. zenml/cli/model.py +7 -15
  7. zenml/cli/secret.py +47 -44
  8. zenml/cli/service_connectors.py +0 -1
  9. zenml/cli/stack.py +0 -1
  10. zenml/cli/tag.py +3 -5
  11. zenml/cli/utils.py +25 -23
  12. zenml/cli/workspace.py +79 -5
  13. zenml/client.py +615 -348
  14. zenml/config/global_config.py +16 -3
  15. zenml/config/pipeline_configurations.py +3 -2
  16. zenml/config/pipeline_run_configuration.py +2 -1
  17. zenml/config/secret_reference_mixin.py +1 -1
  18. zenml/constants.py +1 -3
  19. zenml/enums.py +0 -7
  20. zenml/event_hub/event_hub.py +3 -1
  21. zenml/exceptions.py +0 -24
  22. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
  23. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
  24. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
  25. zenml/integrations/mlflow/steps/mlflow_registry.py +1 -1
  26. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
  27. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +3 -3
  28. zenml/model/model.py +8 -8
  29. zenml/models/__init__.py +18 -1
  30. zenml/models/v2/base/base.py +0 -5
  31. zenml/models/v2/base/filter.py +1 -1
  32. zenml/models/v2/base/scoped.py +104 -121
  33. zenml/models/v2/core/api_key.py +1 -1
  34. zenml/models/v2/core/artifact.py +31 -18
  35. zenml/models/v2/core/artifact_version.py +42 -25
  36. zenml/models/v2/core/component.py +22 -33
  37. zenml/models/v2/core/device.py +3 -2
  38. zenml/models/v2/core/event_source.py +2 -2
  39. zenml/models/v2/core/flavor.py +19 -47
  40. zenml/models/v2/core/logs.py +1 -2
  41. zenml/models/v2/core/model.py +7 -4
  42. zenml/models/v2/core/model_version.py +36 -27
  43. zenml/models/v2/core/pipeline.py +1 -1
  44. zenml/models/v2/core/pipeline_run.py +5 -13
  45. zenml/models/v2/core/run_template.py +1 -2
  46. zenml/models/v2/core/schedule.py +0 -9
  47. zenml/models/v2/core/secret.py +93 -127
  48. zenml/models/v2/core/server_settings.py +2 -2
  49. zenml/models/v2/core/service.py +43 -12
  50. zenml/models/v2/core/service_connector.py +14 -16
  51. zenml/models/v2/core/stack.py +24 -26
  52. zenml/models/v2/core/step_run.py +3 -15
  53. zenml/models/v2/core/tag.py +41 -15
  54. zenml/models/v2/core/user.py +19 -2
  55. zenml/models/v2/misc/statistics.py +45 -0
  56. zenml/models/v2/misc/tag.py +27 -0
  57. zenml/orchestrators/cache_utils.py +1 -1
  58. zenml/orchestrators/input_utils.py +1 -0
  59. zenml/orchestrators/step_launcher.py +0 -1
  60. zenml/orchestrators/step_run_utils.py +0 -2
  61. zenml/orchestrators/step_runner.py +10 -1
  62. zenml/pipelines/build_utils.py +0 -2
  63. zenml/pipelines/pipeline_decorator.py +3 -2
  64. zenml/pipelines/pipeline_definition.py +4 -5
  65. zenml/pipelines/run_utils.py +3 -3
  66. zenml/service_connectors/service_connector.py +0 -7
  67. zenml/service_connectors/service_connector_utils.py +0 -1
  68. zenml/stack/authentication_mixin.py +1 -1
  69. zenml/stack/flavor.py +3 -14
  70. zenml/stack/stack_component.py +1 -5
  71. zenml/steps/step_context.py +19 -0
  72. zenml/utils/string_utils.py +1 -1
  73. zenml/utils/tag_utils.py +642 -0
  74. zenml/zen_server/cloud_utils.py +21 -0
  75. zenml/zen_server/exceptions.py +0 -6
  76. zenml/zen_server/rbac/endpoint_utils.py +134 -46
  77. zenml/zen_server/rbac/models.py +65 -3
  78. zenml/zen_server/rbac/rbac_interface.py +9 -0
  79. zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
  80. zenml/zen_server/rbac/utils.py +156 -29
  81. zenml/zen_server/rbac/zenml_cloud_rbac.py +43 -11
  82. zenml/zen_server/routers/actions_endpoints.py +3 -5
  83. zenml/zen_server/routers/artifact_endpoint.py +0 -5
  84. zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
  85. zenml/zen_server/routers/auth_endpoints.py +22 -7
  86. zenml/zen_server/routers/code_repositories_endpoints.py +56 -3
  87. zenml/zen_server/routers/devices_endpoints.py +0 -4
  88. zenml/zen_server/routers/event_source_endpoints.py +0 -5
  89. zenml/zen_server/routers/flavors_endpoints.py +0 -5
  90. zenml/zen_server/routers/logs_endpoints.py +0 -1
  91. zenml/zen_server/routers/model_versions_endpoints.py +102 -23
  92. zenml/zen_server/routers/models_endpoints.py +51 -68
  93. zenml/zen_server/routers/pipeline_builds_endpoints.py +58 -4
  94. zenml/zen_server/routers/pipeline_deployments_endpoints.py +58 -4
  95. zenml/zen_server/routers/pipelines_endpoints.py +73 -4
  96. zenml/zen_server/routers/plugin_endpoints.py +0 -1
  97. zenml/zen_server/routers/run_metadata_endpoints.py +99 -0
  98. zenml/zen_server/routers/run_templates_endpoints.py +66 -3
  99. zenml/zen_server/routers/runs_endpoints.py +60 -8
  100. zenml/zen_server/routers/schedule_endpoints.py +69 -6
  101. zenml/zen_server/routers/secrets_endpoints.py +40 -4
  102. zenml/zen_server/routers/server_endpoints.py +53 -1
  103. zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
  104. zenml/zen_server/routers/service_connectors_endpoints.py +96 -14
  105. zenml/zen_server/routers/service_endpoints.py +20 -7
  106. zenml/zen_server/routers/stack_components_endpoints.py +68 -7
  107. zenml/zen_server/routers/stacks_endpoints.py +98 -7
  108. zenml/zen_server/routers/steps_endpoints.py +17 -11
  109. zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
  110. zenml/zen_server/routers/tags_endpoints.py +6 -17
  111. zenml/zen_server/routers/triggers_endpoints.py +5 -8
  112. zenml/zen_server/routers/users_endpoints.py +47 -12
  113. zenml/zen_server/routers/workspaces_endpoints.py +56 -1285
  114. zenml/zen_server/template_execution/utils.py +5 -4
  115. zenml/zen_server/utils.py +21 -0
  116. zenml/zen_server/zen_server_api.py +4 -0
  117. zenml/zen_stores/base_zen_store.py +29 -44
  118. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
  119. zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
  120. zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
  121. zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
  122. zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
  123. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
  124. zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
  125. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
  126. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
  127. zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
  128. zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
  129. zenml/zen_stores/rest_zen_store.py +172 -171
  130. zenml/zen_stores/schemas/action_schemas.py +8 -1
  131. zenml/zen_stores/schemas/api_key_schemas.py +8 -1
  132. zenml/zen_stores/schemas/artifact_schemas.py +28 -1
  133. zenml/zen_stores/schemas/code_repository_schemas.py +8 -1
  134. zenml/zen_stores/schemas/component_schemas.py +9 -14
  135. zenml/zen_stores/schemas/event_source_schemas.py +8 -1
  136. zenml/zen_stores/schemas/flavor_schemas.py +14 -20
  137. zenml/zen_stores/schemas/model_schemas.py +3 -0
  138. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +3 -1
  139. zenml/zen_stores/schemas/pipeline_run_schemas.py +0 -3
  140. zenml/zen_stores/schemas/run_template_schemas.py +8 -4
  141. zenml/zen_stores/schemas/schedule_schema.py +9 -14
  142. zenml/zen_stores/schemas/secret_schemas.py +15 -25
  143. zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
  144. zenml/zen_stores/schemas/service_schemas.py +0 -1
  145. zenml/zen_stores/schemas/stack_schemas.py +12 -15
  146. zenml/zen_stores/schemas/step_run_schemas.py +7 -8
  147. zenml/zen_stores/schemas/tag_schemas.py +30 -2
  148. zenml/zen_stores/schemas/trigger_schemas.py +8 -1
  149. zenml/zen_stores/schemas/user_schemas.py +24 -2
  150. zenml/zen_stores/schemas/utils.py +16 -0
  151. zenml/zen_stores/schemas/workspace_schemas.py +7 -25
  152. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
  153. zenml/zen_stores/sql_zen_store.py +2905 -2280
  154. zenml/zen_stores/template_utils.py +1 -1
  155. zenml/zen_stores/zen_store_interface.py +82 -58
  156. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/METADATA +1 -1
  157. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/RECORD +160 -147
  158. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/LICENSE +0 -0
  159. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250313.dist-info}/WHEEL +0 -0
  160. {zenml_nightly-0.75.0.dev20250312.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
- WorkspaceScopedFilter,
36
- WorkspaceScopedRequest,
37
- WorkspaceScopedResponse,
38
- WorkspaceScopedResponseBody,
39
- WorkspaceScopedResponseMetadata,
40
- WorkspaceScopedResponseResources,
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, WorkspaceScopedRequest):
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 InternalComponentRequest(ComponentRequest):
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(WorkspaceScopedResponseBody):
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(WorkspaceScopedResponseMetadata):
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(WorkspaceScopedResponseResources):
210
- """Class for all resource models associated with the component entity."""
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
- WorkspaceScopedResponse[
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(WorkspaceScopedFilter):
350
- """Model to enable advanced filtering of all ComponentModels.
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
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
348
+ *UserScopedFilter.FILTER_EXCLUDE_FIELDS,
360
349
  "scope_type",
361
350
  "stack_id",
362
351
  ]
363
352
  CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
364
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
353
+ *UserScopedFilter.CLI_EXCLUDE_FIELDS,
365
354
  "scope_type",
366
355
  ]
367
356
  scope_type: Optional[str] = Field(
@@ -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 BaseModel, Field
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(BaseModel):
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 BaseZenModel
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(BaseZenModel):
66
+ class EventSourceUpdate(BaseUpdate):
67
67
  """Update model for event sources."""
68
68
 
69
69
  name: Optional[str] = Field(
@@ -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 flavor."""
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
- """Class for all resource models associated with the flavor entity."""
227
+ """Response resources for stack component flavors."""
249
228
 
250
229
 
251
230
  class FlavorResponse(
252
231
  UserScopedResponse[
253
- FlavorResponseBody, FlavorResponseMetadata, FlavorResponseResources
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 workspace(self) -> Optional["WorkspaceResponse"]:
342
- """The `workspace` property.
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.get_metadata().workspace
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(WorkspaceScopedFilter):
417
- """Model to enable advanced filtering of all Flavors."""
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,
@@ -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: Union[str, UUID] = Field(
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")
@@ -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 BaseModel, Field
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(BaseModel):
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, model_name_or_id=self.id
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 BaseModel, ConfigDict, Field, PrivateAttr, field_validator
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(BaseModel):
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
- name=name,
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
- _model_id: UUID = PrivateAttr(None)
607
-
608
- def set_scope_model(self, model_name_or_id: Union[str, UUID]) -> None:
609
- """Set the model to scope this response.
610
-
611
- Args:
612
- model_name_or_id: The model to scope this response to.
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
- if self._model_id:
682
- query = query.where(getattr(table, "model_id") == self._model_id)
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
@@ -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
  ]
@@ -28,12 +28,13 @@ from typing import (
28
28
  )
29
29
  from uuid import UUID
30
30
 
31
- from pydantic import BaseModel, ConfigDict, Field
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(BaseModel):
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
  ]
@@ -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 ------------------