zenml-nightly 0.70.0.dev20241204__py3-none-any.whl → 0.71.0.dev20241207__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 (124) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/config/server_config.py +4 -0
  5. zenml/constants.py +10 -0
  6. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  7. zenml/orchestrators/utils.py +55 -27
  8. zenml/zen_server/auth.py +9 -10
  9. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  10. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  11. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  12. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  13. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  14. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  15. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  16. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  17. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  18. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  19. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  20. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  21. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  22. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  23. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  24. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  25. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  26. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  27. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  28. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  29. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  30. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  31. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  32. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  34. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  35. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  36. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  37. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  40. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  41. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  42. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  43. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  44. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  45. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  46. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  47. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  48. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  50. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  51. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  52. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  53. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  54. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  55. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  57. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  58. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  59. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  60. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  61. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  62. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  63. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  64. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  65. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  66. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  67. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  68. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  69. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  70. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  71. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  72. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  77. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  78. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  79. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  80. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  84. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  85. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  87. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  88. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  89. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  91. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  92. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  96. zenml/zen_server/dashboard/index.html +4 -4
  97. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  98. zenml/zen_server/deploy/helm/README.md +2 -2
  99. zenml/zen_server/routers/auth_endpoints.py +22 -11
  100. zenml/zen_server/routers/steps_endpoints.py +7 -1
  101. zenml/zen_server/template_execution/utils.py +3 -1
  102. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  103. zenml/zen_stores/rest_zen_store.py +8 -3
  104. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
  105. zenml/zen_stores/sql_zen_store.py +5 -1
  106. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/METADATA +5 -5
  107. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/RECORD +110 -101
  108. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  109. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  110. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  111. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  112. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  113. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  114. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  115. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  116. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  117. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  118. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  119. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  120. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  121. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  122. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/LICENSE +0 -0
  123. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.dist-info}/WHEEL +0 -0
  124. {zenml_nightly-0.70.0.dev20241204.dist-info → zenml_nightly-0.71.0.dev20241207.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.dev20241204
1
+ 0.71.0.dev20241207
@@ -27,6 +27,7 @@ from zenml.constants import (
27
27
  DEFAULT_ZENML_SERVER_DEVICE_AUTH_POLLING,
28
28
  DEFAULT_ZENML_SERVER_DEVICE_AUTH_TIMEOUT,
29
29
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME,
30
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME,
30
31
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY,
31
32
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE,
32
33
  DEFAULT_ZENML_SERVER_MAX_DEVICE_AUTH_ATTEMPTS,
@@ -269,6 +270,9 @@ class ServerConfiguration(BaseModel):
269
270
  generic_api_token_lifetime: PositiveInt = (
270
271
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME
271
272
  )
273
+ generic_api_token_max_lifetime: PositiveInt = (
274
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME
275
+ )
272
276
 
273
277
  external_login_url: Optional[str] = None
274
278
  external_user_info_url: Optional[str] = None
zenml/constants.py CHANGED
@@ -170,6 +170,9 @@ ENV_ZENML_DISABLE_STEP_LOGS_STORAGE = "ZENML_DISABLE_STEP_LOGS_STORAGE"
170
170
  ENV_ZENML_IGNORE_FAILURE_HOOK = "ZENML_IGNORE_FAILURE_HOOK"
171
171
  ENV_ZENML_CUSTOM_SOURCE_ROOT = "ZENML_CUSTOM_SOURCE_ROOT"
172
172
  ENV_ZENML_WHEEL_PACKAGE_NAME = "ZENML_WHEEL_PACKAGE_NAME"
173
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
174
+ "ZENML_PIPELINE_API_TOKEN_EXPIRATION"
175
+ )
173
176
 
174
177
  # ZenML Server environment variables
175
178
  ENV_ZENML_SERVER_PREFIX = "ZENML_SERVER_"
@@ -268,6 +271,9 @@ DEFAULT_ZENML_SERVER_PIPELINE_RUN_AUTH_WINDOW = 60 * 48 # 48 hours
268
271
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_MINUTE = 5
269
272
  DEFAULT_ZENML_SERVER_LOGIN_RATE_LIMIT_DAY = 1000
270
273
  DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_LIFETIME = 60 * 60 # 1 hour
274
+ DEFAULT_ZENML_SERVER_GENERIC_API_TOKEN_MAX_LIFETIME = (
275
+ 60 * 60 * 24 * 7
276
+ ) # 7 days
271
277
 
272
278
  DEFAULT_ZENML_SERVER_SECURE_HEADERS_HSTS = (
273
279
  "max-age=63072000; includeSubdomains"
@@ -466,3 +472,7 @@ BANNED_NAME_CHARACTERS = "\t\n\r\v\f"
466
472
 
467
473
 
468
474
  STACK_DEPLOYMENT_API_TOKEN_EXPIRATION = 60 * 6 # 6 hours
475
+
476
+ ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = handle_int_env_var(
477
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION, default=0
478
+ )
@@ -23,7 +23,7 @@ from typing import (
23
23
  cast,
24
24
  )
25
25
 
26
- from pydantic import field_validator
26
+ from pydantic import field_validator, BaseModel
27
27
 
28
28
  from zenml.config.base_settings import BaseSettings
29
29
  from zenml.experiment_trackers.base_experiment_tracker import (
@@ -60,18 +60,26 @@ class WandbExperimentTrackerSettings(BaseSettings):
60
60
  Args:
61
61
  value: The settings.
62
62
 
63
+ Raises:
64
+ ValueError: If converting the settings failed.
65
+
63
66
  Returns:
64
67
  Dict representation of the settings.
65
68
  """
66
69
  import wandb
67
70
 
68
71
  if isinstance(value, wandb.Settings):
69
- # Depending on the wandb version, either `make_static` or `to_dict`
70
- # is available to convert the settings to a dictionary
71
- if hasattr(value, "make_static"):
72
+ # Depending on the wandb version, either `model_dump`,
73
+ # `make_static` or `to_dict` is available to convert the settings
74
+ # to a dictionary
75
+ if isinstance(value, BaseModel):
76
+ return value.model_dump()
77
+ elif hasattr(value, "make_static"):
72
78
  return cast(Dict[str, Any], value.make_static())
73
- else:
79
+ elif hasattr(value, "to_dict"):
74
80
  return value.to_dict()
81
+ else:
82
+ raise ValueError("Unable to convert wandb settings to dict.")
75
83
  else:
76
84
  return value
77
85
 
@@ -26,10 +26,12 @@ from zenml.constants import (
26
26
  ENV_ZENML_ACTIVE_STACK_ID,
27
27
  ENV_ZENML_ACTIVE_WORKSPACE_ID,
28
28
  ENV_ZENML_DISABLE_CREDENTIALS_DISK_CACHING,
29
+ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
29
30
  ENV_ZENML_SERVER,
30
31
  ENV_ZENML_STORE_PREFIX,
32
+ ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
31
33
  )
32
- from zenml.enums import AuthScheme, StackComponentType, StoreType
34
+ from zenml.enums import APITokenType, AuthScheme, StackComponentType, StoreType
33
35
  from zenml.logger import get_logger
34
36
  from zenml.stack import StackComponent
35
37
 
@@ -137,37 +139,63 @@ def get_config_environment_vars(
137
139
  url = global_config.store_configuration.url
138
140
  api_token = credentials_store.get_token(url, allow_expired=False)
139
141
  if schedule_id or pipeline_run_id or step_run_id:
140
- # When connected to an authenticated ZenML server, if a schedule ID,
141
- # pipeline run ID or step run ID is supplied, we need to fetch a new
142
- # workload API token scoped to the schedule, pipeline run or step
143
- # run.
144
142
  assert isinstance(global_config.zen_store, RestZenStore)
145
143
 
146
- # If only a schedule is given, the pipeline run credentials will
147
- # be valid for the entire duration of the schedule.
148
- api_key = credentials_store.get_api_key(url)
149
- if not api_key and not pipeline_run_id and not step_run_id:
144
+ # The user has the option to manually set an expiration for the API
145
+ # token generated for a pipeline run. In this case, we generate a new
146
+ # generic API token that will be valid for the indicated duration.
147
+ if (
148
+ pipeline_run_id
149
+ and ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION != 0
150
+ ):
150
151
  logger.warning(
151
- "An API token without an expiration time will be generated "
152
- "and used to run this pipeline on a schedule. This is very "
153
- "insecure because the API token will be valid for the "
154
- "entire lifetime of the schedule and can be used to access "
155
- "your user account if accidentally leaked. When deploying "
156
- "a pipeline on a schedule, it is strongly advised to use a "
157
- "service account API key to authenticate to the ZenML "
158
- "server instead of your regular user account. For more "
159
- "information, see "
160
- "https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
152
+ f"An unscoped API token will be generated for this pipeline "
153
+ f"run that will expire after "
154
+ f"{ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} "
155
+ f"seconds instead of being scoped to the pipeline run "
156
+ f"and not having an expiration time. This is more insecure "
157
+ f"because the API token will remain valid even after the "
158
+ f"pipeline run completes its execution. This option has "
159
+ "been explicitly enabled by setting the "
160
+ f"{ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION} environment "
161
+ f"variable"
162
+ )
163
+ new_api_token = global_config.zen_store.get_api_token(
164
+ token_type=APITokenType.GENERIC,
165
+ expires_in=ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION,
161
166
  )
162
167
 
163
- # The schedule, pipeline run or step run credentials are scoped to
164
- # the schedule, pipeline run or step run and will only be valid for
165
- # the duration of the schedule/pipeline run/step run.
166
- new_api_token = global_config.zen_store.get_api_token(
167
- schedule_id=schedule_id,
168
- pipeline_run_id=pipeline_run_id,
169
- step_run_id=step_run_id,
170
- )
168
+ else:
169
+ # If a schedule ID, pipeline run ID or step run ID is supplied,
170
+ # we need to fetch a new workload API token scoped to the
171
+ # schedule, pipeline run or step run.
172
+
173
+ # If only a schedule is given, the pipeline run credentials will
174
+ # be valid for the entire duration of the schedule.
175
+ api_key = credentials_store.get_api_key(url)
176
+ if not api_key and not pipeline_run_id and not step_run_id:
177
+ logger.warning(
178
+ "An API token without an expiration time will be generated "
179
+ "and used to run this pipeline on a schedule. This is very "
180
+ "insecure because the API token will be valid for the "
181
+ "entire lifetime of the schedule and can be used to access "
182
+ "your user account if accidentally leaked. When deploying "
183
+ "a pipeline on a schedule, it is strongly advised to use a "
184
+ "service account API key to authenticate to the ZenML "
185
+ "server instead of your regular user account. For more "
186
+ "information, see "
187
+ "https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
188
+ )
189
+
190
+ # The schedule, pipeline run or step run credentials are scoped to
191
+ # the schedule, pipeline run or step run and will only be valid for
192
+ # the duration of the schedule/pipeline run/step run.
193
+ new_api_token = global_config.zen_store.get_api_token(
194
+ token_type=APITokenType.WORKLOAD,
195
+ schedule_id=schedule_id,
196
+ pipeline_run_id=pipeline_run_id,
197
+ step_run_id=step_run_id,
198
+ )
171
199
 
172
200
  environment_vars[ENV_ZENML_STORE_PREFIX + "API_TOKEN"] = (
173
201
  new_api_token
zenml/zen_server/auth.py CHANGED
@@ -413,10 +413,7 @@ def authenticate_credentials(
413
413
  logger.error(error)
414
414
  raise CredentialsNotValid(error)
415
415
 
416
- if pipeline_run_status in [
417
- ExecutionStatus.FAILED,
418
- ExecutionStatus.COMPLETED,
419
- ]:
416
+ if pipeline_run_status.is_finished:
420
417
  error = (
421
418
  f"The execution of pipeline run "
422
419
  f"{decoded_token.pipeline_run_id} has already concluded and "
@@ -461,10 +458,7 @@ def authenticate_credentials(
461
458
  logger.error(error)
462
459
  raise CredentialsNotValid(error)
463
460
 
464
- if step_run_status in [
465
- ExecutionStatus.FAILED,
466
- ExecutionStatus.COMPLETED,
467
- ]:
461
+ if step_run_status.is_finished:
468
462
  error = (
469
463
  f"The execution of step run "
470
464
  f"{decoded_token.step_run_id} has already concluded and "
@@ -821,7 +815,10 @@ def generate_access_token(
821
815
  response: The FastAPI response object.
822
816
  device: The device used for authentication.
823
817
  api_key: The service account API key used for authentication.
824
- expires_in: The number of seconds until the token expires.
818
+ expires_in: The number of seconds until the token expires. If not set,
819
+ the default value is determined automatically based on the server
820
+ configuration and type of token. If set to 0, the token will not
821
+ expire.
825
822
  schedule_id: The ID of the schedule to scope the token to.
826
823
  pipeline_run_id: The ID of the pipeline run to scope the token to.
827
824
  step_run_id: The ID of the step run to scope the token to.
@@ -835,7 +832,9 @@ def generate_access_token(
835
832
  # according to the values configured in the server config. Device tokens are
836
833
  # handled separately from regular user tokens.
837
834
  expires: Optional[datetime] = None
838
- if expires_in:
835
+ if expires_in == 0:
836
+ expires_in = None
837
+ elif expires_in is not None:
839
838
  expires = datetime.utcnow() + timedelta(seconds=expires_in)
840
839
  elif device:
841
840
  # If a device was used for authentication, the token will expire
@@ -1 +1 @@
1
- import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-CCOPpudF.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-CK0KJUen.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};
1
+ import{j as e}from"./@radix-DeK6qiuw.js";import{f as s,r as t}from"./index-FO-p0GU7.js";import{E as r}from"./EmptyState-BzdlCwp3.js";import{S as a}from"./help-Cc9bBIJH.js";import{L as o}from"./@react-router-B3Z5rLr2.js";import"./@tanstack-DT5WLu9C.js";import"./@reactflow-D2Y7BWwz.js";function d(){return e.jsx("div",{className:"flex min-h-screen w-full flex-col",children:e.jsx(r,{icon:e.jsx(a,{className:"h-[120px] w-[120px] fill-neutral-300"}),children:e.jsxs("div",{className:"text-center",children:[e.jsx("h1",{className:"mb-2 text-display-xs font-semibold",children:"We can't find the page you are looking for"}),e.jsx("p",{className:"text-lg text-theme-text-secondary",children:"You can try typing a different URL or we can bring you back to your Homepage."}),e.jsx("div",{className:"mt-5 flex justify-center",children:e.jsx(s,{size:"md",asChild:!0,children:e.jsx(o,{className:"w-min self-center whitespace-nowrap",to:t.home,children:e.jsx("span",{className:"px-0.5",children:"Go to Home"})})})})]})})})}export{d as default};