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
@@ -29,12 +29,12 @@ from zenml.constants import STR_FIELD_MAX_LENGTH
29
29
  from zenml.enums import PluginSubType
30
30
  from zenml.models.v2.base.base import BaseUpdate
31
31
  from zenml.models.v2.base.scoped import (
32
- WorkspaceScopedFilter,
33
- WorkspaceScopedRequest,
34
- WorkspaceScopedResponse,
35
- WorkspaceScopedResponseBody,
36
- WorkspaceScopedResponseMetadata,
37
- WorkspaceScopedResponseResources,
32
+ ProjectScopedFilter,
33
+ ProjectScopedRequest,
34
+ ProjectScopedResponse,
35
+ ProjectScopedResponseBody,
36
+ ProjectScopedResponseMetadata,
37
+ ProjectScopedResponseResources,
38
38
  )
39
39
  from zenml.models.v2.core.user import UserResponse
40
40
 
@@ -47,7 +47,7 @@ if TYPE_CHECKING:
47
47
  # ------------------ Request Model ------------------
48
48
 
49
49
 
50
- class ActionRequest(WorkspaceScopedRequest):
50
+ class ActionRequest(ProjectScopedRequest):
51
51
  """Model for creating a new action."""
52
52
 
53
53
  name: str = Field(
@@ -131,7 +131,7 @@ class ActionUpdate(BaseUpdate):
131
131
  # ------------------ Response Model ------------------
132
132
 
133
133
 
134
- class ActionResponseBody(WorkspaceScopedResponseBody):
134
+ class ActionResponseBody(ProjectScopedResponseBody):
135
135
  """Response body for actions."""
136
136
 
137
137
  flavor: str = Field(
@@ -144,7 +144,7 @@ class ActionResponseBody(WorkspaceScopedResponseBody):
144
144
  )
145
145
 
146
146
 
147
- class ActionResponseMetadata(WorkspaceScopedResponseMetadata):
147
+ class ActionResponseMetadata(ProjectScopedResponseMetadata):
148
148
  """Response metadata for actions."""
149
149
 
150
150
  description: str = Field(
@@ -161,7 +161,7 @@ class ActionResponseMetadata(WorkspaceScopedResponseMetadata):
161
161
  )
162
162
 
163
163
 
164
- class ActionResponseResources(WorkspaceScopedResponseResources):
164
+ class ActionResponseResources(ProjectScopedResponseResources):
165
165
  """Class for all resource models associated with the action entity."""
166
166
 
167
167
  service_account: UserResponse = Field(
@@ -170,7 +170,7 @@ class ActionResponseResources(WorkspaceScopedResponseResources):
170
170
 
171
171
 
172
172
  class ActionResponse(
173
- WorkspaceScopedResponse[
173
+ ProjectScopedResponse[
174
174
  ActionResponseBody, ActionResponseMetadata, ActionResponseResources
175
175
  ]
176
176
  ):
@@ -259,7 +259,7 @@ class ActionResponse(
259
259
  # ------------------ Filter Model ------------------
260
260
 
261
261
 
262
- class ActionFilter(WorkspaceScopedFilter):
262
+ class ActionFilter(ProjectScopedFilter):
263
263
  """Model to enable advanced filtering of all actions."""
264
264
 
265
265
  name: Optional[str] = Field(
@@ -97,7 +97,7 @@ class APIKeyRequest(BaseRequest):
97
97
  )
98
98
 
99
99
 
100
- class APIKeyRotateRequest(BaseModel):
100
+ class APIKeyRotateRequest(BaseRequest):
101
101
  """Request model for API key rotation."""
102
102
 
103
103
  retain_period_minutes: int = Field(
@@ -25,17 +25,19 @@ from typing import (
25
25
  )
26
26
  from uuid import UUID
27
27
 
28
- from pydantic import BaseModel, Field
28
+ from pydantic import Field
29
29
 
30
30
  from zenml.constants import SORT_BY_LATEST_VERSION_KEY, STR_FIELD_MAX_LENGTH
31
- from zenml.models.v2.base.base import (
32
- BaseDatedResponseBody,
33
- BaseIdentifiedResponse,
34
- BaseRequest,
35
- BaseResponseMetadata,
36
- BaseResponseResources,
31
+ from zenml.models.v2.base.base import BaseUpdate
32
+ from zenml.models.v2.base.scoped import (
33
+ ProjectScopedFilter,
34
+ ProjectScopedRequest,
35
+ ProjectScopedResponse,
36
+ ProjectScopedResponseBody,
37
+ ProjectScopedResponseMetadata,
38
+ ProjectScopedResponseResources,
39
+ TaggableFilter,
37
40
  )
38
- from zenml.models.v2.base.scoped import TaggableFilter
39
41
  from zenml.models.v2.core.tag import TagResponse
40
42
 
41
43
  if TYPE_CHECKING:
@@ -49,7 +51,7 @@ AnyQuery = TypeVar("AnyQuery", bound=Any)
49
51
  # ------------------ Request Model ------------------
50
52
 
51
53
 
52
- class ArtifactRequest(BaseRequest):
54
+ class ArtifactRequest(ProjectScopedRequest):
53
55
  """Artifact request model."""
54
56
 
55
57
  name: str = Field(
@@ -70,7 +72,7 @@ class ArtifactRequest(BaseRequest):
70
72
  # ------------------ Update Model ------------------
71
73
 
72
74
 
73
- class ArtifactUpdate(BaseModel):
75
+ class ArtifactUpdate(BaseUpdate):
74
76
  """Artifact update model."""
75
77
 
76
78
  name: Optional[str] = None
@@ -82,7 +84,7 @@ class ArtifactUpdate(BaseModel):
82
84
  # ------------------ Response Model ------------------
83
85
 
84
86
 
85
- class ArtifactResponseBody(BaseDatedResponseBody):
87
+ class ArtifactResponseBody(ProjectScopedResponseBody):
86
88
  """Response body for artifacts."""
87
89
 
88
90
  tags: List[TagResponse] = Field(
@@ -92,7 +94,7 @@ class ArtifactResponseBody(BaseDatedResponseBody):
92
94
  latest_version_id: Optional[UUID] = None
93
95
 
94
96
 
95
- class ArtifactResponseMetadata(BaseResponseMetadata):
97
+ class ArtifactResponseMetadata(ProjectScopedResponseMetadata):
96
98
  """Response metadata for artifacts."""
97
99
 
98
100
  has_custom_name: bool = Field(
@@ -101,12 +103,12 @@ class ArtifactResponseMetadata(BaseResponseMetadata):
101
103
  )
102
104
 
103
105
 
104
- class ArtifactResponseResources(BaseResponseResources):
106
+ class ArtifactResponseResources(ProjectScopedResponseResources):
105
107
  """Class for all resource models associated with the Artifact Entity."""
106
108
 
107
109
 
108
110
  class ArtifactResponse(
109
- BaseIdentifiedResponse[
111
+ ProjectScopedResponse[
110
112
  ArtifactResponseBody,
111
113
  ArtifactResponseMetadata,
112
114
  ArtifactResponseResources,
@@ -176,24 +178,35 @@ class ArtifactResponse(
176
178
  """
177
179
  from zenml.client import Client
178
180
 
179
- responses = Client().list_artifact_versions(name=self.name)
181
+ responses = Client().list_artifact_versions(artifact=self.name)
180
182
  return {str(response.version): response for response in responses}
181
183
 
182
184
 
183
185
  # ------------------ Filter Model ------------------
184
186
 
185
187
 
186
- class ArtifactFilter(TaggableFilter):
188
+ class ArtifactFilter(ProjectScopedFilter, TaggableFilter):
187
189
  """Model to enable advanced filtering of artifacts."""
188
190
 
189
- name: Optional[str] = None
190
- has_custom_name: Optional[bool] = None
191
+ FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
192
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
193
+ *TaggableFilter.FILTER_EXCLUDE_FIELDS,
194
+ ]
191
195
 
192
196
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
197
+ *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
193
198
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
194
199
  SORT_BY_LATEST_VERSION_KEY,
195
200
  ]
196
201
 
202
+ CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
203
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
204
+ *TaggableFilter.CLI_EXCLUDE_FIELDS,
205
+ ]
206
+
207
+ name: Optional[str] = None
208
+ has_custom_name: Optional[bool] = None
209
+
197
210
  def apply_sorting(
198
211
  self,
199
212
  query: AnyQuery,
@@ -27,7 +27,6 @@ from typing import (
27
27
  from uuid import UUID
28
28
 
29
29
  from pydantic import (
30
- BaseModel,
31
30
  ConfigDict,
32
31
  Field,
33
32
  field_validator,
@@ -36,18 +35,19 @@ from pydantic import (
36
35
 
37
36
  from zenml.config.source import Source, SourceWithValidator
38
37
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
39
- from zenml.enums import ArtifactSaveType, ArtifactType, GenericFilterOps
38
+ from zenml.enums import ArtifactSaveType, ArtifactType
40
39
  from zenml.logger import get_logger
41
40
  from zenml.metadata.metadata_types import MetadataType
42
- from zenml.models.v2.base.filter import FilterGenerator, StrFilter
41
+ from zenml.models.v2.base.base import BaseUpdate
42
+ from zenml.models.v2.base.filter import FilterGenerator
43
43
  from zenml.models.v2.base.scoped import (
44
+ ProjectScopedFilter,
45
+ ProjectScopedRequest,
46
+ ProjectScopedResponse,
47
+ ProjectScopedResponseBody,
48
+ ProjectScopedResponseMetadata,
49
+ ProjectScopedResponseResources,
44
50
  TaggableFilter,
45
- WorkspaceScopedFilter,
46
- WorkspaceScopedRequest,
47
- WorkspaceScopedResponse,
48
- WorkspaceScopedResponseBody,
49
- WorkspaceScopedResponseMetadata,
50
- WorkspaceScopedResponseResources,
51
51
  )
52
52
  from zenml.models.v2.core.artifact import ArtifactResponse
53
53
  from zenml.models.v2.core.tag import TagResponse
@@ -71,7 +71,7 @@ logger = get_logger(__name__)
71
71
  # ------------------ Request Model ------------------
72
72
 
73
73
 
74
- class ArtifactVersionRequest(WorkspaceScopedRequest):
74
+ class ArtifactVersionRequest(ProjectScopedRequest):
75
75
  """Request model for artifact versions."""
76
76
 
77
77
  artifact_id: Optional[UUID] = Field(
@@ -165,7 +165,7 @@ class ArtifactVersionRequest(WorkspaceScopedRequest):
165
165
  # ------------------ Update Model ------------------
166
166
 
167
167
 
168
- class ArtifactVersionUpdate(BaseModel):
168
+ class ArtifactVersionUpdate(BaseUpdate):
169
169
  """Artifact version update model."""
170
170
 
171
171
  name: Optional[str] = None
@@ -176,7 +176,7 @@ class ArtifactVersionUpdate(BaseModel):
176
176
  # ------------------ Response Model ------------------
177
177
 
178
178
 
179
- class ArtifactVersionResponseBody(WorkspaceScopedResponseBody):
179
+ class ArtifactVersionResponseBody(ProjectScopedResponseBody):
180
180
  """Response body for artifact versions."""
181
181
 
182
182
  artifact: ArtifactResponse = Field(
@@ -230,7 +230,7 @@ class ArtifactVersionResponseBody(WorkspaceScopedResponseBody):
230
230
  return value
231
231
 
232
232
 
233
- class ArtifactVersionResponseMetadata(WorkspaceScopedResponseMetadata):
233
+ class ArtifactVersionResponseMetadata(ProjectScopedResponseMetadata):
234
234
  """Response metadata for artifact versions."""
235
235
 
236
236
  producer_step_run_id: Optional[UUID] = Field(
@@ -245,12 +245,12 @@ class ArtifactVersionResponseMetadata(WorkspaceScopedResponseMetadata):
245
245
  )
246
246
 
247
247
 
248
- class ArtifactVersionResponseResources(WorkspaceScopedResponseResources):
248
+ class ArtifactVersionResponseResources(ProjectScopedResponseResources):
249
249
  """Class for all resource models associated with the artifact version entity."""
250
250
 
251
251
 
252
252
  class ArtifactVersionResponse(
253
- WorkspaceScopedResponse[
253
+ ProjectScopedResponse[
254
254
  ArtifactVersionResponseBody,
255
255
  ArtifactVersionResponseMetadata,
256
256
  ArtifactVersionResponseResources,
@@ -470,13 +470,14 @@ class ArtifactVersionResponse(
470
470
  # ------------------ Filter Model ------------------
471
471
 
472
472
 
473
- class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
473
+ class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
474
474
  """Model to enable advanced filtering of artifact versions."""
475
475
 
476
476
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
477
- *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
477
+ *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
478
478
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
479
- "name",
479
+ "artifact_id",
480
+ "artifact",
480
481
  "only_unused",
481
482
  "has_custom_name",
482
483
  "model",
@@ -484,23 +485,28 @@ class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
484
485
  "model_version_id",
485
486
  "run_metadata",
486
487
  ]
487
- CUSTOM_SORTING_OPTIONS = [
488
- *WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
488
+ CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
489
+ *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
489
490
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
490
491
  ]
491
- CLI_EXCLUDE_FIELDS = [
492
- *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
492
+ CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
493
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
493
494
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
495
+ "artifact_id",
494
496
  ]
495
497
 
496
- artifact_id: Optional[Union[UUID, str]] = Field(
498
+ artifact: Optional[Union[UUID, str]] = Field(
497
499
  default=None,
498
- description="ID of the artifact to which this version belongs.",
500
+ description="The name or ID of the artifact which the search is scoped "
501
+ "to. This field must always be set and is always applied in addition "
502
+ "to the other filters, regardless of the value of the "
503
+ "logical_operator field.",
499
504
  union_mode="left_to_right",
500
505
  )
501
- name: Optional[str] = Field(
506
+ artifact_id: Optional[Union[UUID, str]] = Field(
502
507
  default=None,
503
- description="Name of the artifact to which this version belongs.",
508
+ description="[Deprecated] Use 'artifact' instead. ID of the artifact to which this version belongs.",
509
+ union_mode="left_to_right",
504
510
  )
505
511
  version: Optional[str] = Field(
506
512
  default=None,
@@ -545,10 +551,6 @@ class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
545
551
  default=None,
546
552
  description="Filter only artifacts with/without custom names.",
547
553
  )
548
- user: Optional[Union[UUID, str]] = Field(
549
- default=None,
550
- description="Name/ID of the user that created the artifact version.",
551
- )
552
554
  model: Optional[Union[UUID, str]] = Field(
553
555
  default=None,
554
556
  description="Name/ID of the model that is associated with this "
@@ -595,18 +597,15 @@ class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
595
597
  StepRunSchema,
596
598
  )
597
599
 
598
- if self.name:
599
- value, filter_operator = self._resolve_operator(self.name)
600
- filter_ = StrFilter(
601
- operation=GenericFilterOps(filter_operator),
602
- column="name",
603
- value=value,
604
- )
605
- artifact_name_filter = and_(
600
+ if self.artifact:
601
+ value, operator = self._resolve_operator(self.artifact)
602
+ artifact_filter = and_(
606
603
  ArtifactVersionSchema.artifact_id == ArtifactSchema.id,
607
- filter_.generate_query_conditions(ArtifactSchema),
604
+ self.generate_name_or_id_query_conditions(
605
+ value=self.artifact, table=ArtifactSchema
606
+ ),
608
607
  )
609
- custom_filters.append(artifact_name_filter)
608
+ custom_filters.append(artifact_filter)
610
609
 
611
610
  if self.only_unused:
612
611
  unused_filter = and_(
@@ -702,6 +701,24 @@ class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
702
701
 
703
702
  return custom_filters
704
703
 
704
+ @model_validator(mode="after")
705
+ def _migrate_artifact_id(self) -> "ArtifactVersionFilter":
706
+ """Migrate value from the deprecated artifact_id attribute.
707
+
708
+ Returns:
709
+ The filter with migrated value.
710
+ """
711
+ # Handle deprecated artifact_id field
712
+ if self.artifact_id is not None:
713
+ logger.warning(
714
+ "The 'ArtifactVersionFilter.artifact_id' field is deprecated "
715
+ "and will be removed in a future version. Please use "
716
+ "'ArtifactVersionFilter.artifact' instead."
717
+ )
718
+ self.artifact = self.artifact or self.artifact_id
719
+
720
+ return self
721
+
705
722
 
706
723
  # -------------------- Lazy Loader --------------------
707
724
 
@@ -21,18 +21,18 @@ from zenml.config.source import Source, SourceWithValidator
21
21
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
22
22
  from zenml.models.v2.base.base import BaseUpdate
23
23
  from zenml.models.v2.base.scoped import (
24
- WorkspaceScopedFilter,
25
- WorkspaceScopedRequest,
26
- WorkspaceScopedResponse,
27
- WorkspaceScopedResponseBody,
28
- WorkspaceScopedResponseMetadata,
29
- WorkspaceScopedResponseResources,
24
+ ProjectScopedFilter,
25
+ ProjectScopedRequest,
26
+ ProjectScopedResponse,
27
+ ProjectScopedResponseBody,
28
+ ProjectScopedResponseMetadata,
29
+ ProjectScopedResponseResources,
30
30
  )
31
31
 
32
32
  # ------------------ Request Model ------------------
33
33
 
34
34
 
35
- class CodeRepositoryRequest(WorkspaceScopedRequest):
35
+ class CodeRepositoryRequest(ProjectScopedRequest):
36
36
  """Request model for code repositories."""
37
37
 
38
38
  name: str = Field(
@@ -88,7 +88,7 @@ class CodeRepositoryUpdate(BaseUpdate):
88
88
  # ------------------ Response Model ------------------
89
89
 
90
90
 
91
- class CodeRepositoryResponseBody(WorkspaceScopedResponseBody):
91
+ class CodeRepositoryResponseBody(ProjectScopedResponseBody):
92
92
  """Response body for code repositories."""
93
93
 
94
94
  source: Source = Field(description="The code repository source.")
@@ -99,7 +99,7 @@ class CodeRepositoryResponseBody(WorkspaceScopedResponseBody):
99
99
  )
100
100
 
101
101
 
102
- class CodeRepositoryResponseMetadata(WorkspaceScopedResponseMetadata):
102
+ class CodeRepositoryResponseMetadata(ProjectScopedResponseMetadata):
103
103
  """Response metadata for code repositories."""
104
104
 
105
105
  config: Dict[str, Any] = Field(
@@ -112,12 +112,12 @@ class CodeRepositoryResponseMetadata(WorkspaceScopedResponseMetadata):
112
112
  )
113
113
 
114
114
 
115
- class CodeRepositoryResponseResources(WorkspaceScopedResponseResources):
115
+ class CodeRepositoryResponseResources(ProjectScopedResponseResources):
116
116
  """Class for all resource models associated with the code repository entity."""
117
117
 
118
118
 
119
119
  class CodeRepositoryResponse(
120
- WorkspaceScopedResponse[
120
+ ProjectScopedResponse[
121
121
  CodeRepositoryResponseBody,
122
122
  CodeRepositoryResponseMetadata,
123
123
  CodeRepositoryResponseResources,
@@ -181,7 +181,7 @@ class CodeRepositoryResponse(
181
181
  # ------------------ Filter Model ------------------
182
182
 
183
183
 
184
- class CodeRepositoryFilter(WorkspaceScopedFilter):
184
+ class CodeRepositoryFilter(ProjectScopedFilter):
185
185
  """Model to enable advanced filtering of all code repositories."""
186
186
 
187
187
  name: Optional[str] = Field(
@@ -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(