zenml-nightly 0.82.1.dev20250527__py3-none-any.whl → 0.82.1.dev20250528__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 (306) 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/login/web_login.py +1 -1
  15. zenml/model/model.py +13 -23
  16. zenml/models/__init__.py +39 -2
  17. zenml/models/v2/base/scoped.py +34 -15
  18. zenml/models/v2/core/artifact.py +10 -9
  19. zenml/models/v2/core/artifact_version.py +16 -16
  20. zenml/models/v2/core/logs.py +8 -50
  21. zenml/models/v2/core/model.py +10 -10
  22. zenml/models/v2/core/model_version.py +155 -88
  23. zenml/models/v2/core/pipeline.py +10 -11
  24. zenml/models/v2/core/pipeline_deployment.py +1 -9
  25. zenml/models/v2/core/pipeline_run.py +10 -17
  26. zenml/models/v2/core/run_template.py +10 -10
  27. zenml/models/v2/core/step_run.py +100 -16
  28. zenml/models/v2/core/tag.py +5 -4
  29. zenml/models/v2/misc/pipeline_run_dag.py +46 -0
  30. zenml/orchestrators/base_orchestrator.py +8 -19
  31. zenml/orchestrators/cache_utils.py +48 -1
  32. zenml/orchestrators/input_utils.py +35 -39
  33. zenml/orchestrators/step_launcher.py +1 -1
  34. zenml/orchestrators/step_run_utils.py +26 -10
  35. zenml/pipelines/pipeline_definition.py +3 -3
  36. zenml/pipelines/run_utils.py +2 -3
  37. zenml/service_connectors/service_connector.py +5 -1
  38. zenml/stack/stack_component.py +1 -4
  39. zenml/steps/step_context.py +1 -1
  40. zenml/utils/dashboard_utils.py +3 -3
  41. zenml/zen_server/auth.py +6 -3
  42. zenml/zen_server/dashboard/assets/{404-_AtuLtaX.js → 404-DmJUgorp.js} +1 -1
  43. zenml/zen_server/dashboard/assets/{@radix-C7hRs6Kx.js → @radix-Cdvw4jJ8.js} +1 -1
  44. zenml/zen_server/dashboard/assets/{@react-router-CNP6g_RL.js → @react-router-DeDfXbUF.js} +5 -5
  45. zenml/zen_server/dashboard/assets/{@reactflow-CQi1Z1Wq.js → @reactflow-8OCk19Fi.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{@tanstack-CSxjHCME.js → @tanstack-5gTMR7G2.js} +4 -4
  47. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CZW4QyWn.js +1 -0
  48. zenml/zen_server/dashboard/assets/ButtonGroup-DFWWFGUE.js +1 -0
  49. zenml/zen_server/dashboard/assets/{CodeSnippet-CvI6D0wx.js → CodeSnippet-D2HkkAGr.js} +1 -1
  50. zenml/zen_server/dashboard/assets/CollapsibleCard-CnS09ljw.js +1 -0
  51. zenml/zen_server/dashboard/assets/{ComponentBadge-DKw7Gndh.js → ComponentBadge-CDgdd0Ks.js} +1 -1
  52. zenml/zen_server/dashboard/assets/ComponentIcon-CbbOc7lb.js +1 -0
  53. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DVvXt-S6.js → DeleteAlertDialog-VIOMDLmx.js} +1 -1
  54. zenml/zen_server/dashboard/assets/DialogItem-ClFCqxEp.js +1 -0
  55. zenml/zen_server/dashboard/assets/{DisplayDate-CYVBBSgr.js → DisplayDate-8RESqe5H.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{EmptyState-M1jafpg6.js → EmptyState-CjrgDtVk.js} +1 -1
  57. zenml/zen_server/dashboard/assets/{Error-BWaXP0VK.js → Error-CQzjbDcN.js} +1 -1
  58. zenml/zen_server/dashboard/assets/ExecutionStatus-CWreILP0.js +1 -0
  59. zenml/zen_server/dashboard/assets/{Helpbox-iE1xLmiZ.js → Helpbox-CiKxG5_X.js} +1 -1
  60. zenml/zen_server/dashboard/assets/Infobox-CGxFvqzi.js +1 -0
  61. zenml/zen_server/dashboard/assets/LeftSideMenu-DCsKdIjC.js +1 -0
  62. zenml/zen_server/dashboard/assets/{Lock-DW-0_M0o.js → Lock-CrIAdQo6.js} +1 -1
  63. zenml/zen_server/dashboard/assets/NestedCollapsible-3M4llYtH.js +1 -0
  64. zenml/zen_server/dashboard/assets/NumberBox-C0mQktmV.js +1 -0
  65. zenml/zen_server/dashboard/assets/Partials-DSjkttlz.js +1 -0
  66. zenml/zen_server/dashboard/assets/{PasswordChecker-lYTOtNom.js → PasswordChecker-B88WjuCe.js} +1 -1
  67. zenml/zen_server/dashboard/assets/ProCta-Dm5cWKpS.js +1 -0
  68. zenml/zen_server/dashboard/assets/{ProviderIcon-DLo7t1lo.js → ProviderIcon-DPwMR6nF.js} +1 -1
  69. zenml/zen_server/dashboard/assets/ProviderRadio-DEDNRgAb.js +1 -0
  70. zenml/zen_server/dashboard/assets/RunsBody-BRBn1e2O.js +1 -0
  71. zenml/zen_server/dashboard/assets/SearchField-DY6-UbRT.js +1 -0
  72. zenml/zen_server/dashboard/assets/SecretTooltip-CZTRnaCV.js +1 -0
  73. zenml/zen_server/dashboard/assets/{SetPassword-DR-EiLI5.js → SetPassword-BjNGDC5e.js} +1 -1
  74. zenml/zen_server/dashboard/assets/SheetHeader-CASpN2Lz.js +1 -0
  75. zenml/zen_server/dashboard/assets/StackComponentList-Be1pQt9m.js +1 -0
  76. zenml/zen_server/dashboard/assets/StackList-BdiR5DvR.js +1 -0
  77. zenml/zen_server/dashboard/assets/StackName-ojLC6xdl.js +1 -0
  78. zenml/zen_server/dashboard/assets/Tabs-DNSKblCM.js +1 -0
  79. zenml/zen_server/dashboard/assets/Tick-BPrWnNlN.js +1 -0
  80. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DbFEaezI.js → UpdatePasswordSchemas-CNfKDo2Q.js} +1 -1
  81. zenml/zen_server/dashboard/assets/UsageReason-Cb-mpV8M.js +1 -0
  82. zenml/zen_server/dashboard/assets/{Wizard-CMI6Ksgz.js → Wizard-Dg8Pmn5A.js} +1 -1
  83. zenml/zen_server/dashboard/assets/WizardFooter-BcNDIvlQ.js +1 -0
  84. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BGASHYtF.js → all-pipeline-runs-query-DCdax7I5.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{arrow-left-CwgF2MEM.js → arrow-left-MRXv5pAH.js} +1 -1
  86. zenml/zen_server/dashboard/assets/bulk-delete-C_kpIB9A.js +3 -0
  87. zenml/zen_server/dashboard/assets/{check-DK77doTf.js → check-B9QMTa3f.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{check-circle-mvyzYvIW.js → check-circle-C4tYvbtw.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{chevron-down-A-rmltmI.js → chevron-down-jbbQh82s.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{chevron-right-double-uNWbJT-C.js → chevron-right-double-Dgp_gEsp.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{clock-CPA5cYxq.js → clock-B_mTG8PH.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{code-browser-j2EpcxIA.js → code-browser-CiD8qkBx.js} +1 -1
  93. zenml/zen_server/dashboard/assets/configuration-form-B2hmKGnF.js +1 -0
  94. zenml/zen_server/dashboard/assets/connectivity-4UKGMYnr.webp +0 -0
  95. zenml/zen_server/dashboard/assets/constants-1EZZxtay.js +1 -0
  96. zenml/zen_server/dashboard/assets/create-stack-TKmMtrkQ.js +1 -0
  97. zenml/zen_server/dashboard/assets/dates-Buh6SMo7.js +1 -0
  98. zenml/zen_server/dashboard/assets/delete-run-CCR9md_s.js +1 -0
  99. zenml/zen_server/dashboard/assets/eye-CbVlAYty.js +1 -0
  100. zenml/zen_server/dashboard/assets/{file-text-BdxZdjP_.js → file-text-Cd8wVfq5.js} +1 -1
  101. zenml/zen_server/dashboard/assets/form-DFJkaFDX.js +1 -0
  102. zenml/zen_server/dashboard/assets/form-schemas-CrznJVzA.js +1 -0
  103. zenml/zen_server/dashboard/assets/{gcp-CHNvgEss.js → gcp-B1I3Qvcx.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{help-DyMolRxD.js → help-Co6aedki.js} +1 -1
  105. zenml/zen_server/dashboard/assets/index-BFqbGSck.js +308 -0
  106. zenml/zen_server/dashboard/assets/{index-CrhdX_qG.js → index-BjUu1mP4.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{index-DR30v9MZ.js → index-DWpiv-Ft.js} +1 -1
  108. zenml/zen_server/dashboard/assets/index-DuhuqTCI.css +1 -0
  109. zenml/zen_server/dashboard/assets/index-U992soPJ.js +1 -0
  110. zenml/zen_server/dashboard/assets/index.es-C1gfATPn.js +14 -0
  111. zenml/zen_server/dashboard/assets/{index.esm-D7jFlf5N.js → index.esm-DhJo3mA6.js} +1 -1
  112. zenml/zen_server/dashboard/assets/info-QkbQz4QU.js +1 -0
  113. zenml/zen_server/dashboard/assets/{key-icon-DO4DPJHZ.js → key-icon-C07HKw8z.js} +1 -1
  114. zenml/zen_server/dashboard/assets/{layout-h3cbx8WZ.js → layout-DBbfEFBe.js} +1 -1
  115. zenml/zen_server/dashboard/assets/layout-Do9YI4QX.js +1 -0
  116. zenml/zen_server/dashboard/assets/login-mutation-D3tFP6Wm.js +1 -0
  117. zenml/zen_server/dashboard/assets/{logs-B5n0U7tB.js → logs-CQKlJjo0.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{package-D1Mhqeh8.js → package-miExReQl.js} +1 -1
  119. zenml/zen_server/dashboard/assets/page-9RjCitFH.js +1 -0
  120. zenml/zen_server/dashboard/assets/page-B0PsXWiT.js +1 -0
  121. zenml/zen_server/dashboard/assets/page-BCrKmYIZ.js +1 -0
  122. zenml/zen_server/dashboard/assets/page-BcRI3-aR.js +29 -0
  123. zenml/zen_server/dashboard/assets/page-Be3R2uYn.js +1 -0
  124. zenml/zen_server/dashboard/assets/page-BgknnddT.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-BrT0_zSJ.js +40 -0
  126. zenml/zen_server/dashboard/assets/page-Bs3W2FDi.js +1 -0
  127. zenml/zen_server/dashboard/assets/page-C210HcBA.js +1 -0
  128. zenml/zen_server/dashboard/assets/page-C6KaiZ_W.js +1 -0
  129. zenml/zen_server/dashboard/assets/page-CAJ8B0vb.js +1 -0
  130. zenml/zen_server/dashboard/assets/page-CAUYrfui.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-CHxVhF3x.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-CSwZxZMQ.js → page-CN7lkvXr.js} +1 -1
  133. zenml/zen_server/dashboard/assets/page-CUaMMoPG.js +1 -0
  134. zenml/zen_server/dashboard/assets/page-Cal6XQ4U.js +1 -0
  135. zenml/zen_server/dashboard/assets/page-CdZCmszX.js +1 -0
  136. zenml/zen_server/dashboard/assets/page-ChGcZI_6.js +1 -0
  137. zenml/zen_server/dashboard/assets/page-CktmtZ8Z.js +1 -0
  138. zenml/zen_server/dashboard/assets/page-ClvmVesa.js +1 -0
  139. zenml/zen_server/dashboard/assets/page-CnbIYE80.js +1 -0
  140. zenml/zen_server/dashboard/assets/page-CoXzjeEY.js +1 -0
  141. zenml/zen_server/dashboard/assets/page-CtiuMP_r.js +1 -0
  142. zenml/zen_server/dashboard/assets/page-D9Hfx6GV.js +1 -0
  143. zenml/zen_server/dashboard/assets/page-D9iuB88h.js +1 -0
  144. zenml/zen_server/dashboard/assets/page-DCcuPZ8P.js +1 -0
  145. zenml/zen_server/dashboard/assets/page-DEohTSz6.js +1 -0
  146. zenml/zen_server/dashboard/assets/page-DJIGaUQ9.js +1 -0
  147. zenml/zen_server/dashboard/assets/page-DKK6ulgy.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-DNjKHjnH.js +1 -0
  149. zenml/zen_server/dashboard/assets/page-DUK0Nd_1.js +1 -0
  150. zenml/zen_server/dashboard/assets/page-DUKbOhaD.js +1 -0
  151. zenml/zen_server/dashboard/assets/page-DYOucPtA.js +1 -0
  152. zenml/zen_server/dashboard/assets/page-DpqRelAy.js +1 -0
  153. zenml/zen_server/dashboard/assets/{page-ZfTtFicG.js → page-DwVPpCFg.js} +2 -2
  154. zenml/zen_server/dashboard/assets/page-XURWnYZP.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-abw-2oeW.js +1 -0
  156. zenml/zen_server/dashboard/assets/page-akLcPcKw.js +1 -0
  157. zenml/zen_server/dashboard/assets/page-n9ejQ2V3.js +2 -0
  158. zenml/zen_server/dashboard/assets/page-sJjNT9xA.js +6 -0
  159. zenml/zen_server/dashboard/assets/{persist-UUym702q.js → persist-DWMWVP-y.js} +1 -1
  160. zenml/zen_server/dashboard/assets/{persist-D87V82eO.js → persist-Dec_w7aB.js} +1 -1
  161. zenml/zen_server/dashboard/assets/pipeline-CSUlkd50.js +1 -0
  162. zenml/zen_server/dashboard/assets/{plus-COjQg3AG.js → plus-Cl0_rCVF.js} +1 -1
  163. zenml/zen_server/dashboard/assets/{react-error-boundary.esm-fyoUBS25.js → react-error-boundary.esm-7_MuhCay.js} +1 -1
  164. zenml/zen_server/dashboard/assets/{refresh-CM5T3QeU.js → refresh-BcTM09NW.js} +1 -1
  165. zenml/zen_server/dashboard/assets/resource-tyes-list-o2LXiMay.js +1 -0
  166. zenml/zen_server/dashboard/assets/resource-type-tooltip-DwHrJstL.js +1 -0
  167. zenml/zen_server/dashboard/assets/service-connectors-DSEMwJ5A.js +1 -0
  168. zenml/zen_server/dashboard/assets/{service-BQ9KIhls.js → service-jxtvgks0.js} +2 -2
  169. zenml/zen_server/dashboard/assets/sharedSchema-BXzg0EZz.js +1 -0
  170. zenml/zen_server/dashboard/assets/stack-detail-query-Cm0fsgo-.js +1 -0
  171. zenml/zen_server/dashboard/assets/{terminal-square-DMtel8mb.js → terminal-XFL_4QN-.js} +1 -1
  172. zenml/zen_server/dashboard/assets/terminal-square-XFL_4QN-.js +1 -0
  173. zenml/zen_server/dashboard/assets/transform-CeZdrxDZ.js +1 -0
  174. zenml/zen_server/dashboard/assets/{trash-BWSZ7NRK.js → trash-DP6Tpp_E.js} +1 -1
  175. zenml/zen_server/dashboard/assets/type-guards-CNgPYg8l.js +1 -0
  176. zenml/zen_server/dashboard/assets/update-current-user-mutation-D5MjcQ6F.js +1 -0
  177. zenml/zen_server/dashboard/assets/update-server-settings-mutation-CmnxdxiK.js +1 -0
  178. zenml/zen_server/dashboard/assets/{zod-C0xYeTvL.js → zod-XdS2h1ws.js} +1 -1
  179. zenml/zen_server/dashboard/index.html +7 -7
  180. zenml/zen_server/rbac/utils.py +2 -2
  181. zenml/zen_server/routers/auth_endpoints.py +2 -2
  182. zenml/zen_server/routers/devices_endpoints.py +8 -5
  183. zenml/zen_server/routers/pipeline_deployments_endpoints.py +1 -1
  184. zenml/zen_server/routers/pipelines_endpoints.py +1 -1
  185. zenml/zen_server/routers/run_templates_endpoints.py +3 -3
  186. zenml/zen_server/routers/runs_endpoints.py +35 -0
  187. zenml/zen_server/template_execution/utils.py +6 -6
  188. zenml/zen_stores/dag_generator.py +171 -0
  189. zenml/zen_stores/rest_zen_store.py +17 -3
  190. zenml/zen_stores/schemas/action_schemas.py +40 -4
  191. zenml/zen_stores/schemas/api_key_schemas.py +29 -1
  192. zenml/zen_stores/schemas/artifact_schemas.py +168 -48
  193. zenml/zen_stores/schemas/base_schemas.py +26 -1
  194. zenml/zen_stores/schemas/code_repository_schemas.py +46 -5
  195. zenml/zen_stores/schemas/component_schemas.py +44 -3
  196. zenml/zen_stores/schemas/device_schemas.py +43 -2
  197. zenml/zen_stores/schemas/event_source_schemas.py +41 -5
  198. zenml/zen_stores/schemas/flavor_schemas.py +42 -2
  199. zenml/zen_stores/schemas/model_schemas.py +113 -77
  200. zenml/zen_stores/schemas/pipeline_build_schemas.py +53 -4
  201. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +53 -4
  202. zenml/zen_stores/schemas/pipeline_run_schemas.py +111 -47
  203. zenml/zen_stores/schemas/pipeline_schemas.py +41 -9
  204. zenml/zen_stores/schemas/run_template_schemas.py +75 -11
  205. zenml/zen_stores/schemas/schedule_schema.py +50 -5
  206. zenml/zen_stores/schemas/secret_schemas.py +39 -2
  207. zenml/zen_stores/schemas/service_connector_schemas.py +39 -2
  208. zenml/zen_stores/schemas/service_schemas.py +39 -4
  209. zenml/zen_stores/schemas/stack_schemas.py +47 -2
  210. zenml/zen_stores/schemas/step_run_schemas.py +89 -26
  211. zenml/zen_stores/schemas/tag_schemas.py +69 -5
  212. zenml/zen_stores/schemas/trigger_schemas.py +44 -5
  213. zenml/zen_stores/schemas/utils.py +25 -4
  214. zenml/zen_stores/sql_zen_store.py +471 -28
  215. zenml/zen_stores/zen_store_interface.py +9 -1
  216. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/METADATA +1 -1
  217. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/RECORD +220 -214
  218. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BG7-Ki1L.js +0 -1
  219. zenml/zen_server/dashboard/assets/CollapsibleCard-D20FtrzC.js +0 -1
  220. zenml/zen_server/dashboard/assets/Commands-DGbAvMDk.js +0 -1
  221. zenml/zen_server/dashboard/assets/ComponentIcon-ils7uNAk.js +0 -1
  222. zenml/zen_server/dashboard/assets/CsvVizualization-DVN541XF.js +0 -15
  223. zenml/zen_server/dashboard/assets/DialogItem-BHWf3sIB.js +0 -1
  224. zenml/zen_server/dashboard/assets/ExecutionStatus-XrvT2r65.js +0 -1
  225. zenml/zen_server/dashboard/assets/Infobox-D9k5TFH4.js +0 -1
  226. zenml/zen_server/dashboard/assets/InlineAvatar-Cfz4WSLK.js +0 -1
  227. zenml/zen_server/dashboard/assets/MarkdownVisualization-URCyUPcZ.js +0 -14
  228. zenml/zen_server/dashboard/assets/NestedCollapsible-Dor-bi98.js +0 -1
  229. zenml/zen_server/dashboard/assets/NumberBox-D2A7ENHb.js +0 -1
  230. zenml/zen_server/dashboard/assets/Partials-DQJFw1yW.js +0 -1
  231. zenml/zen_server/dashboard/assets/ProBadge-Cp4hb1YT.js +0 -1
  232. zenml/zen_server/dashboard/assets/ProCta-EYoV9CvK.js +0 -1
  233. zenml/zen_server/dashboard/assets/ProviderRadio-BVDA-fAr.js +0 -1
  234. zenml/zen_server/dashboard/assets/RunSelector-BLuBYNJt.js +0 -1
  235. zenml/zen_server/dashboard/assets/RunsBody-W4WHf-sq.js +0 -1
  236. zenml/zen_server/dashboard/assets/SearchField-D-h6jXyg.js +0 -1
  237. zenml/zen_server/dashboard/assets/SecretTooltip-CePCL8kd.js +0 -1
  238. zenml/zen_server/dashboard/assets/StackList-CgmN5H-i.js +0 -1
  239. zenml/zen_server/dashboard/assets/Tabs-DxQ8PDOD.js +0 -1
  240. zenml/zen_server/dashboard/assets/Tick-CEsT3HPR.js +0 -1
  241. zenml/zen_server/dashboard/assets/UsageReason-DjI5qMje.js +0 -1
  242. zenml/zen_server/dashboard/assets/WizardFooter-CFBHFZas.js +0 -1
  243. zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +0 -43
  244. zenml/zen_server/dashboard/assets/configuration-form-BtI2Y4eX.js +0 -1
  245. zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +0 -21
  246. zenml/zen_server/dashboard/assets/constants-DP3ZEnXH.js +0 -1
  247. zenml/zen_server/dashboard/assets/create-stack-BJ6x5rzj.js +0 -1
  248. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +0 -1
  249. zenml/zen_server/dashboard/assets/delete-run-DlSLEl5T.js +0 -1
  250. zenml/zen_server/dashboard/assets/docker-BuDBFEDL.js +0 -1
  251. zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +0 -1
  252. zenml/zen_server/dashboard/assets/flavor-select-BnPxvQDN.js +0 -1
  253. zenml/zen_server/dashboard/assets/form-schemas-CbvoEUHr.js +0 -1
  254. zenml/zen_server/dashboard/assets/index-CFESYpe4.js +0 -1
  255. zenml/zen_server/dashboard/assets/index-CmLcvK2z.js +0 -1
  256. zenml/zen_server/dashboard/assets/index-CzX3ZYlI.css +0 -1
  257. zenml/zen_server/dashboard/assets/index-D2iSHVZq.js +0 -64
  258. zenml/zen_server/dashboard/assets/kubernetes-D6OUjwSK.js +0 -1
  259. zenml/zen_server/dashboard/assets/link-external-DUhCSKNm.js +0 -1
  260. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +0 -1
  261. zenml/zen_server/dashboard/assets/login-mutation-CXc-Klim.js +0 -1
  262. zenml/zen_server/dashboard/assets/not-found-olRU3fnu.js +0 -1
  263. zenml/zen_server/dashboard/assets/page-7keIM1V3.js +0 -1
  264. zenml/zen_server/dashboard/assets/page-B31neFwG.js +0 -1
  265. zenml/zen_server/dashboard/assets/page-B3zo4KYS.js +0 -1
  266. zenml/zen_server/dashboard/assets/page-BN3MHq1a.js +0 -1
  267. zenml/zen_server/dashboard/assets/page-BNgVExjN.js +0 -1
  268. zenml/zen_server/dashboard/assets/page-BPtvu74G.js +0 -1
  269. zenml/zen_server/dashboard/assets/page-BTIuG0ki.js +0 -2
  270. zenml/zen_server/dashboard/assets/page-BcQzleH6.js +0 -1
  271. zenml/zen_server/dashboard/assets/page-C05Jw4M2.js +0 -1
  272. zenml/zen_server/dashboard/assets/page-C28a7K8h.js +0 -1
  273. zenml/zen_server/dashboard/assets/page-C9WLk0X-.js +0 -1
  274. zenml/zen_server/dashboard/assets/page-CINMx64X.js +0 -1
  275. zenml/zen_server/dashboard/assets/page-CYrJbk7P.js +0 -1
  276. zenml/zen_server/dashboard/assets/page-Ce0cqLo3.js +0 -1
  277. zenml/zen_server/dashboard/assets/page-CgNsEkw-.js +0 -1
  278. zenml/zen_server/dashboard/assets/page-Ct2FUYuR.js +0 -1
  279. zenml/zen_server/dashboard/assets/page-D8G2B3Bu.js +0 -1
  280. zenml/zen_server/dashboard/assets/page-DL8a4_lg.js +0 -3
  281. zenml/zen_server/dashboard/assets/page-DMhYn1cF.js +0 -1
  282. zenml/zen_server/dashboard/assets/page-Dd_Yq-Uf.js +0 -6
  283. zenml/zen_server/dashboard/assets/page-DfSvqT8g.js +0 -1
  284. zenml/zen_server/dashboard/assets/page-Dt6ANUTx.js +0 -1
  285. zenml/zen_server/dashboard/assets/page-DtvTleaT.js +0 -1
  286. zenml/zen_server/dashboard/assets/page-DwfGTiVs.js +0 -1
  287. zenml/zen_server/dashboard/assets/page-JgomSTDc.js +0 -1
  288. zenml/zen_server/dashboard/assets/page-L84ig6HB.js +0 -1
  289. zenml/zen_server/dashboard/assets/page-Mabsn4QJ.js +0 -1
  290. zenml/zen_server/dashboard/assets/page-P04L5cm9.js +0 -1
  291. zenml/zen_server/dashboard/assets/page-PfhAnvq4.js +0 -1
  292. zenml/zen_server/dashboard/assets/page-WdRrlNt_.js +0 -1
  293. zenml/zen_server/dashboard/assets/page-cqJDDDeK.js +0 -1
  294. zenml/zen_server/dashboard/assets/page-k-Wxh9L_.js +0 -1
  295. zenml/zen_server/dashboard/assets/page-y-zV4n0c.js +0 -1
  296. zenml/zen_server/dashboard/assets/rocket-Cf-B-XOR.js +0 -1
  297. zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
  298. zenml/zen_server/dashboard/assets/sharedSchema-Bse2agAf.js +0 -14
  299. zenml/zen_server/dashboard/assets/stack-detail-query-BAcZJrN3.js +0 -1
  300. zenml/zen_server/dashboard/assets/tick-circle-m94Aa6Zt.js +0 -1
  301. zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
  302. zenml/zen_server/dashboard/assets/type-guards-CaeD8wHO.js +0 -1
  303. zenml/zen_server/dashboard/assets/update-server-settings-mutation-DwMM1LJz.js +0 -1
  304. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/LICENSE +0 -0
  305. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/WHEEL +0 -0
  306. {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/entry_points.txt +0 -0
@@ -30,7 +30,11 @@ from pydantic import ConfigDict, Field
30
30
 
31
31
  from zenml.config.step_configurations import StepConfiguration, StepSpec
32
32
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
33
- from zenml.enums import ExecutionStatus, StepRunInputArtifactType
33
+ from zenml.enums import (
34
+ ArtifactSaveType,
35
+ ExecutionStatus,
36
+ StepRunInputArtifactType,
37
+ )
34
38
  from zenml.metadata.metadata_types import MetadataType
35
39
  from zenml.models.v2.base.base import BaseUpdate
36
40
  from zenml.models.v2.base.scoped import (
@@ -126,7 +130,7 @@ class StepRunRequest(ProjectScopedRequest):
126
130
  title="The IDs of the parent steps of this step run.",
127
131
  default_factory=list,
128
132
  )
129
- inputs: Dict[str, UUID] = Field(
133
+ inputs: Dict[str, List[UUID]] = Field(
130
134
  title="The IDs of the input artifact versions of the step run.",
131
135
  default_factory=dict,
132
136
  )
@@ -180,19 +184,15 @@ class StepRunResponseBody(ProjectScopedResponseBody):
180
184
  title="The end time of the step run.",
181
185
  default=None,
182
186
  )
183
- inputs: Dict[str, StepRunInputResponse] = Field(
184
- title="The input artifact versions of the step run.",
185
- default_factory=dict,
186
- )
187
- outputs: Dict[str, List[ArtifactVersionResponse]] = Field(
188
- title="The output artifact versions of the step run.",
189
- default_factory=dict,
190
- )
191
187
  model_version_id: Optional[UUID] = Field(
192
188
  title="The ID of the model version that was "
193
189
  "configured by this step run explicitly.",
194
190
  default=None,
195
191
  )
192
+ substitutions: Dict[str, str] = Field(
193
+ title="The substitutions of the step run.",
194
+ default={},
195
+ )
196
196
  model_config = ConfigDict(protected_namespaces=())
197
197
 
198
198
 
@@ -254,6 +254,14 @@ class StepRunResponseResources(ProjectScopedResponseResources):
254
254
  """Class for all resource models associated with the step run entity."""
255
255
 
256
256
  model_version: Optional[ModelVersionResponse] = None
257
+ inputs: Dict[str, List[StepRunInputResponse]] = Field(
258
+ title="The input artifact versions of the step run.",
259
+ default_factory=dict,
260
+ )
261
+ outputs: Dict[str, List[ArtifactVersionResponse]] = Field(
262
+ title="The output artifact versions of the step run.",
263
+ default_factory=dict,
264
+ )
257
265
 
258
266
  # TODO: In Pydantic v2, the `model_` is a protected namespaces for all
259
267
  # fields defined under base models. If not handled, this raises a warning.
@@ -288,7 +296,7 @@ class StepRunResponse(
288
296
 
289
297
  # Helper properties
290
298
  @property
291
- def input(self) -> ArtifactVersionResponse:
299
+ def input(self) -> StepRunInputResponse:
292
300
  """Returns the input artifact that was used to run this step.
293
301
 
294
302
  Returns:
@@ -299,12 +307,14 @@ class StepRunResponse(
299
307
  """
300
308
  if not self.inputs:
301
309
  raise ValueError(f"Step {self.name} has no inputs.")
302
- if len(self.inputs) > 1:
310
+ if len(self.inputs) > 1 or (
311
+ len(self.inputs) == 1 and len(next(iter(self.inputs.values()))) > 1
312
+ ):
303
313
  raise ValueError(
304
314
  f"Step {self.name} has multiple inputs, so `Step.input` is "
305
315
  "ambiguous. Please use `Step.inputs` instead."
306
316
  )
307
- return next(iter(self.inputs.values()))
317
+ return next(iter(self.inputs.values()))[0]
308
318
 
309
319
  @property
310
320
  def output(self) -> ArtifactVersionResponse:
@@ -328,6 +338,71 @@ class StepRunResponse(
328
338
  )
329
339
  return next(iter(self.outputs.values()))[0]
330
340
 
341
+ @property
342
+ def regular_inputs(self) -> Dict[str, StepRunInputResponse]:
343
+ """Returns the regular step inputs of the step run.
344
+
345
+ Regular step inputs are the inputs that are defined in the step function
346
+ signature, and are not manually loaded during the step execution.
347
+
348
+ Raises:
349
+ ValueError: If there were multiple regular input artifacts for the
350
+ same input name.
351
+
352
+ Returns:
353
+ The regular step inputs.
354
+ """
355
+ result = {}
356
+
357
+ for input_name, input_artifacts in self.inputs.items():
358
+ filtered = [
359
+ input_artifact
360
+ for input_artifact in input_artifacts
361
+ if input_artifact.input_type != StepRunInputArtifactType.MANUAL
362
+ ]
363
+ if len(filtered) > 1:
364
+ raise ValueError(
365
+ f"Expected 1 regular input artifact for {input_name}, got "
366
+ f"{len(filtered)}."
367
+ )
368
+ if filtered:
369
+ result[input_name] = filtered[0]
370
+
371
+ return result
372
+
373
+ @property
374
+ def regular_outputs(self) -> Dict[str, ArtifactVersionResponse]:
375
+ """Returns the regular step outputs of the step run.
376
+
377
+ Regular step outputs are the outputs that are defined in the step
378
+ function signature, and are not manually saved during the step
379
+ execution.
380
+
381
+ Raises:
382
+ ValueError: If there were multiple regular output artifacts for the
383
+ same output name.
384
+
385
+ Returns:
386
+ The regular step outputs.
387
+ """
388
+ result = {}
389
+
390
+ for output_name, output_artifacts in self.outputs.items():
391
+ filtered = [
392
+ output_artifact
393
+ for output_artifact in output_artifacts
394
+ if output_artifact.save_type == ArtifactSaveType.STEP_OUTPUT
395
+ ]
396
+ if len(filtered) > 1:
397
+ raise ValueError(
398
+ f"Expected 1 regular output artifact for {output_name}, "
399
+ f"got {len(filtered)}."
400
+ )
401
+ if filtered:
402
+ result[output_name] = filtered[0]
403
+
404
+ return result
405
+
331
406
  # Body and metadata properties
332
407
  @property
333
408
  def status(self) -> ExecutionStatus:
@@ -339,13 +414,13 @@ class StepRunResponse(
339
414
  return self.get_body().status
340
415
 
341
416
  @property
342
- def inputs(self) -> Dict[str, StepRunInputResponse]:
417
+ def inputs(self) -> Dict[str, List[StepRunInputResponse]]:
343
418
  """The `inputs` property.
344
419
 
345
420
  Returns:
346
421
  the value of the property.
347
422
  """
348
- return self.get_body().inputs
423
+ return self.get_resources().inputs
349
424
 
350
425
  @property
351
426
  def outputs(self) -> Dict[str, List[ArtifactVersionResponse]]:
@@ -354,7 +429,7 @@ class StepRunResponse(
354
429
  Returns:
355
430
  the value of the property.
356
431
  """
357
- return self.get_body().outputs
432
+ return self.get_resources().outputs
358
433
 
359
434
  @property
360
435
  def model_version_id(self) -> Optional[UUID]:
@@ -365,6 +440,15 @@ class StepRunResponse(
365
440
  """
366
441
  return self.get_body().model_version_id
367
442
 
443
+ @property
444
+ def substitutions(self) -> Dict[str, str]:
445
+ """The `substitutions` property.
446
+
447
+ Returns:
448
+ the value of the property.
449
+ """
450
+ return self.get_body().substitutions
451
+
368
452
  @property
369
453
  def config(self) -> "StepConfiguration":
370
454
  """The `config` property.
@@ -125,14 +125,15 @@ class TagResponseBody(UserScopedResponseBody):
125
125
  exclusive: bool = Field(
126
126
  description="The flag signifying whether the tag is an exclusive tag."
127
127
  )
128
- tagged_count: int = Field(
129
- description="The count of resources tagged with this tag."
130
- )
131
128
 
132
129
 
133
130
  class TagResponseMetadata(UserScopedResponseMetadata):
134
131
  """Response metadata for tags."""
135
132
 
133
+ tagged_count: int = Field(
134
+ description="The count of resources tagged with this tag."
135
+ )
136
+
136
137
 
137
138
  class TagResponseResources(UserScopedResponseResources):
138
139
  """Class for all resource models associated with the tag entity."""
@@ -185,7 +186,7 @@ class TagResponse(
185
186
  Returns:
186
187
  the value of the property.
187
188
  """
188
- return self.get_body().tagged_count
189
+ return self.get_metadata().tagged_count
189
190
 
190
191
 
191
192
  # ------------------ Filter Model ------------------
@@ -0,0 +1,46 @@
1
+ # Copyright (c) ZenML GmbH 2025. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at:
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
+ # or implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+ """Pipeline run DAG models."""
15
+
16
+ from typing import Any, Dict, List, Optional
17
+ from uuid import UUID
18
+
19
+ from pydantic import BaseModel
20
+
21
+ from zenml.enums import ExecutionStatus
22
+
23
+
24
+ class PipelineRunDAG(BaseModel):
25
+ """Pipeline run DAG."""
26
+
27
+ id: UUID
28
+ status: ExecutionStatus
29
+ nodes: List["Node"]
30
+ edges: List["Edge"]
31
+
32
+ class Node(BaseModel):
33
+ """Node in the pipeline run DAG."""
34
+
35
+ node_id: str
36
+ type: str
37
+ id: Optional[UUID] = None
38
+ name: str
39
+ metadata: Dict[str, Any] = {}
40
+
41
+ class Edge(BaseModel):
42
+ """Edge in the pipeline run DAG."""
43
+
44
+ source: str
45
+ target: str
46
+ metadata: Dict[str, Any] = {}
@@ -220,29 +220,18 @@ class BaseOrchestrator(StackComponent, ABC):
220
220
  and not deployment.schedule
221
221
  and not prevent_client_side_caching
222
222
  ):
223
- from zenml.orchestrators import step_run_utils
223
+ from zenml.orchestrators import cache_utils
224
224
 
225
- cached_invocations = step_run_utils.create_cached_step_runs(
226
- deployment=deployment,
227
- pipeline_run=placeholder_run,
228
- stack=stack,
225
+ run_required = (
226
+ cache_utils.create_cached_step_runs_and_prune_deployment(
227
+ deployment=deployment,
228
+ pipeline_run=placeholder_run,
229
+ stack=stack,
230
+ )
229
231
  )
230
232
 
231
- for invocation_id in cached_invocations:
232
- # Remove the cached step invocations from the deployment so
233
- # the orchestrator does not try to run them
234
- deployment.step_configurations.pop(invocation_id)
235
-
236
- for step in deployment.step_configurations.values():
237
- for invocation_id in cached_invocations:
238
- if invocation_id in step.spec.upstream_steps:
239
- step.spec.upstream_steps.remove(invocation_id)
240
-
241
- if len(deployment.step_configurations) == 0:
242
- # All steps were cached, we update the pipeline run status and
243
- # don't actually use the orchestrator to run the pipeline
233
+ if not run_required:
244
234
  self._cleanup_run()
245
- logger.info("All steps of the pipeline run were cached.")
246
235
  return
247
236
  else:
248
237
  logger.debug("Skipping client-side caching.")
@@ -19,13 +19,20 @@ from typing import TYPE_CHECKING, Dict, Optional
19
19
  from zenml.client import Client
20
20
  from zenml.enums import ExecutionStatus, SorterOps
21
21
  from zenml.logger import get_logger
22
+ from zenml.orchestrators import step_run_utils
22
23
 
23
24
  if TYPE_CHECKING:
24
25
  from uuid import UUID
25
26
 
26
27
  from zenml.artifact_stores import BaseArtifactStore
27
28
  from zenml.config.step_configurations import Step
28
- from zenml.models import StepRunResponse
29
+ from zenml.models import (
30
+ PipelineDeploymentResponse,
31
+ PipelineRunResponse,
32
+ StepRunResponse,
33
+ )
34
+ from zenml.stack import Stack
35
+
29
36
 
30
37
  logger = get_logger(__name__)
31
38
 
@@ -127,3 +134,43 @@ def get_cached_step_run(cache_key: str) -> Optional["StepRunResponse"]:
127
134
  if cache_candidates:
128
135
  return cache_candidates[0]
129
136
  return None
137
+
138
+
139
+ def create_cached_step_runs_and_prune_deployment(
140
+ deployment: "PipelineDeploymentResponse",
141
+ pipeline_run: "PipelineRunResponse",
142
+ stack: "Stack",
143
+ ) -> bool:
144
+ """Create cached step runs and prune the cached steps from the deployment.
145
+
146
+ Args:
147
+ deployment: The deployment of the pipeline run.
148
+ pipeline_run: The pipeline run for which to create the step runs.
149
+ stack: The stack on which the pipeline run is happening.
150
+
151
+ Returns:
152
+ Whether an actual pipeline run is still required.
153
+ """
154
+ cached_invocations = step_run_utils.create_cached_step_runs(
155
+ deployment=deployment,
156
+ pipeline_run=pipeline_run,
157
+ stack=stack,
158
+ )
159
+
160
+ for invocation_id in cached_invocations:
161
+ # Remove the cached step invocations from the deployment so
162
+ # the orchestrator does not try to run them
163
+ deployment.step_configurations.pop(invocation_id)
164
+
165
+ for step in deployment.step_configurations.values():
166
+ for invocation_id in cached_invocations:
167
+ if invocation_id in step.spec.upstream_steps:
168
+ step.spec.upstream_steps.remove(invocation_id)
169
+
170
+ if len(deployment.step_configurations) == 0:
171
+ # All steps were cached, we update the pipeline run status and
172
+ # don't actually use the orchestrator to run the pipeline
173
+ logger.info("All steps of the pipeline run were cached.")
174
+ return False
175
+
176
+ return True
@@ -13,29 +13,34 @@
13
13
  # permissions and limitations under the License.
14
14
  """Utilities for inputs."""
15
15
 
16
- from typing import TYPE_CHECKING, Dict, List, Tuple
16
+ import json
17
+ from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
17
18
  from uuid import UUID
18
19
 
19
20
  from zenml.client import Client
20
21
  from zenml.config.step_configurations import Step
21
- from zenml.enums import ArtifactSaveType, StepRunInputArtifactType
22
+ from zenml.enums import StepRunInputArtifactType
22
23
  from zenml.exceptions import InputResolutionError
23
24
  from zenml.utils import pagination_utils, string_utils
24
25
 
25
26
  if TYPE_CHECKING:
26
- from zenml.models import PipelineRunResponse
27
+ from zenml.models import PipelineRunResponse, StepRunResponse
27
28
  from zenml.models.v2.core.step_run import StepRunInputResponse
28
29
 
29
30
 
30
31
  def resolve_step_inputs(
31
32
  step: "Step",
32
33
  pipeline_run: "PipelineRunResponse",
34
+ step_runs: Optional[Dict[str, "StepRunResponse"]] = None,
33
35
  ) -> Tuple[Dict[str, "StepRunInputResponse"], List[UUID]]:
34
36
  """Resolves inputs for the current step.
35
37
 
36
38
  Args:
37
39
  step: The step for which to resolve the inputs.
38
40
  pipeline_run: The current pipeline run.
41
+ step_runs: A dictionary of already fetched step runs to use for input
42
+ resolution. This will be updated in-place with newly fetched step
43
+ runs.
39
44
 
40
45
  Raises:
41
46
  InputResolutionError: If input resolving failed due to a missing
@@ -50,65 +55,56 @@ def resolve_step_inputs(
50
55
  from zenml.models import ArtifactVersionResponse
51
56
  from zenml.models.v2.core.step_run import StepRunInputResponse
52
57
 
53
- current_run_steps = {
54
- run_step.name: run_step
55
- for run_step in pagination_utils.depaginate(
56
- Client().list_run_steps,
57
- pipeline_run_id=pipeline_run.id,
58
- project=pipeline_run.project.id,
58
+ step_runs = step_runs or {}
59
+
60
+ steps_to_fetch = set(step.spec.upstream_steps)
61
+ steps_to_fetch.update(
62
+ input_.step_name for input_ in step.spec.inputs.values()
63
+ )
64
+ # Remove all the step runs that we've already fetched.
65
+ steps_to_fetch.difference_update(step_runs.keys())
66
+
67
+ if steps_to_fetch:
68
+ step_runs.update(
69
+ {
70
+ run_step.name: run_step
71
+ for run_step in pagination_utils.depaginate(
72
+ Client().list_run_steps,
73
+ pipeline_run_id=pipeline_run.id,
74
+ project=pipeline_run.project_id,
75
+ name="oneof:" + json.dumps(list(steps_to_fetch)),
76
+ )
77
+ }
59
78
  )
60
- }
61
79
 
62
80
  input_artifacts: Dict[str, StepRunInputResponse] = {}
63
81
  for name, input_ in step.spec.inputs.items():
64
82
  try:
65
- step_run = current_run_steps[input_.step_name]
83
+ step_run = step_runs[input_.step_name]
66
84
  except KeyError:
67
85
  raise InputResolutionError(
68
86
  f"No step `{input_.step_name}` found in current run."
69
87
  )
70
88
 
71
- # Try to get the substitutions from the pipeline run first, as we
72
- # already have a hydrated version of that. In the unlikely case
73
- # that the pipeline run is outdated, we fetch it from the step
74
- # run instead which will costs us one hydration call.
75
- substitutions = (
76
- pipeline_run.step_substitutions.get(step_run.name)
77
- or step_run.config.substitutions
78
- )
79
89
  output_name = string_utils.format_name_template(
80
- input_.output_name, substitutions=substitutions
90
+ input_.output_name, substitutions=step_run.substitutions
81
91
  )
82
92
 
83
93
  try:
84
- outputs = step_run.outputs[output_name]
94
+ output = step_run.regular_outputs[output_name]
85
95
  except KeyError:
86
96
  raise InputResolutionError(
87
97
  f"No step output `{output_name}` found for step "
88
98
  f"`{input_.step_name}`."
89
99
  )
90
-
91
- step_outputs = [
92
- output
93
- for output in outputs
94
- if output.save_type == ArtifactSaveType.STEP_OUTPUT
95
- ]
96
- if len(step_outputs) > 2:
97
- # This should never happen, there can only be a single regular step
98
- # output for a name
100
+ except ValueError:
99
101
  raise InputResolutionError(
100
- f"Too many step outputs for output `{output_name}` of "
101
- f"step `{input_.step_name}`."
102
- )
103
- elif len(step_outputs) == 0:
104
- raise InputResolutionError(
105
- f"No step output `{output_name}` found for step "
106
- f"`{input_.step_name}`."
102
+ f"Expected 1 regular output artifact for {output_name}."
107
103
  )
108
104
 
109
105
  input_artifacts[name] = StepRunInputResponse(
110
106
  input_type=StepRunInputArtifactType.STEP_OUTPUT,
111
- **step_outputs[0].model_dump(),
107
+ **output.model_dump(),
112
108
  )
113
109
 
114
110
  for (
@@ -187,7 +183,7 @@ def resolve_step_inputs(
187
183
  step.config.parameters[name] = value_
188
184
 
189
185
  parent_step_ids = [
190
- current_run_steps[upstream_step].id
186
+ step_runs[upstream_step].id
191
187
  for upstream_step in step.spec.upstream_steps
192
188
  ]
193
189
 
@@ -381,7 +381,7 @@ class StepLauncher:
381
381
  pipeline_run=pipeline_run,
382
382
  step_run=step_run,
383
383
  step_run_info=step_run_info,
384
- input_artifacts=step_run.inputs,
384
+ input_artifacts=step_run.regular_inputs,
385
385
  output_artifact_uris=output_artifact_uris,
386
386
  last_retry=last_retry,
387
387
  )
@@ -28,6 +28,7 @@ from zenml.models import (
28
28
  PipelineDeploymentResponse,
29
29
  PipelineRunResponse,
30
30
  StepRunRequest,
31
+ StepRunResponse,
31
32
  )
32
33
  from zenml.orchestrators import cache_utils, input_utils, utils
33
34
  from zenml.stack import Stack
@@ -79,24 +80,34 @@ class StepRunRequestFactory:
79
80
  project=Client().active_project.id,
80
81
  )
81
82
 
82
- def populate_request(self, request: StepRunRequest) -> None:
83
+ def populate_request(
84
+ self,
85
+ request: StepRunRequest,
86
+ step_runs: Optional[Dict[str, "StepRunResponse"]] = None,
87
+ ) -> None:
83
88
  """Populate a step run request with additional information.
84
89
 
85
90
  Args:
86
91
  request: The request to populate.
92
+ step_runs: A dictionary of already fetched step runs to use for
93
+ input resolution. This will be updated in-place with newly
94
+ fetched step runs.
87
95
  """
88
96
  step = self.deployment.step_configurations[request.name]
89
97
 
90
98
  input_artifacts, parent_step_ids = input_utils.resolve_step_inputs(
91
99
  step=step,
92
100
  pipeline_run=self.pipeline_run,
101
+ step_runs=step_runs,
93
102
  )
94
103
  input_artifact_ids = {
95
104
  input_name: artifact.id
96
105
  for input_name, artifact in input_artifacts.items()
97
106
  }
98
107
 
99
- request.inputs = input_artifact_ids
108
+ request.inputs = {
109
+ name: [artifact.id] for name, artifact in input_artifacts.items()
110
+ }
100
111
  request.parent_step_ids = parent_step_ids
101
112
 
102
113
  cache_key = cache_utils.generate_cache_key(
@@ -128,8 +139,8 @@ class StepRunRequestFactory:
128
139
  cache_key=cache_key
129
140
  ):
130
141
  request.inputs = {
131
- input_name: artifact.id
132
- for input_name, artifact in cached_step_run.inputs.items()
142
+ input_name: [artifact.id for artifact in artifacts]
143
+ for input_name, artifacts in cached_step_run.inputs.items()
133
144
  }
134
145
 
135
146
  request.original_step_run_id = cached_step_run.id
@@ -283,6 +294,9 @@ def create_cached_step_runs(
283
294
  request_factory = StepRunRequestFactory(
284
295
  deployment=deployment, pipeline_run=pipeline_run, stack=stack
285
296
  )
297
+ # This is used to cache the step runs that we created to avoid unnecessary
298
+ # server requests.
299
+ step_runs: Dict[str, "StepRunResponse"] = {}
286
300
 
287
301
  while (
288
302
  cache_candidates := find_cacheable_invocation_candidates(
@@ -296,16 +310,13 @@ def create_cached_step_runs(
296
310
  for invocation_id in cache_candidates:
297
311
  visited_invocations.add(invocation_id)
298
312
 
299
- # Make sure the request factory has the most up to date pipeline
300
- # run to avoid hydration calls
301
- request_factory.pipeline_run = Client().get_pipeline_run(
302
- pipeline_run.id
303
- )
304
313
  try:
305
314
  step_run_request = request_factory.create_request(
306
315
  invocation_id
307
316
  )
308
- request_factory.populate_request(step_run_request)
317
+ request_factory.populate_request(
318
+ step_run_request, step_runs=step_runs
319
+ )
309
320
  except Exception as e:
310
321
  # We failed to create/populate the step run. This might be due
311
322
  # to some input resolution error, or an error importing the step
@@ -325,6 +336,11 @@ def create_cached_step_runs(
325
336
 
326
337
  step_run = Client().zen_store.create_run_step(step_run_request)
327
338
 
339
+ # Include the newly created step run in the step runs dictionary to
340
+ # avoid fetching it again later when downstream steps need it for
341
+ # input resolution.
342
+ step_runs[invocation_id] = step_run
343
+
328
344
  if (
329
345
  model_version := step_run.model_version
330
346
  or pipeline_run.model_version
@@ -1065,16 +1065,16 @@ To avoid this consider setting pipeline parameters only in one place (config or
1065
1065
  if not source.is_internal:
1066
1066
  custom_materializer = True
1067
1067
 
1068
- stack_creator = Client().get_stack(stack.id).user
1068
+ stack_creator = Client().get_stack(stack.id).user_id
1069
1069
  active_user = Client().active_user
1070
- own_stack = stack_creator and stack_creator.id == active_user.id
1070
+ own_stack = stack_creator and stack_creator == active_user.id
1071
1071
 
1072
1072
  stack_metadata = {
1073
1073
  component_type.value: component.flavor
1074
1074
  for component_type, component in stack.components.items()
1075
1075
  }
1076
1076
  return {
1077
- "project_id": deployment.project.id,
1077
+ "project_id": deployment.project_id,
1078
1078
  "store_type": Client().zen_store.type.value,
1079
1079
  **stack_metadata,
1080
1080
  "total_steps": len(self.invocations),
@@ -64,10 +64,9 @@ def create_placeholder_run(
64
64
  Returns:
65
65
  The placeholder run or `None` if no run was created.
66
66
  """
67
- assert deployment.user
68
-
69
67
  if deployment.schedule:
70
68
  return None
69
+
71
70
  start_time = utc_now()
72
71
  run_request = PipelineRunRequest(
73
72
  name=string_utils.format_name_template(
@@ -84,7 +83,7 @@ def create_placeholder_run(
84
83
  # running.
85
84
  start_time=start_time,
86
85
  orchestrator_run_id=None,
87
- project=deployment.project.id,
86
+ project=deployment.project_id,
88
87
  deployment=deployment.id,
89
88
  pipeline=deployment.pipeline.id if deployment.pipeline else None,
90
89
  status=ExecutionStatus.INITIALIZING,