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.
Files changed (191) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +2 -0
  3. zenml/analytics/context.py +7 -0
  4. zenml/analytics/enums.py +2 -2
  5. zenml/artifacts/utils.py +2 -4
  6. zenml/cli/__init__.py +8 -9
  7. zenml/cli/base.py +2 -2
  8. zenml/cli/code_repository.py +1 -1
  9. zenml/cli/login.py +6 -0
  10. zenml/cli/model.py +7 -15
  11. zenml/cli/pipeline.py +3 -3
  12. zenml/cli/project.py +172 -0
  13. zenml/cli/secret.py +47 -44
  14. zenml/cli/service_accounts.py +0 -1
  15. zenml/cli/service_connectors.py +15 -17
  16. zenml/cli/stack.py +0 -3
  17. zenml/cli/stack_components.py +2 -2
  18. zenml/cli/tag.py +3 -5
  19. zenml/cli/utils.py +25 -23
  20. zenml/client.py +749 -475
  21. zenml/config/global_config.py +48 -37
  22. zenml/config/pipeline_configurations.py +3 -2
  23. zenml/config/pipeline_run_configuration.py +2 -1
  24. zenml/config/secret_reference_mixin.py +1 -1
  25. zenml/constants.py +6 -6
  26. zenml/enums.py +0 -7
  27. zenml/event_hub/event_hub.py +3 -1
  28. zenml/exceptions.py +0 -24
  29. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +5 -3
  30. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -4
  31. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +7 -6
  32. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -4
  33. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -3
  34. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -1
  35. zenml/integrations/wandb/__init__.py +1 -1
  36. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +29 -9
  37. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +5 -3
  38. zenml/model/model.py +10 -10
  39. zenml/model_registries/base_model_registry.py +1 -1
  40. zenml/models/__init__.py +45 -28
  41. zenml/models/v2/base/base.py +0 -5
  42. zenml/models/v2/base/filter.py +2 -2
  43. zenml/models/v2/base/scoped.py +135 -156
  44. zenml/models/v2/core/action.py +12 -12
  45. zenml/models/v2/core/api_key.py +1 -1
  46. zenml/models/v2/core/artifact.py +31 -18
  47. zenml/models/v2/core/artifact_version.py +57 -40
  48. zenml/models/v2/core/code_repository.py +12 -12
  49. zenml/models/v2/core/component.py +22 -33
  50. zenml/models/v2/core/device.py +3 -2
  51. zenml/models/v2/core/event_source.py +14 -14
  52. zenml/models/v2/core/flavor.py +19 -47
  53. zenml/models/v2/core/logs.py +1 -2
  54. zenml/models/v2/core/model.py +23 -20
  55. zenml/models/v2/core/model_version.py +51 -42
  56. zenml/models/v2/core/pipeline.py +16 -16
  57. zenml/models/v2/core/pipeline_build.py +14 -14
  58. zenml/models/v2/core/pipeline_deployment.py +12 -14
  59. zenml/models/v2/core/pipeline_run.py +21 -29
  60. zenml/models/v2/core/project.py +203 -0
  61. zenml/models/v2/core/run_metadata.py +2 -2
  62. zenml/models/v2/core/run_template.py +16 -17
  63. zenml/models/v2/core/schedule.py +12 -21
  64. zenml/models/v2/core/secret.py +94 -128
  65. zenml/models/v2/core/server_settings.py +2 -2
  66. zenml/models/v2/core/service.py +57 -26
  67. zenml/models/v2/core/service_connector.py +14 -16
  68. zenml/models/v2/core/stack.py +24 -26
  69. zenml/models/v2/core/step_run.py +16 -28
  70. zenml/models/v2/core/tag.py +41 -15
  71. zenml/models/v2/core/trigger.py +13 -13
  72. zenml/models/v2/core/trigger_execution.py +2 -2
  73. zenml/models/v2/core/user.py +2 -2
  74. zenml/models/v2/misc/statistics.py +45 -0
  75. zenml/models/v2/misc/tag.py +27 -0
  76. zenml/orchestrators/cache_utils.py +7 -7
  77. zenml/orchestrators/input_utils.py +1 -0
  78. zenml/orchestrators/step_launcher.py +1 -2
  79. zenml/orchestrators/step_run_utils.py +2 -4
  80. zenml/orchestrators/step_runner.py +10 -1
  81. zenml/orchestrators/utils.py +4 -4
  82. zenml/pipelines/build_utils.py +2 -4
  83. zenml/pipelines/pipeline_decorator.py +3 -2
  84. zenml/pipelines/pipeline_definition.py +8 -9
  85. zenml/pipelines/run_utils.py +4 -4
  86. zenml/service_connectors/service_connector.py +0 -10
  87. zenml/service_connectors/service_connector_utils.py +0 -2
  88. zenml/stack/authentication_mixin.py +1 -1
  89. zenml/stack/flavor.py +3 -14
  90. zenml/stack/stack.py +0 -1
  91. zenml/stack/stack_component.py +1 -5
  92. zenml/steps/base_step.py +10 -2
  93. zenml/steps/step_context.py +19 -0
  94. zenml/utils/string_utils.py +1 -1
  95. zenml/utils/tag_utils.py +642 -0
  96. zenml/zen_server/cloud_utils.py +21 -0
  97. zenml/zen_server/exceptions.py +0 -6
  98. zenml/zen_server/rbac/endpoint_utils.py +134 -46
  99. zenml/zen_server/rbac/models.py +65 -3
  100. zenml/zen_server/rbac/rbac_interface.py +9 -0
  101. zenml/zen_server/rbac/rbac_sql_zen_store.py +15 -7
  102. zenml/zen_server/rbac/utils.py +155 -30
  103. zenml/zen_server/rbac/zenml_cloud_rbac.py +39 -11
  104. zenml/zen_server/routers/actions_endpoints.py +3 -5
  105. zenml/zen_server/routers/artifact_endpoint.py +0 -5
  106. zenml/zen_server/routers/artifact_version_endpoints.py +15 -9
  107. zenml/zen_server/routers/auth_endpoints.py +22 -7
  108. zenml/zen_server/routers/code_repositories_endpoints.py +54 -3
  109. zenml/zen_server/routers/devices_endpoints.py +0 -4
  110. zenml/zen_server/routers/event_source_endpoints.py +0 -5
  111. zenml/zen_server/routers/flavors_endpoints.py +0 -5
  112. zenml/zen_server/routers/logs_endpoints.py +0 -1
  113. zenml/zen_server/routers/model_versions_endpoints.py +100 -23
  114. zenml/zen_server/routers/models_endpoints.py +50 -69
  115. zenml/zen_server/routers/pipeline_builds_endpoints.py +55 -3
  116. zenml/zen_server/routers/pipeline_deployments_endpoints.py +56 -4
  117. zenml/zen_server/routers/pipelines_endpoints.py +70 -3
  118. zenml/zen_server/routers/plugin_endpoints.py +0 -1
  119. zenml/zen_server/routers/projects_endpoints.py +283 -0
  120. zenml/zen_server/routers/run_metadata_endpoints.py +97 -0
  121. zenml/zen_server/routers/run_templates_endpoints.py +64 -3
  122. zenml/zen_server/routers/runs_endpoints.py +58 -8
  123. zenml/zen_server/routers/schedule_endpoints.py +67 -6
  124. zenml/zen_server/routers/secrets_endpoints.py +38 -4
  125. zenml/zen_server/routers/server_endpoints.py +53 -1
  126. zenml/zen_server/routers/service_accounts_endpoints.py +14 -15
  127. zenml/zen_server/routers/service_connectors_endpoints.py +94 -14
  128. zenml/zen_server/routers/service_endpoints.py +18 -7
  129. zenml/zen_server/routers/stack_components_endpoints.py +66 -7
  130. zenml/zen_server/routers/stacks_endpoints.py +95 -6
  131. zenml/zen_server/routers/steps_endpoints.py +17 -11
  132. zenml/zen_server/routers/tag_resource_endpoints.py +115 -0
  133. zenml/zen_server/routers/tags_endpoints.py +6 -17
  134. zenml/zen_server/routers/triggers_endpoints.py +5 -8
  135. zenml/zen_server/routers/users_endpoints.py +9 -12
  136. zenml/zen_server/template_execution/utils.py +8 -7
  137. zenml/zen_server/utils.py +21 -0
  138. zenml/zen_server/zen_server_api.py +7 -2
  139. zenml/zen_stores/base_zen_store.py +50 -69
  140. zenml/zen_stores/migrations/versions/12eff0206201_rename_workspace_to_project.py +768 -0
  141. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +20 -10
  142. zenml/zen_stores/migrations/versions/1f9d1cd00b90_add_unique_name_constraints.py +231 -0
  143. zenml/zen_stores/migrations/versions/288f4fb6e112_make_tags_user_scoped.py +74 -0
  144. zenml/zen_stores/migrations/versions/2e695a26fe7a_add_user_default_workspace.py +45 -0
  145. zenml/zen_stores/migrations/versions/3b1776345020_remove_workspace_from_globals.py +81 -0
  146. zenml/zen_stores/migrations/versions/41b28cae31ce_make_artifacts_workspace_scoped.py +136 -0
  147. zenml/zen_stores/migrations/versions/9e7bf0970266_adding_exclusive_attribute_to_tags.py +47 -0
  148. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +8 -4
  149. zenml/zen_stores/migrations/versions/cbc6acd71f92_add_workspace_display_name.py +58 -0
  150. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +12 -6
  151. zenml/zen_stores/migrations/versions/f1d723fd723b_add_secret_private_attr.py +61 -0
  152. zenml/zen_stores/migrations/versions/f76a368a25a5_add_stack_description.py +35 -0
  153. zenml/zen_stores/rest_zen_store.py +223 -230
  154. zenml/zen_stores/schemas/__init__.py +2 -2
  155. zenml/zen_stores/schemas/action_schemas.py +15 -8
  156. zenml/zen_stores/schemas/api_key_schemas.py +8 -1
  157. zenml/zen_stores/schemas/artifact_schemas.py +35 -10
  158. zenml/zen_stores/schemas/code_repository_schemas.py +22 -17
  159. zenml/zen_stores/schemas/component_schemas.py +9 -14
  160. zenml/zen_stores/schemas/event_source_schemas.py +15 -8
  161. zenml/zen_stores/schemas/flavor_schemas.py +14 -20
  162. zenml/zen_stores/schemas/model_schemas.py +18 -17
  163. zenml/zen_stores/schemas/pipeline_build_schemas.py +7 -7
  164. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +10 -8
  165. zenml/zen_stores/schemas/pipeline_run_schemas.py +9 -12
  166. zenml/zen_stores/schemas/pipeline_schemas.py +9 -9
  167. zenml/zen_stores/schemas/{workspace_schemas.py → project_schemas.py} +53 -65
  168. zenml/zen_stores/schemas/run_metadata_schemas.py +5 -5
  169. zenml/zen_stores/schemas/run_template_schemas.py +17 -13
  170. zenml/zen_stores/schemas/schedule_schema.py +16 -21
  171. zenml/zen_stores/schemas/secret_schemas.py +15 -25
  172. zenml/zen_stores/schemas/service_connector_schemas.py +8 -17
  173. zenml/zen_stores/schemas/service_schemas.py +7 -8
  174. zenml/zen_stores/schemas/stack_schemas.py +12 -15
  175. zenml/zen_stores/schemas/step_run_schemas.py +14 -15
  176. zenml/zen_stores/schemas/tag_schemas.py +30 -2
  177. zenml/zen_stores/schemas/trigger_schemas.py +15 -8
  178. zenml/zen_stores/schemas/user_schemas.py +12 -2
  179. zenml/zen_stores/schemas/utils.py +16 -0
  180. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +0 -3
  181. zenml/zen_stores/sql_zen_store.py +2984 -2369
  182. zenml/zen_stores/template_utils.py +1 -1
  183. zenml/zen_stores/zen_store_interface.py +136 -126
  184. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/METADATA +1 -1
  185. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/RECORD +188 -173
  186. zenml/cli/workspace.py +0 -86
  187. zenml/models/v2/core/workspace.py +0 -131
  188. zenml/zen_server/routers/workspaces_endpoints.py +0 -1469
  189. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/LICENSE +0 -0
  190. {zenml_nightly-0.75.0.dev20250312.dist-info → zenml_nightly-0.75.0.dev20250314.dist-info}/WHEEL +0 -0
  191. {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 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
- WorkspaceScopedFilter,
27
- WorkspaceScopedRequest,
28
- WorkspaceScopedResponse,
29
- WorkspaceScopedResponseBody,
30
- WorkspaceScopedResponseMetadata,
31
- WorkspaceScopedResponseResources,
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(WorkspaceScopedRequest):
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(BaseZenModel):
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(WorkspaceScopedResponseBody):
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(WorkspaceScopedResponseMetadata):
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(WorkspaceScopedResponseResources):
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
- WorkspaceScopedResponse[
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(WorkspaceScopedFilter):
229
+ class EventSourceFilter(ProjectScopedFilter):
230
230
  """Model to enable advanced filtering of all EventSourceModels."""
231
231
 
232
232
  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,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 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 (
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(WorkspaceScopedRequest):
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(BaseModel):
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(WorkspaceScopedResponseBody):
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(WorkspaceScopedResponseMetadata):
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(WorkspaceScopedResponseResources):
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
- WorkspaceScopedResponse[
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, model_name_or_id=self.id
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(WorkspaceScopedFilter, TaggableFilter):
327
- """Model to enable advanced filtering of all Workspaces."""
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
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
338
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
336
339
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
337
340
  ]
338
341
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
339
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
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
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
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 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 (
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(WorkspaceScopedRequest):
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(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,
@@ -137,7 +135,7 @@ class ModelVersionUpdate(BaseModel):
137
135
  # ------------------ Response Model ------------------
138
136
 
139
137
 
140
- class ModelVersionResponseBody(WorkspaceScopedResponseBody):
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(WorkspaceScopedResponseMetadata):
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(WorkspaceScopedResponseResources):
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
- WorkspaceScopedResponse[
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
- name=name,
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(WorkspaceScopedFilter, TaggableFilter):
569
+ class ModelVersionFilter(ProjectScopedFilter, TaggableFilter):
572
570
  """Filter model for model versions."""
573
571
 
574
572
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
575
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
573
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
576
574
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
575
+ "model",
577
576
  "run_metadata",
578
577
  ]
579
- CUSTOM_SORTING_OPTIONS = [
580
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
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
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
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
- _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
@@ -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(WorkspaceScopedRequest):
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(WorkspaceScopedResponseBody):
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(WorkspaceScopedResponseMetadata):
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(WorkspaceScopedResponseResources):
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
- WorkspaceScopedResponse[
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(WorkspaceScopedFilter, TaggableFilter):
260
+ class PipelineFilter(ProjectScopedFilter, TaggableFilter):
261
261
  """Pipeline filter model."""
262
262
 
263
263
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
264
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
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
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
269
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
270
270
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
271
271
  "latest_run_status",
272
272
  ]
273
- CLI_EXCLUDE_FIELDS = [
274
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
273
+ CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
274
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
275
275
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
276
276
  ]
277
277