zenml-nightly 0.58.2.dev20240623__py3-none-any.whl → 0.61.0.dev20240712__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 (249) hide show
  1. README.md +30 -9
  2. RELEASE_NOTES.md +240 -0
  3. zenml/VERSION +1 -1
  4. zenml/actions/base_action.py +177 -174
  5. zenml/actions/pipeline_run/pipeline_run_action.py +28 -23
  6. zenml/analytics/enums.py +3 -0
  7. zenml/artifact_stores/base_artifact_store.py +7 -1
  8. zenml/artifacts/utils.py +13 -10
  9. zenml/cli/__init__.py +28 -0
  10. zenml/cli/artifact.py +1 -2
  11. zenml/cli/integration.py +9 -8
  12. zenml/cli/server.py +6 -0
  13. zenml/cli/service_connectors.py +1 -0
  14. zenml/cli/stack.py +946 -39
  15. zenml/cli/stack_components.py +7 -0
  16. zenml/cli/text_utils.py +35 -1
  17. zenml/cli/utils.py +127 -10
  18. zenml/client.py +257 -72
  19. zenml/config/compiler.py +10 -9
  20. zenml/config/docker_settings.py +33 -14
  21. zenml/constants.py +11 -2
  22. zenml/container_registries/base_container_registry.py +1 -0
  23. zenml/enums.py +7 -0
  24. zenml/event_hub/base_event_hub.py +5 -5
  25. zenml/event_hub/event_hub.py +20 -14
  26. zenml/event_sources/base_event.py +0 -11
  27. zenml/event_sources/base_event_source.py +7 -0
  28. zenml/event_sources/webhooks/base_webhook_event_source.py +1 -4
  29. zenml/exceptions.py +4 -0
  30. zenml/hooks/hook_validators.py +2 -3
  31. zenml/integrations/aws/__init__.py +1 -0
  32. zenml/integrations/azure/__init__.py +1 -0
  33. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +3 -3
  34. zenml/integrations/deepchecks/__init__.py +1 -0
  35. zenml/integrations/discord/__init__.py +1 -0
  36. zenml/integrations/evidently/__init__.py +1 -0
  37. zenml/integrations/facets/__init__.py +1 -0
  38. zenml/integrations/feast/__init__.py +1 -0
  39. zenml/integrations/gcp/__init__.py +3 -1
  40. zenml/integrations/gcp/google_credentials_mixin.py +1 -1
  41. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +320 -64
  42. zenml/integrations/huggingface/__init__.py +1 -0
  43. zenml/integrations/integration.py +24 -0
  44. zenml/integrations/kubeflow/__init__.py +3 -0
  45. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +1 -1
  46. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +0 -1
  47. zenml/integrations/kubernetes/__init__.py +3 -1
  48. zenml/integrations/kubernetes/orchestrators/kube_utils.py +4 -1
  49. zenml/integrations/label_studio/annotators/label_studio_annotator.py +1 -0
  50. zenml/integrations/langchain/__init__.py +1 -0
  51. zenml/integrations/mlflow/__init__.py +4 -2
  52. zenml/integrations/neural_prophet/__init__.py +1 -0
  53. zenml/integrations/polars/__init__.py +1 -0
  54. zenml/integrations/prodigy/__init__.py +1 -0
  55. zenml/integrations/pycaret/__init__.py +6 -0
  56. zenml/integrations/registry.py +37 -0
  57. zenml/integrations/s3/artifact_stores/s3_artifact_store.py +93 -9
  58. zenml/integrations/seldon/__init__.py +1 -0
  59. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +1 -0
  60. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +2 -2
  61. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +1 -1
  62. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
  63. zenml/integrations/skypilot_aws/__init__.py +2 -1
  64. zenml/integrations/skypilot_azure/__init__.py +1 -1
  65. zenml/integrations/skypilot_gcp/__init__.py +1 -1
  66. zenml/integrations/skypilot_lambda/__init__.py +1 -1
  67. zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +1 -1
  68. zenml/integrations/slack/__init__.py +1 -0
  69. zenml/integrations/tekton/__init__.py +1 -0
  70. zenml/integrations/tensorboard/__init__.py +0 -1
  71. zenml/integrations/tensorflow/__init__.py +18 -6
  72. zenml/integrations/wandb/__init__.py +1 -0
  73. zenml/logging/step_logging.py +54 -51
  74. zenml/models/__init__.py +28 -0
  75. zenml/models/v2/core/action.py +276 -0
  76. zenml/models/v2/core/component.py +18 -0
  77. zenml/models/v2/core/model.py +1 -2
  78. zenml/models/v2/core/service_connector.py +17 -0
  79. zenml/models/v2/core/stack.py +31 -0
  80. zenml/models/v2/core/trigger.py +182 -141
  81. zenml/models/v2/misc/full_stack.py +97 -0
  82. zenml/models/v2/misc/stack_deployment.py +86 -0
  83. zenml/new/pipelines/pipeline.py +14 -4
  84. zenml/new/pipelines/pipeline_decorator.py +1 -2
  85. zenml/new/pipelines/run_utils.py +1 -12
  86. zenml/new/steps/step_decorator.py +2 -3
  87. zenml/orchestrators/input_utils.py +3 -6
  88. zenml/pipelines/base_pipeline.py +0 -2
  89. zenml/pipelines/pipeline_decorator.py +1 -2
  90. zenml/stack/stack.py +3 -6
  91. zenml/stack/stack_component.py +4 -0
  92. zenml/stack_deployments/__init__.py +14 -0
  93. zenml/stack_deployments/aws_stack_deployment.py +254 -0
  94. zenml/stack_deployments/gcp_stack_deployment.py +260 -0
  95. zenml/stack_deployments/stack_deployment.py +208 -0
  96. zenml/stack_deployments/utils.py +44 -0
  97. zenml/steps/base_step.py +1 -2
  98. zenml/steps/step_decorator.py +1 -2
  99. zenml/types.py +10 -1
  100. zenml/utils/function_utils.py +1 -1
  101. zenml/utils/pagination_utils.py +7 -5
  102. zenml/utils/pipeline_docker_image_builder.py +117 -73
  103. zenml/utils/pydantic_utils.py +6 -5
  104. zenml/zen_server/cloud_utils.py +18 -3
  105. zenml/zen_server/dashboard/assets/{404-CDPQCl4D.js → 404-DpJaNHKF.js} +1 -1
  106. zenml/zen_server/dashboard/assets/@radix-CFOkMR_E.js +85 -0
  107. zenml/zen_server/dashboard/assets/{@react-router-DYovave8.js → @react-router-CO-OsFwI.js} +2 -2
  108. zenml/zen_server/dashboard/assets/{@reactflow-CHBapDaj.js → @reactflow-DJfzkHO1.js} +2 -2
  109. zenml/zen_server/dashboard/assets/@tanstack-DYiOyJUL.js +22 -0
  110. zenml/zen_server/dashboard/assets/AwarenessChannel-BYDLT2xC.js +1 -0
  111. zenml/zen_server/dashboard/assets/{CodeSnippet-BidtnWOi.js → CodeSnippet-BkOuRmyq.js} +2 -2
  112. zenml/zen_server/dashboard/assets/Commands-ZvWR1BRs.js +1 -0
  113. zenml/zen_server/dashboard/assets/CopyButton-DVwLkafa.js +2 -0
  114. zenml/zen_server/dashboard/assets/{CsvVizualization-BOuez-fG.js → CsvVizualization-C2IiqX4I.js} +7 -7
  115. zenml/zen_server/dashboard/assets/DisplayDate-DYgIjlDF.js +1 -0
  116. zenml/zen_server/dashboard/assets/EmptyState-BMLnFVlB.js +1 -0
  117. zenml/zen_server/dashboard/assets/Error-CqX0VqW_.js +1 -0
  118. zenml/zen_server/dashboard/assets/ExecutionStatus-BoLUXR9t.js +1 -0
  119. zenml/zen_server/dashboard/assets/Helpbox-LFydyVwh.js +1 -0
  120. zenml/zen_server/dashboard/assets/Infobox-DnENC0sh.js +1 -0
  121. zenml/zen_server/dashboard/assets/InlineAvatar-CbJtYr0t.js +1 -0
  122. zenml/zen_server/dashboard/assets/{MarkdownVisualization-DsB2QZiK.js → MarkdownVisualization-xp3hhULl.js} +2 -2
  123. zenml/zen_server/dashboard/assets/Pagination-DEbVUupy.js +1 -0
  124. zenml/zen_server/dashboard/assets/PasswordChecker-DUveqlva.js +1 -0
  125. zenml/zen_server/dashboard/assets/SetPassword-BYBdbQDo.js +1 -0
  126. zenml/zen_server/dashboard/assets/SuccessStep-Nx743hll.js +1 -0
  127. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DnM-c11H.js → UpdatePasswordSchemas-DF9gSzE0.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{aws-t0gKCj_R.js → aws-BgKTfTfx.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{check-circle-BVvhm5dy.js → check-circle-i56092KI.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{chevron-down-zcvCWmyP.js → chevron-down-D_ZlKMqH.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{chevron-right-double-CJ50E9Gr.js → chevron-right-double-BiEMg7rd.js} +1 -1
  132. zenml/zen_server/dashboard/assets/cloud-only-DVbIeckv.js +1 -0
  133. zenml/zen_server/dashboard/assets/{copy-BRhQz3j-.js → copy-BXNk6BjL.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{database-CRRnyFWh.js → database-1xWSgZfO.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{docker-BAonhm6G.js → docker-CQMVm_4d.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{file-text-CbVERUON.js → file-text-CqD_iu6l.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{help-B8rqCvqn.js → help-bu_DgLKI.js} +1 -1
  138. zenml/zen_server/dashboard/assets/index-C_CrU4vI.js +1 -0
  139. zenml/zen_server/dashboard/assets/index-DK1ynKjA.js +55 -0
  140. zenml/zen_server/dashboard/assets/index-inApY3KQ.css +1 -0
  141. zenml/zen_server/dashboard/assets/index-rK_Wuy2W.js +1 -0
  142. zenml/zen_server/dashboard/assets/index.esm-Corw4lXQ.js +1 -0
  143. zenml/zen_server/dashboard/assets/{login-mutation-wzzl23C6.js → login-mutation-BUnVASxp.js} +1 -1
  144. zenml/zen_server/dashboard/assets/not-found-B4VnX8gK.js +1 -0
  145. zenml/zen_server/dashboard/assets/package-CsUhPmou.js +1 -0
  146. zenml/zen_server/dashboard/assets/{page-BmkSiYeQ.js → page-3efNCDeb.js} +2 -2
  147. zenml/zen_server/dashboard/assets/page-7zTHbhhI.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-BEs6jK71.js +1 -0
  149. zenml/zen_server/dashboard/assets/page-BpSqIf4B.js +1 -0
  150. zenml/zen_server/dashboard/assets/{page-AQKopn_4.js → page-Bx6o0ARS.js} +1 -1
  151. zenml/zen_server/dashboard/assets/page-C43QGHTt.js +9 -0
  152. zenml/zen_server/dashboard/assets/page-CR0OG7ss.js +1 -0
  153. zenml/zen_server/dashboard/assets/page-CRTJ0UuR.js +1 -0
  154. zenml/zen_server/dashboard/assets/page-CUZIGO-3.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-CaopxiU1.js +1 -0
  156. zenml/zen_server/dashboard/assets/{page-CuT1SUik.js → page-Cx67M0QT.js} +1 -1
  157. zenml/zen_server/dashboard/assets/page-D7Z399xy.js +1 -0
  158. zenml/zen_server/dashboard/assets/page-D93kd7Xj.js +1 -0
  159. zenml/zen_server/dashboard/assets/{page-BzVZGExK.js → page-DKlIdAe5.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{page-Bi5AI0S7.js → page-DMOYZppS.js} +1 -1
  161. zenml/zen_server/dashboard/assets/page-DMsSn3dv.js +2 -0
  162. zenml/zen_server/dashboard/assets/{page-BW6Ket3a.js → page-Dc_7KMQE.js} +1 -1
  163. zenml/zen_server/dashboard/assets/page-DvCvroOM.js +1 -0
  164. zenml/zen_server/dashboard/assets/page-Hus2pr9T.js +1 -0
  165. zenml/zen_server/dashboard/assets/page-JyfeDUfu.js +1 -0
  166. zenml/zen_server/dashboard/assets/{page-yN4rZ-ZS.js → page-Sxn82W-5.js} +1 -1
  167. zenml/zen_server/dashboard/assets/page-TKXERe16.js +1 -0
  168. zenml/zen_server/dashboard/assets/page-Xu8JEjSU.js +1 -0
  169. zenml/zen_server/dashboard/assets/{play-circle-DK5QMJyp.js → play-circle-CNtZKDnW.js} +1 -1
  170. zenml/zen_server/dashboard/assets/plus-DOeLmm7C.js +1 -0
  171. zenml/zen_server/dashboard/assets/{terminal-B2ovgWuz.js → terminal-By9cErXc.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-0Wgz8pUE.js → update-server-settings-mutation-CR8e3Sir.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{url-6_xv0WJS.js → url-DuQMeqYA.js} +1 -1
  174. zenml/zen_server/dashboard/assets/{zod-DrZvVLjd.js → zod-BhoGpZ63.js} +1 -1
  175. zenml/zen_server/dashboard/index.html +7 -7
  176. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  177. zenml/zen_server/dashboard_legacy/index.html +1 -1
  178. zenml/zen_server/dashboard_legacy/{precache-manifest.f4abc5b7cfa7d90c1caf5521918e29a8.js → precache-manifest.c8c57fb0d2132b1d3c2119e776b7dfb3.js} +4 -4
  179. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  180. zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js → main.382439a7.chunk.js} +2 -2
  181. zenml/zen_server/dashboard_legacy/static/js/{main.ac2f17d0.chunk.js.map → main.382439a7.chunk.js.map} +1 -1
  182. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  183. zenml/zen_server/deploy/helm/README.md +2 -2
  184. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +11 -5
  185. zenml/zen_server/pipeline_deployment/utils.py +57 -44
  186. zenml/zen_server/rbac/models.py +1 -0
  187. zenml/zen_server/rbac/utils.py +22 -1
  188. zenml/zen_server/rbac/zenml_cloud_rbac.py +11 -5
  189. zenml/zen_server/routers/actions_endpoints.py +324 -0
  190. zenml/zen_server/routers/stack_deployment_endpoints.py +158 -0
  191. zenml/zen_server/routers/triggers_endpoints.py +30 -158
  192. zenml/zen_server/routers/workspaces_endpoints.py +64 -0
  193. zenml/zen_server/zen_server_api.py +4 -0
  194. zenml/zen_stores/migrations/utils.py +1 -1
  195. zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
  196. zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
  197. zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
  198. zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
  199. zenml/zen_stores/rest_zen_store.py +248 -8
  200. zenml/zen_stores/schemas/__init__.py +2 -0
  201. zenml/zen_stores/schemas/action_schemas.py +192 -0
  202. zenml/zen_stores/schemas/stack_schemas.py +10 -0
  203. zenml/zen_stores/schemas/step_run_schemas.py +27 -11
  204. zenml/zen_stores/schemas/trigger_schemas.py +43 -50
  205. zenml/zen_stores/schemas/user_schemas.py +10 -2
  206. zenml/zen_stores/schemas/workspace_schemas.py +5 -0
  207. zenml/zen_stores/sql_zen_store.py +540 -36
  208. zenml/zen_stores/zen_store_interface.py +165 -0
  209. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/METADATA +33 -11
  210. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/RECORD +213 -193
  211. zenml/zen_server/dashboard/assets/@radix-C9DBgJhe.js +0 -77
  212. zenml/zen_server/dashboard/assets/@tanstack-CEbkxrhX.js +0 -30
  213. zenml/zen_server/dashboard/assets/AwarenessChannel-nXGpmj_f.js +0 -1
  214. zenml/zen_server/dashboard/assets/Cards-nwsvQLVS.js +0 -1
  215. zenml/zen_server/dashboard/assets/Commands-DuIWKg_Q.js +0 -1
  216. zenml/zen_server/dashboard/assets/CopyButton-B_YSm-Ds.js +0 -2
  217. zenml/zen_server/dashboard/assets/DisplayDate-BdguISQF.js +0 -1
  218. zenml/zen_server/dashboard/assets/EmptyState-BkooiGtL.js +0 -1
  219. zenml/zen_server/dashboard/assets/Error-B6M0dPph.js +0 -1
  220. zenml/zen_server/dashboard/assets/Helpbox-BQoqCm04.js +0 -1
  221. zenml/zen_server/dashboard/assets/Infobox-Ce9mefqU.js +0 -1
  222. zenml/zen_server/dashboard/assets/InlineAvatar-DGf3dVhV.js +0 -1
  223. zenml/zen_server/dashboard/assets/PageHeader-DGaemzjc.js +0 -1
  224. zenml/zen_server/dashboard/assets/Pagination-DVYfBCCc.js +0 -1
  225. zenml/zen_server/dashboard/assets/PasswordChecker-DSLBp7Vl.js +0 -1
  226. zenml/zen_server/dashboard/assets/SetPassword-B5s7DJug.js +0 -1
  227. zenml/zen_server/dashboard/assets/SuccessStep-ZzczaM7g.js +0 -1
  228. zenml/zen_server/dashboard/assets/cloud-only-Ba_ShBR5.js +0 -1
  229. zenml/zen_server/dashboard/assets/index-CWJ3xbIf.css +0 -1
  230. zenml/zen_server/dashboard/assets/index-QORVVTMN.js +0 -55
  231. zenml/zen_server/dashboard/assets/index.esm-F7nqy9zY.js +0 -1
  232. zenml/zen_server/dashboard/assets/not-found-Dh2la7kh.js +0 -1
  233. zenml/zen_server/dashboard/assets/page-B-5jAKoO.js +0 -1
  234. zenml/zen_server/dashboard/assets/page-B-vWk8a6.js +0 -1
  235. zenml/zen_server/dashboard/assets/page-B0BrqfS8.js +0 -1
  236. zenml/zen_server/dashboard/assets/page-BQxVFlUl.js +0 -1
  237. zenml/zen_server/dashboard/assets/page-ByrHy6Ss.js +0 -1
  238. zenml/zen_server/dashboard/assets/page-CPtY4Kv_.js +0 -1
  239. zenml/zen_server/dashboard/assets/page-CmmukLsl.js +0 -1
  240. zenml/zen_server/dashboard/assets/page-D2D-7qyr.js +0 -9
  241. zenml/zen_server/dashboard/assets/page-DAQQyLxT.js +0 -1
  242. zenml/zen_server/dashboard/assets/page-DHkUMl_E.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-DZCbwOEs.js +0 -2
  244. zenml/zen_server/dashboard/assets/page-DdaIt20-.js +0 -1
  245. zenml/zen_server/dashboard/assets/page-LqLs24Ot.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-lebv0c7C.js +0 -1
  247. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/LICENSE +0 -0
  248. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/WHEEL +0 -0
  249. {zenml_nightly-0.58.2.dev20240623.dist-info → zenml_nightly-0.61.0.dev20240712.dist-info}/entry_points.txt +0 -0
zenml/client.py CHANGED
@@ -19,7 +19,6 @@ import os
19
19
  from abc import ABCMeta
20
20
  from collections import Counter
21
21
  from datetime import datetime
22
- from functools import partial
23
22
  from pathlib import Path
24
23
  from typing import (
25
24
  TYPE_CHECKING,
@@ -82,6 +81,10 @@ from zenml.exceptions import (
82
81
  from zenml.io import fileio
83
82
  from zenml.logger import get_logger
84
83
  from zenml.models import (
84
+ ActionFilter,
85
+ ActionRequest,
86
+ ActionResponse,
87
+ ActionUpdate,
85
88
  APIKeyFilter,
86
89
  APIKeyRequest,
87
90
  APIKeyResponse,
@@ -201,7 +204,7 @@ if TYPE_CHECKING:
201
204
  logger = get_logger(__name__)
202
205
 
203
206
  AnyResponse = TypeVar("AnyResponse", bound=BaseIdentifiedResponse) # type: ignore[type-arg]
204
- T = TypeVar("T")
207
+ F = TypeVar("F", bound=Callable[..., Any])
205
208
 
206
209
 
207
210
  class ClientConfiguration(FileSyncModel):
@@ -307,11 +310,11 @@ class ClientMetaClass(ABCMeta):
307
310
  return cls._global_client
308
311
 
309
312
 
310
- def _fail_for_sql_zen_store(method: Callable[..., T]) -> Callable[..., T]:
311
- """Decorator for all methods, that are disallowed when the client is not connected through REST API.
313
+ def _fail_for_sql_zen_store(method: F) -> F:
314
+ """Decorator for methods that are not allowed with a SQLZenStore.
312
315
 
313
316
  Args:
314
- method: The method
317
+ method: The method to decorate.
315
318
 
316
319
  Returns:
317
320
  The decorated method.
@@ -327,7 +330,7 @@ def _fail_for_sql_zen_store(method: Callable[..., T]) -> Callable[..., T]:
327
330
  )
328
331
  return method(self, *args, **kwargs)
329
332
 
330
- return wrapper
333
+ return cast(F, wrapper)
331
334
 
332
335
 
333
336
  @evaluate_all_lazy_load_args_in_client_methods
@@ -1149,6 +1152,7 @@ class Client(metaclass=ClientMetaClass):
1149
1152
  name: str,
1150
1153
  components: Mapping[StackComponentType, Union[str, UUID]],
1151
1154
  stack_spec_file: Optional[str] = None,
1155
+ labels: Optional[Dict[str, Any]] = None,
1152
1156
  ) -> StackResponse:
1153
1157
  """Registers a stack and its components.
1154
1158
 
@@ -1156,6 +1160,7 @@ class Client(metaclass=ClientMetaClass):
1156
1160
  name: The name of the stack to register.
1157
1161
  components: dictionary which maps component types to component names
1158
1162
  stack_spec_file: path to the stack spec file
1163
+ labels: The labels of the stack.
1159
1164
 
1160
1165
  Returns:
1161
1166
  The model of the registered stack.
@@ -1180,6 +1185,7 @@ class Client(metaclass=ClientMetaClass):
1180
1185
  stack_spec_path=stack_spec_file,
1181
1186
  workspace=self.active_workspace.id,
1182
1187
  user=self.active_user.id,
1188
+ labels=labels,
1183
1189
  )
1184
1190
 
1185
1191
  self._validate_stack_configuration(stack=stack)
@@ -1223,8 +1229,8 @@ class Client(metaclass=ClientMetaClass):
1223
1229
  size: int = PAGE_SIZE_DEFAULT,
1224
1230
  logical_operator: LogicalOperators = LogicalOperators.AND,
1225
1231
  id: Optional[Union[UUID, str]] = None,
1226
- created: Optional[datetime] = None,
1227
- updated: Optional[datetime] = None,
1232
+ created: Optional[Union[datetime, str]] = None,
1233
+ updated: Optional[Union[datetime, str]] = None,
1228
1234
  name: Optional[str] = None,
1229
1235
  description: Optional[str] = None,
1230
1236
  workspace_id: Optional[Union[str, UUID]] = None,
@@ -1275,6 +1281,7 @@ class Client(metaclass=ClientMetaClass):
1275
1281
  name_id_or_prefix: Optional[Union[UUID, str]] = None,
1276
1282
  name: Optional[str] = None,
1277
1283
  stack_spec_file: Optional[str] = None,
1284
+ labels: Optional[Dict[str, Any]] = None,
1278
1285
  description: Optional[str] = None,
1279
1286
  component_updates: Optional[
1280
1287
  Dict[StackComponentType, List[Union[UUID, str]]]
@@ -1285,7 +1292,8 @@ class Client(metaclass=ClientMetaClass):
1285
1292
  Args:
1286
1293
  name_id_or_prefix: The name, id or prefix of the stack to update.
1287
1294
  name: the new name of the stack.
1288
- stack_spec_file: path to the stack spec file
1295
+ stack_spec_file: path to the stack spec file.
1296
+ labels: The new labels of the stack component.
1289
1297
  description: the new description of the stack.
1290
1298
  component_updates: dictionary which maps stack component types to
1291
1299
  lists of new stack component names or ids.
@@ -1339,6 +1347,15 @@ class Client(metaclass=ClientMetaClass):
1339
1347
  for c_type, c_list in components_dict.items()
1340
1348
  }
1341
1349
 
1350
+ if labels is not None:
1351
+ existing_labels = stack.labels or {}
1352
+ existing_labels.update(labels)
1353
+
1354
+ existing_labels = {
1355
+ k: v for k, v in existing_labels.items() if v is not None
1356
+ }
1357
+ update_model.labels = existing_labels
1358
+
1342
1359
  updated_stack = self.zen_store.update_stack(
1343
1360
  stack_id=stack.id,
1344
1361
  stack_update=update_model,
@@ -2435,9 +2452,7 @@ class Client(metaclass=ClientMetaClass):
2435
2452
  )
2436
2453
 
2437
2454
  for pipeline in depaginate(
2438
- functools.partial(
2439
- Client().list_pipelines, name=name_id_or_prefix
2440
- )
2455
+ Client().list_pipelines, name=name_id_or_prefix
2441
2456
  ):
2442
2457
  Client().delete_pipeline(pipeline.id)
2443
2458
  else:
@@ -2575,11 +2590,9 @@ class Client(metaclass=ClientMetaClass):
2575
2590
  )
2576
2591
 
2577
2592
  builds = depaginate(
2578
- partial(
2579
- self.list_builds,
2580
- pipeline_id=pipeline.id,
2581
- stack_id=stack.id if stack else None,
2582
- )
2593
+ self.list_builds,
2594
+ pipeline_id=pipeline.id,
2595
+ stack_id=stack.id if stack else None,
2583
2596
  )
2584
2597
 
2585
2598
  for build in builds:
@@ -2754,18 +2767,18 @@ class Client(metaclass=ClientMetaClass):
2754
2767
  self,
2755
2768
  name: str,
2756
2769
  configuration: Dict[str, Any],
2757
- description: str,
2758
2770
  flavor: str,
2759
2771
  event_source_subtype: PluginSubType,
2772
+ description: str = "",
2760
2773
  ) -> EventSourceResponse:
2761
- """Registers a event_source.
2774
+ """Registers an event source.
2762
2775
 
2763
2776
  Args:
2764
- name: The name of the event_source to create.
2765
- configuration: Configuration for this event source
2766
- description: The description of the event_source
2767
- flavor: The flavor of event source
2768
- event_source_subtype: str
2777
+ name: The name of the event source to create.
2778
+ configuration: Configuration for this event source.
2779
+ flavor: The flavor of event source.
2780
+ event_source_subtype: The event source subtype.
2781
+ description: The description of the event source.
2769
2782
 
2770
2783
  Returns:
2771
2784
  The model of the registered event source.
@@ -2935,52 +2948,218 @@ class Client(metaclass=ClientMetaClass):
2935
2948
  self.zen_store.delete_event_source(event_source_id=event_source.id)
2936
2949
  logger.info("Deleted event_source with name '%s'.", event_source.name)
2937
2950
 
2951
+ # --------------------------------- Actions -------------------------
2952
+
2953
+ @_fail_for_sql_zen_store
2954
+ def create_action(
2955
+ self,
2956
+ name: str,
2957
+ flavor: str,
2958
+ action_type: PluginSubType,
2959
+ configuration: Dict[str, Any],
2960
+ service_account_id: UUID,
2961
+ auth_window: Optional[int] = None,
2962
+ description: str = "",
2963
+ ) -> ActionResponse:
2964
+ """Create an action.
2965
+
2966
+ Args:
2967
+ name: The name of the action.
2968
+ flavor: The flavor of the action,
2969
+ action_type: The action subtype.
2970
+ configuration: The action configuration.
2971
+ service_account_id: The service account that is used to execute the
2972
+ action.
2973
+ auth_window: The time window in minutes for which the service
2974
+ account is authorized to execute the action. Set this to 0 to
2975
+ authorize the service account indefinitely (not recommended).
2976
+ description: The description of the action.
2977
+
2978
+ Returns:
2979
+ The created action
2980
+ """
2981
+ action = ActionRequest(
2982
+ name=name,
2983
+ description=description,
2984
+ flavor=flavor,
2985
+ plugin_subtype=action_type,
2986
+ configuration=configuration,
2987
+ service_account_id=service_account_id,
2988
+ auth_window=auth_window,
2989
+ user=self.active_user.id,
2990
+ workspace=self.active_workspace.id,
2991
+ )
2992
+
2993
+ return self.zen_store.create_action(action=action)
2994
+
2995
+ @_fail_for_sql_zen_store
2996
+ def get_action(
2997
+ self,
2998
+ name_id_or_prefix: Union[UUID, str],
2999
+ allow_name_prefix_match: bool = True,
3000
+ hydrate: bool = True,
3001
+ ) -> ActionResponse:
3002
+ """Get an action by name, ID or prefix.
3003
+
3004
+ Args:
3005
+ name_id_or_prefix: The name, ID or prefix of the action.
3006
+ allow_name_prefix_match: If True, allow matching by name prefix.
3007
+ hydrate: Flag deciding whether to hydrate the output model(s)
3008
+ by including metadata fields in the response.
3009
+
3010
+ Returns:
3011
+ The action.
3012
+ """
3013
+ return self._get_entity_by_id_or_name_or_prefix(
3014
+ get_method=self.zen_store.get_action,
3015
+ list_method=self.list_actions,
3016
+ name_id_or_prefix=name_id_or_prefix,
3017
+ allow_name_prefix_match=allow_name_prefix_match,
3018
+ hydrate=hydrate,
3019
+ )
3020
+
3021
+ @_fail_for_sql_zen_store
3022
+ def list_actions(
3023
+ self,
3024
+ sort_by: str = "created",
3025
+ page: int = PAGINATION_STARTING_PAGE,
3026
+ size: int = PAGE_SIZE_DEFAULT,
3027
+ logical_operator: LogicalOperators = LogicalOperators.AND,
3028
+ id: Optional[Union[UUID, str]] = None,
3029
+ created: Optional[datetime] = None,
3030
+ updated: Optional[datetime] = None,
3031
+ name: Optional[str] = None,
3032
+ flavor: Optional[str] = None,
3033
+ action_type: Optional[str] = None,
3034
+ workspace_id: Optional[Union[str, UUID]] = None,
3035
+ user_id: Optional[Union[str, UUID]] = None,
3036
+ hydrate: bool = False,
3037
+ ) -> Page[ActionResponse]:
3038
+ """List actions.
3039
+
3040
+ Args:
3041
+ sort_by: The column to sort by
3042
+ page: The page of items
3043
+ size: The maximum size of all pages
3044
+ logical_operator: Which logical operator to use [and, or]
3045
+ id: Use the id of the action to filter by.
3046
+ created: Use to filter by time of creation
3047
+ updated: Use the last updated date for filtering
3048
+ workspace_id: The id of the workspace to filter by.
3049
+ user_id: The id of the user to filter by.
3050
+ name: The name of the action to filter by.
3051
+ flavor: The flavor of the action to filter by.
3052
+ action_type: The type of the action to filter by.
3053
+ hydrate: Flag deciding whether to hydrate the output model(s)
3054
+ by including metadata fields in the response.
3055
+
3056
+ Returns:
3057
+ A page of actions.
3058
+ """
3059
+ filter_model = ActionFilter(
3060
+ page=page,
3061
+ size=size,
3062
+ sort_by=sort_by,
3063
+ logical_operator=logical_operator,
3064
+ workspace_id=workspace_id,
3065
+ user_id=user_id,
3066
+ name=name,
3067
+ id=id,
3068
+ flavor=flavor,
3069
+ plugin_subtype=action_type,
3070
+ created=created,
3071
+ updated=updated,
3072
+ )
3073
+ filter_model.set_scope_workspace(self.active_workspace.id)
3074
+ return self.zen_store.list_actions(filter_model, hydrate=hydrate)
3075
+
3076
+ @_fail_for_sql_zen_store
3077
+ def update_action(
3078
+ self,
3079
+ name_id_or_prefix: Union[UUID, str],
3080
+ name: Optional[str] = None,
3081
+ description: Optional[str] = None,
3082
+ configuration: Optional[Dict[str, Any]] = None,
3083
+ service_account_id: Optional[UUID] = None,
3084
+ auth_window: Optional[int] = None,
3085
+ ) -> ActionResponse:
3086
+ """Update an action.
3087
+
3088
+ Args:
3089
+ name_id_or_prefix: The name, id or prefix of the action to update.
3090
+ name: The new name of the action.
3091
+ description: The new description of the action.
3092
+ configuration: The new configuration of the action.
3093
+ service_account_id: The new service account that is used to execute
3094
+ the action.
3095
+ auth_window: The new time window in minutes for which the service
3096
+ account is authorized to execute the action. Set this to 0 to
3097
+ authorize the service account indefinitely (not recommended).
3098
+
3099
+ Returns:
3100
+ The updated action.
3101
+ """
3102
+ action = self.get_action(
3103
+ name_id_or_prefix=name_id_or_prefix, allow_name_prefix_match=False
3104
+ )
3105
+
3106
+ update_model = ActionUpdate(
3107
+ name=name,
3108
+ description=description,
3109
+ configuration=configuration,
3110
+ service_account_id=service_account_id,
3111
+ auth_window=auth_window,
3112
+ )
3113
+
3114
+ return self.zen_store.update_action(
3115
+ action_id=action.id,
3116
+ action_update=update_model,
3117
+ )
3118
+
3119
+ @_fail_for_sql_zen_store
3120
+ def delete_action(self, name_id_or_prefix: Union[str, UUID]) -> None:
3121
+ """Delete an action.
3122
+
3123
+ Args:
3124
+ name_id_or_prefix: The name, id or prefix id of the action
3125
+ to delete.
3126
+ """
3127
+ action = self.get_action(
3128
+ name_id_or_prefix=name_id_or_prefix, allow_name_prefix_match=False
3129
+ )
3130
+
3131
+ self.zen_store.delete_action(action_id=action.id)
3132
+ logger.info("Deleted action with name '%s'.", action.name)
3133
+
2938
3134
  # --------------------------------- Triggers -------------------------
2939
3135
 
2940
3136
  @_fail_for_sql_zen_store
2941
3137
  def create_trigger(
2942
3138
  self,
2943
3139
  name: str,
2944
- description: str,
2945
3140
  event_source_id: UUID,
2946
3141
  event_filter: Dict[str, Any],
2947
- action: Dict[str, Any],
2948
- action_flavor: str,
2949
- action_subtype: PluginSubType,
2950
- service_account: Union[str, UUID],
2951
- auth_window: Optional[int] = None,
3142
+ action_id: UUID,
3143
+ description: str = "",
2952
3144
  ) -> TriggerResponse:
2953
3145
  """Registers a trigger.
2954
3146
 
2955
3147
  Args:
2956
3148
  name: The name of the trigger to create.
2957
- description: The description of the trigger
2958
3149
  event_source_id: The id of the event source id
2959
3150
  event_filter: The event filter
2960
- action: The action
2961
- action_flavor: The action flavor
2962
- action_subtype: The action subtype
2963
- service_account: The service account
2964
- auth_window: The auth window
3151
+ action_id: The ID of the action that should be triggered.
3152
+ description: The description of the trigger
2965
3153
 
2966
3154
  Returns:
2967
- The model of the registered event source.
3155
+ The created trigger.
2968
3156
  """
2969
- # Fetch the service account
2970
- service_account_model = self.get_service_account(
2971
- name_id_or_prefix=service_account, allow_name_prefix_match=False
2972
- )
2973
-
2974
3157
  trigger = TriggerRequest(
2975
3158
  name=name,
2976
3159
  description=description,
2977
3160
  event_source_id=event_source_id,
2978
3161
  event_filter=event_filter,
2979
- action=action,
2980
- action_flavor=action_flavor,
2981
- action_subtype=action_subtype,
2982
- service_account_id=service_account_model.id,
2983
- auth_window=auth_window,
3162
+ action_id=action_id,
2984
3163
  user=self.active_user.id,
2985
3164
  workspace=self.active_workspace.id,
2986
3165
  )
@@ -2994,10 +3173,10 @@ class Client(metaclass=ClientMetaClass):
2994
3173
  allow_name_prefix_match: bool = True,
2995
3174
  hydrate: bool = True,
2996
3175
  ) -> TriggerResponse:
2997
- """Get a event source by name, ID or prefix.
3176
+ """Get a trigger by name, ID or prefix.
2998
3177
 
2999
3178
  Args:
3000
- name_id_or_prefix: The name, ID or prefix of the stack.
3179
+ name_id_or_prefix: The name, ID or prefix of the trigger.
3001
3180
  allow_name_prefix_match: If True, allow matching by name prefix.
3002
3181
  hydrate: Flag deciding whether to hydrate the output model(s)
3003
3182
  by including metadata fields in the response.
@@ -3025,6 +3204,11 @@ class Client(metaclass=ClientMetaClass):
3025
3204
  updated: Optional[datetime] = None,
3026
3205
  name: Optional[str] = None,
3027
3206
  event_source_id: Optional[UUID] = None,
3207
+ action_id: Optional[UUID] = None,
3208
+ event_source_flavor: Optional[str] = None,
3209
+ event_source_subtype: Optional[str] = None,
3210
+ action_flavor: Optional[str] = None,
3211
+ action_subtype: Optional[str] = None,
3028
3212
  workspace_id: Optional[Union[str, UUID]] = None,
3029
3213
  user_id: Optional[Union[str, UUID]] = None,
3030
3214
  hydrate: bool = False,
@@ -3042,7 +3226,14 @@ class Client(metaclass=ClientMetaClass):
3042
3226
  workspace_id: The id of the workspace to filter by.
3043
3227
  user_id: The id of the user to filter by.
3044
3228
  name: The name of the trigger to filter by.
3045
- event_source_id: The event source associated with the Trigger
3229
+ event_source_id: The event source associated with the trigger.
3230
+ action_id: The action associated with the trigger.
3231
+ event_source_flavor: Flavor of the event source associated with the
3232
+ trigger.
3233
+ event_source_subtype: Type of the event source associated with the
3234
+ trigger.
3235
+ action_flavor: Flavor of the action associated with the trigger.
3236
+ action_subtype: Type of the action associated with the trigger.
3046
3237
  hydrate: Flag deciding whether to hydrate the output model(s)
3047
3238
  by including metadata fields in the response.
3048
3239
 
@@ -3058,6 +3249,11 @@ class Client(metaclass=ClientMetaClass):
3058
3249
  user_id=user_id,
3059
3250
  name=name,
3060
3251
  event_source_id=event_source_id,
3252
+ action_id=action_id,
3253
+ event_source_flavor=event_source_flavor,
3254
+ event_source_subtype=event_source_subtype,
3255
+ action_flavor=action_flavor,
3256
+ action_subtype=action_subtype,
3061
3257
  id=id,
3062
3258
  created=created,
3063
3259
  updated=updated,
@@ -3074,10 +3270,7 @@ class Client(metaclass=ClientMetaClass):
3074
3270
  name: Optional[str] = None,
3075
3271
  description: Optional[str] = None,
3076
3272
  event_filter: Optional[Dict[str, Any]] = None,
3077
- action: Optional[Dict[str, Any]] = None,
3078
3273
  is_active: Optional[bool] = None,
3079
- service_account: Optional[Union[str, UUID]] = None,
3080
- auth_window: Optional[int] = None,
3081
3274
  ) -> TriggerResponse:
3082
3275
  """Updates a trigger.
3083
3276
 
@@ -3086,11 +3279,7 @@ class Client(metaclass=ClientMetaClass):
3086
3279
  name: the new name of the trigger.
3087
3280
  description: the new description of the trigger.
3088
3281
  event_filter: The event filter configuration.
3089
- action: The action configuration.
3090
- is_active: Optional[bool] = Allows for activation/deactivating the
3091
- event source
3092
- service_account: The service account
3093
- auth_window: The auth window
3282
+ is_active: Whether the trigger is active or not.
3094
3283
 
3095
3284
  Returns:
3096
3285
  The model of the updated trigger.
@@ -3108,17 +3297,8 @@ class Client(metaclass=ClientMetaClass):
3108
3297
  name=name,
3109
3298
  description=description,
3110
3299
  event_filter=event_filter,
3111
- action=action,
3112
3300
  is_active=is_active,
3113
- auth_window=auth_window,
3114
3301
  )
3115
- if service_account:
3116
- # Fetch the service account
3117
- service_account_model = self.get_service_account(
3118
- name_id_or_prefix=service_account,
3119
- allow_name_prefix_match=False,
3120
- )
3121
- update_model.service_account_id = service_account_model.id
3122
3302
 
3123
3303
  if name:
3124
3304
  if self.list_triggers(name=name):
@@ -3771,7 +3951,7 @@ class Client(metaclass=ClientMetaClass):
3771
3951
  """
3772
3952
  if delete_from_artifact_store:
3773
3953
  unused_artifact_versions = depaginate(
3774
- partial(self.list_artifact_versions, only_unused=True)
3954
+ self.list_artifact_versions, only_unused=True
3775
3955
  )
3776
3956
  for unused_artifact_version in unused_artifact_versions:
3777
3957
  self._delete_artifact_from_artifact_store(
@@ -3980,7 +4160,7 @@ class Client(metaclass=ClientMetaClass):
3980
4160
  ValueError: If the artifact version is still used in any runs.
3981
4161
  """
3982
4162
  if artifact_version not in depaginate(
3983
- partial(self.list_artifact_versions, only_unused=True)
4163
+ self.list_artifact_versions, only_unused=True
3984
4164
  ):
3985
4165
  raise ValueError(
3986
4166
  "The metadata of artifact versions that are used in runs "
@@ -5495,6 +5675,7 @@ class Client(metaclass=ClientMetaClass):
5495
5675
  name_id_or_prefix=name_id_or_prefix,
5496
5676
  resource_type=resource_type,
5497
5677
  resource_id=resource_id,
5678
+ verify=False,
5498
5679
  )
5499
5680
 
5500
5681
  connector_client.configure_local_client(
@@ -5508,6 +5689,7 @@ class Client(metaclass=ClientMetaClass):
5508
5689
  name_id_or_prefix: Union[UUID, str],
5509
5690
  resource_type: Optional[str] = None,
5510
5691
  resource_id: Optional[str] = None,
5692
+ verify: bool = False,
5511
5693
  ) -> "ServiceConnector":
5512
5694
  """Get the client side of a service connector instance to use with a local client.
5513
5695
 
@@ -5523,6 +5705,8 @@ class Client(metaclass=ClientMetaClass):
5523
5705
  equivalent to the one requested, a `ValueError` exception is
5524
5706
  raised. May be omitted for connectors and resource types that do
5525
5707
  not support multiple resource instances.
5708
+ verify: Whether to verify that the service connector configuration
5709
+ and credentials can be used to gain access to the resource.
5526
5710
 
5527
5711
  Returns:
5528
5712
  The client side of the indicated service connector instance that can
@@ -5560,9 +5744,10 @@ class Client(metaclass=ClientMetaClass):
5560
5744
  )
5561
5745
  )
5562
5746
 
5563
- # Verify the connector client on the local machine, because the
5564
- # server-side implementation may not be able to do so
5565
- connector_client.verify()
5747
+ if verify:
5748
+ # Verify the connector client on the local machine, because the
5749
+ # server-side implementation may not be able to do so
5750
+ connector_client.verify()
5566
5751
  else:
5567
5752
  connector_instance = (
5568
5753
  service_connector_registry.instantiate_connector(
zenml/config/compiler.py CHANGED
@@ -192,10 +192,6 @@ class Compiler:
192
192
  Args:
193
193
  pipeline: The pipeline to configure.
194
194
  config: The run configurations.
195
-
196
- Raises:
197
- KeyError: If the run configuration contains options for a
198
- non-existent step.
199
195
  """
200
196
  with pipeline.__suppress_configure_warnings__():
201
197
  pipeline.configure(
@@ -209,11 +205,16 @@ class Compiler:
209
205
  parameters=config.parameters,
210
206
  )
211
207
 
212
- for invocation_id in config.steps:
213
- if invocation_id not in pipeline.invocations:
214
- raise KeyError(
215
- f"Configuration for step {invocation_id} cannot be applied to any pipeline step. Make sure that all configured steps are present in your pipeline."
216
- )
208
+ invalid_step_configs = set(config.steps) - set(pipeline.invocations)
209
+ if invalid_step_configs:
210
+ logger.warning(
211
+ f"Configuration for step invocations {invalid_step_configs} "
212
+ "cannot be applied to any pipeline step invocations, "
213
+ "ignoring..."
214
+ )
215
+
216
+ for key in invalid_step_configs:
217
+ config.steps.pop(key)
217
218
 
218
219
  # Override `enable_cache` of all steps if set at run level
219
220
  if config.enable_cache is not None: