zenml-nightly 0.82.1.dev20250527__py3-none-any.whl → 0.83.0.dev20250529__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 (316) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/base.py +6 -1
  3. zenml/cli/model.py +16 -36
  4. zenml/cli/server.py +8 -3
  5. zenml/client.py +20 -4
  6. zenml/client_lazy_loader.py +2 -0
  7. zenml/config/docker_settings.py +15 -2
  8. zenml/enums.py +3 -0
  9. zenml/event_hub/event_hub.py +1 -1
  10. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -1
  11. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -1
  12. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +3 -0
  13. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +37 -26
  14. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +45 -4
  15. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +92 -84
  16. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +207 -179
  17. zenml/integrations/skypilot/utils.py +273 -0
  18. zenml/integrations/skypilot_aws/__init__.py +1 -2
  19. zenml/integrations/skypilot_azure/__init__.py +1 -2
  20. zenml/integrations/skypilot_gcp/__init__.py +9 -1
  21. zenml/integrations/skypilot_kubernetes/__init__.py +2 -3
  22. zenml/integrations/skypilot_lambda/__init__.py +1 -2
  23. zenml/login/web_login.py +1 -1
  24. zenml/model/model.py +13 -23
  25. zenml/models/__init__.py +39 -2
  26. zenml/models/v2/base/scoped.py +34 -15
  27. zenml/models/v2/core/artifact.py +10 -9
  28. zenml/models/v2/core/artifact_version.py +16 -16
  29. zenml/models/v2/core/logs.py +8 -50
  30. zenml/models/v2/core/model.py +10 -10
  31. zenml/models/v2/core/model_version.py +155 -88
  32. zenml/models/v2/core/pipeline.py +10 -11
  33. zenml/models/v2/core/pipeline_deployment.py +1 -9
  34. zenml/models/v2/core/pipeline_run.py +10 -17
  35. zenml/models/v2/core/run_template.py +10 -10
  36. zenml/models/v2/core/step_run.py +100 -16
  37. zenml/models/v2/core/tag.py +5 -4
  38. zenml/models/v2/misc/pipeline_run_dag.py +46 -0
  39. zenml/orchestrators/base_orchestrator.py +8 -19
  40. zenml/orchestrators/cache_utils.py +48 -1
  41. zenml/orchestrators/input_utils.py +35 -39
  42. zenml/orchestrators/step_launcher.py +1 -1
  43. zenml/orchestrators/step_run_utils.py +26 -10
  44. zenml/pipelines/pipeline_definition.py +3 -3
  45. zenml/pipelines/run_utils.py +2 -3
  46. zenml/service_connectors/service_connector.py +5 -1
  47. zenml/stack/stack_component.py +1 -4
  48. zenml/steps/step_context.py +1 -1
  49. zenml/utils/dashboard_utils.py +3 -3
  50. zenml/zen_server/auth.py +6 -3
  51. zenml/zen_server/dashboard/assets/{404-_AtuLtaX.js → 404-DmJUgorp.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{@radix-C7hRs6Kx.js → @radix-Cdvw4jJ8.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{@react-router-CNP6g_RL.js → @react-router-DeDfXbUF.js} +5 -5
  54. zenml/zen_server/dashboard/assets/{@reactflow-CQi1Z1Wq.js → @reactflow-8OCk19Fi.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{@tanstack-CSxjHCME.js → @tanstack-5gTMR7G2.js} +4 -4
  56. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CZW4QyWn.js +1 -0
  57. zenml/zen_server/dashboard/assets/ButtonGroup-DFWWFGUE.js +1 -0
  58. zenml/zen_server/dashboard/assets/{CodeSnippet-CvI6D0wx.js → CodeSnippet-D2HkkAGr.js} +1 -1
  59. zenml/zen_server/dashboard/assets/CollapsibleCard-CnS09ljw.js +1 -0
  60. zenml/zen_server/dashboard/assets/{ComponentBadge-DKw7Gndh.js → ComponentBadge-CDgdd0Ks.js} +1 -1
  61. zenml/zen_server/dashboard/assets/ComponentIcon-CbbOc7lb.js +1 -0
  62. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DVvXt-S6.js → DeleteAlertDialog-VIOMDLmx.js} +1 -1
  63. zenml/zen_server/dashboard/assets/DialogItem-ClFCqxEp.js +1 -0
  64. zenml/zen_server/dashboard/assets/{DisplayDate-CYVBBSgr.js → DisplayDate-8RESqe5H.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{EmptyState-M1jafpg6.js → EmptyState-CjrgDtVk.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{Error-BWaXP0VK.js → Error-CQzjbDcN.js} +1 -1
  67. zenml/zen_server/dashboard/assets/ExecutionStatus-CWreILP0.js +1 -0
  68. zenml/zen_server/dashboard/assets/{Helpbox-iE1xLmiZ.js → Helpbox-CiKxG5_X.js} +1 -1
  69. zenml/zen_server/dashboard/assets/Infobox-CGxFvqzi.js +1 -0
  70. zenml/zen_server/dashboard/assets/LeftSideMenu-DCsKdIjC.js +1 -0
  71. zenml/zen_server/dashboard/assets/{Lock-DW-0_M0o.js → Lock-CrIAdQo6.js} +1 -1
  72. zenml/zen_server/dashboard/assets/NestedCollapsible-3M4llYtH.js +1 -0
  73. zenml/zen_server/dashboard/assets/NumberBox-C0mQktmV.js +1 -0
  74. zenml/zen_server/dashboard/assets/Partials-DSjkttlz.js +1 -0
  75. zenml/zen_server/dashboard/assets/{PasswordChecker-lYTOtNom.js → PasswordChecker-B88WjuCe.js} +1 -1
  76. zenml/zen_server/dashboard/assets/ProCta-Dm5cWKpS.js +1 -0
  77. zenml/zen_server/dashboard/assets/{ProviderIcon-DLo7t1lo.js → ProviderIcon-DPwMR6nF.js} +1 -1
  78. zenml/zen_server/dashboard/assets/ProviderRadio-DEDNRgAb.js +1 -0
  79. zenml/zen_server/dashboard/assets/RunsBody-BRBn1e2O.js +1 -0
  80. zenml/zen_server/dashboard/assets/SearchField-DY6-UbRT.js +1 -0
  81. zenml/zen_server/dashboard/assets/SecretTooltip-CZTRnaCV.js +1 -0
  82. zenml/zen_server/dashboard/assets/{SetPassword-DR-EiLI5.js → SetPassword-BjNGDC5e.js} +1 -1
  83. zenml/zen_server/dashboard/assets/SheetHeader-CASpN2Lz.js +1 -0
  84. zenml/zen_server/dashboard/assets/StackComponentList-Be1pQt9m.js +1 -0
  85. zenml/zen_server/dashboard/assets/StackList-BdiR5DvR.js +1 -0
  86. zenml/zen_server/dashboard/assets/StackName-ojLC6xdl.js +1 -0
  87. zenml/zen_server/dashboard/assets/Tabs-DNSKblCM.js +1 -0
  88. zenml/zen_server/dashboard/assets/Tick-BPrWnNlN.js +1 -0
  89. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DbFEaezI.js → UpdatePasswordSchemas-CNfKDo2Q.js} +1 -1
  90. zenml/zen_server/dashboard/assets/UsageReason-Cb-mpV8M.js +1 -0
  91. zenml/zen_server/dashboard/assets/{Wizard-CMI6Ksgz.js → Wizard-Dg8Pmn5A.js} +1 -1
  92. zenml/zen_server/dashboard/assets/WizardFooter-BcNDIvlQ.js +1 -0
  93. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BGASHYtF.js → all-pipeline-runs-query-DCdax7I5.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{arrow-left-CwgF2MEM.js → arrow-left-MRXv5pAH.js} +1 -1
  95. zenml/zen_server/dashboard/assets/bulk-delete-C_kpIB9A.js +3 -0
  96. zenml/zen_server/dashboard/assets/{check-DK77doTf.js → check-B9QMTa3f.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{check-circle-mvyzYvIW.js → check-circle-C4tYvbtw.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{chevron-down-A-rmltmI.js → chevron-down-jbbQh82s.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{chevron-right-double-uNWbJT-C.js → chevron-right-double-Dgp_gEsp.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{clock-CPA5cYxq.js → clock-B_mTG8PH.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{code-browser-j2EpcxIA.js → code-browser-CiD8qkBx.js} +1 -1
  102. zenml/zen_server/dashboard/assets/configuration-form-B2hmKGnF.js +1 -0
  103. zenml/zen_server/dashboard/assets/connectivity-4UKGMYnr.webp +0 -0
  104. zenml/zen_server/dashboard/assets/constants-1EZZxtay.js +1 -0
  105. zenml/zen_server/dashboard/assets/create-stack-TKmMtrkQ.js +1 -0
  106. zenml/zen_server/dashboard/assets/dates-Buh6SMo7.js +1 -0
  107. zenml/zen_server/dashboard/assets/delete-run-CCR9md_s.js +1 -0
  108. zenml/zen_server/dashboard/assets/eye-CbVlAYty.js +1 -0
  109. zenml/zen_server/dashboard/assets/{file-text-BdxZdjP_.js → file-text-Cd8wVfq5.js} +1 -1
  110. zenml/zen_server/dashboard/assets/form-DFJkaFDX.js +1 -0
  111. zenml/zen_server/dashboard/assets/form-schemas-CrznJVzA.js +1 -0
  112. zenml/zen_server/dashboard/assets/{gcp-CHNvgEss.js → gcp-B1I3Qvcx.js} +1 -1
  113. zenml/zen_server/dashboard/assets/{help-DyMolRxD.js → help-Co6aedki.js} +1 -1
  114. zenml/zen_server/dashboard/assets/index-BFqbGSck.js +308 -0
  115. zenml/zen_server/dashboard/assets/{index-CrhdX_qG.js → index-BjUu1mP4.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{index-DR30v9MZ.js → index-DWpiv-Ft.js} +1 -1
  117. zenml/zen_server/dashboard/assets/index-DuhuqTCI.css +1 -0
  118. zenml/zen_server/dashboard/assets/index-U992soPJ.js +1 -0
  119. zenml/zen_server/dashboard/assets/index.es-C1gfATPn.js +14 -0
  120. zenml/zen_server/dashboard/assets/{index.esm-D7jFlf5N.js → index.esm-DhJo3mA6.js} +1 -1
  121. zenml/zen_server/dashboard/assets/info-QkbQz4QU.js +1 -0
  122. zenml/zen_server/dashboard/assets/{key-icon-DO4DPJHZ.js → key-icon-C07HKw8z.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{layout-h3cbx8WZ.js → layout-DBbfEFBe.js} +1 -1
  124. zenml/zen_server/dashboard/assets/layout-Do9YI4QX.js +1 -0
  125. zenml/zen_server/dashboard/assets/login-mutation-D3tFP6Wm.js +1 -0
  126. zenml/zen_server/dashboard/assets/{logs-B5n0U7tB.js → logs-CQKlJjo0.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{package-D1Mhqeh8.js → package-miExReQl.js} +1 -1
  128. zenml/zen_server/dashboard/assets/page-9RjCitFH.js +1 -0
  129. zenml/zen_server/dashboard/assets/page-B0PsXWiT.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-BCrKmYIZ.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-BcRI3-aR.js +29 -0
  132. zenml/zen_server/dashboard/assets/page-Be3R2uYn.js +1 -0
  133. zenml/zen_server/dashboard/assets/page-BgknnddT.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-BrT0_zSJ.js +40 -0
  135. zenml/zen_server/dashboard/assets/page-Bs3W2FDi.js +1 -0
  136. zenml/zen_server/dashboard/assets/page-C210HcBA.js +1 -0
  137. zenml/zen_server/dashboard/assets/page-C6KaiZ_W.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-CAJ8B0vb.js +1 -0
  139. zenml/zen_server/dashboard/assets/page-CAUYrfui.js +1 -0
  140. zenml/zen_server/dashboard/assets/page-CHxVhF3x.js +1 -0
  141. zenml/zen_server/dashboard/assets/{page-CSwZxZMQ.js → page-CN7lkvXr.js} +1 -1
  142. zenml/zen_server/dashboard/assets/page-CUaMMoPG.js +1 -0
  143. zenml/zen_server/dashboard/assets/page-Cal6XQ4U.js +1 -0
  144. zenml/zen_server/dashboard/assets/page-CdZCmszX.js +1 -0
  145. zenml/zen_server/dashboard/assets/page-ChGcZI_6.js +1 -0
  146. zenml/zen_server/dashboard/assets/page-CktmtZ8Z.js +1 -0
  147. zenml/zen_server/dashboard/assets/page-ClvmVesa.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-CnbIYE80.js +1 -0
  149. zenml/zen_server/dashboard/assets/page-CoXzjeEY.js +1 -0
  150. zenml/zen_server/dashboard/assets/page-CtiuMP_r.js +1 -0
  151. zenml/zen_server/dashboard/assets/page-D9Hfx6GV.js +1 -0
  152. zenml/zen_server/dashboard/assets/page-D9iuB88h.js +1 -0
  153. zenml/zen_server/dashboard/assets/page-DCcuPZ8P.js +1 -0
  154. zenml/zen_server/dashboard/assets/page-DEohTSz6.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-DJIGaUQ9.js +1 -0
  156. zenml/zen_server/dashboard/assets/page-DKK6ulgy.js +1 -0
  157. zenml/zen_server/dashboard/assets/page-DNjKHjnH.js +1 -0
  158. zenml/zen_server/dashboard/assets/page-DUK0Nd_1.js +1 -0
  159. zenml/zen_server/dashboard/assets/page-DUKbOhaD.js +1 -0
  160. zenml/zen_server/dashboard/assets/page-DYOucPtA.js +1 -0
  161. zenml/zen_server/dashboard/assets/page-DpqRelAy.js +1 -0
  162. zenml/zen_server/dashboard/assets/{page-ZfTtFicG.js → page-DwVPpCFg.js} +2 -2
  163. zenml/zen_server/dashboard/assets/page-XURWnYZP.js +1 -0
  164. zenml/zen_server/dashboard/assets/page-abw-2oeW.js +1 -0
  165. zenml/zen_server/dashboard/assets/page-akLcPcKw.js +1 -0
  166. zenml/zen_server/dashboard/assets/page-n9ejQ2V3.js +2 -0
  167. zenml/zen_server/dashboard/assets/page-sJjNT9xA.js +6 -0
  168. zenml/zen_server/dashboard/assets/{persist-UUym702q.js → persist-DWMWVP-y.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{persist-D87V82eO.js → persist-Dec_w7aB.js} +1 -1
  170. zenml/zen_server/dashboard/assets/pipeline-CSUlkd50.js +1 -0
  171. zenml/zen_server/dashboard/assets/{plus-COjQg3AG.js → plus-Cl0_rCVF.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-fyoUBS25.js → react-error-boundary.esm-7_MuhCay.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{refresh-CM5T3QeU.js → refresh-BcTM09NW.js} +1 -1
  174. zenml/zen_server/dashboard/assets/resource-tyes-list-o2LXiMay.js +1 -0
  175. zenml/zen_server/dashboard/assets/resource-type-tooltip-DwHrJstL.js +1 -0
  176. zenml/zen_server/dashboard/assets/service-connectors-DSEMwJ5A.js +1 -0
  177. zenml/zen_server/dashboard/assets/{service-BQ9KIhls.js → service-jxtvgks0.js} +2 -2
  178. zenml/zen_server/dashboard/assets/sharedSchema-BXzg0EZz.js +1 -0
  179. zenml/zen_server/dashboard/assets/stack-detail-query-Cm0fsgo-.js +1 -0
  180. zenml/zen_server/dashboard/assets/{terminal-square-DMtel8mb.js → terminal-XFL_4QN-.js} +1 -1
  181. zenml/zen_server/dashboard/assets/terminal-square-XFL_4QN-.js +1 -0
  182. zenml/zen_server/dashboard/assets/transform-CeZdrxDZ.js +1 -0
  183. zenml/zen_server/dashboard/assets/{trash-BWSZ7NRK.js → trash-DP6Tpp_E.js} +1 -1
  184. zenml/zen_server/dashboard/assets/type-guards-CNgPYg8l.js +1 -0
  185. zenml/zen_server/dashboard/assets/update-current-user-mutation-D5MjcQ6F.js +1 -0
  186. zenml/zen_server/dashboard/assets/update-server-settings-mutation-CmnxdxiK.js +1 -0
  187. zenml/zen_server/dashboard/assets/{zod-C0xYeTvL.js → zod-XdS2h1ws.js} +1 -1
  188. zenml/zen_server/dashboard/index.html +7 -7
  189. zenml/zen_server/rbac/utils.py +2 -2
  190. zenml/zen_server/routers/auth_endpoints.py +2 -2
  191. zenml/zen_server/routers/devices_endpoints.py +8 -5
  192. zenml/zen_server/routers/pipeline_deployments_endpoints.py +1 -1
  193. zenml/zen_server/routers/pipelines_endpoints.py +1 -1
  194. zenml/zen_server/routers/run_templates_endpoints.py +3 -3
  195. zenml/zen_server/routers/runs_endpoints.py +35 -0
  196. zenml/zen_server/template_execution/utils.py +6 -6
  197. zenml/zen_stores/dag_generator.py +171 -0
  198. zenml/zen_stores/migrations/versions/0.83.0_release.py +23 -0
  199. zenml/zen_stores/rest_zen_store.py +17 -3
  200. zenml/zen_stores/schemas/action_schemas.py +40 -4
  201. zenml/zen_stores/schemas/api_key_schemas.py +29 -1
  202. zenml/zen_stores/schemas/artifact_schemas.py +168 -48
  203. zenml/zen_stores/schemas/base_schemas.py +26 -1
  204. zenml/zen_stores/schemas/code_repository_schemas.py +46 -5
  205. zenml/zen_stores/schemas/component_schemas.py +44 -3
  206. zenml/zen_stores/schemas/device_schemas.py +43 -2
  207. zenml/zen_stores/schemas/event_source_schemas.py +41 -5
  208. zenml/zen_stores/schemas/flavor_schemas.py +42 -2
  209. zenml/zen_stores/schemas/model_schemas.py +113 -77
  210. zenml/zen_stores/schemas/pipeline_build_schemas.py +53 -4
  211. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +53 -4
  212. zenml/zen_stores/schemas/pipeline_run_schemas.py +111 -47
  213. zenml/zen_stores/schemas/pipeline_schemas.py +41 -9
  214. zenml/zen_stores/schemas/run_template_schemas.py +75 -11
  215. zenml/zen_stores/schemas/schedule_schema.py +50 -5
  216. zenml/zen_stores/schemas/secret_schemas.py +39 -2
  217. zenml/zen_stores/schemas/service_connector_schemas.py +39 -2
  218. zenml/zen_stores/schemas/service_schemas.py +39 -4
  219. zenml/zen_stores/schemas/stack_schemas.py +47 -2
  220. zenml/zen_stores/schemas/step_run_schemas.py +89 -26
  221. zenml/zen_stores/schemas/tag_schemas.py +69 -5
  222. zenml/zen_stores/schemas/trigger_schemas.py +44 -5
  223. zenml/zen_stores/schemas/utils.py +25 -4
  224. zenml/zen_stores/sql_zen_store.py +471 -28
  225. zenml/zen_stores/zen_store_interface.py +9 -1
  226. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/METADATA +2 -2
  227. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/RECORD +230 -222
  228. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BG7-Ki1L.js +0 -1
  229. zenml/zen_server/dashboard/assets/CollapsibleCard-D20FtrzC.js +0 -1
  230. zenml/zen_server/dashboard/assets/Commands-DGbAvMDk.js +0 -1
  231. zenml/zen_server/dashboard/assets/ComponentIcon-ils7uNAk.js +0 -1
  232. zenml/zen_server/dashboard/assets/CsvVizualization-DVN541XF.js +0 -15
  233. zenml/zen_server/dashboard/assets/DialogItem-BHWf3sIB.js +0 -1
  234. zenml/zen_server/dashboard/assets/ExecutionStatus-XrvT2r65.js +0 -1
  235. zenml/zen_server/dashboard/assets/Infobox-D9k5TFH4.js +0 -1
  236. zenml/zen_server/dashboard/assets/InlineAvatar-Cfz4WSLK.js +0 -1
  237. zenml/zen_server/dashboard/assets/MarkdownVisualization-URCyUPcZ.js +0 -14
  238. zenml/zen_server/dashboard/assets/NestedCollapsible-Dor-bi98.js +0 -1
  239. zenml/zen_server/dashboard/assets/NumberBox-D2A7ENHb.js +0 -1
  240. zenml/zen_server/dashboard/assets/Partials-DQJFw1yW.js +0 -1
  241. zenml/zen_server/dashboard/assets/ProBadge-Cp4hb1YT.js +0 -1
  242. zenml/zen_server/dashboard/assets/ProCta-EYoV9CvK.js +0 -1
  243. zenml/zen_server/dashboard/assets/ProviderRadio-BVDA-fAr.js +0 -1
  244. zenml/zen_server/dashboard/assets/RunSelector-BLuBYNJt.js +0 -1
  245. zenml/zen_server/dashboard/assets/RunsBody-W4WHf-sq.js +0 -1
  246. zenml/zen_server/dashboard/assets/SearchField-D-h6jXyg.js +0 -1
  247. zenml/zen_server/dashboard/assets/SecretTooltip-CePCL8kd.js +0 -1
  248. zenml/zen_server/dashboard/assets/StackList-CgmN5H-i.js +0 -1
  249. zenml/zen_server/dashboard/assets/Tabs-DxQ8PDOD.js +0 -1
  250. zenml/zen_server/dashboard/assets/Tick-CEsT3HPR.js +0 -1
  251. zenml/zen_server/dashboard/assets/UsageReason-DjI5qMje.js +0 -1
  252. zenml/zen_server/dashboard/assets/WizardFooter-CFBHFZas.js +0 -1
  253. zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +0 -43
  254. zenml/zen_server/dashboard/assets/configuration-form-BtI2Y4eX.js +0 -1
  255. zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +0 -21
  256. zenml/zen_server/dashboard/assets/constants-DP3ZEnXH.js +0 -1
  257. zenml/zen_server/dashboard/assets/create-stack-BJ6x5rzj.js +0 -1
  258. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +0 -1
  259. zenml/zen_server/dashboard/assets/delete-run-DlSLEl5T.js +0 -1
  260. zenml/zen_server/dashboard/assets/docker-BuDBFEDL.js +0 -1
  261. zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +0 -1
  262. zenml/zen_server/dashboard/assets/flavor-select-BnPxvQDN.js +0 -1
  263. zenml/zen_server/dashboard/assets/form-schemas-CbvoEUHr.js +0 -1
  264. zenml/zen_server/dashboard/assets/index-CFESYpe4.js +0 -1
  265. zenml/zen_server/dashboard/assets/index-CmLcvK2z.js +0 -1
  266. zenml/zen_server/dashboard/assets/index-CzX3ZYlI.css +0 -1
  267. zenml/zen_server/dashboard/assets/index-D2iSHVZq.js +0 -64
  268. zenml/zen_server/dashboard/assets/kubernetes-D6OUjwSK.js +0 -1
  269. zenml/zen_server/dashboard/assets/link-external-DUhCSKNm.js +0 -1
  270. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +0 -1
  271. zenml/zen_server/dashboard/assets/login-mutation-CXc-Klim.js +0 -1
  272. zenml/zen_server/dashboard/assets/not-found-olRU3fnu.js +0 -1
  273. zenml/zen_server/dashboard/assets/page-7keIM1V3.js +0 -1
  274. zenml/zen_server/dashboard/assets/page-B31neFwG.js +0 -1
  275. zenml/zen_server/dashboard/assets/page-B3zo4KYS.js +0 -1
  276. zenml/zen_server/dashboard/assets/page-BN3MHq1a.js +0 -1
  277. zenml/zen_server/dashboard/assets/page-BNgVExjN.js +0 -1
  278. zenml/zen_server/dashboard/assets/page-BPtvu74G.js +0 -1
  279. zenml/zen_server/dashboard/assets/page-BTIuG0ki.js +0 -2
  280. zenml/zen_server/dashboard/assets/page-BcQzleH6.js +0 -1
  281. zenml/zen_server/dashboard/assets/page-C05Jw4M2.js +0 -1
  282. zenml/zen_server/dashboard/assets/page-C28a7K8h.js +0 -1
  283. zenml/zen_server/dashboard/assets/page-C9WLk0X-.js +0 -1
  284. zenml/zen_server/dashboard/assets/page-CINMx64X.js +0 -1
  285. zenml/zen_server/dashboard/assets/page-CYrJbk7P.js +0 -1
  286. zenml/zen_server/dashboard/assets/page-Ce0cqLo3.js +0 -1
  287. zenml/zen_server/dashboard/assets/page-CgNsEkw-.js +0 -1
  288. zenml/zen_server/dashboard/assets/page-Ct2FUYuR.js +0 -1
  289. zenml/zen_server/dashboard/assets/page-D8G2B3Bu.js +0 -1
  290. zenml/zen_server/dashboard/assets/page-DL8a4_lg.js +0 -3
  291. zenml/zen_server/dashboard/assets/page-DMhYn1cF.js +0 -1
  292. zenml/zen_server/dashboard/assets/page-Dd_Yq-Uf.js +0 -6
  293. zenml/zen_server/dashboard/assets/page-DfSvqT8g.js +0 -1
  294. zenml/zen_server/dashboard/assets/page-Dt6ANUTx.js +0 -1
  295. zenml/zen_server/dashboard/assets/page-DtvTleaT.js +0 -1
  296. zenml/zen_server/dashboard/assets/page-DwfGTiVs.js +0 -1
  297. zenml/zen_server/dashboard/assets/page-JgomSTDc.js +0 -1
  298. zenml/zen_server/dashboard/assets/page-L84ig6HB.js +0 -1
  299. zenml/zen_server/dashboard/assets/page-Mabsn4QJ.js +0 -1
  300. zenml/zen_server/dashboard/assets/page-P04L5cm9.js +0 -1
  301. zenml/zen_server/dashboard/assets/page-PfhAnvq4.js +0 -1
  302. zenml/zen_server/dashboard/assets/page-WdRrlNt_.js +0 -1
  303. zenml/zen_server/dashboard/assets/page-cqJDDDeK.js +0 -1
  304. zenml/zen_server/dashboard/assets/page-k-Wxh9L_.js +0 -1
  305. zenml/zen_server/dashboard/assets/page-y-zV4n0c.js +0 -1
  306. zenml/zen_server/dashboard/assets/rocket-Cf-B-XOR.js +0 -1
  307. zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
  308. zenml/zen_server/dashboard/assets/sharedSchema-Bse2agAf.js +0 -14
  309. zenml/zen_server/dashboard/assets/stack-detail-query-BAcZJrN3.js +0 -1
  310. zenml/zen_server/dashboard/assets/tick-circle-m94Aa6Zt.js +0 -1
  311. zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
  312. zenml/zen_server/dashboard/assets/type-guards-CaeD8wHO.js +0 -1
  313. zenml/zen_server/dashboard/assets/update-server-settings-mutation-DwMM1LJz.js +0 -1
  314. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/LICENSE +0 -0
  315. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/WHEEL +0 -0
  316. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/entry_points.txt +0 -0
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.82.1.dev20250527
1
+ 0.83.0.dev20250529
zenml/cli/base.py CHANGED
@@ -610,6 +610,11 @@ def info(
610
610
 
611
611
  store_cfg = gc.store_configuration
612
612
 
613
+ try:
614
+ active_project = client.active_project
615
+ except RuntimeError:
616
+ active_project = None
617
+
613
618
  user_info = {
614
619
  "zenml_local_version": zenml_version,
615
620
  "zenml_server_version": store_info.version,
@@ -622,7 +627,7 @@ def info(
622
627
  "python_version": environment.python_version(),
623
628
  "environment": get_environment(),
624
629
  "system_info": environment.get_system_info(),
625
- "active_project": client.active_project.name,
630
+ "active_project": active_project.name if active_project else None,
626
631
  "active_stack": client.active_stack_model.name,
627
632
  "active_user": client.active_user.name,
628
633
  "telemetry_status": "enabled" if gc.analytics_opt_in else "disabled",
zenml/cli/model.py CHANGED
@@ -68,12 +68,6 @@ def _model_version_to_print(
68
68
  "stage": model_version.stage,
69
69
  "run_metadata": model_version.run_metadata,
70
70
  "tags": [t.name for t in model_version.tags],
71
- "data_artifacts_count": len(model_version.data_artifact_ids),
72
- "model_artifacts_count": len(model_version.model_artifact_ids),
73
- "deployment_artifacts_count": len(
74
- model_version.deployment_artifact_ids
75
- ),
76
- "pipeline_runs_count": len(model_version.pipeline_run_ids),
77
71
  "updated": model_version.updated.date(),
78
72
  }
79
73
 
@@ -601,21 +595,6 @@ def _print_artifacts_links_generic(
601
595
  else "model artifacts"
602
596
  )
603
597
 
604
- if (
605
- (only_data_artifacts and not model_version.data_artifact_ids)
606
- or (
607
- only_deployment_artifacts
608
- and not model_version.deployment_artifact_ids
609
- )
610
- or (only_model_artifacts and not model_version.model_artifact_ids)
611
- ):
612
- cli_utils.declare(f"No {type_} linked to the model version found.")
613
- return
614
-
615
- cli_utils.title(
616
- f"{type_} linked to the model version `{model_version.name}[{model_version.number}]`:"
617
- )
618
-
619
598
  links = Client().list_model_version_artifact_links(
620
599
  model_version_id=model_version.id,
621
600
  only_data_artifacts=only_data_artifacts,
@@ -624,6 +603,13 @@ def _print_artifacts_links_generic(
624
603
  **kwargs,
625
604
  )
626
605
 
606
+ if not links:
607
+ cli_utils.declare(f"No {type_} linked to the model version found.")
608
+ return
609
+
610
+ cli_utils.title(
611
+ f"{type_} linked to the model version `{model_version.name}[{model_version.number}]`:"
612
+ )
627
613
  cli_utils.print_pydantic_models(
628
614
  links,
629
615
  columns=["artifact_version", "created"],
@@ -732,29 +718,23 @@ def list_model_version_pipeline_runs(
732
718
  model_name: The ID or name of the model containing version.
733
719
  model_version: The name, number or ID of the model version. If not
734
720
  provided, the latest version is used.
735
- **kwargs: Keyword arguments to filter models.
721
+ **kwargs: Keyword arguments to filter runs.
736
722
  """
737
723
  model_version_response_model = Client().get_model_version(
738
724
  model_name_or_id=model_name,
739
725
  model_version_name_or_number_or_id=model_version,
740
726
  )
741
727
 
742
- if not model_version_response_model.pipeline_run_ids:
743
- cli_utils.declare("No pipeline runs attached to model version found.")
744
- return
745
- cli_utils.title(
746
- f"Pipeline runs linked to the model version `{model_version_response_model.name}[{model_version_response_model.number}]`:"
747
- )
748
-
749
- links = Client().list_model_version_pipeline_run_links(
728
+ runs = Client().list_model_version_pipeline_run_links(
750
729
  model_version_id=model_version_response_model.id,
751
730
  **kwargs,
752
731
  )
753
732
 
754
- cli_utils.print_pydantic_models(
755
- links,
756
- columns=[
757
- "pipeline_run",
758
- "created",
759
- ],
733
+ if not runs:
734
+ cli_utils.declare("No pipeline runs attached to model version found.")
735
+ return
736
+
737
+ cli_utils.title(
738
+ f"Pipeline runs linked to the model version `{model_version_response_model.name}[{model_version_response_model.number}]`:"
760
739
  )
740
+ cli_utils.print_pydantic_models(runs)
zenml/cli/server.py CHANGED
@@ -268,9 +268,14 @@ def status() -> None:
268
268
  # Write about the active entities
269
269
  scope = "repository" if client.uses_local_configuration else "global"
270
270
  cli_utils.declare(f" The active user is: '{client.active_user.name}'")
271
- cli_utils.declare(
272
- f" The active project is: '{client.active_project.name}'"
273
- )
271
+
272
+ try:
273
+ cli_utils.declare(
274
+ f" The active project is: '{client.active_project.name}' ({scope})"
275
+ )
276
+ except RuntimeError:
277
+ cli_utils.declare(" No active project set.")
278
+
274
279
  cli_utils.declare(
275
280
  f" The active stack is: '{client.active_stack_model.name}' ({scope})"
276
281
  )
zenml/client.py CHANGED
@@ -2573,7 +2573,7 @@ class Client(metaclass=ClientMetaClass):
2573
2573
  self.list_run_templates,
2574
2574
  pipeline_id=pipeline.id,
2575
2575
  stack_id=stack.id if stack else None,
2576
- project=project or pipeline.project.id,
2576
+ project=project or pipeline.project_id,
2577
2577
  )
2578
2578
 
2579
2579
  for template in templates:
@@ -3855,6 +3855,7 @@ class Client(metaclass=ClientMetaClass):
3855
3855
  allow_name_prefix_match: bool = True,
3856
3856
  project: Optional[Union[str, UUID]] = None,
3857
3857
  hydrate: bool = True,
3858
+ include_full_metadata: bool = False,
3858
3859
  ) -> PipelineRunResponse:
3859
3860
  """Gets a pipeline run by name, ID, or prefix.
3860
3861
 
@@ -3864,6 +3865,8 @@ class Client(metaclass=ClientMetaClass):
3864
3865
  project: The project name/ID to filter by.
3865
3866
  hydrate: Flag deciding whether to hydrate the output model(s)
3866
3867
  by including metadata fields in the response.
3868
+ include_full_metadata: If True, include metadata of all steps in
3869
+ the response.
3867
3870
 
3868
3871
  Returns:
3869
3872
  The pipeline run.
@@ -3875,6 +3878,7 @@ class Client(metaclass=ClientMetaClass):
3875
3878
  allow_name_prefix_match=allow_name_prefix_match,
3876
3879
  project=project,
3877
3880
  hydrate=hydrate,
3881
+ include_full_metadata=include_full_metadata,
3878
3882
  )
3879
3883
 
3880
3884
  def list_pipeline_runs(
@@ -3913,6 +3917,7 @@ class Client(metaclass=ClientMetaClass):
3913
3917
  stack: Optional[Union[UUID, str]] = None,
3914
3918
  stack_component: Optional[Union[UUID, str]] = None,
3915
3919
  hydrate: bool = False,
3920
+ include_full_metadata: bool = False,
3916
3921
  ) -> Page[PipelineRunResponse]:
3917
3922
  """List all pipeline runs.
3918
3923
 
@@ -3953,6 +3958,8 @@ class Client(metaclass=ClientMetaClass):
3953
3958
  stack_component: Filter by stack component name/ID.
3954
3959
  hydrate: Flag deciding whether to hydrate the output model(s)
3955
3960
  by including metadata fields in the response.
3961
+ include_full_metadata: If True, include metadata of all steps in
3962
+ the response.
3956
3963
 
3957
3964
  Returns:
3958
3965
  A page with Pipeline Runs fitting the filter description
@@ -3995,6 +4002,7 @@ class Client(metaclass=ClientMetaClass):
3995
4002
  return self.zen_store.list_runs(
3996
4003
  runs_filter_model=runs_filter_model,
3997
4004
  hydrate=hydrate,
4005
+ include_full_metadata=include_full_metadata,
3998
4006
  )
3999
4007
 
4000
4008
  def delete_pipeline_run(
@@ -6368,7 +6376,7 @@ class Client(metaclass=ClientMetaClass):
6368
6376
  model_version=ModelVersionRequest(
6369
6377
  name=name,
6370
6378
  description=description,
6371
- project=model.project.id,
6379
+ project=model.project_id,
6372
6380
  model=model.id,
6373
6381
  tags=tags,
6374
6382
  )
@@ -6623,7 +6631,7 @@ class Client(metaclass=ClientMetaClass):
6623
6631
  if not is_valid_uuid(model_name_or_id):
6624
6632
  model = self.get_model(model_name_or_id, project=project)
6625
6633
  model_name_or_id = model.id
6626
- project = project or model.project.id
6634
+ project = project or model.project_id
6627
6635
  if not is_valid_uuid(version_name_or_id):
6628
6636
  version_name_or_id = self.get_model_version(
6629
6637
  model_name_or_id, version_name_or_id, project=project
@@ -7032,6 +7040,7 @@ class Client(metaclass=ClientMetaClass):
7032
7040
  allow_name_prefix_match: bool = True,
7033
7041
  project: Optional[Union[str, UUID]] = None,
7034
7042
  hydrate: bool = True,
7043
+ **kwargs: Any,
7035
7044
  ) -> AnyResponse:
7036
7045
  """Fetches an entity using the id, name, or partial id/name.
7037
7046
 
@@ -7044,6 +7053,8 @@ class Client(metaclass=ClientMetaClass):
7044
7053
  hydrate: Flag deciding whether to hydrate the output model(s)
7045
7054
  by including metadata fields in the response.
7046
7055
  project: The project name/ID to filter by.
7056
+ **kwargs: Additional keyword arguments to pass to the get and list
7057
+ methods.
7047
7058
 
7048
7059
  Returns:
7049
7060
  The entity with the given name, id or partial id.
@@ -7058,13 +7069,14 @@ class Client(metaclass=ClientMetaClass):
7058
7069
 
7059
7070
  # First interpret as full UUID
7060
7071
  if is_valid_uuid(name_id_or_prefix):
7061
- return get_method(name_id_or_prefix, hydrate=hydrate)
7072
+ return get_method(name_id_or_prefix, hydrate=hydrate, **kwargs)
7062
7073
 
7063
7074
  # If not a UUID, try to find by name
7064
7075
  assert not isinstance(name_id_or_prefix, UUID)
7065
7076
  list_kwargs: Dict[str, Any] = dict(
7066
7077
  name=f"equals:{name_id_or_prefix}",
7067
7078
  hydrate=hydrate,
7079
+ **kwargs,
7068
7080
  )
7069
7081
  scope = ""
7070
7082
  if project:
@@ -7182,6 +7194,7 @@ class Client(metaclass=ClientMetaClass):
7182
7194
  allow_name_prefix_match: bool,
7183
7195
  project: Optional[Union[str, UUID]] = None,
7184
7196
  hydrate: bool = True,
7197
+ **kwargs: Any,
7185
7198
  ) -> AnyResponse:
7186
7199
  """Fetches an entity using a partial ID or name.
7187
7200
 
@@ -7193,6 +7206,8 @@ class Client(metaclass=ClientMetaClass):
7193
7206
  hydrate: Flag deciding whether to hydrate the output model(s)
7194
7207
  by including metadata fields in the response.
7195
7208
  project: The project name/ID to filter by.
7209
+ **kwargs: Additional keyword arguments to pass to the get and list
7210
+ methods.
7196
7211
 
7197
7212
  Returns:
7198
7213
  The entity with the given partial ID or name.
@@ -7206,6 +7221,7 @@ class Client(metaclass=ClientMetaClass):
7206
7221
  "logical_operator": LogicalOperators.OR,
7207
7222
  "id": f"startswith:{partial_id_or_name}",
7208
7223
  "hydrate": hydrate,
7224
+ **kwargs,
7209
7225
  }
7210
7226
  if allow_name_prefix_match:
7211
7227
  list_method_args["name"] = f"startswith:{partial_id_or_name}"
@@ -14,6 +14,7 @@
14
14
  """Lazy loading functionality for Client methods."""
15
15
 
16
16
  import contextlib
17
+ import functools
17
18
  from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type
18
19
 
19
20
  from pydantic import BaseModel, Field
@@ -188,6 +189,7 @@ def evaluate_all_lazy_load_args_in_client_methods(
188
189
  def _evaluate_args(
189
190
  func: Callable[..., Any], is_instance_method: bool
190
191
  ) -> Any:
192
+ @functools.wraps(func)
191
193
  def _inner(*args: Any, **kwargs: Any) -> Any:
192
194
  args_ = list(args)
193
195
  if not is_instance_method:
@@ -72,6 +72,9 @@ class DockerBuildConfig(BaseModel):
72
72
  dockerignore: Optional[str] = None
73
73
 
74
74
 
75
+ _docker_settings_warnings_logged = []
76
+
77
+
75
78
  class DockerSettings(BaseSettings):
76
79
  """Settings for building Docker images to run ZenML pipelines.
77
80
 
@@ -372,6 +375,9 @@ class DockerSettings(BaseSettings):
372
375
  if isinstance(
373
376
  self.replicate_local_python_environment,
374
377
  (str, list, PythonEnvironmentExportMethod),
378
+ ) and (
379
+ "replicate_local_python_environment"
380
+ not in _docker_settings_warnings_logged
375
381
  ):
376
382
  logger.warning(
377
383
  "Specifying a command (`%s`) for "
@@ -383,7 +389,9 @@ class DockerSettings(BaseSettings):
383
389
  "file, use `DockerSettings.pyproject_path` and "
384
390
  "`DockerSettings.pyproject_export_command` instead."
385
391
  )
386
-
392
+ _docker_settings_warnings_logged.append(
393
+ "replicate_local_python_environment"
394
+ )
387
395
  return self
388
396
 
389
397
  @model_validator(mode="before")
@@ -400,7 +408,11 @@ class DockerSettings(BaseSettings):
400
408
  Returns:
401
409
  The validated settings values.
402
410
  """
403
- if "python_package_installer" not in data:
411
+ if (
412
+ "python_package_installer" not in data
413
+ and "python_package_installer"
414
+ not in _docker_settings_warnings_logged
415
+ ):
404
416
  logger.warning(
405
417
  "In a future release, the default Python package installer "
406
418
  "used by ZenML to build container images for your "
@@ -409,6 +421,7 @@ class DockerSettings(BaseSettings):
409
421
  "`python_package_installer=PythonPackageInstaller.PIP` "
410
422
  "in your DockerSettings."
411
423
  )
424
+ _docker_settings_warnings_logged.append("python_package_installer")
412
425
  return data
413
426
 
414
427
  model_config = ConfigDict(
zenml/enums.py CHANGED
@@ -408,6 +408,8 @@ class OnboardingStep(StrEnum):
408
408
  DEVICE_VERIFIED = "device_verified"
409
409
  PROJECT_CREATED = "project_created"
410
410
  PIPELINE_RUN = "pipeline_run"
411
+ SECOND_PIPELINE_RUN = "second_pipeline_run"
412
+ THIRD_PIPELINE_RUN = "third_pipeline_run"
411
413
  STARTER_SETUP_COMPLETED = "starter_setup_completed"
412
414
  STACK_WITH_REMOTE_ORCHESTRATOR_CREATED = (
413
415
  "stack_with_remote_orchestrator_created"
@@ -422,6 +424,7 @@ class OnboardingStep(StrEnum):
422
424
  "pipeline_run_with_remote_artifact_store"
423
425
  )
424
426
  PRODUCTION_SETUP_COMPLETED = "production_setup_completed"
427
+ PRO_ONBOARDING_COMPLETED = "pro_onboarding_completed"
425
428
 
426
429
 
427
430
  class StackDeploymentProvider(StrEnum):
@@ -126,7 +126,7 @@ class InternalEventHub(BaseEventHub):
126
126
  triggers: List[TriggerResponse] = depaginate(
127
127
  self.zen_store.list_triggers,
128
128
  trigger_filter_model=TriggerFilter(
129
- project=event_source.project.id,
129
+ project=event_source.project_id,
130
130
  event_source_id=event_source.id,
131
131
  is_active=True,
132
132
  ),
@@ -326,7 +326,7 @@ class BitbucketWebhookEventSourceHandler(BaseWebhookEventSourceHandler):
326
326
  config: Event source configuration instantiated from the response.
327
327
  """
328
328
  assert isinstance(config, BitbucketWebhookEventSourceConfiguration)
329
- assert event_source.user is not None, (
329
+ assert event_source.user_id is not None, (
330
330
  "User is not set for event source"
331
331
  )
332
332
 
@@ -352,7 +352,7 @@ class GithubWebhookEventSourceHandler(BaseWebhookEventSourceHandler):
352
352
  config: Event source configuration instantiated from the response.
353
353
  """
354
354
  assert isinstance(config, GithubWebhookEventSourceConfiguration)
355
- assert event_source.user is not None, (
355
+ assert event_source.user_id is not None, (
356
356
  "User is not set for event source"
357
357
  )
358
358
 
@@ -67,6 +67,8 @@ class KubernetesOrchestratorSettings(BaseSettings):
67
67
  ttl_seconds_after_finished: The amount of seconds to keep finished jobs
68
68
  before deleting them. This only applies to jobs created when
69
69
  scheduling a pipeline.
70
+ prevent_orchestrator_pod_caching: If `True`, the orchestrator pod will
71
+ not try to compute cached steps before starting the step pods.
70
72
  """
71
73
 
72
74
  synchronous: bool = True
@@ -85,6 +87,7 @@ class KubernetesOrchestratorSettings(BaseSettings):
85
87
  successful_jobs_history_limit: Optional[NonNegativeInt] = None
86
88
  failed_jobs_history_limit: Optional[NonNegativeInt] = None
87
89
  ttl_seconds_after_finished: Optional[NonNegativeInt] = None
90
+ prevent_orchestrator_pod_caching: bool = False
88
91
 
89
92
 
90
93
  class KubernetesOrchestratorConfig(
@@ -74,23 +74,37 @@ def main() -> None:
74
74
  orchestrator_pod_name = socket.gethostname()
75
75
 
76
76
  client = Client()
77
+ active_stack = client.active_stack
78
+ orchestrator = active_stack.orchestrator
79
+ assert isinstance(orchestrator, KubernetesOrchestrator)
77
80
 
78
- deployment_config = client.get_deployment(args.deployment_id)
81
+ deployment = client.get_deployment(args.deployment_id)
82
+ pipeline_settings = cast(
83
+ KubernetesOrchestratorSettings,
84
+ orchestrator.get_settings(deployment),
85
+ )
79
86
 
80
- pipeline_dag = {
81
- step_name: step.spec.upstream_steps
82
- for step_name, step in deployment_config.step_configurations.items()
83
- }
84
87
  step_command = StepEntrypointConfiguration.get_entrypoint_command()
85
88
 
86
- active_stack = client.active_stack
89
+ if args.run_id and not pipeline_settings.prevent_orchestrator_pod_caching:
90
+ from zenml.orchestrators import cache_utils
91
+
92
+ run_required = (
93
+ cache_utils.create_cached_step_runs_and_prune_deployment(
94
+ deployment=deployment,
95
+ pipeline_run=client.get_pipeline_run(args.run_id),
96
+ stack=active_stack,
97
+ )
98
+ )
99
+
100
+ if not run_required:
101
+ return
102
+
87
103
  mount_local_stores = active_stack.orchestrator.config.is_local
88
104
 
89
105
  # Get a Kubernetes client from the active Kubernetes orchestrator, but
90
106
  # override the `incluster` setting to `True` since we are running inside
91
107
  # the Kubernetes cluster.
92
- orchestrator = active_stack.orchestrator
93
- assert isinstance(orchestrator, KubernetesOrchestrator)
94
108
  kube_client = orchestrator.get_kube_client(incluster=True)
95
109
  core_api = k8s_client.CoreV1Api(kube_client)
96
110
 
@@ -121,7 +135,7 @@ def main() -> None:
121
135
  Raises:
122
136
  Exception: If the pod fails to start.
123
137
  """
124
- step_config = deployment_config.step_configurations[step_name].config
138
+ step_config = deployment.step_configurations[step_name].config
125
139
  settings = step_config.settings.get("orchestrator.kubernetes", None)
126
140
  settings = KubernetesOrchestratorSettings.model_validate(
127
141
  settings.model_dump() if settings else {}
@@ -147,10 +161,10 @@ def main() -> None:
147
161
  )
148
162
 
149
163
  image = KubernetesOrchestrator.get_image(
150
- deployment=deployment_config, step_name=step_name
164
+ deployment=deployment, step_name=step_name
151
165
  )
152
166
  step_args = StepEntrypointConfiguration.get_entrypoint_arguments(
153
- step_name=step_name, deployment_id=deployment_config.id
167
+ step_name=step_name, deployment_id=deployment.id
154
168
  )
155
169
 
156
170
  # We set some default minimum memory resource requests for the step pod
@@ -165,9 +179,7 @@ def main() -> None:
165
179
 
166
180
  if orchestrator.config.pass_zenml_token_as_secret:
167
181
  env.pop("ZENML_STORE_API_TOKEN", None)
168
- secret_name = orchestrator.get_token_secret_name(
169
- deployment_config.id
170
- )
182
+ secret_name = orchestrator.get_token_secret_name(deployment.id)
171
183
  pod_settings.env.append(
172
184
  {
173
185
  "name": "ZENML_STORE_API_TOKEN",
@@ -184,7 +196,7 @@ def main() -> None:
184
196
  pod_manifest = build_pod_manifest(
185
197
  pod_name=pod_name,
186
198
  run_name=args.run_name,
187
- pipeline_name=deployment_config.pipeline_configuration.name,
199
+ pipeline_name=deployment.pipeline_configuration.name,
188
200
  image_name=image,
189
201
  command=step_command,
190
202
  args=step_args,
@@ -251,8 +263,8 @@ def main() -> None:
251
263
 
252
264
  pipeline_runs = client.list_pipeline_runs(
253
265
  hydrate=True,
254
- project=deployment_config.project.id,
255
- deployment_id=deployment_config.id,
266
+ project=deployment.project_id,
267
+ deployment_id=deployment.id,
256
268
  **list_args,
257
269
  )
258
270
  if not len(pipeline_runs):
@@ -298,27 +310,26 @@ def main() -> None:
298
310
  parallel_node_startup_waiting_period = (
299
311
  orchestrator.config.parallel_step_startup_waiting_period or 0.0
300
312
  )
301
- settings = cast(
302
- KubernetesOrchestratorSettings,
303
- orchestrator.get_settings(deployment_config),
304
- )
313
+
314
+ pipeline_dag = {
315
+ step_name: step.spec.upstream_steps
316
+ for step_name, step in deployment.step_configurations.items()
317
+ }
305
318
  try:
306
319
  ThreadedDagRunner(
307
320
  dag=pipeline_dag,
308
321
  run_fn=run_step_on_kubernetes,
309
322
  finalize_fn=finalize_run,
310
323
  parallel_node_startup_waiting_period=parallel_node_startup_waiting_period,
311
- max_parallelism=settings.max_parallelism,
324
+ max_parallelism=pipeline_settings.max_parallelism,
312
325
  ).run()
313
326
  logger.info("Orchestration pod completed.")
314
327
  finally:
315
328
  if (
316
329
  orchestrator.config.pass_zenml_token_as_secret
317
- and deployment_config.schedule is None
330
+ and deployment.schedule is None
318
331
  ):
319
- secret_name = orchestrator.get_token_secret_name(
320
- deployment_config.id
321
- )
332
+ secret_name = orchestrator.get_token_secret_name(deployment.id)
322
333
  try:
323
334
  kube_utils.delete_secret(
324
335
  core_api=core_api,
@@ -13,7 +13,7 @@
13
13
  # permissions and limitations under the License.
14
14
  """Skypilot orchestrator base config and settings."""
15
15
 
16
- from typing import Dict, List, Literal, Optional, Union
16
+ from typing import Any, Dict, List, Literal, Optional, Union
17
17
 
18
18
  from pydantic import Field
19
19
 
@@ -67,6 +67,14 @@ class SkypilotBaseOrchestratorSettings(BaseSettings):
67
67
  disk_size: the size of the OS disk in GiB.
68
68
  disk_tier: the disk performance tier to use. If None, defaults to
69
69
  ``'medium'``.
70
+ ports: Ports to expose. Could be an integer, a range, or a list of
71
+ integers and ranges. All ports will be exposed to the public internet.
72
+ labels: Labels to apply to instances as key-value pairs. These are
73
+ mapped to cloud-specific implementations (instance tags in AWS,
74
+ instance labels in GCP, etc.)
75
+ any_of: List of candidate resources to try in order of preference based on
76
+ cost (determined by the optimizer).
77
+ ordered: List of candidate resources to try in the specified order.
70
78
 
71
79
  cluster_name: name of the cluster to create/reuse. If None,
72
80
  auto-generate a name.
@@ -88,6 +96,19 @@ class SkypilotBaseOrchestratorSettings(BaseSettings):
88
96
  stream_logs: if True, show the logs in the terminal.
89
97
  docker_run_args: Optional arguments to pass to the `docker run` command
90
98
  running inside the VM.
99
+ workdir: Working directory to sync to the VM. Synced to ~/sky_workdir.
100
+ task_name: Task name used for display purposes.
101
+ file_mounts: File and storage mounts configuration for remote cluster.
102
+ envs: Environment variables for the task.
103
+ task_settings: Dictionary of arbitrary settings to pass to sky.Task().
104
+ This allows passing future parameters added by SkyPilot without
105
+ requiring updates to ZenML.
106
+ resources_settings: Dictionary of arbitrary settings to pass to
107
+ sky.Resources(). This allows passing future parameters added
108
+ by SkyPilot without requiring updates to ZenML.
109
+ launch_settings: Dictionary of arbitrary settings to pass to
110
+ sky.launch(). This allows passing future parameters added
111
+ by SkyPilot without requiring updates to ZenML.
91
112
  """
92
113
 
93
114
  # Resources
@@ -103,14 +124,18 @@ class SkypilotBaseOrchestratorSettings(BaseSettings):
103
124
  )
104
125
  accelerator_args: Optional[Dict[str, str]] = None
105
126
  use_spot: Optional[bool] = None
106
- job_recovery: Optional[str] = None
127
+ job_recovery: Union[None, str, Dict[str, Any]] = Field(
128
+ default=None, union_mode="left_to_right"
129
+ )
107
130
  region: Optional[str] = None
108
131
  zone: Optional[str] = None
109
132
  image_id: Union[Dict[str, str], str, None] = Field(
110
133
  default=None, union_mode="left_to_right"
111
134
  )
112
135
  disk_size: Optional[int] = None
113
- disk_tier: Optional[Literal["high", "medium", "low"]] = None
136
+ disk_tier: Optional[Literal["high", "medium", "low", "ultra", "best"]] = (
137
+ None
138
+ )
114
139
 
115
140
  # Run settings
116
141
  cluster_name: Optional[str] = None
@@ -118,9 +143,25 @@ class SkypilotBaseOrchestratorSettings(BaseSettings):
118
143
  idle_minutes_to_autostop: Optional[int] = 30
119
144
  down: bool = True
120
145
  stream_logs: bool = True
121
-
122
146
  docker_run_args: List[str] = []
123
147
 
148
+ # Additional SkyPilot features
149
+ ports: Union[None, int, str, List[Union[int, str]]] = Field(
150
+ default=None, union_mode="left_to_right"
151
+ )
152
+ labels: Optional[Dict[str, str]] = None
153
+ any_of: Optional[List[Dict[str, Any]]] = None
154
+ ordered: Optional[List[Dict[str, Any]]] = None
155
+ workdir: Optional[str] = None
156
+ task_name: Optional[str] = None
157
+ file_mounts: Optional[Dict[str, Any]] = None
158
+ envs: Optional[Dict[str, str]] = None
159
+
160
+ # Future-proofing settings dictionaries
161
+ task_settings: Dict[str, Any] = {}
162
+ resources_settings: Dict[str, Any] = {}
163
+ launch_settings: Dict[str, Any] = {}
164
+
124
165
 
125
166
  class SkypilotBaseOrchestratorConfig(
126
167
  BaseOrchestratorConfig, SkypilotBaseOrchestratorSettings