zenml-nightly 0.70.0.dev20241201__py3-none-any.whl → 0.71.0.dev20241223__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 (193) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/artifact_config.py +8 -5
  5. zenml/artifacts/utils.py +3 -1
  6. zenml/cli/__init__.py +4 -4
  7. zenml/cli/base.py +1 -1
  8. zenml/cli/pipeline.py +48 -79
  9. zenml/cli/server.py +19 -19
  10. zenml/client.py +54 -2
  11. zenml/config/secret_reference_mixin.py +1 -1
  12. zenml/config/server_config.py +4 -0
  13. zenml/constants.py +10 -0
  14. zenml/image_builders/base_image_builder.py +5 -2
  15. zenml/image_builders/build_context.py +7 -16
  16. zenml/integrations/aws/__init__.py +3 -0
  17. zenml/integrations/aws/flavors/__init__.py +6 -0
  18. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  19. zenml/integrations/aws/image_builders/__init__.py +20 -0
  20. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  21. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  22. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
  23. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
  24. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -1
  25. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
  26. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  27. zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
  28. zenml/integrations/registry.py +2 -2
  29. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
  30. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  31. zenml/materializers/built_in_materializer.py +1 -1
  32. zenml/model/model.py +12 -16
  33. zenml/model/utils.py +3 -1
  34. zenml/models/v2/base/filter.py +26 -30
  35. zenml/models/v2/base/scoped.py +258 -5
  36. zenml/models/v2/core/artifact_version.py +15 -26
  37. zenml/models/v2/core/code_repository.py +1 -12
  38. zenml/models/v2/core/component.py +5 -46
  39. zenml/models/v2/core/flavor.py +1 -11
  40. zenml/models/v2/core/model.py +1 -57
  41. zenml/models/v2/core/model_version.py +5 -33
  42. zenml/models/v2/core/model_version_artifact.py +11 -3
  43. zenml/models/v2/core/model_version_pipeline_run.py +14 -3
  44. zenml/models/v2/core/pipeline.py +47 -55
  45. zenml/models/v2/core/pipeline_build.py +67 -12
  46. zenml/models/v2/core/pipeline_deployment.py +0 -10
  47. zenml/models/v2/core/pipeline_run.py +91 -29
  48. zenml/models/v2/core/run_template.py +21 -29
  49. zenml/models/v2/core/schedule.py +0 -10
  50. zenml/models/v2/core/secret.py +0 -14
  51. zenml/models/v2/core/service.py +9 -16
  52. zenml/models/v2/core/service_connector.py +0 -11
  53. zenml/models/v2/core/stack.py +21 -30
  54. zenml/models/v2/core/step_run.py +18 -14
  55. zenml/models/v2/core/trigger.py +19 -3
  56. zenml/orchestrators/base_orchestrator.py +13 -1
  57. zenml/orchestrators/output_utils.py +5 -1
  58. zenml/orchestrators/step_launcher.py +9 -13
  59. zenml/orchestrators/step_run_utils.py +8 -204
  60. zenml/orchestrators/utils.py +55 -27
  61. zenml/pipelines/build_utils.py +12 -0
  62. zenml/service_connectors/service_connector_utils.py +3 -9
  63. zenml/stack/stack_component.py +1 -1
  64. zenml/stack_deployments/aws_stack_deployment.py +22 -0
  65. zenml/utils/archivable.py +65 -36
  66. zenml/utils/code_utils.py +8 -4
  67. zenml/utils/docker_utils.py +9 -0
  68. zenml/zen_server/auth.py +9 -10
  69. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  78. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  79. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  91. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  92. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  96. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  97. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  103. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  104. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  105. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  106. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  107. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  110. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  111. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  112. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  113. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  114. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  115. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  117. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  118. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  119. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  120. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  124. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  127. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  128. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  130. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  137. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  138. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  139. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  144. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  145. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  147. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  149. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  151. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  152. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  156. zenml/zen_server/dashboard/index.html +4 -4
  157. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  158. zenml/zen_server/deploy/helm/README.md +2 -2
  159. zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
  160. zenml/zen_server/routers/auth_endpoints.py +22 -11
  161. zenml/zen_server/routers/steps_endpoints.py +7 -1
  162. zenml/zen_server/template_execution/utils.py +3 -1
  163. zenml/zen_server/utils.py +4 -3
  164. zenml/zen_stores/base_zen_store.py +10 -2
  165. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  166. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  167. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  168. zenml/zen_stores/rest_zen_store.py +76 -43
  169. zenml/zen_stores/schemas/model_schemas.py +42 -6
  170. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  171. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
  172. zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
  173. zenml/zen_stores/schemas/step_run_schemas.py +8 -1
  174. zenml/zen_stores/sql_zen_store.py +332 -100
  175. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241223.dist-info}/METADATA +5 -5
  176. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241223.dist-info}/RECORD +179 -164
  177. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  178. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  179. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  180. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  181. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  182. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  183. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  184. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  185. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  186. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  187. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  188. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  189. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  190. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  191. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241223.dist-info}/LICENSE +0 -0
  192. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241223.dist-info}/WHEEL +0 -0
  193. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241223.dist-info}/entry_points.txt +0 -0
@@ -13,7 +13,17 @@
13
13
  # permissions and limitations under the License.
14
14
  """Models representing pipeline templates."""
15
15
 
16
- from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Union
16
+ from typing import (
17
+ TYPE_CHECKING,
18
+ Any,
19
+ ClassVar,
20
+ Dict,
21
+ List,
22
+ Optional,
23
+ Type,
24
+ TypeVar,
25
+ Union,
26
+ )
17
27
  from uuid import UUID
18
28
 
19
29
  from pydantic import Field
@@ -45,6 +55,11 @@ from zenml.models.v2.core.tag import TagResponse
45
55
  if TYPE_CHECKING:
46
56
  from sqlalchemy.sql.elements import ColumnElement
47
57
 
58
+ from zenml.zen_stores.schemas.base_schemas import BaseSchema
59
+
60
+ AnySchema = TypeVar("AnySchema", bound=BaseSchema)
61
+
62
+
48
63
  # ------------------ Request Model ------------------
49
64
 
50
65
 
@@ -310,16 +325,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
310
325
  default=None,
311
326
  description="Name of the run template.",
312
327
  )
313
- workspace_id: Optional[Union[UUID, str]] = Field(
314
- default=None,
315
- description="Workspace associated with the template.",
316
- union_mode="left_to_right",
317
- )
318
- user_id: Optional[Union[UUID, str]] = Field(
319
- default=None,
320
- description="User that created the template.",
321
- union_mode="left_to_right",
322
- )
323
328
  pipeline_id: Optional[Union[UUID, str]] = Field(
324
329
  default=None,
325
330
  description="Pipeline associated with the template.",
@@ -340,10 +345,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
340
345
  description="Code repository associated with the template.",
341
346
  union_mode="left_to_right",
342
347
  )
343
- user: Optional[Union[UUID, str]] = Field(
344
- default=None,
345
- description="Name/ID of the user that created the template.",
346
- )
347
348
  pipeline: Optional[Union[UUID, str]] = Field(
348
349
  default=None,
349
350
  description="Name/ID of the pipeline associated with the template.",
@@ -354,14 +355,17 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
354
355
  )
355
356
 
356
357
  def get_custom_filters(
357
- self,
358
+ self, table: Type["AnySchema"]
358
359
  ) -> List["ColumnElement[bool]"]:
359
360
  """Get custom filters.
360
361
 
362
+ Args:
363
+ table: The query table.
364
+
361
365
  Returns:
362
366
  A list of custom filters.
363
367
  """
364
- custom_filters = super().get_custom_filters()
368
+ custom_filters = super().get_custom_filters(table)
365
369
 
366
370
  from sqlmodel import and_
367
371
 
@@ -371,7 +375,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
371
375
  PipelineSchema,
372
376
  RunTemplateSchema,
373
377
  StackSchema,
374
- UserSchema,
375
378
  )
376
379
 
377
380
  if self.code_repository_id:
@@ -409,17 +412,6 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
409
412
  )
410
413
  custom_filters.append(pipeline_filter)
411
414
 
412
- if self.user:
413
- user_filter = and_(
414
- RunTemplateSchema.user_id == UserSchema.id,
415
- self.generate_name_or_id_query_conditions(
416
- value=self.user,
417
- table=UserSchema,
418
- additional_columns=["full_name"],
419
- ),
420
- )
421
- custom_filters.append(user_filter)
422
-
423
415
  if self.pipeline:
424
416
  pipeline_filter = and_(
425
417
  RunTemplateSchema.source_deployment_id
@@ -279,16 +279,6 @@ class ScheduleResponse(
279
279
  class ScheduleFilter(WorkspaceScopedFilter):
280
280
  """Model to enable advanced filtering of all Users."""
281
281
 
282
- workspace_id: Optional[Union[UUID, str]] = Field(
283
- default=None,
284
- description="Workspace scope of the schedule.",
285
- union_mode="left_to_right",
286
- )
287
- user_id: Optional[Union[UUID, str]] = Field(
288
- default=None,
289
- description="User that created the schedule",
290
- union_mode="left_to_right",
291
- )
292
282
  pipeline_id: Optional[Union[UUID, str]] = Field(
293
283
  default=None,
294
284
  description="Pipeline that the schedule is attached to.",
@@ -15,7 +15,6 @@
15
15
 
16
16
  from datetime import datetime
17
17
  from typing import Any, ClassVar, Dict, List, Optional, Union
18
- from uuid import UUID
19
18
 
20
19
  from pydantic import Field, SecretStr
21
20
 
@@ -253,25 +252,12 @@ class SecretFilter(WorkspaceScopedFilter):
253
252
  default=None,
254
253
  description="Name of the secret",
255
254
  )
256
-
257
255
  scope: Optional[Union[SecretScope, str]] = Field(
258
256
  default=None,
259
257
  description="Scope in which to filter secrets",
260
258
  union_mode="left_to_right",
261
259
  )
262
260
 
263
- workspace_id: Optional[Union[UUID, str]] = Field(
264
- default=None,
265
- description="Workspace of the Secret",
266
- union_mode="left_to_right",
267
- )
268
-
269
- user_id: Optional[Union[UUID, str]] = Field(
270
- default=None,
271
- description="User that created the Secret",
272
- union_mode="left_to_right",
273
- )
274
-
275
261
  @staticmethod
276
262
  def _get_filtering_value(value: Optional[Any]) -> str:
277
263
  """Convert the value to a string that can be used for lexicographical filtering and sorting.
@@ -15,19 +15,20 @@
15
15
 
16
16
  from datetime import datetime
17
17
  from typing import (
18
+ TYPE_CHECKING,
18
19
  Any,
19
20
  ClassVar,
20
21
  Dict,
21
22
  List,
22
23
  Optional,
23
24
  Type,
25
+ TypeVar,
24
26
  Union,
25
27
  )
26
28
  from uuid import UUID
27
29
 
28
30
  from pydantic import BaseModel, ConfigDict, Field
29
31
  from sqlalchemy.sql.elements import ColumnElement
30
- from sqlmodel import SQLModel
31
32
 
32
33
  from zenml.constants import STR_FIELD_MAX_LENGTH
33
34
  from zenml.models.v2.base.scoped import (
@@ -37,11 +38,15 @@ from zenml.models.v2.base.scoped import (
37
38
  WorkspaceScopedResponseBody,
38
39
  WorkspaceScopedResponseMetadata,
39
40
  WorkspaceScopedResponseResources,
40
- WorkspaceScopedTaggableFilter,
41
41
  )
42
42
  from zenml.services.service_status import ServiceState
43
43
  from zenml.services.service_type import ServiceType
44
44
 
45
+ if TYPE_CHECKING:
46
+ from zenml.zen_stores.schemas import BaseSchema
47
+
48
+ AnySchema = TypeVar("AnySchema", bound=BaseSchema)
49
+
45
50
  # ------------------ Request Model ------------------
46
51
 
47
52
 
@@ -376,16 +381,6 @@ class ServiceFilter(WorkspaceScopedFilter):
376
381
  description="Name of the service. Use this to filter services by "
377
382
  "their name.",
378
383
  )
379
- workspace_id: Optional[Union[UUID, str]] = Field(
380
- default=None,
381
- description="Workspace of the service",
382
- union_mode="left_to_right",
383
- )
384
- user_id: Optional[Union[UUID, str]] = Field(
385
- default=None,
386
- description="User of the service",
387
- union_mode="left_to_right",
388
- )
389
384
  type: Optional[str] = Field(
390
385
  default=None,
391
386
  description="Type of the service. Filter services by their type.",
@@ -457,9 +452,7 @@ class ServiceFilter(WorkspaceScopedFilter):
457
452
  "config",
458
453
  ]
459
454
  CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
460
- *WorkspaceScopedTaggableFilter.CLI_EXCLUDE_FIELDS,
461
- "workspace_id",
462
- "user_id",
455
+ *WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
463
456
  "flavor",
464
457
  "type",
465
458
  "pipeline_step_name",
@@ -468,7 +461,7 @@ class ServiceFilter(WorkspaceScopedFilter):
468
461
  ]
469
462
 
470
463
  def generate_filter(
471
- self, table: Type["SQLModel"]
464
+ self, table: Type["AnySchema"]
472
465
  ) -> Union["ColumnElement[bool]"]:
473
466
  """Generate the filter for the query.
474
467
 
@@ -801,7 +801,6 @@ class ServiceConnectorFilter(WorkspaceScopedFilter):
801
801
  default=None,
802
802
  description="The type to scope this query to.",
803
803
  )
804
-
805
804
  name: Optional[str] = Field(
806
805
  default=None,
807
806
  description="The name to filter by",
@@ -810,16 +809,6 @@ class ServiceConnectorFilter(WorkspaceScopedFilter):
810
809
  default=None,
811
810
  description="The type of service connector to filter by",
812
811
  )
813
- workspace_id: Optional[Union[UUID, str]] = Field(
814
- default=None,
815
- description="Workspace to filter by",
816
- union_mode="left_to_right",
817
- )
818
- user_id: Optional[Union[UUID, str]] = Field(
819
- default=None,
820
- description="User to filter by",
821
- union_mode="left_to_right",
822
- )
823
812
  auth_method: Optional[str] = Field(
824
813
  default=None,
825
814
  title="Filter by the authentication method configured for the "
@@ -14,7 +14,17 @@
14
14
  """Models representing stacks."""
15
15
 
16
16
  import json
17
- from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Union
17
+ from typing import (
18
+ TYPE_CHECKING,
19
+ Any,
20
+ ClassVar,
21
+ Dict,
22
+ List,
23
+ Optional,
24
+ Type,
25
+ TypeVar,
26
+ Union,
27
+ )
18
28
  from uuid import UUID
19
29
 
20
30
  from pydantic import Field, model_validator
@@ -39,6 +49,9 @@ if TYPE_CHECKING:
39
49
  from sqlalchemy.sql.elements import ColumnElement
40
50
 
41
51
  from zenml.models.v2.core.component import ComponentResponse
52
+ from zenml.zen_stores.schemas import BaseSchema
53
+
54
+ AnySchema = TypeVar("AnySchema", bound=BaseSchema)
42
55
 
43
56
 
44
57
  # ------------------ Request Model ------------------
@@ -323,7 +336,6 @@ class StackFilter(WorkspaceScopedFilter):
323
336
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
324
337
  *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
325
338
  "component_id",
326
- "user",
327
339
  "component",
328
340
  ]
329
341
 
@@ -334,42 +346,32 @@ class StackFilter(WorkspaceScopedFilter):
334
346
  description: Optional[str] = Field(
335
347
  default=None, description="Description of the stack"
336
348
  )
337
- workspace_id: Optional[Union[UUID, str]] = Field(
338
- default=None,
339
- description="Workspace of the stack",
340
- union_mode="left_to_right",
341
- )
342
- user_id: Optional[Union[UUID, str]] = Field(
343
- default=None,
344
- description="User of the stack",
345
- union_mode="left_to_right",
346
- )
347
349
  component_id: Optional[Union[UUID, str]] = Field(
348
350
  default=None,
349
351
  description="Component in the stack",
350
352
  union_mode="left_to_right",
351
353
  )
352
- user: Optional[Union[UUID, str]] = Field(
353
- default=None,
354
- description="Name/ID of the user that created the stack.",
355
- )
356
354
  component: Optional[Union[UUID, str]] = Field(
357
355
  default=None, description="Name/ID of a component in the stack."
358
356
  )
359
357
 
360
- def get_custom_filters(self) -> List["ColumnElement[bool]"]:
358
+ def get_custom_filters(
359
+ self, table: Type["AnySchema"]
360
+ ) -> List["ColumnElement[bool]"]:
361
361
  """Get custom filters.
362
362
 
363
+ Args:
364
+ table: The query table.
365
+
363
366
  Returns:
364
367
  A list of custom filters.
365
368
  """
366
- custom_filters = super().get_custom_filters()
369
+ custom_filters = super().get_custom_filters(table)
367
370
 
368
371
  from zenml.zen_stores.schemas import (
369
372
  StackComponentSchema,
370
373
  StackCompositionSchema,
371
374
  StackSchema,
372
- UserSchema,
373
375
  )
374
376
 
375
377
  if self.component_id:
@@ -379,17 +381,6 @@ class StackFilter(WorkspaceScopedFilter):
379
381
  )
380
382
  custom_filters.append(component_id_filter)
381
383
 
382
- if self.user:
383
- user_filter = and_(
384
- StackSchema.user_id == UserSchema.id,
385
- self.generate_name_or_id_query_conditions(
386
- value=self.user,
387
- table=UserSchema,
388
- additional_columns=["full_name"],
389
- ),
390
- )
391
- custom_filters.append(user_filter)
392
-
393
384
  if self.component:
394
385
  component_filter = and_(
395
386
  StackCompositionSchema.stack_id == StackSchema.id,
@@ -14,7 +14,16 @@
14
14
  """Models representing steps runs."""
15
15
 
16
16
  from datetime import datetime
17
- from typing import TYPE_CHECKING, ClassVar, Dict, List, Optional, Union
17
+ from typing import (
18
+ TYPE_CHECKING,
19
+ ClassVar,
20
+ Dict,
21
+ List,
22
+ Optional,
23
+ Type,
24
+ TypeVar,
25
+ Union,
26
+ )
18
27
  from uuid import UUID
19
28
 
20
29
  from pydantic import BaseModel, ConfigDict, Field
@@ -41,6 +50,9 @@ if TYPE_CHECKING:
41
50
  LogsRequest,
42
51
  LogsResponse,
43
52
  )
53
+ from zenml.zen_stores.schemas import BaseSchema
54
+
55
+ AnySchema = TypeVar("AnySchema", bound=BaseSchema)
44
56
 
45
57
 
46
58
  class StepRunInputResponse(ArtifactVersionResponse):
@@ -553,16 +565,6 @@ class StepRunFilter(WorkspaceScopedFilter):
553
565
  description="Original id for this step run",
554
566
  union_mode="left_to_right",
555
567
  )
556
- user_id: Optional[Union[UUID, str]] = Field(
557
- default=None,
558
- description="User that produced this step run",
559
- union_mode="left_to_right",
560
- )
561
- workspace_id: Optional[Union[UUID, str]] = Field(
562
- default=None,
563
- description="Workspace of this step run",
564
- union_mode="left_to_right",
565
- )
566
568
  model_version_id: Optional[Union[UUID, str]] = Field(
567
569
  default=None,
568
570
  description="Model version associated with the step run.",
@@ -576,18 +578,20 @@ class StepRunFilter(WorkspaceScopedFilter):
576
578
  default=None,
577
579
  description="The run_metadata to filter the step runs by.",
578
580
  )
579
-
580
581
  model_config = ConfigDict(protected_namespaces=())
581
582
 
582
583
  def get_custom_filters(
583
- self,
584
+ self, table: Type["AnySchema"]
584
585
  ) -> List["ColumnElement[bool]"]:
585
586
  """Get custom filters.
586
587
 
588
+ Args:
589
+ table: The query table.
590
+
587
591
  Returns:
588
592
  A list of custom filters.
589
593
  """
590
- custom_filters = super().get_custom_filters()
594
+ custom_filters = super().get_custom_filters(table)
591
595
 
592
596
  from sqlmodel import and_
593
597
 
@@ -13,7 +13,17 @@
13
13
  # permissions and limitations under the License.
14
14
  """Collection of all models concerning triggers."""
15
15
 
16
- from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Union
16
+ from typing import (
17
+ TYPE_CHECKING,
18
+ Any,
19
+ ClassVar,
20
+ Dict,
21
+ List,
22
+ Optional,
23
+ Type,
24
+ TypeVar,
25
+ Union,
26
+ )
17
27
  from uuid import UUID
18
28
 
19
29
  from pydantic import Field, model_validator
@@ -39,6 +49,9 @@ if TYPE_CHECKING:
39
49
  ActionResponse,
40
50
  )
41
51
  from zenml.models.v2.core.event_source import EventSourceResponse
52
+ from zenml.zen_stores.schemas import BaseSchema
53
+
54
+ AnySchema = TypeVar("AnySchema", bound=BaseSchema)
42
55
 
43
56
 
44
57
  # ------------------ Request Model ------------------
@@ -358,10 +371,13 @@ class TriggerFilter(WorkspaceScopedFilter):
358
371
  )
359
372
 
360
373
  def get_custom_filters(
361
- self,
374
+ self, table: Type["AnySchema"]
362
375
  ) -> List["ColumnElement[bool]"]:
363
376
  """Get custom filters.
364
377
 
378
+ Args:
379
+ table: The query table.
380
+
365
381
  Returns:
366
382
  A list of custom filters.
367
383
  """
@@ -373,7 +389,7 @@ class TriggerFilter(WorkspaceScopedFilter):
373
389
  TriggerSchema,
374
390
  )
375
391
 
376
- custom_filters = super().get_custom_filters()
392
+ custom_filters = super().get_custom_filters(table)
377
393
 
378
394
  if self.event_source_flavor:
379
395
  event_source_flavor_filter = and_(
@@ -61,7 +61,7 @@ class BaseOrchestratorConfig(StackComponentConfig):
61
61
  "The 'custom_docker_base_image_name' field has been "
62
62
  "deprecated. To use a custom base container image with your "
63
63
  "orchestrators, please use the DockerSettings in your "
64
- "pipeline (see https://docs.zenml.io/how-to/customize-docker-builds)."
64
+ "pipeline (see https://docs.zenml.io/how-to/infrastructure-deployment/customize-docker-builds)."
65
65
  )
66
66
 
67
67
  return data
@@ -84,6 +84,15 @@ class BaseOrchestratorConfig(StackComponentConfig):
84
84
  """
85
85
  return False
86
86
 
87
+ @property
88
+ def supports_client_side_caching(self) -> bool:
89
+ """Whether the orchestrator supports client side caching.
90
+
91
+ Returns:
92
+ Whether the orchestrator supports client side caching.
93
+ """
94
+ return True
95
+
87
96
 
88
97
  class BaseOrchestrator(StackComponent, ABC):
89
98
  """Base class for all orchestrators.
@@ -205,6 +214,7 @@ class BaseOrchestrator(StackComponent, ABC):
205
214
 
206
215
  if (
207
216
  placeholder_run
217
+ and self.config.supports_client_side_caching
208
218
  and not deployment.schedule
209
219
  and not prevent_client_side_caching
210
220
  ):
@@ -232,6 +242,8 @@ class BaseOrchestrator(StackComponent, ABC):
232
242
  self._cleanup_run()
233
243
  logger.info("All steps of the pipeline run were cached.")
234
244
  return
245
+ else:
246
+ logger.debug("Skipping client-side caching.")
235
247
 
236
248
  try:
237
249
  if metadata_iterator := self.prepare_or_run_pipeline(
@@ -19,6 +19,7 @@ from uuid import uuid4
19
19
 
20
20
  from zenml.client import Client
21
21
  from zenml.logger import get_logger
22
+ from zenml.utils import string_utils
22
23
 
23
24
  if TYPE_CHECKING:
24
25
  from zenml.artifact_stores import BaseArtifactStore
@@ -75,10 +76,13 @@ def prepare_output_artifact_uris(
75
76
  artifact_store = stack.artifact_store
76
77
  output_artifact_uris: Dict[str, str] = {}
77
78
  for output_name in step.config.outputs.keys():
79
+ substituted_output_name = string_utils.format_name_template(
80
+ output_name, substitutions=step_run.config.substitutions
81
+ )
78
82
  artifact_uri = generate_artifact_uri(
79
83
  artifact_store=stack.artifact_store,
80
84
  step_run=step_run,
81
- output_name=output_name,
85
+ output_name=substituted_output_name,
82
86
  )
83
87
  if artifact_store.exists(artifact_uri):
84
88
  raise RuntimeError("Artifact already exists")
@@ -179,12 +179,10 @@ class StepLauncher:
179
179
  pipeline_run_id=pipeline_run.id,
180
180
  pipeline_run_metadata=pipeline_run_metadata,
181
181
  )
182
-
183
- pipeline_model_version, pipeline_run = (
184
- step_run_utils.prepare_pipeline_run_model_version(
185
- pipeline_run
186
- )
187
- )
182
+ if model_version := pipeline_run.model_version:
183
+ step_run_utils.log_model_version_dashboard_url(
184
+ model_version=model_version
185
+ )
188
186
 
189
187
  request_factory = step_run_utils.StepRunRequestFactory(
190
188
  deployment=self._deployment,
@@ -209,12 +207,10 @@ class StepLauncher:
209
207
  step_run = Client().zen_store.create_run_step(
210
208
  step_run_request
211
209
  )
212
-
213
- step_model_version, step_run = (
214
- step_run_utils.prepare_step_run_model_version(
215
- step_run=step_run, pipeline_run=pipeline_run
210
+ if model_version := step_run.model_version:
211
+ step_run_utils.log_model_version_dashboard_url(
212
+ model_version=model_version
216
213
  )
217
- )
218
214
 
219
215
  if not step_run.status.is_finished:
220
216
  logger.info(f"Step `{self._step_name}` has started.")
@@ -289,8 +285,8 @@ class StepLauncher:
289
285
  f"Using cached version of step `{self._step_name}`."
290
286
  )
291
287
  if (
292
- model_version := step_model_version
293
- or pipeline_model_version
288
+ model_version := step_run.model_version
289
+ or pipeline_run.model_version
294
290
  ):
295
291
  step_run_utils.link_output_artifacts_to_model_version(
296
292
  artifacts=step_run.outputs,