zenml-nightly 0.70.0.dev20241125__py3-none-any.whl → 0.71.0.dev20241220__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 (254) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/artifact_stores/base_artifact_store.py +2 -2
  5. zenml/artifacts/artifact_config.py +15 -6
  6. zenml/artifacts/utils.py +59 -32
  7. zenml/cli/__init__.py +22 -4
  8. zenml/cli/base.py +5 -5
  9. zenml/cli/login.py +26 -0
  10. zenml/cli/pipeline.py +111 -62
  11. zenml/cli/server.py +20 -20
  12. zenml/cli/service_connectors.py +3 -3
  13. zenml/cli/stack.py +0 -3
  14. zenml/cli/stack_components.py +0 -1
  15. zenml/cli/utils.py +0 -5
  16. zenml/client.py +62 -20
  17. zenml/config/compiler.py +12 -3
  18. zenml/config/pipeline_configurations.py +20 -0
  19. zenml/config/pipeline_run_configuration.py +1 -0
  20. zenml/config/secret_reference_mixin.py +1 -1
  21. zenml/config/server_config.py +4 -0
  22. zenml/config/step_configurations.py +21 -0
  23. zenml/constants.py +10 -0
  24. zenml/enums.py +1 -0
  25. zenml/image_builders/base_image_builder.py +5 -2
  26. zenml/image_builders/build_context.py +7 -16
  27. zenml/image_builders/local_image_builder.py +13 -3
  28. zenml/integrations/__init__.py +1 -0
  29. zenml/integrations/aws/__init__.py +3 -0
  30. zenml/integrations/aws/flavors/__init__.py +6 -0
  31. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  32. zenml/integrations/aws/image_builders/__init__.py +20 -0
  33. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  34. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +14 -6
  35. zenml/integrations/constants.py +1 -0
  36. zenml/integrations/feast/__init__.py +1 -1
  37. zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
  38. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  39. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
  40. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
  41. zenml/integrations/kubernetes/orchestrators/kube_utils.py +46 -2
  42. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +13 -2
  43. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +3 -1
  44. zenml/integrations/kubernetes/orchestrators/manifest_utils.py +3 -2
  45. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -2
  46. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
  47. zenml/integrations/modal/__init__.py +46 -0
  48. zenml/integrations/modal/flavors/__init__.py +26 -0
  49. zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
  50. zenml/integrations/modal/step_operators/__init__.py +22 -0
  51. zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
  52. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  53. zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
  54. zenml/integrations/registry.py +2 -2
  55. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
  56. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  57. zenml/io/filesystem.py +2 -2
  58. zenml/io/local_filesystem.py +3 -3
  59. zenml/materializers/built_in_materializer.py +18 -1
  60. zenml/materializers/structured_string_materializer.py +8 -3
  61. zenml/model/model.py +23 -101
  62. zenml/model/utils.py +21 -17
  63. zenml/models/__init__.py +6 -0
  64. zenml/models/v2/base/filter.py +26 -30
  65. zenml/models/v2/base/scoped.py +258 -5
  66. zenml/models/v2/core/artifact_version.py +21 -29
  67. zenml/models/v2/core/code_repository.py +1 -12
  68. zenml/models/v2/core/component.py +5 -68
  69. zenml/models/v2/core/flavor.py +1 -11
  70. zenml/models/v2/core/model.py +1 -57
  71. zenml/models/v2/core/model_version.py +11 -36
  72. zenml/models/v2/core/model_version_artifact.py +11 -3
  73. zenml/models/v2/core/model_version_pipeline_run.py +14 -3
  74. zenml/models/v2/core/pipeline.py +47 -55
  75. zenml/models/v2/core/pipeline_build.py +67 -12
  76. zenml/models/v2/core/pipeline_deployment.py +0 -10
  77. zenml/models/v2/core/pipeline_run.py +110 -32
  78. zenml/models/v2/core/run_metadata.py +30 -9
  79. zenml/models/v2/core/run_template.py +21 -29
  80. zenml/models/v2/core/schedule.py +0 -10
  81. zenml/models/v2/core/secret.py +0 -14
  82. zenml/models/v2/core/service.py +9 -16
  83. zenml/models/v2/core/service_connector.py +0 -11
  84. zenml/models/v2/core/stack.py +21 -30
  85. zenml/models/v2/core/step_run.py +24 -18
  86. zenml/models/v2/core/trigger.py +19 -3
  87. zenml/models/v2/misc/run_metadata.py +38 -0
  88. zenml/orchestrators/base_orchestrator.py +13 -1
  89. zenml/orchestrators/input_utils.py +19 -6
  90. zenml/orchestrators/output_utils.py +5 -1
  91. zenml/orchestrators/publish_utils.py +12 -5
  92. zenml/orchestrators/step_launcher.py +16 -16
  93. zenml/orchestrators/step_run_utils.py +18 -197
  94. zenml/orchestrators/step_runner.py +40 -3
  95. zenml/orchestrators/utils.py +79 -50
  96. zenml/pipelines/build_utils.py +12 -0
  97. zenml/pipelines/pipeline_decorator.py +4 -0
  98. zenml/pipelines/pipeline_definition.py +26 -8
  99. zenml/pipelines/run_utils.py +9 -5
  100. zenml/service_connectors/service_connector_utils.py +3 -9
  101. zenml/stack/stack_component.py +1 -1
  102. zenml/stack_deployments/aws_stack_deployment.py +22 -0
  103. zenml/steps/base_step.py +11 -1
  104. zenml/steps/entrypoint_function_utils.py +7 -3
  105. zenml/steps/step_decorator.py +4 -0
  106. zenml/steps/utils.py +23 -7
  107. zenml/types.py +4 -0
  108. zenml/utils/archivable.py +65 -36
  109. zenml/utils/code_utils.py +8 -4
  110. zenml/utils/docker_utils.py +9 -0
  111. zenml/utils/metadata_utils.py +186 -153
  112. zenml/utils/string_utils.py +41 -16
  113. zenml/utils/visualization_utils.py +4 -1
  114. zenml/zen_server/auth.py +9 -10
  115. zenml/zen_server/cloud_utils.py +3 -1
  116. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  119. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  120. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  124. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  125. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  126. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  138. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  139. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  140. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  143. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  144. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  150. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  151. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  152. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  153. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  154. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  156. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  157. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  158. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  159. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  160. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  161. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  162. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  163. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  164. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  165. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  166. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  167. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  168. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  170. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  171. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  172. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  173. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  174. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  177. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  178. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  179. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  180. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  181. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  183. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  184. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  185. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  186. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  187. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  188. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  189. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  190. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  191. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  192. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  193. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  194. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  195. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  196. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  197. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  198. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  199. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  200. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  201. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  202. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  203. zenml/zen_server/dashboard/index.html +4 -4
  204. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  205. zenml/zen_server/deploy/helm/README.md +2 -2
  206. zenml/zen_server/rbac/endpoint_utils.py +6 -4
  207. zenml/zen_server/rbac/models.py +3 -2
  208. zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
  209. zenml/zen_server/rbac/utils.py +4 -7
  210. zenml/zen_server/routers/auth_endpoints.py +22 -11
  211. zenml/zen_server/routers/steps_endpoints.py +7 -1
  212. zenml/zen_server/routers/users_endpoints.py +35 -37
  213. zenml/zen_server/routers/workspaces_endpoints.py +44 -55
  214. zenml/zen_server/template_execution/utils.py +4 -1
  215. zenml/zen_server/utils.py +4 -3
  216. zenml/zen_stores/base_zen_store.py +10 -2
  217. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  218. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  219. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  220. zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
  221. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
  222. zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
  223. zenml/zen_stores/rest_zen_store.py +76 -43
  224. zenml/zen_stores/schemas/__init__.py +5 -1
  225. zenml/zen_stores/schemas/artifact_schemas.py +12 -11
  226. zenml/zen_stores/schemas/component_schemas.py +0 -3
  227. zenml/zen_stores/schemas/model_schemas.py +55 -17
  228. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  229. zenml/zen_stores/schemas/pipeline_run_schemas.py +52 -18
  230. zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
  231. zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
  232. zenml/zen_stores/schemas/step_run_schemas.py +40 -13
  233. zenml/zen_stores/schemas/utils.py +47 -3
  234. zenml/zen_stores/sql_zen_store.py +462 -134
  235. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
  236. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +239 -217
  237. zenml/utils/cloud_utils.py +0 -40
  238. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  239. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  240. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  241. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  242. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  244. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  245. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  247. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  248. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  249. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  250. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  251. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  252. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
  253. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
  254. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -147,7 +147,7 @@ Or, through our CLI command:
147
147
  zenml stack deploy --provider aws
148
148
  ```
149
149
 
150
- Alternatively, if the necessary pieces of infrastructure is already deployed, you can register a cloud stack seamlessly through the stack wizard:
150
+ Alternatively, if the necessary pieces of infrastructure are already deployed, you can register a cloud stack seamlessly through the stack wizard:
151
151
 
152
152
  ```bash
153
153
  zenml stack register <STACK_NAME> --provider aws
@@ -195,9 +195,9 @@ def trainer(training_df: pd.DataFrame) -> Annotated["model", torch.nn.Module]:
195
195
 
196
196
  ![Exploring ZenML Models](/docs/book/.gitbook/assets/readme_mcp.gif)
197
197
 
198
- ### Purpose built for machine learning with integration to you favorite tools
198
+ ### Purpose built for machine learning with integrations to your favorite tools
199
199
 
200
- While ZenML brings a lot of value of the box, it also integrates into your existing tooling and infrastructure without you having to be locked in.
200
+ While ZenML brings a lot of value out of the box, it also integrates into your existing tooling and infrastructure without you having to be locked in.
201
201
 
202
202
  ```python
203
203
  from bentoml._internal.bento import bento
@@ -333,7 +333,7 @@ the Apache License Version 2.0.
333
333
  <a href="https://github.com/zenml-io/zenml-projects">Projects Showcase</a>
334
334
  <br />
335
335
  <br />
336
- 🎉 Version 0.70.0 is out. Check out the release notes
336
+ 🎉 Version 0.71.0 is out. Check out the release notes
337
337
  <a href="https://github.com/zenml-io/zenml/releases">here</a>.
338
338
  <br />
339
339
  🖥️ 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,117 @@
1
1
  <!-- markdown-link-check-disable -->
2
2
 
3
+ # 0.71.0
4
+
5
+ ZenML version 0.71.0 delivers a new Modal step operator integration as its
6
+ core feature, enabling efficient cloud execution for ML pipelines with granular
7
+ hardware configuration options. The release strengthens enterprise capabilities
8
+ through improved token management and dashboard features, while expanding
9
+ artifact handling with dynamic naming and enhanced visualization support.
10
+ Additionally, it includes various infrastructure improvements and bug fixes
11
+ that enhance the platform's stability and usability, particularly around
12
+ Docker connectivity, Kubernetes management, and service connector operations.
13
+
14
+ ## New Feature: Modal Step Operator Integration
15
+
16
+ ZenML now [integrates with Modal](https://modal.com/), bringing lightning-fast
17
+ cloud execution capabilities to your ML pipelines. This new step operator[
18
+ https://docs.zenml.io/stack-components/step-operators/modal] allows you to
19
+ execute individual pipeline steps on Modal's specialized compute instances,
20
+ offering notable speed particularly for Docker image building and hardware
21
+ provisioning. With simple configuration options, you can precisely specify
22
+ hardware requirements like GPU type, CPU count, and memory for each step,
23
+ making it ideal for resource-intensive ML workloads.
24
+
25
+ ## Other Highlights
26
+
27
+ - **Workload API Token Management:** Refactored token management for improved
28
+ security with a generic API token dispenser.
29
+ - **Dashboard Enhancements:**
30
+ - Introduced service account management capabilities.
31
+ - Added API key creation and integration features.
32
+ - **Dynamic Artifact Naming:** Introduced capability to dynamically name
33
+ artifacts.
34
+ - **Visualization Enhancements:** Made dictionaries and lists visualizable,
35
+ added JSON visualization type.
36
+
37
+ ## Additional Features and Improvements
38
+
39
+ - Improved error messages for Docker daemon connectivity
40
+ - Enhanced SageMaker URL handling
41
+ - Simplified model version artifact linkage
42
+ - Added testing for pipeline templates
43
+ - Improved Kubernetes pod and label length management
44
+ - Allowed skipping type annotations for step inputs
45
+ - Enabled using feature service instances instead of just names
46
+
47
+ ## Bug Fixes
48
+
49
+ - Fixed issues with getting out of an inaccessible active stack
50
+ - Fixed race conditions in the service connector type registry
51
+ - Resolved migration test complications
52
+ - Corrected documentation links
53
+ - Fixed artifact store and artifact URI handling
54
+ - Addressed various scalability and compatibility issues
55
+
56
+ ## Documentation Updates
57
+
58
+ - Added documentation redirects
59
+ - Updated PyTorch documentation links
60
+ - Improved service connector documentation
61
+
62
+ ## What's Changed
63
+ * Refactored workload API token management for better security and implemented generic API token dispenser by @stefannica in https://github.com/zenml-io/zenml/pull/3154
64
+ * Add 0.70.0 to the migration tests by @avishniakov in https://github.com/zenml-io/zenml/pull/3190
65
+ * Adjustments to the PR template by @bcdurak in https://github.com/zenml-io/zenml/pull/3194
66
+ * [docs] Fix links in the how-to section of docs by @wjayesh in https://github.com/zenml-io/zenml/pull/3196
67
+ * Fixing sagemaker urls to take the settings into consideration by @bcdurak in https://github.com/zenml-io/zenml/pull/3195
68
+ * Add cached run into testing of migrations by @avishniakov in https://github.com/zenml-io/zenml/pull/3199
69
+ * Fix service connector type registry race conditions by @stefannica in https://github.com/zenml-io/zenml/pull/3202
70
+ * Refactor container resource configuration in Vertex Orchestrator test by @avishniakov in https://github.com/zenml-io/zenml/pull/3203
71
+ * [docs] Add missing redirects by @wjayesh in https://github.com/zenml-io/zenml/pull/3200
72
+ * Add links to `uv` new PyTorch documentation by @strickvl in https://github.com/zenml-io/zenml/pull/3204
73
+ * Fix broken docs link by @strickvl in https://github.com/zenml-io/zenml/pull/3208
74
+ * Bugfix for getting out of an inaccessible active stack with no permissions by @bcdurak in https://github.com/zenml-io/zenml/pull/3198
75
+ * Simplify model version artifact linkage by @schustmi in https://github.com/zenml-io/zenml/pull/3175
76
+ * Reenable macos testing by @avishniakov in https://github.com/zenml-io/zenml/pull/3205
77
+ * Various fixes and improvements by @stefannica in https://github.com/zenml-io/zenml/pull/3211
78
+ * Pass config path during zenml pipeline build by @schustmi in https://github.com/zenml-io/zenml/pull/3212
79
+ * Add test for running templates by @schustmi in https://github.com/zenml-io/zenml/pull/3192
80
+ * Fix service connector docstring by @schustmi in https://github.com/zenml-io/zenml/pull/3216
81
+ * Improve error message when docker daemon is not reachable by @schustmi in https://github.com/zenml-io/zenml/pull/3214
82
+ * Don't run migration for empty updates by @schustmi in https://github.com/zenml-io/zenml/pull/3210
83
+ * Remove `--check` from format script and fix naming by @safoinme in https://github.com/zenml-io/zenml/pull/3218
84
+ * More scalability improvements by @schustmi in https://github.com/zenml-io/zenml/pull/3206
85
+ * Use correct keyword for artifact store open by @schustmi in https://github.com/zenml-io/zenml/pull/3220
86
+ * Fix passing of some sagemaker settings by @schustmi in https://github.com/zenml-io/zenml/pull/3221
87
+ * Add hint when trying to connect with api key by @schustmi in https://github.com/zenml-io/zenml/pull/3222
88
+ * Allow passing None values as parameter for optional complex types by @schustmi in https://github.com/zenml-io/zenml/pull/3215
89
+ * Limit kubernetes pod and label length by @schustmi in https://github.com/zenml-io/zenml/pull/3217
90
+ * Updating the quickstart example to use the new `log_metadata` by @bcdurak in https://github.com/zenml-io/zenml/pull/3188
91
+ * Allow skipping type annotations for step inputs by @schustmi in https://github.com/zenml-io/zenml/pull/3223
92
+ * Modal Step Operator by @strickvl in https://github.com/zenml-io/zenml/pull/2948
93
+ * Add dynamic artifacts naming, documentation and tests by @avishniakov in https://github.com/zenml-io/zenml/pull/3201
94
+ * Run template CLI command and bugfix by @schustmi in https://github.com/zenml-io/zenml/pull/3225
95
+ * Make dicts/lists visualizable and add JSON as viz type by @wjayesh in https://github.com/zenml-io/zenml/pull/2882
96
+ * Instances of the `FeatureService`s are now used instead of only the names of the FeatureServices. by @aiakide in https://github.com/zenml-io/zenml/pull/3209
97
+ * Quickstart fixes by @schustmi in https://github.com/zenml-io/zenml/pull/3227
98
+ * Add missing docs by @schustmi in https://github.com/zenml-io/zenml/pull/3226
99
+ * Misc cleanup by @schustmi in https://github.com/zenml-io/zenml/pull/3229
100
+ * Fix input resolution for steps with dynamic artifact names by @schustmi in https://github.com/zenml-io/zenml/pull/3228
101
+ * Follow-up on the `run_metadata` changes by @bcdurak in https://github.com/zenml-io/zenml/pull/3193
102
+ * Fixed broken links by @htahir1 in https://github.com/zenml-io/zenml/pull/3232
103
+ * Fixed wandb login problem in Quickstart by @htahir1 in https://github.com/zenml-io/zenml/pull/3233
104
+ * Misc bugfixes by @schustmi in https://github.com/zenml-io/zenml/pull/3234
105
+ * Add additional way to fetch docker repo digest by @schustmi in https://github.com/zenml-io/zenml/pull/3231
106
+ * AWS Image Builder implementation by @stefannica in https://github.com/zenml-io/zenml/pull/2904
107
+ * Disable client-side caching for some orchestrators by @schustmi in https://github.com/zenml-io/zenml/pull/3235
108
+ * Fix artifact uris for artifacts with name placeholders by @schustmi in https://github.com/zenml-io/zenml/pull/3237
109
+ * Materializer test fix on Windows by @bcdurak in https://github.com/zenml-io/zenml/pull/3238
110
+ * Fix GET step run endpoint to return unhydrated response if requested by @schustmi in https://github.com/zenml-io/zenml/pull/3240
111
+ * Pipeline run API token fixes and improvements by @stefannica in https://github.com/zenml-io/zenml/pull/3242
112
+
113
+ **Full Changelog**: https://github.com/zenml-io/zenml/compare/0.70.0...0.71.0
114
+
3
115
  # 0.70.0
4
116
 
5
117
  The **ZenML 0.70.0** release includes a significant number of database schema changes and migrations, which means upgrading to this version will require extra caution. As always, please make sure to make a copy of your production database before upgrading.
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.70.0.dev20241125
1
+ 0.71.0.dev20241220
@@ -267,11 +267,11 @@ class BaseArtifactStore(StackComponent):
267
267
 
268
268
  # --- User interface ---
269
269
  @abstractmethod
270
- def open(self, name: PathType, mode: str = "r") -> Any:
270
+ def open(self, path: PathType, mode: str = "r") -> Any:
271
271
  """Open a file at the given path.
272
272
 
273
273
  Args:
274
- name: The path of the file to open.
274
+ path: The path of the file to open.
275
275
  mode: The mode to open the file.
276
276
 
277
277
  Returns:
@@ -45,7 +45,13 @@ class ArtifactConfig(BaseModel):
45
45
  ```
46
46
 
47
47
  Attributes:
48
- name: The name of the artifact.
48
+ name: The name of the artifact:
49
+ - static string e.g. "name"
50
+ - dynamic string e.g. "name_{date}_{time}_{custom_placeholder}"
51
+ If you use any placeholders besides `date` and `time`,
52
+ you need to provide the values for them in the `substitutions`
53
+ argument of the step decorator or the `substitutions` argument
54
+ of `with_options` of the step.
49
55
  version: The version of the artifact.
50
56
  tags: The tags of the artifact.
51
57
  run_metadata: Metadata to add to the artifact.
@@ -98,15 +104,18 @@ class ArtifactConfig(BaseModel):
98
104
  )
99
105
  elif is_model_artifact:
100
106
  logger.warning(
101
- "`ArtifactConfig.is_model_artifact` is deprecated and will be "
102
- "removed soon. Use `ArtifactConfig.artifact_type` instead."
107
+ "`ArtifactConfig(..., is_model_artifact=True)` is deprecated "
108
+ "and will be removed soon. Use `ArtifactConfig(..., "
109
+ "artifact_type=ArtifactType.MODEL)` instead. For more info: "
110
+ "https://docs.zenml.io/user-guide/starter-guide/manage-artifacts"
103
111
  )
104
112
  data.setdefault("artifact_type", ArtifactType.MODEL)
105
113
  elif is_deployment_artifact:
106
114
  logger.warning(
107
- "`ArtifactConfig.is_deployment_artifact` is deprecated and "
108
- "will be removed soon. Use `ArtifactConfig.artifact_type` "
109
- "instead."
115
+ "`ArtifactConfig(..., is_deployment_artifact=True)` is "
116
+ "deprecated and will be removed soon. Use `ArtifactConfig(..., "
117
+ "artifact_type=ArtifactType.SERVICE)` instead. For more info: "
118
+ "https://docs.zenml.io/user-guide/starter-guide/manage-artifacts"
110
119
  )
111
120
  data.setdefault("artifact_type", ArtifactType.SERVICE)
112
121
 
zenml/artifacts/utils.py CHANGED
@@ -14,6 +14,7 @@
14
14
  """Utility functions for handling artifacts."""
15
15
 
16
16
  import base64
17
+ import contextlib
17
18
  import os
18
19
  import tempfile
19
20
  import zipfile
@@ -41,7 +42,6 @@ from zenml.enums import (
41
42
  ArtifactSaveType,
42
43
  ArtifactType,
43
44
  ExecutionStatus,
44
- MetadataResourceTypes,
45
45
  StackComponentType,
46
46
  VisualizationType,
47
47
  )
@@ -404,50 +404,73 @@ def log_artifact_metadata(
404
404
  artifact_version: The version of the artifact to log metadata for. If
405
405
  not provided, when being called inside a step that produces an
406
406
  artifact named `artifact_name`, the metadata will be associated to
407
- the corresponding newly created artifact. Or, if not provided when
408
- being called outside a step, or in a step that does not produce
409
- any artifact named `artifact_name`, the metadata will be associated
410
- to the latest version of that artifact.
407
+ the corresponding newly created artifact.
411
408
 
412
409
  Raises:
413
410
  ValueError: If no artifact name is provided and the function is not
414
411
  called inside a step with a single output, or, if neither an
415
412
  artifact nor an output with the given name exists.
413
+
416
414
  """
417
415
  logger.warning(
418
416
  "The `log_artifact_metadata` function is deprecated and will soon be "
419
- "removed. Please use `log_metadata` instead."
417
+ "removed. Instead, you can consider using: "
418
+ "`log_metadata(metadata={...}, infer_artifact=True, ...)` instead. For more "
419
+ "info: https://docs.zenml.io/how-to/model-management-metrics/track-metrics-metadata/attach-metadata-to-an-artifact"
420
420
  )
421
- try:
421
+
422
+ from zenml import log_metadata
423
+
424
+ if artifact_name and artifact_version:
425
+ assert artifact_name is not None
426
+
427
+ log_metadata(
428
+ metadata=metadata,
429
+ artifact_name=artifact_name,
430
+ artifact_version=artifact_version,
431
+ )
432
+
433
+ step_context = None
434
+ with contextlib.suppress(RuntimeError):
422
435
  step_context = get_step_context()
423
- in_step_outputs = (artifact_name in step_context._outputs) or (
424
- not artifact_name and len(step_context._outputs) == 1
436
+
437
+ if step_context and artifact_name in step_context._outputs.keys():
438
+ log_metadata(
439
+ metadata=metadata,
440
+ artifact_name=artifact_name,
441
+ infer_artifact=True,
425
442
  )
426
- except RuntimeError:
427
- step_context = None
428
- in_step_outputs = False
429
-
430
- if not step_context or not in_step_outputs or artifact_version:
431
- if not artifact_name:
432
- raise ValueError(
433
- "Artifact name must be provided unless the function is called "
434
- "inside a step with a single output."
435
- )
443
+ elif step_context and len(step_context._outputs) == 1:
444
+ single_output_name = list(step_context._outputs.keys())[0]
445
+
446
+ log_metadata(
447
+ metadata=metadata,
448
+ artifact_name=single_output_name,
449
+ infer_artifact=True,
450
+ )
451
+ elif artifact_name:
436
452
  client = Client()
437
- response = client.get_artifact_version(artifact_name, artifact_version)
438
- client.create_run_metadata(
453
+ logger.warning(
454
+ "Deprecation warning! Currently, you are calling "
455
+ "`log_artifact_metadata` from a context, where we use the "
456
+ "`artifact_name` to fetch it and link the metadata to its "
457
+ "latest version. This behavior is deprecated and will be "
458
+ "removed in the future. To circumvent this, please check"
459
+ "the `log_metadata` function."
460
+ )
461
+ artifact_version_model = client.get_artifact_version(
462
+ name_id_or_prefix=artifact_name
463
+ )
464
+ log_metadata(
439
465
  metadata=metadata,
440
- resource_id=response.id,
441
- resource_type=MetadataResourceTypes.ARTIFACT_VERSION,
466
+ artifact_version_id=artifact_version_model.id,
442
467
  )
443
-
444
468
  else:
445
- try:
446
- step_context.add_output_metadata(
447
- metadata=metadata, output_name=artifact_name
448
- )
449
- except StepContextError as e:
450
- raise ValueError(e)
469
+ raise ValueError(
470
+ "You need to call `log_artifact_metadata` either within a step "
471
+ "(potentially with an artifact name) or outside of a step with an "
472
+ "artifact name (and/or version)."
473
+ )
451
474
 
452
475
 
453
476
  # -----------------
@@ -575,7 +598,7 @@ def download_artifact_files_from_response(
575
598
  )
576
599
  file_path = str(Path(artifact.uri) / file_str)
577
600
  with artifact_store.open(
578
- name=file_path, mode="rb"
601
+ file_path, mode="rb"
579
602
  ) as store_file:
580
603
  # Use a loop to read and write chunks of the file
581
604
  # instead of reading the entire file into memory
@@ -689,7 +712,11 @@ def _link_artifact_version_to_the_step_and_model(
689
712
  client.zen_store.update_run_step(
690
713
  step_run_id=step_run.id,
691
714
  step_run_update=StepRunUpdate(
692
- outputs={artifact_version.artifact.name: artifact_version.id}
715
+ outputs={
716
+ artifact_version.artifact.name: [
717
+ artifact_version.id,
718
+ ]
719
+ }
693
720
  ),
694
721
  )
695
722
  error_message = "model"
zenml/cli/__init__.py CHANGED
@@ -1987,7 +1987,7 @@ Secrets management
1987
1987
  ------------------
1988
1988
 
1989
1989
  ZenML offers a way to [securely store secrets associated with your other
1990
- stack components and infrastructure](https://docs.zenml.io/getting-started/deploying-zenml/manage-the-deployed-services/secret-management).
1990
+ stack components and infrastructure](https://docs.zenml.io/getting-started/deploying-zenml/secret-management).
1991
1991
  A ZenML Secret is a collection or grouping of key-value pairs stored by the
1992
1992
  ZenML secrets store. ZenML Secrets are identified by a unique name which
1993
1993
  allows you to fetch or reference them in your pipelines and stacks.
@@ -2083,7 +2083,7 @@ challenge in configuring uninterrupted, secure access to infrastructure
2083
2083
  resources. In ZenML, Service Connectors streamline this process by abstracting
2084
2084
  away the complexity of authentication and help you connect your stack to your
2085
2085
  resources. You can find the full docs on the ZenML service connectors
2086
- [here](https://docs.zenml.io/how-to/auth-management).
2086
+ [here](https://docs.zenml.io/how-to/infrastructure-deployment/auth-management).
2087
2087
 
2088
2088
  The ZenML CLI features a variety of commands to help you manage your service
2089
2089
  connectors. First of all, to explore all the types of service connectors
@@ -2113,7 +2113,7 @@ zenml service-connector register SERVICE_CONNECTOR_NAME \
2113
2113
  ```
2114
2114
 
2115
2115
  For more details on how to create a service connector, please refer to our
2116
- [docs](https://docs.zenml.io/how-to/auth-management).
2116
+ [docs](https://docs.zenml.io/how-to/infrastructure-deployment/auth-management).
2117
2117
 
2118
2118
  To check if your service connector is registered properly, you can `verify` it.
2119
2119
  By doing this, you can both check if it is configured correctly and also, you
@@ -2242,6 +2242,9 @@ export ZENML_STORE_URL=https://...
2242
2242
  export ZENML_STORE_API_KEY=<API_KEY>
2243
2243
  ```
2244
2244
 
2245
+ You don't need to run `zenml login` after setting these two environment
2246
+ variables and can start interacting with your server right away.
2247
+
2245
2248
  To see all the service accounts you've created and their API keys, use the
2246
2249
  following commands:
2247
2250
 
@@ -2364,7 +2367,7 @@ defining the pipeline is not in your current directory, the module path consists
2364
2367
  of the full path to the file, separated by dots, e.g.
2365
2368
  `some_directory.some_file.my_pipeline`.
2366
2369
 
2367
- To [build Docker images for your pipeline](https://docs.zenml.io/how-to/customize-docker-builds)
2370
+ To [build Docker images for your pipeline](https://docs.zenml.io/how-to/infrastructure-deployment/customize-docker-builds)
2368
2371
  without actually running the pipeline, use:
2369
2372
 
2370
2373
  ```bash
@@ -2407,6 +2410,21 @@ stack, use the `--stack` option.
2407
2410
  zenml pipeline run <PIPELINE_SOURCE_PATH> --stack=<STACK_ID_OR_NAME>
2408
2411
  ```
2409
2412
 
2413
+ If you want to create a run template based on your pipeline that can later be used to trigger a run either from the dashboard or through an HTTP request:
2414
+
2415
+ ```bash
2416
+ zenml pipeline create-run-template <PIPELINE_SOURCE_PATH> \
2417
+ --name=<TEMPLATE_NAME>
2418
+
2419
+ To specify a config file, use the `--config/-c` option. If you would like to use a different stack than the active one, use the `--stack` option.
2420
+
2421
+ ```bash
2422
+ zenml pipeline create-run-template <PIPELINE_SOURCE_PATH> \
2423
+ --name=<TEMPLATE_NAME> \
2424
+ --config=<PATH_TO_CONFIG_YAML> \
2425
+ --stack=<STACK_ID_OR_NAME>
2426
+ ```
2427
+
2410
2428
  Tagging your resources with ZenML
2411
2429
  ---------------------------------
2412
2430
 
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.11.20", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
82
+ github_tag="2024.11.28", # 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.10.30", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
86
+ github_tag="2024.11.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.10.30", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
90
+ github_tag="2024.11.28", # 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.11.08", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
94
+ github_tag="2024.11.28", # Make sure it is aligned with .github/workflows/update-templates-to-examples.yml
95
95
  ),
96
96
  )
97
97
 
@@ -264,7 +264,7 @@ def init(
264
264
  f"will only take effect when you're running ZenML from the initialized "
265
265
  f"repository root, or from a subdirectory. For more information on "
266
266
  f"repositories and configurations, please visit "
267
- f"https://docs.zenml.io/user-guide/starter-guide/understand-stacks."
267
+ f"https://docs.zenml.io/user-guide/production-guide/understand-stacks."
268
268
  )
269
269
 
270
270
 
zenml/cli/login.py CHANGED
@@ -14,6 +14,7 @@
14
14
  """CLI for managing ZenML server deployments."""
15
15
 
16
16
  import ipaddress
17
+ import os
17
18
  import re
18
19
  import sys
19
20
  import time
@@ -413,6 +414,27 @@ def connect_to_pro_server(
413
414
  cli_utils.declare(f"Connected to ZenML Pro server: {server.name}.")
414
415
 
415
416
 
417
+ def _fail_if_authentication_environment_variables_set() -> None:
418
+ """Fail if any of the authentication environment variables are set."""
419
+ environment_variables = [
420
+ "ZENML_STORE_URL",
421
+ "ZENML_STORE_API_KEY",
422
+ "ZENML_STORE_USERNAME",
423
+ "ZENML_STORE_PASSWORD",
424
+ ]
425
+
426
+ if any(env_var in os.environ for env_var in environment_variables):
427
+ cli_utils.error(
428
+ "You're running to login/logout while having one of the "
429
+ f"{environment_variables} environment variables set. "
430
+ "If you want to use those environment variables to authenticate "
431
+ "to your ZenML server, there is no need to login/logout, you can "
432
+ "start interacting with your server right away. If you want to use "
433
+ "the `zenml login` command for authentication, please unset these "
434
+ "environment variables first."
435
+ )
436
+
437
+
416
438
  @cli.command(
417
439
  "login",
418
440
  help=(
@@ -670,6 +692,8 @@ def login(
670
692
  dashboard on a public domain. Primarily used for accessing the
671
693
  dashboard in Colab.
672
694
  """
695
+ _fail_if_authentication_environment_variables_set()
696
+
673
697
  if local:
674
698
  if api_key:
675
699
  cli_utils.error(
@@ -849,6 +873,8 @@ def logout(
849
873
  """
850
874
  from zenml.login.credentials_store import get_credentials_store
851
875
 
876
+ _fail_if_authentication_environment_variables_set()
877
+
852
878
  credentials_store = get_credentials_store()
853
879
  gc = GlobalConfiguration()
854
880
  store_cfg = gc.store_configuration