zenml-nightly 0.64.0.dev20240809__py3-none-any.whl → 0.65.0.dev20240906__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 (274) hide show
  1. README.md +1 -1
  2. RELEASE_NOTES.md +68 -4
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/utils.py +13 -6
  5. zenml/cli/__init__.py +1 -1
  6. zenml/cli/base.py +4 -4
  7. zenml/cli/integration.py +48 -9
  8. zenml/cli/pipeline.py +9 -2
  9. zenml/cli/stack.py +39 -27
  10. zenml/cli/utils.py +13 -0
  11. zenml/client.py +15 -17
  12. zenml/config/server_config.py +30 -0
  13. zenml/config/source.py +3 -7
  14. zenml/constants.py +5 -3
  15. zenml/entrypoints/base_entrypoint_configuration.py +41 -27
  16. zenml/entrypoints/step_entrypoint_configuration.py +5 -2
  17. zenml/enums.py +2 -0
  18. zenml/environment.py +31 -0
  19. zenml/feature_stores/base_feature_store.py +4 -6
  20. zenml/integrations/__init__.py +3 -0
  21. zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +9 -0
  22. zenml/integrations/aws/__init__.py +2 -2
  23. zenml/integrations/azure/__init__.py +2 -2
  24. zenml/integrations/azure/azureml_utils.py +201 -0
  25. zenml/integrations/azure/flavors/azureml.py +139 -0
  26. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +20 -118
  27. zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +67 -14
  28. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +58 -172
  29. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +1 -0
  30. zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -0
  31. zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -177
  32. zenml/integrations/constants.py +3 -0
  33. zenml/integrations/databricks/__init__.py +22 -4
  34. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +9 -0
  35. zenml/integrations/deepchecks/__init__.py +29 -11
  36. zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
  37. zenml/integrations/deepchecks/validation_checks.py +0 -30
  38. zenml/integrations/evidently/__init__.py +17 -2
  39. zenml/integrations/facets/__init__.py +21 -5
  40. zenml/integrations/feast/__init__.py +18 -5
  41. zenml/integrations/gcp/__init__.py +2 -2
  42. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +9 -0
  43. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +10 -1
  44. zenml/integrations/great_expectations/__init__.py +21 -7
  45. zenml/integrations/huggingface/__init__.py +39 -15
  46. zenml/integrations/huggingface/materializers/__init__.py +3 -0
  47. zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +3 -1
  48. zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +1 -1
  49. zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +107 -0
  50. zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +1 -1
  51. zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +2 -2
  52. zenml/integrations/huggingface/steps/accelerate_runner.py +108 -85
  53. zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +9 -0
  54. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +9 -0
  55. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +10 -1
  56. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +9 -0
  57. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +10 -1
  58. zenml/integrations/lightning/__init__.py +48 -0
  59. zenml/integrations/lightning/flavors/__init__.py +23 -0
  60. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +148 -0
  61. zenml/integrations/lightning/orchestrators/__init__.py +23 -0
  62. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +596 -0
  63. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +307 -0
  64. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
  65. zenml/integrations/lightning/orchestrators/utils.py +67 -0
  66. zenml/integrations/mlflow/__init__.py +43 -5
  67. zenml/integrations/mlflow/services/mlflow_deployment.py +26 -0
  68. zenml/integrations/numpy/__init__.py +32 -0
  69. zenml/integrations/numpy/materializers/__init__.py +18 -0
  70. zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
  71. zenml/integrations/pandas/__init__.py +32 -0
  72. zenml/integrations/pandas/materializers/__init__.py +18 -0
  73. zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
  74. zenml/integrations/prodigy/annotators/prodigy_annotator.py +1 -1
  75. zenml/integrations/seldon/__init__.py +18 -3
  76. zenml/integrations/sklearn/__init__.py +1 -1
  77. zenml/integrations/skypilot_azure/__init__.py +1 -1
  78. zenml/integrations/tensorboard/__init__.py +1 -1
  79. zenml/integrations/tensorflow/__init__.py +2 -2
  80. zenml/integrations/wandb/experiment_trackers/wandb_experiment_tracker.py +1 -1
  81. zenml/integrations/whylogs/__init__.py +18 -2
  82. zenml/logging/step_logging.py +9 -2
  83. zenml/materializers/__init__.py +0 -4
  84. zenml/materializers/base_materializer.py +4 -0
  85. zenml/materializers/numpy_materializer.py +23 -234
  86. zenml/materializers/pandas_materializer.py +22 -179
  87. zenml/model/model.py +91 -2
  88. zenml/model/utils.py +5 -5
  89. zenml/models/__init__.py +16 -3
  90. zenml/models/v2/core/model_version.py +1 -1
  91. zenml/models/v2/core/pipeline_run.py +31 -1
  92. zenml/models/v2/core/stack.py +51 -20
  93. zenml/models/v2/core/step_run.py +28 -0
  94. zenml/models/v2/misc/info_models.py +78 -0
  95. zenml/new/pipelines/pipeline.py +65 -25
  96. zenml/new/pipelines/run_utils.py +57 -136
  97. zenml/new/steps/step_context.py +17 -6
  98. zenml/orchestrators/base_orchestrator.py +9 -0
  99. zenml/orchestrators/step_launcher.py +37 -14
  100. zenml/orchestrators/step_runner.py +14 -13
  101. zenml/orchestrators/utils.py +107 -7
  102. zenml/service_connectors/service_connector_utils.py +2 -2
  103. zenml/stack/utils.py +11 -2
  104. zenml/stack_deployments/azure_stack_deployment.py +2 -1
  105. zenml/steps/base_step.py +62 -25
  106. zenml/steps/utils.py +115 -3
  107. zenml/utils/cloud_utils.py +8 -8
  108. zenml/utils/code_utils.py +130 -32
  109. zenml/utils/function_utils.py +7 -7
  110. zenml/utils/notebook_utils.py +14 -0
  111. zenml/utils/pipeline_docker_image_builder.py +1 -11
  112. zenml/utils/pydantic_utils.py +3 -3
  113. zenml/utils/secret_utils.py +2 -2
  114. zenml/utils/source_utils.py +67 -21
  115. zenml/utils/string_utils.py +29 -0
  116. zenml/zen_server/dashboard/assets/{404-CRAA_Lew.js → 404-nKxQ4QDX.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{@radix-BXWm7HOa.js → @radix-DnFH_oo1.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{@react-router-l3lMcXA2.js → @react-router-APVeuk-U.js} +1 -1
  119. zenml/zen_server/dashboard/assets/{@reactflow-CeVxyqYT.js → @reactflow-IuMOnBUC.js} +2 -2
  120. zenml/zen_server/dashboard/assets/{@tanstack-FmcYZMuX.js → @tanstack-QbMbTrh5.js} +1 -1
  121. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CO2rOw5M.js +1 -0
  122. zenml/zen_server/dashboard/assets/{CodeSnippet-D0VLxT2A.js → CodeSnippet-i_WEOWw9.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{CollapsibleCard-BaUPiVg0.js → CollapsibleCard-C9BzoY6q.js} +1 -1
  124. zenml/zen_server/dashboard/assets/Commands-m9HMl-eh.js +1 -0
  125. zenml/zen_server/dashboard/assets/{CopyButton-Dbo52T1K.js → CopyButton-BAYaQlWF.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{CsvVizualization-D3kAypDj.js → CsvVizualization-Bbzv7VEL.js} +5 -5
  127. zenml/zen_server/dashboard/assets/{edit-C0MVvPD2.js → DialogItem-B576Svvy.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{DisplayDate-DizbSeT-.js → DisplayDate-DkCy54Bp.js} +1 -1
  129. zenml/zen_server/dashboard/assets/EditSecretDialog-CmY9fiM0.js +1 -0
  130. zenml/zen_server/dashboard/assets/{EmptyState-BHblM39I.js → EmptyState-Cs3DEmso.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{Error-C6LeJSER.js → Error-QMgFNDTs.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{ExecutionStatus-jH4OrWBq.js → ExecutionStatus-BSQgMpzk.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{Helpbox-aAB2XP-z.js → Helpbox-C96LeSX9.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{Infobox-BQ0aty32.js → Infobox-BB7dfbrO.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{InlineAvatar-DpTLgM3Q.js → InlineAvatar-C2ZECnGP.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{Lock-CNyJvf2r.js → Lock-CmIn0szs.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{MarkdownVisualization-Bajxn0HY.js → MarkdownVisualization-DS05sfBm.js} +1 -1
  138. zenml/zen_server/dashboard/assets/{NumberBox-BmKE0qnO.js → NumberBox-CrN0_kqI.js} +1 -1
  139. zenml/zen_server/dashboard/assets/Partials-RDhJ8Ci7.js +1 -0
  140. zenml/zen_server/dashboard/assets/{PasswordChecker-yGGoJSB-.js → PasswordChecker-DE71J_3F.js} +1 -1
  141. zenml/zen_server/dashboard/assets/ProviderIcon-wA4qBOv1.js +1 -0
  142. zenml/zen_server/dashboard/assets/ProviderRadio-DkPE6alG.js +1 -0
  143. zenml/zen_server/dashboard/assets/SearchField-BPNazO4G.js +1 -0
  144. zenml/zen_server/dashboard/assets/SetPassword-kA6Bi_Kp.js +1 -0
  145. zenml/zen_server/dashboard/assets/{Tick-uxv80Q6a.js → Tick-DEACFydX.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-oN4G3sKz.js → UpdatePasswordSchemas-BKyR7Eqi.js} +1 -1
  147. zenml/zen_server/dashboard/assets/UsageReason-DbgUeRkI.js +1 -0
  148. zenml/zen_server/dashboard/assets/WizardFooter-sUnbJ70r.js +1 -0
  149. zenml/zen_server/dashboard/assets/{check-circle-1_I207rW.js → check-circle-DOoS4yhF.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{chevron-down-BpaF8JqM.js → chevron-down-Cwb-W_B_.js} +1 -1
  151. zenml/zen_server/dashboard/assets/{chevron-right-double-Dk8e2L99.js → chevron-right-double-c9H46Kl8.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{cloud-only-BkUuI0lZ.js → cloud-only-DrdxC8NV.js} +1 -1
  153. zenml/zen_server/dashboard/assets/code-browser-BJYErIjr.js +1 -0
  154. zenml/zen_server/dashboard/assets/{copy-f3XGPPxt.js → copy-CaGlDsUy.js} +1 -1
  155. zenml/zen_server/dashboard/assets/create-stack-u6VyIXZP.js +1 -0
  156. zenml/zen_server/dashboard/assets/{docker-8uj__HHK.js → docker-BFAFXr2_.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{dots-horizontal-sKQlWEni.js → dots-horizontal-C6K59vUm.js} +1 -1
  158. zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
  159. zenml/zen_server/dashboard/assets/form-schemas-DD4OppNK.js +1 -0
  160. zenml/zen_server/dashboard/assets/gcp-Dj6ntk0L.js +1 -0
  161. zenml/zen_server/dashboard/assets/{help-FuHlZwn0.js → help-CwN931fX.js} +1 -1
  162. zenml/zen_server/dashboard/assets/{index-Bd1xgUQG.js → index-5GJ5ysEZ.js} +1 -1
  163. zenml/zen_server/dashboard/assets/index-CnqMjIZT.js +1 -0
  164. zenml/zen_server/dashboard/assets/index-CsIuf3i6.css +1 -0
  165. zenml/zen_server/dashboard/assets/index-Davdjm1d.js +55 -0
  166. zenml/zen_server/dashboard/assets/{index.esm-DT4uyn2i.js → index.esm-BE1uqCX5.js} +1 -1
  167. zenml/zen_server/dashboard/assets/kubernetes-BjbR6D-1.js +1 -0
  168. zenml/zen_server/dashboard/assets/{layout-D6oiSbfd.js → layout-Dru15_XR.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{login-mutation-13A_JSVA.js → login-mutation-TIWnZoJ7.js} +1 -1
  170. zenml/zen_server/dashboard/assets/{logs-CgeE2vZP.js → logs-GiDJXbLS.js} +1 -1
  171. zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
  172. zenml/zen_server/dashboard/assets/{not-found-B0Mmb90p.js → not-found-C_bW_Kkr.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{package-DdkziX79.js → package-DYKZ5jKW.js} +1 -1
  174. zenml/zen_server/dashboard/assets/page-0eecLRNs.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-DugsjcQ_.js → page-BN7n3Dsp.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{page-OFKSPyN7.js → page-BPFkP_IB.js} +1 -1
  177. zenml/zen_server/dashboard/assets/page-BSkbj719.js +1 -0
  178. zenml/zen_server/dashboard/assets/{page-YiF_fNbe.js → page-Bg5X2mLz.js} +1 -1
  179. zenml/zen_server/dashboard/assets/{page-DSTQnBk-.js → page-BhqIV8mu.js} +1 -1
  180. zenml/zen_server/dashboard/assets/page-BxPQz4Q8.js +1 -0
  181. zenml/zen_server/dashboard/assets/{page-DLpOnf7u.js → page-CDG9uQT9.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{page-CCY6yfmu.js → page-CUOBhxxU.js} +1 -1
  183. zenml/zen_server/dashboard/assets/page-CrjI9mjm.js +1 -0
  184. zenml/zen_server/dashboard/assets/page-D4J2Oy-I.js +1 -0
  185. zenml/zen_server/dashboard/assets/{page-TXe1Eo3Z.js → page-D5I0-LSs.js} +1 -1
  186. zenml/zen_server/dashboard/assets/page-D7bwpJvV.js +1 -0
  187. zenml/zen_server/dashboard/assets/page-DCnizFO_.js +9 -0
  188. zenml/zen_server/dashboard/assets/page-DQBv3t8t.js +1 -0
  189. zenml/zen_server/dashboard/assets/page-DYNlbmas.js +1 -0
  190. zenml/zen_server/dashboard/assets/{page-Cgn-6v2Y.js → page-DsKroTLH.js} +1 -1
  191. zenml/zen_server/dashboard/assets/page-DsQOL6ZL.js +1 -0
  192. zenml/zen_server/dashboard/assets/{page-BGwA9B1M.js → page-Dvr6lpJm.js} +1 -1
  193. zenml/zen_server/dashboard/assets/{page-hQaiQXfg.js → page-Dy0EbJQD.js} +1 -1
  194. zenml/zen_server/dashboard/assets/page-DyM2M_wT.js +1 -0
  195. zenml/zen_server/dashboard/assets/page-HXZtxyWq.js +1 -0
  196. zenml/zen_server/dashboard/assets/page-OmVfClGH.js +2 -0
  197. zenml/zen_server/dashboard/assets/{page-RnG-qhv9.js → page-XReFLy-1.js} +1 -1
  198. zenml/zen_server/dashboard/assets/page-t1VWIy6W.js +1 -0
  199. zenml/zen_server/dashboard/assets/{page-BkjAUyTA.js → page-wPiJkPp6.js} +1 -1
  200. zenml/zen_server/dashboard/assets/{page-CxQmQqDw.js → page-wQ8_y5mW.js} +1 -1
  201. zenml/zen_server/dashboard/assets/persist-CnMMI8ls.js +1 -0
  202. zenml/zen_server/dashboard/assets/{persist-3-5nOJ6m.js → persist-g4uRK-v-.js} +1 -1
  203. zenml/zen_server/dashboard/assets/{plus-FB9-lEq_.js → plus-Bc8eLSDM.js} +1 -1
  204. zenml/zen_server/dashboard/assets/{refresh-COb6KYDi.js → refresh-CtPKdk2G.js} +1 -1
  205. zenml/zen_server/dashboard/assets/rocket-SESCGQXm.js +1 -0
  206. zenml/zen_server/dashboard/assets/sharedSchema-Dbpe2oAO.js +14 -0
  207. zenml/zen_server/dashboard/assets/stack-detail-query-fuuoot1D.js +1 -0
  208. zenml/zen_server/dashboard/assets/{terminal-grtjrIEJ.js → terminal-DRIPb4oF.js} +1 -1
  209. zenml/zen_server/dashboard/assets/{trash-Cd5CSFqA.js → trash-DUWZWzse.js} +1 -1
  210. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-B8GB_ubU.js → update-server-settings-mutation-YhoZKgC9.js} +1 -1
  211. zenml/zen_server/dashboard/assets/{url-hcMJkz8p.js → url-DNHuFfYx.js} +1 -1
  212. zenml/zen_server/dashboard/assets/{zod-CnykDKJj.js → zod-uFd1wBcd.js} +1 -1
  213. zenml/zen_server/dashboard/index.html +7 -7
  214. zenml/zen_server/dashboard_legacy/asset-manifest.json +4 -4
  215. zenml/zen_server/dashboard_legacy/index.html +1 -1
  216. zenml/zen_server/dashboard_legacy/{precache-manifest.9c473c96a43298343a7ce1256183123b.js → precache-manifest.123c8e8fafecee40f30294ab26484cf1.js} +4 -4
  217. zenml/zen_server/dashboard_legacy/service-worker.js +1 -1
  218. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js → main.a98a73cf.chunk.js} +2 -2
  219. zenml/zen_server/dashboard_legacy/static/js/{main.463c90b9.chunk.js.map → main.a98a73cf.chunk.js.map} +1 -1
  220. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  221. zenml/zen_server/deploy/helm/README.md +2 -2
  222. zenml/zen_server/routers/service_connectors_endpoints.py +2 -4
  223. zenml/zen_server/routers/workspaces_endpoints.py +20 -66
  224. zenml/zen_server/secure_headers.py +120 -0
  225. zenml/zen_server/template_execution/runner_entrypoint_configuration.py +0 -2
  226. zenml/zen_server/template_execution/utils.py +1 -0
  227. zenml/zen_server/utils.py +0 -100
  228. zenml/zen_server/zen_server_api.py +4 -2
  229. zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
  230. zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
  231. zenml/zen_stores/rest_zen_store.py +4 -21
  232. zenml/zen_stores/schemas/constants.py +16 -0
  233. zenml/zen_stores/schemas/model_schemas.py +9 -3
  234. zenml/zen_stores/schemas/pipeline_run_schemas.py +22 -8
  235. zenml/zen_stores/schemas/step_run_schemas.py +23 -12
  236. zenml/zen_stores/sql_zen_store.py +312 -300
  237. zenml/zen_stores/zen_store_interface.py +0 -16
  238. {zenml_nightly-0.64.0.dev20240809.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/METADATA +9 -11
  239. {zenml_nightly-0.64.0.dev20240809.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/RECORD +242 -214
  240. zenml/models/v2/misc/full_stack.py +0 -129
  241. zenml/new/pipelines/model_utils.py +0 -72
  242. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-ErO9aOgK.js +0 -1
  243. zenml/zen_server/dashboard/assets/AwarenessChannel-CLXo5rKM.js +0 -1
  244. zenml/zen_server/dashboard/assets/Commands-JrcZK-3j.js +0 -1
  245. zenml/zen_server/dashboard/assets/EditSecretDialog-Bd7mFLS4.js +0 -1
  246. zenml/zen_server/dashboard/assets/ProviderRadio-BBqkIuTd.js +0 -1
  247. zenml/zen_server/dashboard/assets/RadioItem-xLhXoiFV.js +0 -1
  248. zenml/zen_server/dashboard/assets/SearchField-C9R0mdaX.js +0 -1
  249. zenml/zen_server/dashboard/assets/SetPassword-52sNxNiO.js +0 -1
  250. zenml/zen_server/dashboard/assets/SuccessStep-DlkItqYG.js +0 -1
  251. zenml/zen_server/dashboard/assets/aws-0_3UsPif.js +0 -1
  252. zenml/zen_server/dashboard/assets/database-cXYNX9tt.js +0 -1
  253. zenml/zen_server/dashboard/assets/file-text-B9JibxTs.js +0 -1
  254. zenml/zen_server/dashboard/assets/index-DaGknux4.css +0 -1
  255. zenml/zen_server/dashboard/assets/index-DhIZtpxB.js +0 -55
  256. zenml/zen_server/dashboard/assets/page-7-v2OBm-.js +0 -1
  257. zenml/zen_server/dashboard/assets/page-B3ozwdD1.js +0 -1
  258. zenml/zen_server/dashboard/assets/page-BnacgBiy.js +0 -1
  259. zenml/zen_server/dashboard/assets/page-BxF_KMQ3.js +0 -2
  260. zenml/zen_server/dashboard/assets/page-C4POHC0K.js +0 -1
  261. zenml/zen_server/dashboard/assets/page-C9kudd44.js +0 -9
  262. zenml/zen_server/dashboard/assets/page-CA1j3GpJ.js +0 -1
  263. zenml/zen_server/dashboard/assets/page-CgTe7Bme.js +0 -1
  264. zenml/zen_server/dashboard/assets/page-D2Goey3H.js +0 -1
  265. zenml/zen_server/dashboard/assets/page-DTysUGOy.js +0 -1
  266. zenml/zen_server/dashboard/assets/page-D_EXUFJb.js +0 -1
  267. zenml/zen_server/dashboard/assets/page-Db15QzsM.js +0 -1
  268. zenml/zen_server/dashboard/assets/page-T2BtjwPl.js +0 -1
  269. zenml/zen_server/dashboard/assets/play-circle-XSkLR12B.js +0 -1
  270. zenml/zen_server/dashboard/assets/sharedSchema-BoYx_B_L.js +0 -14
  271. zenml/zen_server/dashboard/assets/stack-detail-query-B-US_-wa.js +0 -1
  272. {zenml_nightly-0.64.0.dev20240809.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/LICENSE +0 -0
  273. {zenml_nightly-0.64.0.dev20240809.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/WHEEL +0 -0
  274. {zenml_nightly-0.64.0.dev20240809.dist-info → zenml_nightly-0.65.0.dev20240906.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -327,7 +327,7 @@ the Apache License Version 2.0.
327
327
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
328
328
  <br />
329
329
  <br />
330
- 🎉 Version 0.64.0 is out. Check out the release notes
330
+ 🎉 Version 0.65.0 is out. Check out the release notes
331
331
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
332
332
  <br />
333
333
  🖥️ Download our VS Code Extension <a href="https://marketplace.visualstudio.com/items?itemName=ZenML.zenml-vscode">here</a>.
RELEASE_NOTES.md CHANGED
@@ -1,5 +1,69 @@
1
1
  <!-- markdown-link-check-disable -->
2
2
 
3
+ # 0.65.0
4
+
5
+ ## New Features and Improvements
6
+
7
+ ### New Quickstart Experience
8
+
9
+ This example demonstrates how ZenML streamlines the transition of machine learning workflows from local environments to
10
+ cloud-scale operations.
11
+
12
+ ### Run Single Step as a ZenML Pipeline
13
+
14
+ If you want to run just an individual step on your stack, you can simply call the step
15
+ as you would with a normal Python function. ZenML will internally create a pipeline with just your step
16
+ and run it on the active stack.
17
+
18
+ ### Other improvements and fixes
19
+
20
+ * Updated AzureML Step Operator to work with SDKv2 and use Service Connectors
21
+ * Added timestamps to log messages
22
+ * Fixed issue with loading artifacts from artifact store outside of current active artifact store
23
+ * Support of templated names for Model Version (`{date}` and `{time}` are currently supported placeholders)
24
+ * `run_with_accelerate` step wrapper can be used as a Python Decorator on top of ZenML steps
25
+
26
+ ## Breaking changes
27
+
28
+ * Workspace scoped POST endpoint `full-stack` was removed and merged with `stacks` POST endpoint
29
+
30
+
31
+ ## What's Changed
32
+ * Remove broken JIRA sync workflow by @strickvl in https://github.com/zenml-io/zenml/pull/2924
33
+ * Fix Hugging Face Spaces permissions by @strickvl in https://github.com/zenml-io/zenml/pull/2925
34
+ * Fixes for `run_with_accelerate` by @avishniakov in https://github.com/zenml-io/zenml/pull/2935
35
+ * Bump azure skypilot to a stable 0.6.1 by @avishniakov in https://github.com/zenml-io/zenml/pull/2933
36
+ * Add Timestamps to Logs and Update Dashboard URL Message by @htahir1 in https://github.com/zenml-io/zenml/pull/2934
37
+ * Adding 0.64.0 to migration tests by @bcdurak in https://github.com/zenml-io/zenml/pull/2923
38
+ * Removed docker build docs + fixed CLI command for zenml pipeline build list by @htahir1 in https://github.com/zenml-io/zenml/pull/2938
39
+ * Throw an error when running integration installs when uv == False but pip is not installed by @mennoliefstingh in https://github.com/zenml-io/zenml/pull/2930
40
+ * Update AzureML step operator to SDK v2 and add service connector support by @stefannica in https://github.com/zenml-io/zenml/pull/2927
41
+ * Improving the AzureML orchestrator docs by @bcdurak in https://github.com/zenml-io/zenml/pull/2940
42
+ * Update mlflow docs by @htahir1 in https://github.com/zenml-io/zenml/pull/2941
43
+ * Tell users where they can import `DockerSettings` from by @strickvl in https://github.com/zenml-io/zenml/pull/2947
44
+ * Fail early when specifying invalid materializers by @schustmi in https://github.com/zenml-io/zenml/pull/2950
45
+ * Add GitHub Codespaces and VS Code Remote Container support by @htahir1 in https://github.com/zenml-io/zenml/pull/2949
46
+ * Automatically detect whether code download is necessary by @schustmi in https://github.com/zenml-io/zenml/pull/2946
47
+ * Enable running a single step on the active stack by @schustmi in https://github.com/zenml-io/zenml/pull/2942
48
+ * Dynamic (templated) names for model versions by @avishniakov in https://github.com/zenml-io/zenml/pull/2909
49
+ * Adding an orchestrator URL to the AzureML orchestrator by @bcdurak in https://github.com/zenml-io/zenml/pull/2952
50
+ * Update python version of latest docker image by @schustmi in https://github.com/zenml-io/zenml/pull/2954
51
+ * Make `run_with_accelerate` a pythonic decorator by @avishniakov in https://github.com/zenml-io/zenml/pull/2943
52
+ * Bugfix for artifacts coming from a different artifact store by @bcdurak in https://github.com/zenml-io/zenml/pull/2928
53
+ * Stack Request cleanup and improvements by @bcdurak in https://github.com/zenml-io/zenml/pull/2906
54
+ * Silence pydantic protected namespace warnings by @schustmi in https://github.com/zenml-io/zenml/pull/2955
55
+ * Update key for finished onboarding survey by @schustmi in https://github.com/zenml-io/zenml/pull/2956
56
+ * Extend notebook source replacement code to other objects apart from ZenML steps by @schustmi in https://github.com/zenml-io/zenml/pull/2919
57
+ * Fix stack register CLI command by @schustmi in https://github.com/zenml-io/zenml/pull/2958
58
+ * Lightening studio orchestrator by @safoinme in https://github.com/zenml-io/zenml/pull/2931
59
+ * Introduce new quickstart with a focus on Stack switching by @AlexejPenner in https://github.com/zenml-io/zenml/pull/2937
60
+ * Bugfix for the required prompts for the AzureML wizard by @bcdurak in https://github.com/zenml-io/zenml/pull/2959
61
+
62
+ ## New Contributors
63
+ * @mennoliefstingh made their first contribution in https://github.com/zenml-io/zenml/pull/2930
64
+
65
+ **Full Changelog**: https://github.com/zenml-io/zenml/compare/0.64.0...0.65.0
66
+
3
67
  # 0.64.0
4
68
 
5
69
  ## New Features and Improvements
@@ -731,7 +795,7 @@ by adding support for `Schedule.start_time` to the HyperAI orchestrator.
731
795
  ## What's Changed
732
796
  * Really run migration testing by @avishniakov in https://github.com/zenml-io/zenml/pull/2562
733
797
  * Interact with feature gate by @AlexejPenner in https://github.com/zenml-io/zenml/pull/2492
734
- * Allow for logs to be unformatted / without colours by @strickvl in https://github.com/zenml-io/zenml/pull/2544
798
+ * Allow for logs to be unformatted / without colors by @strickvl in https://github.com/zenml-io/zenml/pull/2544
735
799
  * Add VS Code extension to README / docs by @strickvl in https://github.com/zenml-io/zenml/pull/2568
736
800
  * Allow loading of artifacts without needing to activate the artifact store (again) by @avishniakov in https://github.com/zenml-io/zenml/pull/2545
737
801
  * Minor fix by @htahir1 in https://github.com/zenml-io/zenml/pull/2578
@@ -1302,7 +1366,7 @@ and some improvements to the Model Control Plane.
1302
1366
  ## What's Changed
1303
1367
  * Bump aquasecurity/trivy-action from 0.16.0 to 0.16.1 by @dependabot in https://github.com/zenml-io/zenml/pull/2244
1304
1368
  * Bump crate-ci/typos from 1.16.26 to 1.17.0 by @dependabot in https://github.com/zenml-io/zenml/pull/2245
1305
- * Add YAML formatting standardisation to formatting & linting scripts by @strickvl in https://github.com/zenml-io/zenml/pull/2224
1369
+ * Add YAML formatting standardization to formatting & linting scripts by @strickvl in https://github.com/zenml-io/zenml/pull/2224
1306
1370
  * Remove text annotation by @strickvl in https://github.com/zenml-io/zenml/pull/2246
1307
1371
  * Add MariaDB migration testing by @strickvl in https://github.com/zenml-io/zenml/pull/2170
1308
1372
  * Delete artifact links from model version via Client, ModelVersion and API by @avishniakov in https://github.com/zenml-io/zenml/pull/2191
@@ -1383,7 +1447,7 @@ which allows you to define custom blocks for the Slack message.
1383
1447
  * Bump google-github-actions/auth from 1 to 2 by @dependabot in https://github.com/zenml-io/zenml/pull/2203
1384
1448
  * Bump aws-actions/amazon-ecr-login from 1 to 2 by @dependabot in https://github.com/zenml-io/zenml/pull/2200
1385
1449
  * Bump crate-ci/typos from 1.16.25 to 1.16.26 by @dependabot in https://github.com/zenml-io/zenml/pull/2207
1386
- * Fix unreliable test behaviour when using hypothesis by @strickvl in https://github.com/zenml-io/zenml/pull/2208
1450
+ * Fix unreliable test behavior when using hypothesis by @strickvl in https://github.com/zenml-io/zenml/pull/2208
1387
1451
  * Added more pod spec properties for k8s orchestrator by @htahir1 in https://github.com/zenml-io/zenml/pull/2097
1388
1452
  * Fix API docs environment setup by @strickvl in https://github.com/zenml-io/zenml/pull/2190
1389
1453
  * Use placeholder runs to show pipeline runs in the dashboard without delay by @schustmi in https://github.com/zenml-io/zenml/pull/2048
@@ -2602,7 +2666,7 @@ improvements and bug fixes.
2602
2666
  * Delete extra word from `bentoml` docs by @strickvl in https://github.com/zenml-io/zenml/pull/1484
2603
2667
  * Remove top-level config from recommended repo structure by @schustmi in https://github.com/zenml-io/zenml/pull/1485
2604
2668
  * Bump `mypy` and `ruff` by @strickvl in https://github.com/zenml-io/zenml/pull/1481
2605
- * ZenML Version Downgrade - Silence Warnning by @safoinme in https://github.com/zenml-io/zenml/pull/1477
2669
+ * ZenML Version Downgrade - Silence Warning by @safoinme in https://github.com/zenml-io/zenml/pull/1477
2606
2670
  * Update ZenServer recipes to include secret stores by @wjayesh in https://github.com/zenml-io/zenml/pull/1483
2607
2671
  * Fix alembic order by @schustmi in https://github.com/zenml-io/zenml/pull/1487
2608
2672
  * Fix source resolving for classes in notebooks by @schustmi in https://github.com/zenml-io/zenml/pull/1486
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.64.0.dev20240809
1
+ 0.65.0.dev20240906
zenml/artifacts/utils.py CHANGED
@@ -710,12 +710,19 @@ def _get_artifact_store_from_response_or_from_active_stack(
710
710
  "BaseArtifactStore",
711
711
  StackComponent.from_model(artifact_store_model),
712
712
  )
713
- except (KeyError, ImportError):
714
- logger.warning(
715
- "Unable to restore artifact store while trying to load artifact "
716
- "`%s`. If this artifact is stored in a remote artifact store, "
717
- "this might lead to issues when trying to load the artifact.",
718
- artifact.id,
713
+ except KeyError:
714
+ raise RuntimeError(
715
+ "Unable to fetch the artifact store with id: "
716
+ f"'{artifact.artifact_store_id}'. Check whether the artifact "
717
+ "store still exists and you have the right permissions to "
718
+ "access it."
719
+ )
720
+ except ImportError:
721
+ raise RuntimeError(
722
+ "Unable to load the implementation of the artifact store with"
723
+ f"id: '{artifact.artifact_store_id}'. Please make sure that "
724
+ "the environment that you are loading this artifact from "
725
+ "has the right dependencies."
719
726
  )
720
727
  return Client().active_stack.artifact_store
721
728
 
zenml/cli/__init__.py CHANGED
@@ -2186,7 +2186,7 @@ zenml service-connector describe SERVICE_CONNECTOR_NAME_ID_OR_PREFIX
2186
2186
 
2187
2187
  You can update a registered service connector by using the `update` command.
2188
2188
  Keep in mind that all service connector updates are validated before being
2189
- applied. If you want to disable this behaviour please use the `--no-verify`
2189
+ applied. If you want to disable this behavior please use the `--no-verify`
2190
2190
  flag.
2191
2191
 
2192
2192
  ```bash
zenml/cli/base.py CHANGED
@@ -79,19 +79,19 @@ class ZenMLProjectTemplateLocation(BaseModel):
79
79
  ZENML_PROJECT_TEMPLATES = dict(
80
80
  e2e_batch=ZenMLProjectTemplateLocation(
81
81
  github_url="zenml-io/template-e2e-batch",
82
- github_tag="2024.06.06", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
82
+ github_tag="2024.08.29", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
83
83
  ),
84
84
  starter=ZenMLProjectTemplateLocation(
85
85
  github_url="zenml-io/template-starter",
86
- github_tag="2024.07.26", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
86
+ github_tag="2024.08.28", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
87
87
  ),
88
88
  nlp=ZenMLProjectTemplateLocation(
89
89
  github_url="zenml-io/template-nlp",
90
- github_tag="2024.08.07", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
90
+ github_tag="2024.08.29", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
91
91
  ),
92
92
  llm_finetuning=ZenMLProjectTemplateLocation(
93
93
  github_url="zenml-io/template-llm-finetuning",
94
- github_tag="2024.06.20", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
94
+ github_tag="2024.08.29", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
95
95
  ),
96
96
  )
97
97
 
zenml/cli/integration.py CHANGED
@@ -247,32 +247,43 @@ def install(
247
247
  Args:
248
248
  integrations: The name of the integration to install the requirements
249
249
  for.
250
- ignore_integration: Integrations to ignore explicitly (passed in separately).
250
+ ignore_integration: Integrations to ignore explicitly (passed in
251
+ separately).
251
252
  force: Force the installation of the required packages.
252
253
  uv: Use uv for package installation (experimental).
253
254
  """
254
- from zenml.cli.utils import is_uv_installed
255
+ from zenml.cli.utils import is_pip_installed, is_uv_installed
255
256
  from zenml.integrations.registry import integration_registry
256
257
 
257
258
  if uv and not is_uv_installed():
258
259
  error(
259
- "UV is not installed but the uv flag was passed in. Please install uv or remove the uv flag."
260
+ "UV is not installed but the uv flag was passed in. Please install "
261
+ "uv or remove the uv flag."
262
+ )
263
+
264
+ if not uv and not is_pip_installed():
265
+ error(
266
+ "Pip is not installed. Please install pip or use the uv flag "
267
+ "(--uv) for package installation."
260
268
  )
261
269
 
262
270
  if not integrations:
263
271
  # no integrations specified, use all registered integrations
264
- integrations = set(integration_registry.integrations.keys())
272
+ integration_set = set(integration_registry.integrations.keys())
265
273
 
266
274
  for i in ignore_integration:
267
275
  try:
268
- integrations.remove(i)
276
+ integration_set.remove(i)
269
277
  except KeyError:
270
278
  error(
271
279
  f"Integration {i} does not exist. Available integrations: "
272
280
  f"{list(integration_registry.integrations.keys())}"
273
281
  )
282
+ else:
283
+ integration_set = set(integrations)
284
+
274
285
  # TODO: remove once python 3.8 is deprecated
275
- if sys.version_info.minor == 8 and "tensorflow" in integrations:
286
+ if sys.version_info.minor == 8 and "tensorflow" in integration_set:
276
287
  warning(
277
288
  "Python 3.8 with TensorFlow is not fully compatible with "
278
289
  "Pydantic 2 requirements. Consider upgrading to a "
@@ -280,9 +291,25 @@ def install(
280
291
  "Tensorflow integration."
281
292
  )
282
293
 
294
+ if sys.version_info.minor == 12 and "tensorflow" in integration_set:
295
+ warning(
296
+ "The TensorFlow integration is not yet compatible with Python "
297
+ "3.12, thus its installation is skipped. Consider using a "
298
+ "different version of Python and stay in touch for further updates."
299
+ )
300
+ integration_set.remove("tensorflow")
301
+
302
+ if sys.version_info.minor == 12 and "deepchecks" in integration_set:
303
+ warning(
304
+ "The Deepchecks integration is not yet compatible with Python "
305
+ "3.12, thus its installation is skipped. Consider using a "
306
+ "different version of Python and stay in touch for further updates."
307
+ )
308
+ integration_set.remove("deepchecks")
309
+
283
310
  requirements = []
284
311
  integrations_to_install = []
285
- for integration_name in integrations:
312
+ for integration_name in integration_set:
286
313
  try:
287
314
  if force or not integration_registry.is_installed(
288
315
  integration_name
@@ -346,12 +373,18 @@ def uninstall(
346
373
  force: Force the uninstallation of the required packages.
347
374
  uv: Use uv for package uninstallation (experimental).
348
375
  """
349
- from zenml.cli.utils import is_uv_installed
376
+ from zenml.cli.utils import is_pip_installed, is_uv_installed
350
377
  from zenml.integrations.registry import integration_registry
351
378
 
352
379
  if uv and not is_uv_installed():
353
380
  error("Package `uv` is not installed. Please install it and retry.")
354
381
 
382
+ if not uv and not is_pip_installed():
383
+ error(
384
+ "Pip is not installed. Please install pip or use the uv flag "
385
+ "(--uv) for package installation."
386
+ )
387
+
355
388
  if not integrations:
356
389
  # no integrations specified, use all registered integrations
357
390
  integrations = tuple(integration_registry.integrations.keys())
@@ -423,12 +456,18 @@ def upgrade(
423
456
  force: Force the installation of the required packages.
424
457
  uv: Use uv for package installation (experimental).
425
458
  """
426
- from zenml.cli.utils import is_uv_installed
459
+ from zenml.cli.utils import is_pip_installed, is_uv_installed
427
460
  from zenml.integrations.registry import integration_registry
428
461
 
429
462
  if uv and not is_uv_installed():
430
463
  error("Package `uv` is not installed. Please install it and retry.")
431
464
 
465
+ if not uv and not is_pip_installed():
466
+ error(
467
+ "Pip is not installed. Please install pip or use the uv flag "
468
+ "(--uv) for package installation."
469
+ )
470
+
432
471
  if not integrations:
433
472
  # no integrations specified, use all registered integrations
434
473
  integrations = set(integration_registry.integrations.keys())
zenml/cli/pipeline.py CHANGED
@@ -516,7 +516,7 @@ def list_pipeline_builds(**kwargs: Any) -> None:
516
516
  client = Client()
517
517
  try:
518
518
  with console.status("Listing pipeline builds...\n"):
519
- pipeline_builds = client.list_builds(**kwargs)
519
+ pipeline_builds = client.list_builds(hydrate=True, **kwargs)
520
520
  except KeyError as err:
521
521
  cli_utils.error(str(err))
522
522
  else:
@@ -526,7 +526,14 @@ def list_pipeline_builds(**kwargs: Any) -> None:
526
526
 
527
527
  cli_utils.print_pydantic_models(
528
528
  pipeline_builds,
529
- exclude_columns=["created", "updated", "user", "workspace"],
529
+ exclude_columns=[
530
+ "created",
531
+ "updated",
532
+ "user",
533
+ "workspace",
534
+ "images",
535
+ "stack_checksum",
536
+ ],
530
537
  )
531
538
 
532
539
 
zenml/cli/stack.py CHANGED
@@ -74,16 +74,16 @@ from zenml.exceptions import (
74
74
  )
75
75
  from zenml.io.fileio import rmtree
76
76
  from zenml.logger import get_logger
77
- from zenml.models import StackFilter
78
- from zenml.models.v2.core.service_connector import (
79
- ServiceConnectorRequest,
80
- ServiceConnectorResponse,
81
- )
82
- from zenml.models.v2.misc.full_stack import (
77
+ from zenml.models import (
83
78
  ComponentInfo,
84
- FullStackRequest,
85
79
  ServiceConnectorInfo,
86
80
  ServiceConnectorResourcesInfo,
81
+ StackFilter,
82
+ StackRequest,
83
+ )
84
+ from zenml.models.v2.core.service_connector import (
85
+ ServiceConnectorRequest,
86
+ ServiceConnectorResponse,
87
87
  )
88
88
  from zenml.service_connectors.service_connector_utils import (
89
89
  get_resources_options_from_resource_model_for_full_stack,
@@ -281,10 +281,11 @@ def register_stack(
281
281
  artifact_store is None or orchestrator is None
282
282
  ):
283
283
  cli_utils.error(
284
- "Only stack using service connector can be registered "
285
- "without specifying an artifact store and an orchestrator. "
286
- "Please specify the artifact store and the orchestrator or "
287
- "the service connector or cloud type settings."
284
+ "The only way to register a stack without specifying an "
285
+ "orchestrator and an artifact store is by using either a provider"
286
+ "(-p/--provider) or an existing service connector "
287
+ "(-sc/--connector). Please specify the artifact store and "
288
+ "the orchestrator or the service connector or cloud type settings."
288
289
  )
289
290
 
290
291
  client = Client()
@@ -294,12 +295,12 @@ def register_stack(
294
295
  cli_utils.error(
295
296
  "You are registering a stack using a service connector, but "
296
297
  "this feature cannot be used with a local ZenML deployment. "
297
- "ZenML needs to be accessible from the cloud provider to allow the "
298
- "stack and its components to be registered automatically. "
299
- "Please deploy ZenML in a remote environment as described in the "
300
- "documentation: https://docs.zenml.io/getting-started/deploying-zenml "
301
- "or use a managed ZenML Pro server instance for quick access to "
302
- "this feature and more: https://www.zenml.io/pro"
298
+ "ZenML needs to be accessible from the cloud provider to allow "
299
+ "the stack and its components to be registered automatically. "
300
+ "Please deploy ZenML in a remote environment as described in "
301
+ "the documentation: https://docs.zenml.io/getting-started/deploying-zenml "
302
+ "or use a managed ZenML Pro server instance for quick access "
303
+ "to this feature and more: https://www.zenml.io/pro"
303
304
  )
304
305
 
305
306
  try:
@@ -315,8 +316,9 @@ def register_stack(
315
316
  pass
316
317
 
317
318
  labels: Dict[str, str] = {}
318
- components: Dict[StackComponentType, Union[UUID, ComponentInfo]] = {}
319
- # cloud flow
319
+ components: Dict[StackComponentType, List[Union[UUID, ComponentInfo]]] = {}
320
+
321
+ # Cloud Flow
320
322
  created_objects: Set[str] = set()
321
323
  service_connector: Optional[Union[UUID, ServiceConnectorInfo]] = None
322
324
  if provider is not None and connector is None:
@@ -339,6 +341,7 @@ def register_stack(
339
341
  )
340
342
  except Exception:
341
343
  pass
344
+
342
345
  if service_connector_response:
343
346
  use_auto_configure = Confirm.ask(
344
347
  f"[bold]{provider.upper()} cloud service connector[/bold] "
@@ -364,8 +367,9 @@ def register_stack(
364
367
  for connector in existing_connectors.items
365
368
  ],
366
369
  headers=["Name"],
367
- prompt_text=f"We found these {provider.upper()} service connectors. "
368
- "Do you want to create a new one or use one of the existing ones?",
370
+ prompt_text=f"We found these {provider.upper()} service "
371
+ "connectors. Do you want to create a new one or use one "
372
+ "of the existing ones?",
369
373
  default_choice="0",
370
374
  allow_zero_be_a_new_object=True,
371
375
  )
@@ -486,7 +490,7 @@ def register_stack(
486
490
  component_info = selected_component.id
487
491
  component_name = selected_component.name
488
492
 
489
- components[component_type] = component_info
493
+ components[component_type] = [component_info]
490
494
  if component_type == StackComponentType.ARTIFACT_STORE:
491
495
  artifact_store = component_name
492
496
  if component_type == StackComponentType.ORCHESTRATOR:
@@ -511,13 +515,15 @@ def register_stack(
511
515
  (StackComponentType.CONTAINER_REGISTRY, container_registry),
512
516
  ]:
513
517
  if component_name_ and component_type_ not in components:
514
- components[component_type_] = client.get_stack_component(
515
- component_type_, component_name_
516
- ).id
518
+ components[component_type_] = [
519
+ client.get_stack_component(
520
+ component_type_, component_name_
521
+ ).id
522
+ ]
517
523
 
518
524
  try:
519
- created_stack = client.zen_store.create_full_stack(
520
- full_stack=FullStackRequest(
525
+ created_stack = client.zen_store.create_stack(
526
+ stack=StackRequest(
521
527
  user=client.active_user.id,
522
528
  workspace=client.active_workspace.id,
523
529
  name=stack_name,
@@ -2471,6 +2477,12 @@ def _get_stack_component_info(
2471
2477
  "Skypilot cluster",
2472
2478
  is_skypilot=True,
2473
2479
  )
2480
+ elif flavor == "azureml":
2481
+ config["subscription_id"] = Prompt.ask(
2482
+ "Enter the subscription ID:"
2483
+ )
2484
+ config["resource_group"] = Prompt.ask("Enter the resource group:")
2485
+ config["workspace"] = Prompt.ask("Enter the workspace name:")
2474
2486
  elif flavor == "vertex":
2475
2487
  config["location"] = query_region(
2476
2488
  StackDeploymentProvider.GCP, "Vertex AI job"
zenml/cli/utils.py CHANGED
@@ -1169,6 +1169,19 @@ def is_uv_installed() -> bool:
1169
1169
  return False
1170
1170
 
1171
1171
 
1172
+ def is_pip_installed() -> bool:
1173
+ """Check if pip is installed in the current environment.
1174
+
1175
+ Returns:
1176
+ True if pip is installed, False otherwise.
1177
+ """
1178
+ try:
1179
+ pkg_resources.get_distribution("pip")
1180
+ return True
1181
+ except pkg_resources.DistributionNotFound:
1182
+ return False
1183
+
1184
+
1172
1185
  def pretty_print_secret(
1173
1186
  secret: Dict[str, str],
1174
1187
  hide_secret: bool = True,
zenml/client.py CHANGED
@@ -1522,25 +1522,23 @@ class Client(metaclass=ClientMetaClass):
1522
1522
  stack: The stack to validate.
1523
1523
 
1524
1524
  Raises:
1525
- KeyError: If the stack references missing components.
1526
1525
  ValidationError: If the stack configuration is invalid.
1527
1526
  """
1528
1527
  local_components: List[str] = []
1529
1528
  remote_components: List[str] = []
1530
1529
  assert stack.components is not None
1531
- for component_type, component_ids in stack.components.items():
1532
- for component_id in component_ids:
1533
- try:
1534
- component = self.get_stack_component(
1535
- name_id_or_prefix=component_id,
1530
+ for component_type, components in stack.components.items():
1531
+ for component in components:
1532
+ if isinstance(component, UUID):
1533
+ component_response = self.get_stack_component(
1534
+ name_id_or_prefix=component,
1536
1535
  component_type=component_type,
1537
1536
  )
1538
- except KeyError as e:
1539
- raise KeyError(
1540
- f"Cannot register stack '{stack.name}' since it has an "
1541
- f"unregistered {component_type} with id "
1542
- f"'{component_id}'."
1543
- ) from e
1537
+ component_config = component_response.configuration
1538
+ component_flavor = component_response.flavor
1539
+ else:
1540
+ component_config = component.configuration
1541
+ component_flavor = component.flavor
1544
1542
 
1545
1543
  # Create and validate the configuration
1546
1544
  from zenml.stack.utils import (
@@ -1549,9 +1547,9 @@ class Client(metaclass=ClientMetaClass):
1549
1547
  )
1550
1548
 
1551
1549
  configuration = validate_stack_component_config(
1552
- configuration_dict=component.configuration,
1553
- flavor_name=component.flavor,
1554
- component_type=component.type,
1550
+ configuration_dict=component_config,
1551
+ flavor_name=component_flavor,
1552
+ component_type=component_type,
1555
1553
  # Always enforce validation of custom flavors
1556
1554
  validate_custom_flavors=True,
1557
1555
  )
@@ -1561,11 +1559,11 @@ class Client(metaclass=ClientMetaClass):
1561
1559
  warn_if_config_server_mismatch(configuration)
1562
1560
  if configuration.is_local:
1563
1561
  local_components.append(
1564
- f"{component.type.value}: {component.name}"
1562
+ f"{component_type.value}: {component_flavor}"
1565
1563
  )
1566
1564
  elif configuration.is_remote:
1567
1565
  remote_components.append(
1568
- f"{component.type.value}: {component.name}"
1566
+ f"{component_type.value}: {component_flavor}"
1569
1567
  )
1570
1568
 
1571
1569
  if local_components and remote_components:
@@ -381,6 +381,36 @@ class ServerConfiguration(BaseModel):
381
381
  # Revert to the default value if the header is enabled
382
382
  del data[k]
383
383
 
384
+ # Handle merging of user-defined secure_headers_csp value with the default value
385
+ if "secure_headers_csp" in data:
386
+ user_defined_csp = data["secure_headers_csp"]
387
+ if isinstance(user_defined_csp, str):
388
+ # Parse the user-defined CSP string into a dictionary
389
+ user_defined_csp_dict = {}
390
+ for directive in user_defined_csp.split(";"):
391
+ directive = directive.strip()
392
+ if directive:
393
+ key, value = directive.split(" ", 1)
394
+ user_defined_csp_dict[key] = value.strip("'\"")
395
+
396
+ # Merge the user-defined CSP dictionary with the default CSP dictionary
397
+ default_csp_dict = {}
398
+ for directive in DEFAULT_ZENML_SERVER_SECURE_HEADERS_CSP.split(
399
+ ";"
400
+ ):
401
+ directive = directive.strip()
402
+ if directive:
403
+ key, value = directive.split(" ", 1)
404
+ default_csp_dict[key] = value.strip("'\"")
405
+
406
+ merged_csp_dict = {**default_csp_dict, **user_defined_csp_dict}
407
+
408
+ # Convert the merged CSP dictionary back to a string
409
+ merged_csp_str = "; ".join(
410
+ f"{key} {value}" for key, value in merged_csp_dict.items()
411
+ )
412
+ data["secure_headers_csp"] = merged_csp_str
413
+
384
414
  return data
385
415
 
386
416
  @property
zenml/config/source.py CHANGED
@@ -234,20 +234,16 @@ class NotebookSource(Source):
234
234
  """Source representing an object defined in a notebook.
235
235
 
236
236
  Attributes:
237
- code_path: Path where the notebook cell code for this source is
238
- uploaded.
239
237
  replacement_module: Name of the module from which this source should
240
238
  be loaded in case the code is not running in a notebook.
239
+ artifact_store_id: ID of the artifact store in which the replacement
240
+ module code is stored.
241
241
  """
242
242
 
243
- code_path: Optional[str] = None
244
243
  replacement_module: Optional[str] = None
244
+ artifact_store_id: Optional[UUID] = None
245
245
  type: SourceType = SourceType.NOTEBOOK
246
246
 
247
- # Private attribute that is used to store the code but should not be
248
- # serialized
249
- _cell_code: Optional[str] = None
250
-
251
247
  @field_validator("type")
252
248
  @classmethod
253
249
  def _validate_type(cls, value: SourceType) -> SourceType:
zenml/constants.py CHANGED
@@ -162,7 +162,6 @@ ENV_ZENML_DISABLE_CLIENT_SERVER_MISMATCH_WARNING = (
162
162
  )
163
163
  ENV_ZENML_DISABLE_WORKSPACE_WARNINGS = "ZENML_DISABLE_WORKSPACE_WARNINGS"
164
164
  ENV_ZENML_SKIP_IMAGE_BUILDER_DEFAULT = "ZENML_SKIP_IMAGE_BUILDER_DEFAULT"
165
- ENV_ZENML_REQUIRES_CODE_DOWNLOAD = "ZENML_REQUIRES_CODE_DOWNLOAD"
166
165
  ENV_ZENML_SERVER = "ZENML_SERVER"
167
166
  ENV_ZENML_LOCAL_SERVER = "ZENML_LOCAL_SERVER"
168
167
  ENV_ZENML_ENFORCE_TYPE_ANNOTATIONS = "ZENML_ENFORCE_TYPE_ANNOTATIONS"
@@ -173,6 +172,7 @@ ENV_ZENML_PIPELINE_API_TOKEN_EXPIRES_MINUTES = (
173
172
  )
174
173
  ENV_ZENML_IGNORE_FAILURE_HOOK = "ZENML_IGNORE_FAILURE_HOOK"
175
174
  ENV_ZENML_CUSTOM_SOURCE_ROOT = "ZENML_CUSTOM_SOURCE_ROOT"
175
+ ENV_ZENML_WHEEL_PACKAGE_NAME = "ZENML_WHEEL_PACKAGE_NAME"
176
176
 
177
177
  # ZenML Server environment variables
178
178
  ENV_ZENML_SERVER_PREFIX = "ZENML_SERVER_"
@@ -185,6 +185,9 @@ ENV_ZENML_SERVER_USE_LEGACY_DASHBOARD = (
185
185
  f"{ENV_ZENML_SERVER_PREFIX}USE_LEGACY_DASHBOARD"
186
186
  )
187
187
  ENV_ZENML_SERVER_AUTO_ACTIVATE = f"{ENV_ZENML_SERVER_PREFIX}AUTO_ACTIVATE"
188
+ ENV_ZENML_RUN_SINGLE_STEPS_WITHOUT_STACK = (
189
+ "ZENML_RUN_SINGLE_STEPS_WITHOUT_STACK"
190
+ )
188
191
 
189
192
  # Logging variables
190
193
  IS_DEBUG_ENV: bool = handle_bool_env_var(ENV_ZENML_DEBUG, default=False)
@@ -348,7 +351,6 @@ EMAIL_ANALYTICS = "/email-opt-in"
348
351
  EVENT_FLAVORS = "/event-flavors"
349
352
  EVENT_SOURCES = "/event-sources"
350
353
  FLAVORS = "/flavors"
351
- FULL_STACK = "/full-stack"
352
354
  GET_OR_CREATE = "/get-or-create"
353
355
  GRAPH = "/graph"
354
356
  HEALTH = "/health"
@@ -486,7 +488,7 @@ MAX_RETRIES_FOR_VERSIONED_ENTITY_CREATION = (
486
488
  )
487
489
 
488
490
 
489
- FINISHED_ONBOARDING_SURVEY_KEY = "awareness_channels"
491
+ FINISHED_ONBOARDING_SURVEY_KEY = "finished_onboarding_survey"
490
492
 
491
493
  # Name validation
492
494
  BANNED_NAME_CHARACTERS = "\t\n\r\v\f"