zenml-nightly 0.80.2.dev20250415__py3-none-any.whl → 0.81.0.dev20250417__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 (129) hide show
  1. zenml/VERSION +1 -1
  2. zenml/cli/utils.py +13 -11
  3. zenml/config/compiler.py +1 -0
  4. zenml/config/global_config.py +1 -1
  5. zenml/config/pipeline_configurations.py +1 -0
  6. zenml/config/pipeline_run_configuration.py +1 -0
  7. zenml/constants.py +4 -1
  8. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +47 -5
  9. zenml/integrations/gcp/vertex_custom_job_parameters.py +15 -1
  10. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +0 -1
  11. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +0 -1
  12. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -3
  13. zenml/logging/step_logging.py +41 -21
  14. zenml/login/credentials_store.py +31 -0
  15. zenml/models/v2/base/base.py +8 -4
  16. zenml/models/v2/base/filter.py +1 -1
  17. zenml/models/v2/core/pipeline_run.py +19 -0
  18. zenml/orchestrators/step_launcher.py +2 -3
  19. zenml/orchestrators/step_runner.py +2 -2
  20. zenml/orchestrators/utils.py +2 -5
  21. zenml/pipelines/pipeline_context.py +1 -0
  22. zenml/pipelines/pipeline_decorator.py +4 -0
  23. zenml/pipelines/pipeline_definition.py +83 -22
  24. zenml/pipelines/run_utils.py +4 -0
  25. zenml/steps/utils.py +1 -1
  26. zenml/zen_server/auth.py +44 -64
  27. zenml/zen_server/dashboard/assets/{404-CYPi9d8E.js → 404-o3nB5iwI.js} +1 -1
  28. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-Dn8bgaXG.js → AlertDialogDropdownItem-C_qWs-4u.js} +1 -1
  29. zenml/zen_server/dashboard/assets/{CodeSnippet-CSINAl3I.js → CodeSnippet-nRnOvbOJ.js} +1 -1
  30. zenml/zen_server/dashboard/assets/{CollapsibleCard-CQOb53t9.js → CollapsibleCard-9sSz7n1R.js} +1 -1
  31. zenml/zen_server/dashboard/assets/{Commands-CPleXvse.js → Commands-BwBzFj-5.js} +1 -1
  32. zenml/zen_server/dashboard/assets/{ComponentBadge-CIFj0W7T.js → ComponentBadge-CMx2DbsV.js} +1 -1
  33. zenml/zen_server/dashboard/assets/{ComponentIcon-D3JHFhJU.js → ComponentIcon-CSxdApv8.js} +1 -1
  34. zenml/zen_server/dashboard/assets/{CsvVizualization-Cklc1Vb5.js → CsvVizualization-lxB2iyEh.js} +1 -1
  35. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-Bzq-uSd7.js → DeleteAlertDialog-Bp0o-UXZ.js} +1 -1
  36. zenml/zen_server/dashboard/assets/{DialogItem-zjMgCmCl.js → DialogItem-DHw2ihTx.js} +1 -1
  37. zenml/zen_server/dashboard/assets/{Error-kdeNHm_o.js → Error-DRhVeVHQ.js} +1 -1
  38. zenml/zen_server/dashboard/assets/{ExecutionStatus-UE6Rbmtk.js → ExecutionStatus-HnZXi9bW.js} +1 -1
  39. zenml/zen_server/dashboard/assets/{Helpbox-CeM-FPQl.js → Helpbox-Dsr3ZYcL.js} +1 -1
  40. zenml/zen_server/dashboard/assets/{Infobox-CD0fDbYF.js → Infobox-C4Op55B8.js} +1 -1
  41. zenml/zen_server/dashboard/assets/{InlineAvatar-CrHWwlf4.js → InlineAvatar-CrAwe7Pl.js} +1 -1
  42. zenml/zen_server/dashboard/assets/{NestedCollapsible-DfTTGG8u.js → NestedCollapsible-Ce1bmT8N.js} +1 -1
  43. zenml/zen_server/dashboard/assets/{Partials-DggkUpWp.js → Partials-DjTM0Oe-.js} +1 -1
  44. zenml/zen_server/dashboard/assets/{ProBadge-BCdprj69.js → ProBadge-CDEqgzh8.js} +1 -1
  45. zenml/zen_server/dashboard/assets/{ProCta-szzPO0Y7.js → ProCta-BYSSivgY.js} +1 -1
  46. zenml/zen_server/dashboard/assets/{ProviderIcon-MdqWDO6-.js → ProviderIcon-B8W7AGNk.js} +1 -1
  47. zenml/zen_server/dashboard/assets/{ProviderRadio-B4CB4vzP.js → ProviderRadio-BWFJPEY2.js} +1 -1
  48. zenml/zen_server/dashboard/assets/{RunSelector-Bhb83FyB.js → RunSelector-DoL_gMHJ.js} +1 -1
  49. zenml/zen_server/dashboard/assets/{RunsBody-Csn2VEOE.js → RunsBody-B6mBjv-_.js} +1 -1
  50. zenml/zen_server/dashboard/assets/{SearchField-Cce00eQL.js → SearchField-DHl5flXv.js} +1 -1
  51. zenml/zen_server/dashboard/assets/{SecretTooltip-DaDLBVj-.js → SecretTooltip-CCn9HfEh.js} +1 -1
  52. zenml/zen_server/dashboard/assets/{SetPassword-tX6fom1Y.js → SetPassword-BDFVwnNB.js} +1 -1
  53. zenml/zen_server/dashboard/assets/{StackList-CQt1xGRh.js → StackList-dhdUtky3.js} +1 -1
  54. zenml/zen_server/dashboard/assets/{Tabs-CCQyIqRb.js → Tabs-BuZG8ft1.js} +1 -1
  55. zenml/zen_server/dashboard/assets/{Tick-D63_jhf1.js → Tick-C4gtED35.js} +1 -1
  56. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-CbbvoGYV.js → UpdatePasswordSchemas-3gg2tC-H.js} +1 -1
  57. zenml/zen_server/dashboard/assets/{UsageReason-C2cNrUeS.js → UsageReason-DOMAzO02.js} +1 -1
  58. zenml/zen_server/dashboard/assets/{Wizard-BVkN2a2x.js → Wizard-BSH_lIfi.js} +1 -1
  59. zenml/zen_server/dashboard/assets/{WizardFooter-Bk7gIKiS.js → WizardFooter-CnM-50jL.js} +1 -1
  60. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BLclwQSi.js → all-pipeline-runs-query-D9XfZpmV.js} +1 -1
  61. zenml/zen_server/dashboard/assets/{configuration-form-CjrAp0GS.js → configuration-form-Ci_QlfZC.js} +1 -1
  62. zenml/zen_server/dashboard/assets/{create-stack-Bd2JdQer.js → create-stack-CoQ5SEJL.js} +1 -1
  63. zenml/zen_server/dashboard/assets/{delete-run-Cwpxu1-d.js → delete-run-B5xUZwdP.js} +1 -1
  64. zenml/zen_server/dashboard/assets/{flavor-select-c0w-6o9w.js → flavor-select-DOLAl-S4.js} +1 -1
  65. zenml/zen_server/dashboard/assets/{form-schemas-B5Ax1SZf.js → form-schemas-BaEJ1z87.js} +1 -1
  66. zenml/zen_server/dashboard/assets/{index-BW-KaQ2p.js → index-BoWZ9rXk.js} +1 -1
  67. zenml/zen_server/dashboard/assets/{index-CjdtNrfJ.js → index-e8udi7QT.js} +1 -1
  68. zenml/zen_server/dashboard/assets/{index-Be2jLIYM.js → index-hsSXyS3H.js} +2 -2
  69. zenml/zen_server/dashboard/assets/{index-d_40qKeY.js → index-ojAuWXMf.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{login-mutation-DOajKct8.js → login-mutation-CwraNa5G.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{not-found-DolTp0dr.js → not-found-BuK1QrF2.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{page-C4zMMcaH.js → page-0AIX3VK8.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{page-BkPPfNfG.js → page-3lW9eIer.js} +1 -1
  74. zenml/zen_server/dashboard/assets/page-9PzQok8O.js +1 -0
  75. zenml/zen_server/dashboard/assets/{page-bS5tHLDW.js → page-B5clbTo4.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{page-BRfeowe0.js → page-BEibNYiA.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{page-CmzmFF4S.js → page-BOE2XBFy.js} +1 -1
  78. zenml/zen_server/dashboard/assets/{page-DmOcZO8U.js → page-BQVPbNps.js} +1 -1
  79. zenml/zen_server/dashboard/assets/{page-D3m9-YWJ.js → page-BbygQpf-.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{page-CKVbEdX2.js → page-Bki79xdd.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{page-Dv3qtvm8.js → page-BnKwJnOb.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{page-ir7Scz2Y.js → page-C-6XUKSp.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{page-48DMcIQw.js → page-C30HZCTR.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{page-BmTf1Lf1.js → page-C7buw8xJ.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{page-CwAbTnvK.js → page-CBGeo-7W.js} +2 -2
  86. zenml/zen_server/dashboard/assets/{page-BEAx6ZvH.js → page-CIDo1Ajk.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{page-CaTJVICi.js → page-CZgeF_wQ.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{page-DCpZju6a.js → page-CgJcperk.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{page-gRfUvR0E.js → page-CjRoKEQs.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{page-DWOAh8Pp.js → page-Co-FJ5ds.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{page-D-MjLTXS.js → page-Cu8vuohQ.js} +1 -1
  92. zenml/zen_server/dashboard/assets/{page-mtwS5oci.js → page-Czj8fu8q.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{page-hNHJPQtK.js → page-D0QcEBi1.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{page-CPRymOIS.js → page-DHDeVaMO.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{page-B32kCGPe.js → page-DKY_U5Sz.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{page-BiAjLLww.js → page-DLVtrRa5.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{page-DEUeF3mO.js → page-DQHU5o_C.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{page-BbRtQC2E.js → page-DbEn9V9E.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{page-DezabeEO.js → page-DpY1koQY.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{page-P81CcE2L.js → page-DrS4WOup.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{page-BuZC8z6N.js → page-DwIlrsF0.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{page-DnY59jOg.js → page-HIAPXq4w.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{page-BgUR_5z3.js → page-Jw2QAdxa.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{page-DivlNKt9.js → page-KRP_w5zH.js} +1 -1
  105. zenml/zen_server/dashboard/assets/{page-a1c6o4vv.js → page-_Zt6UwiG.js} +1 -1
  106. zenml/zen_server/dashboard/assets/{page-BBNrvxC1.js → page-hVng6ANV.js} +1 -1
  107. zenml/zen_server/dashboard/assets/{persist-BUqILw7G.js → persist-DLvsEXh0.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{persist-BbdfLc0W.js → persist-xOAq24Bm.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{service-CV2zjc-p.js → service-MHyqhRgp.js} +1 -1
  110. zenml/zen_server/dashboard/assets/{sharedSchema-DpGc9kQg.js → sharedSchema-CQA5lnlU.js} +1 -1
  111. zenml/zen_server/dashboard/assets/{stack-detail-query-BpzLZjvw.js → stack-detail-query-C1GoxBeK.js} +1 -1
  112. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-Dv6qHtK9.js → update-server-settings-mutation-DduehrZn.js} +1 -1
  113. zenml/zen_server/dashboard/index.html +2 -2
  114. zenml/zen_server/download_utils.py +26 -29
  115. zenml/zen_server/jwt.py +0 -14
  116. zenml/zen_server/routers/auth_endpoints.py +5 -36
  117. zenml/zen_server/routers/pipeline_deployments_endpoints.py +63 -26
  118. zenml/zen_server/routers/runs_endpoints.py +57 -0
  119. zenml/zen_server/template_execution/utils.py +1 -1
  120. zenml/zen_stores/migrations/versions/0.81.0_release.py +23 -0
  121. zenml/zen_stores/rest_zen_store.py +16 -13
  122. zenml/zen_stores/schemas/pipeline_run_schemas.py +1 -0
  123. zenml/zen_stores/sql_zen_store.py +18 -0
  124. {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/METADATA +3 -2
  125. {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/RECORD +128 -127
  126. zenml/zen_server/dashboard/assets/page-BAjhc2bs.js +0 -1
  127. {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/LICENSE +0 -0
  128. {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/WHEEL +0 -0
  129. {zenml_nightly-0.80.2.dev20250415.dist-info → zenml_nightly-0.81.0.dev20250417.dist-info}/entry_points.txt +0 -0
@@ -1 +1 @@
1
- import{j as n,o as i,F as o,p as u}from"./index-Be2jLIYM.js";import{b as c}from"./@tanstack-CSxjHCME.js";async function p(e){const r=i(u.settings),t=await n(r,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok){const a=await t.json().then(s=>Array.isArray(s.detail)?s.detail[1]:s.detail).catch(()=>"Failed to update Server Settings");throw new o({status:t.status,statusText:t.statusText,message:a})}return t.json()}function f(e){return c({mutationFn:async r=>p(r),...e})}export{f as u};
1
+ import{j as n,o as i,F as o,p as u}from"./index-hsSXyS3H.js";import{b as c}from"./@tanstack-CSxjHCME.js";async function p(e){const r=i(u.settings),t=await n(r,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok){const a=await t.json().then(s=>Array.isArray(s.detail)?s.detail[1]:s.detail).catch(()=>"Failed to update Server Settings");throw new o({status:t.status,statusText:t.statusText,message:a})}return t.json()}function f(e){return c({mutationFn:async r=>p(r),...e})}export{f as u};
@@ -5,14 +5,14 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>ZenML Dashboard</title>
8
- <script type="module" crossorigin src="/assets/index-Be2jLIYM.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-hsSXyS3H.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/@radix-C7hRs6Kx.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/@tanstack-CSxjHCME.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/@react-router-BGgzhn5D.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/@reactflow-CQi1Z1Wq.js">
13
13
  <link rel="stylesheet" crossorigin href="/assets/@reactflow-Fd0xVSp_.css">
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-6mLFgFwe.css">
15
- <link rel="prefetch" href="/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-400-normal-Bput3-QP.woff2"><link rel="prefetch" href="/assets/inter-greek-400-normal-DxZsaF_h.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-400-normal-hnt3BR84.woff2"><link rel="prefetch" href="/assets/inter-latin-400-normal-BOOGhInR.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-400-normal-DMkecbls.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-500-normal-B6guLgqG.woff2"><link rel="prefetch" href="/assets/inter-greek-500-normal-CeQXL5ds.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-500-normal-DOriooB6.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2"><link rel="prefetch" href="/assets/inter-latin-500-normal-D2bGa7uu.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-600-normal-BGBWG807.woff2"><link rel="prefetch" href="/assets/inter-greek-600-normal-Dhlb-90d.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2"><link rel="prefetch" href="/assets/inter-latin-600-normal-D273HNI0.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-600-normal-BnYJhD27.woff2"><link rel="prefetch" href="/assets/cloud-squares-DeRLMopf.svg"><link rel="prefetch" href="/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff"><link rel="prefetch" href="/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff"><link rel="prefetch" href="/assets/inter-greek-ext-400-normal-DCpCPQOf.woff"><link rel="prefetch" href="/assets/inter-greek-400-normal-BZzXV7-1.woff"><link rel="prefetch" href="/assets/inter-latin-ext-400-normal-C1t-h-pH.woff"><link rel="prefetch" href="/assets/inter-latin-400-normal-gitzw0hO.woff"><link rel="prefetch" href="/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff"><link rel="prefetch" href="/assets/inter-vietnamese-400-normal-BUNmGMP1.woff"><link rel="prefetch" href="/assets/inter-cyrillic-500-normal-DH2hs3aW.woff"><link rel="prefetch" href="/assets/inter-greek-500-normal-d_eO-yCQ.woff"><link rel="prefetch" href="/assets/inter-greek-ext-500-normal-M2hEX8vc.woff"><link rel="prefetch" href="/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff"><link rel="prefetch" href="/assets/inter-latin-ext-500-normal-UMdmhHu2.woff"><link rel="prefetch" href="/assets/inter-latin-500-normal-deR1Tlfd.woff"><link rel="prefetch" href="/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff"><link rel="prefetch" href="/assets/inter-cyrillic-600-normal-BuzJQFbW.woff"><link rel="prefetch" href="/assets/inter-greek-600-normal-CwicyhtI.woff"><link rel="prefetch" href="/assets/inter-greek-ext-600-normal-C9WLioJ8.woff"><link rel="prefetch" href="/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff"><link rel="prefetch" href="/assets/inter-latin-600-normal-B5cFAncS.woff"><link rel="prefetch" href="/assets/inter-latin-ext-600-normal-CAF0vJDd.woff"><link rel="prefetch" href="/assets/acp-DOsXjFc7.webp"><link rel="prefetch" href="/assets/mcp-Cb1aMeoq.webp"><link rel="prefetch" href="/assets/settings_preview-0JLrRgHP.webp"><link rel="prefetch" href="/assets/upgrade-form-CwRHBuXB.webp"><link rel="prefetch" href="/assets/connectors-video-C9qY4syJ.svg"><link rel="prefetch" href="/assets/repos-video-D8kpu60k.svg"><link rel="prefetch" href="/assets/tour-cover-BYfeen6M.webp"><link rel="prefetch" href="/assets/adam-e-y0WnB_.webp"><link rel="prefetch" href="/assets/alex-DcCuDHPg.webp"><link rel="prefetch" href="/assets/baris-C0ZrZ10g.webp"><link rel="prefetch" href="/assets/stefan-B08Ftbba.webp"><link rel="prefetch" href="/assets/hamza-NKKOZz1I.webp"><link rel="prefetch" href="/assets/templates-1S_8WeSK.webp"><link rel="prefetch" href="/assets/flyte-Cj-xy_8I.svg"><link rel="prefetch" href="/assets/metaflow-weOkWNyT.svg"><link rel="prefetch" href="/assets/CodeSnippet-CK5CxKct.css"><link rel="prefetch" href="/assets/page-BiAjLLww.js"><link rel="prefetch" href="/assets/page-gRfUvR0E.js"><link rel="prefetch" href="/assets/page-DmOcZO8U.js"><link rel="prefetch" href="/assets/page-D3m9-YWJ.js"><link rel="prefetch" href="/assets/page-48DMcIQw.js"><link rel="prefetch" href="/assets/SetPassword-tX6fom1Y.js"><link rel="prefetch" href="/assets/login-mutation-DOajKct8.js"><link rel="prefetch" href="/assets/page-B32kCGPe.js"><link rel="prefetch" href="/assets/page-CKVbEdX2.js"><link rel="prefetch" href="/assets/page-CwAbTnvK.js"><link rel="prefetch" href="/assets/not-found-DolTp0dr.js"><link rel="prefetch" href="/assets/page-Dv3qtvm8.js"><link rel="prefetch" href="/assets/page-DezabeEO.js"><link rel="prefetch" href="/assets/PasswordChecker-lYTOtNom.js"><link rel="prefetch" href="/assets/tick-circle-m94Aa6Zt.js"><link rel="prefetch" href="/assets/page-BkPPfNfG.js"><link rel="prefetch" href="/assets/page-BbRtQC2E.js"><link rel="prefetch" href="/assets/page-BBNrvxC1.js"><link rel="prefetch" href="/assets/docker-BuDBFEDL.js"><link rel="prefetch" href="/assets/page-a1c6o4vv.js"><link rel="prefetch" href="/assets/Commands-CPleXvse.js"><link rel="prefetch" href="/assets/page-BmTf1Lf1.js"><link rel="prefetch" href="/assets/react-error-boundary.esm-fyoUBS25.js"><link rel="prefetch" href="/assets/page-BgUR_5z3.js"><link rel="prefetch" href="/assets/code-snippets-CqONne41.js"><link rel="prefetch" href="/assets/page-BRfeowe0.js"><link rel="prefetch" href="/assets/SecretTooltip-DaDLBVj-.js"><link rel="prefetch" href="/assets/page-BuZC8z6N.js"><link rel="prefetch" href="/assets/update-server-settings-mutation-Dv6qHtK9.js"><link rel="prefetch" href="/assets/page-DWOAh8Pp.js"><link rel="prefetch" href="/assets/page-CmzmFF4S.js"><link rel="prefetch" href="/assets/dates-3pMLCNrD.js"><link rel="prefetch" href="/assets/key-icon-DO4DPJHZ.js"><link rel="prefetch" href="/assets/service-CV2zjc-p.js"><link rel="prefetch" href="/assets/page-hNHJPQtK.js"><link rel="prefetch" href="/assets/page-BAjhc2bs.js"><link rel="prefetch" href="/assets/RunsBody-Csn2VEOE.js"><link rel="prefetch" href="/assets/RunSelector-Bhb83FyB.js"><link rel="prefetch" href="/assets/delete-run-Cwpxu1-d.js"><link rel="prefetch" href="/assets/DeleteAlertDialog-Bzq-uSd7.js"><link rel="prefetch" href="/assets/Tabs-CCQyIqRb.js"><link rel="prefetch" href="/assets/all-pipeline-runs-query-BLclwQSi.js"><link rel="prefetch" href="/assets/NestedCollapsible-DfTTGG8u.js"><link rel="prefetch" href="/assets/ExecutionStatus-UE6Rbmtk.js"><link rel="prefetch" href="/assets/page-CaTJVICi.js"><link rel="prefetch" href="/assets/page-BEAx6ZvH.js"><link rel="prefetch" href="/assets/page-D-MjLTXS.js"><link rel="prefetch" href="/assets/StackList-CQt1xGRh.js"><link rel="prefetch" href="/assets/DialogItem-zjMgCmCl.js"><link rel="prefetch" href="/assets/AlertDialogDropdownItem-Dn8bgaXG.js"><link rel="prefetch" href="/assets/CollapsibleCard-CQOb53t9.js"><link rel="prefetch" href="/assets/refresh-CM5T3QeU.js"><link rel="prefetch" href="/assets/SearchField-Cce00eQL.js"><link rel="prefetch" href="/assets/page-DCpZju6a.js"><link rel="prefetch" href="/assets/code-browser-j2EpcxIA.js"><link rel="prefetch" href="/assets/clock-CPA5cYxq.js"><link rel="prefetch" href="/assets/page-C4zMMcaH.js"><link rel="prefetch" href="/assets/page-P81CcE2L.js"><link rel="prefetch" href="/assets/flavor-select-c0w-6o9w.js"><link rel="prefetch" href="/assets/constants-DP3ZEnXH.js"><link rel="prefetch" href="/assets/arrow-left-CwgF2MEM.js"><link rel="prefetch" href="/assets/configuration-form-CjrAp0GS.js"><link rel="prefetch" href="/assets/terminal-square-DMtel8mb.js"><link rel="prefetch" href="/assets/index-BW-KaQ2p.js"><link rel="prefetch" href="/assets/InlineAvatar-CrHWwlf4.js"><link rel="prefetch" href="/assets/DisplayDate-CYVBBSgr.js"><link rel="prefetch" href="/assets/index-DR30v9MZ.js"><link rel="prefetch" href="/assets/page-DEUeF3mO.js"><link rel="prefetch" href="/assets/Lock-DW-0_M0o.js"><link rel="prefetch" href="/assets/components-Br2ezRib.js"><link rel="prefetch" href="/assets/create-stack-Bd2JdQer.js"><link rel="prefetch" href="/assets/index-d_40qKeY.js"><link rel="prefetch" href="/assets/type-guards-CaeD8wHO.js"><link rel="prefetch" href="/assets/trash-BWSZ7NRK.js"><link rel="prefetch" href="/assets/page-mtwS5oci.js"><link rel="prefetch" href="/assets/persist-BbdfLc0W.js"><link rel="prefetch" href="/assets/Partials-DggkUpWp.js"><link rel="prefetch" href="/assets/logs-B5n0U7tB.js"><link rel="prefetch" href="/assets/link-external-DUhCSKNm.js"><link rel="prefetch" href="/assets/NumberBox-D2A7ENHb.js"><link rel="prefetch" href="/assets/Infobox-CD0fDbYF.js"><link rel="prefetch" href="/assets/WizardFooter-Bk7gIKiS.js"><link rel="prefetch" href="/assets/Wizard-BVkN2a2x.js"><link rel="prefetch" href="/assets/ProviderRadio-B4CB4vzP.js"><link rel="prefetch" href="/assets/persist-BUqILw7G.js"><link rel="prefetch" href="/assets/ComponentBadge-CIFj0W7T.js"><link rel="prefetch" href="/assets/ProviderIcon-MdqWDO6-.js"><link rel="prefetch" href="/assets/sharedSchema-DpGc9kQg.js"><link rel="prefetch" href="/assets/index-CjdtNrfJ.js"><link rel="prefetch" href="/assets/stack-detail-query-BpzLZjvw.js"><link rel="prefetch" href="/assets/ComponentIcon-D3JHFhJU.js"><link rel="prefetch" href="/assets/layout-h3cbx8WZ.js"><link rel="prefetch" href="/assets/login-command-CkqxPtV3.js"><link rel="prefetch" href="/assets/CodeSnippet-CSINAl3I.js"><link rel="prefetch" href="/assets/zod-C0xYeTvL.js"><link rel="prefetch" href="/assets/index.esm-D7jFlf5N.js"><link rel="prefetch" href="/assets/ProCta-szzPO0Y7.js"><link rel="prefetch" href="/assets/check-DK77doTf.js"><link rel="prefetch" href="/assets/check-circle-mvyzYvIW.js"><link rel="prefetch" href="/assets/form-schemas-B5Ax1SZf.js"><link rel="prefetch" href="/assets/EmptyState-M1jafpg6.js"><link rel="prefetch" href="/assets/UsageReason-C2cNrUeS.js"><link rel="prefetch" href="/assets/gcp-CHNvgEss.js"><link rel="prefetch" href="/assets/kubernetes-D6OUjwSK.js"><link rel="prefetch" href="/assets/rocket-Cf-B-XOR.js"><link rel="prefetch" href="/assets/UpdatePasswordSchemas-CbbvoGYV.js"><link rel="prefetch" href="/assets/chevron-right-double-uNWbJT-C.js"><link rel="prefetch" href="/assets/plus-COjQg3AG.js"><link rel="prefetch" href="/assets/chevron-down-A-rmltmI.js"><link rel="prefetch" href="/assets/Error-kdeNHm_o.js"><link rel="prefetch" href="/assets/Helpbox-CeM-FPQl.js"><link rel="prefetch" href="/assets/help-DyMolRxD.js"><link rel="prefetch" href="/assets/Tick-D63_jhf1.js"><link rel="prefetch" href="/assets/file-text-BdxZdjP_.js"><link rel="prefetch" href="/assets/package-D1Mhqeh8.js"><link rel="prefetch" href="/assets/page-DnY59jOg.js"><link rel="prefetch" href="/assets/page-DivlNKt9.js"><link rel="prefetch" href="/assets/ProBadge-BCdprj69.js"><link rel="prefetch" href="/assets/page-bS5tHLDW.js"><link rel="prefetch" href="/assets/page-CPRymOIS.js"><link rel="prefetch" href="/assets/page-ir7Scz2Y.js"><link rel="prefetch" href="/assets/404-CYPi9d8E.js"><link rel="prefetch" href="/assets/CsvVizualization-Cklc1Vb5.js"><link rel="prefetch" href="/assets/MarkdownVisualization-URCyUPcZ.js"></head>
15
+ <link rel="prefetch" href="/assets/cloud-squares-DeRLMopf.svg"><link rel="prefetch" href="/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-400-normal-Bput3-QP.woff2"><link rel="prefetch" href="/assets/inter-greek-400-normal-DxZsaF_h.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-400-normal-DMkecbls.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-400-normal-hnt3BR84.woff2"><link rel="prefetch" href="/assets/inter-latin-400-normal-BOOGhInR.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-500-normal-B6guLgqG.woff2"><link rel="prefetch" href="/assets/inter-greek-500-normal-CeQXL5ds.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-500-normal-DOriooB6.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2"><link rel="prefetch" href="/assets/inter-latin-500-normal-D2bGa7uu.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-600-normal-BGBWG807.woff2"><link rel="prefetch" href="/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2"><link rel="prefetch" href="/assets/inter-greek-600-normal-Dhlb-90d.woff2"><link rel="prefetch" href="/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2"><link rel="prefetch" href="/assets/inter-latin-600-normal-D273HNI0.woff2"><link rel="prefetch" href="/assets/inter-latin-ext-600-normal-BnYJhD27.woff2"><link rel="prefetch" href="/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff"><link rel="prefetch" href="/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff"><link rel="prefetch" href="/assets/inter-greek-ext-400-normal-DCpCPQOf.woff"><link rel="prefetch" href="/assets/inter-greek-400-normal-BZzXV7-1.woff"><link rel="prefetch" href="/assets/inter-vietnamese-400-normal-BUNmGMP1.woff"><link rel="prefetch" href="/assets/inter-latin-ext-400-normal-C1t-h-pH.woff"><link rel="prefetch" href="/assets/inter-latin-400-normal-gitzw0hO.woff"><link rel="prefetch" href="/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff"><link rel="prefetch" href="/assets/inter-cyrillic-500-normal-DH2hs3aW.woff"><link rel="prefetch" href="/assets/inter-greek-ext-500-normal-M2hEX8vc.woff"><link rel="prefetch" href="/assets/inter-greek-500-normal-d_eO-yCQ.woff"><link rel="prefetch" href="/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff"><link rel="prefetch" href="/assets/inter-latin-500-normal-deR1Tlfd.woff"><link rel="prefetch" href="/assets/inter-latin-ext-500-normal-UMdmhHu2.woff"><link rel="prefetch" href="/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff"><link rel="prefetch" href="/assets/inter-cyrillic-600-normal-BuzJQFbW.woff"><link rel="prefetch" href="/assets/inter-greek-ext-600-normal-C9WLioJ8.woff"><link rel="prefetch" href="/assets/inter-greek-600-normal-CwicyhtI.woff"><link rel="prefetch" href="/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff"><link rel="prefetch" href="/assets/inter-latin-600-normal-B5cFAncS.woff"><link rel="prefetch" href="/assets/inter-latin-ext-600-normal-CAF0vJDd.woff"><link rel="prefetch" href="/assets/mcp-Cb1aMeoq.webp"><link rel="prefetch" href="/assets/acp-DOsXjFc7.webp"><link rel="prefetch" href="/assets/settings_preview-0JLrRgHP.webp"><link rel="prefetch" href="/assets/upgrade-form-CwRHBuXB.webp"><link rel="prefetch" href="/assets/connectors-video-C9qY4syJ.svg"><link rel="prefetch" href="/assets/repos-video-D8kpu60k.svg"><link rel="prefetch" href="/assets/tour-cover-BYfeen6M.webp"><link rel="prefetch" href="/assets/adam-e-y0WnB_.webp"><link rel="prefetch" href="/assets/alex-DcCuDHPg.webp"><link rel="prefetch" href="/assets/baris-C0ZrZ10g.webp"><link rel="prefetch" href="/assets/hamza-NKKOZz1I.webp"><link rel="prefetch" href="/assets/stefan-B08Ftbba.webp"><link rel="prefetch" href="/assets/templates-1S_8WeSK.webp"><link rel="prefetch" href="/assets/flyte-Cj-xy_8I.svg"><link rel="prefetch" href="/assets/metaflow-weOkWNyT.svg"><link rel="prefetch" href="/assets/CodeSnippet-CK5CxKct.css"><link rel="prefetch" href="/assets/page-DLVtrRa5.js"><link rel="prefetch" href="/assets/page-CjRoKEQs.js"><link rel="prefetch" href="/assets/page-BQVPbNps.js"><link rel="prefetch" href="/assets/page-BbygQpf-.js"><link rel="prefetch" href="/assets/page-C30HZCTR.js"><link rel="prefetch" href="/assets/SetPassword-BDFVwnNB.js"><link rel="prefetch" href="/assets/login-mutation-CwraNa5G.js"><link rel="prefetch" href="/assets/page-DKY_U5Sz.js"><link rel="prefetch" href="/assets/page-Bki79xdd.js"><link rel="prefetch" href="/assets/page-CBGeo-7W.js"><link rel="prefetch" href="/assets/not-found-BuK1QrF2.js"><link rel="prefetch" href="/assets/page-BnKwJnOb.js"><link rel="prefetch" href="/assets/page-DpY1koQY.js"><link rel="prefetch" href="/assets/PasswordChecker-lYTOtNom.js"><link rel="prefetch" href="/assets/tick-circle-m94Aa6Zt.js"><link rel="prefetch" href="/assets/page-3lW9eIer.js"><link rel="prefetch" href="/assets/page-DbEn9V9E.js"><link rel="prefetch" href="/assets/page-hVng6ANV.js"><link rel="prefetch" href="/assets/docker-BuDBFEDL.js"><link rel="prefetch" href="/assets/page-_Zt6UwiG.js"><link rel="prefetch" href="/assets/Commands-BwBzFj-5.js"><link rel="prefetch" href="/assets/page-C7buw8xJ.js"><link rel="prefetch" href="/assets/react-error-boundary.esm-fyoUBS25.js"><link rel="prefetch" href="/assets/page-Jw2QAdxa.js"><link rel="prefetch" href="/assets/code-snippets-CqONne41.js"><link rel="prefetch" href="/assets/page-BEibNYiA.js"><link rel="prefetch" href="/assets/SecretTooltip-CCn9HfEh.js"><link rel="prefetch" href="/assets/page-DwIlrsF0.js"><link rel="prefetch" href="/assets/update-server-settings-mutation-DduehrZn.js"><link rel="prefetch" href="/assets/page-Co-FJ5ds.js"><link rel="prefetch" href="/assets/page-BOE2XBFy.js"><link rel="prefetch" href="/assets/dates-3pMLCNrD.js"><link rel="prefetch" href="/assets/key-icon-DO4DPJHZ.js"><link rel="prefetch" href="/assets/service-MHyqhRgp.js"><link rel="prefetch" href="/assets/page-D0QcEBi1.js"><link rel="prefetch" href="/assets/page-9PzQok8O.js"><link rel="prefetch" href="/assets/RunsBody-B6mBjv-_.js"><link rel="prefetch" href="/assets/RunSelector-DoL_gMHJ.js"><link rel="prefetch" href="/assets/delete-run-B5xUZwdP.js"><link rel="prefetch" href="/assets/DeleteAlertDialog-Bp0o-UXZ.js"><link rel="prefetch" href="/assets/Tabs-BuZG8ft1.js"><link rel="prefetch" href="/assets/all-pipeline-runs-query-D9XfZpmV.js"><link rel="prefetch" href="/assets/NestedCollapsible-Ce1bmT8N.js"><link rel="prefetch" href="/assets/ExecutionStatus-HnZXi9bW.js"><link rel="prefetch" href="/assets/page-CZgeF_wQ.js"><link rel="prefetch" href="/assets/page-CIDo1Ajk.js"><link rel="prefetch" href="/assets/page-Cu8vuohQ.js"><link rel="prefetch" href="/assets/StackList-dhdUtky3.js"><link rel="prefetch" href="/assets/DialogItem-DHw2ihTx.js"><link rel="prefetch" href="/assets/AlertDialogDropdownItem-C_qWs-4u.js"><link rel="prefetch" href="/assets/CollapsibleCard-9sSz7n1R.js"><link rel="prefetch" href="/assets/refresh-CM5T3QeU.js"><link rel="prefetch" href="/assets/SearchField-DHl5flXv.js"><link rel="prefetch" href="/assets/page-CgJcperk.js"><link rel="prefetch" href="/assets/code-browser-j2EpcxIA.js"><link rel="prefetch" href="/assets/clock-CPA5cYxq.js"><link rel="prefetch" href="/assets/page-0AIX3VK8.js"><link rel="prefetch" href="/assets/page-DrS4WOup.js"><link rel="prefetch" href="/assets/flavor-select-DOLAl-S4.js"><link rel="prefetch" href="/assets/constants-DP3ZEnXH.js"><link rel="prefetch" href="/assets/arrow-left-CwgF2MEM.js"><link rel="prefetch" href="/assets/configuration-form-Ci_QlfZC.js"><link rel="prefetch" href="/assets/terminal-square-DMtel8mb.js"><link rel="prefetch" href="/assets/index-BoWZ9rXk.js"><link rel="prefetch" href="/assets/InlineAvatar-CrAwe7Pl.js"><link rel="prefetch" href="/assets/DisplayDate-CYVBBSgr.js"><link rel="prefetch" href="/assets/index-DR30v9MZ.js"><link rel="prefetch" href="/assets/page-DQHU5o_C.js"><link rel="prefetch" href="/assets/Lock-DW-0_M0o.js"><link rel="prefetch" href="/assets/components-Br2ezRib.js"><link rel="prefetch" href="/assets/create-stack-CoQ5SEJL.js"><link rel="prefetch" href="/assets/index-ojAuWXMf.js"><link rel="prefetch" href="/assets/type-guards-CaeD8wHO.js"><link rel="prefetch" href="/assets/trash-BWSZ7NRK.js"><link rel="prefetch" href="/assets/page-Czj8fu8q.js"><link rel="prefetch" href="/assets/persist-xOAq24Bm.js"><link rel="prefetch" href="/assets/Partials-DjTM0Oe-.js"><link rel="prefetch" href="/assets/logs-B5n0U7tB.js"><link rel="prefetch" href="/assets/link-external-DUhCSKNm.js"><link rel="prefetch" href="/assets/NumberBox-D2A7ENHb.js"><link rel="prefetch" href="/assets/Infobox-C4Op55B8.js"><link rel="prefetch" href="/assets/WizardFooter-CnM-50jL.js"><link rel="prefetch" href="/assets/Wizard-BSH_lIfi.js"><link rel="prefetch" href="/assets/ProviderRadio-BWFJPEY2.js"><link rel="prefetch" href="/assets/persist-DLvsEXh0.js"><link rel="prefetch" href="/assets/ComponentBadge-CMx2DbsV.js"><link rel="prefetch" href="/assets/ProviderIcon-B8W7AGNk.js"><link rel="prefetch" href="/assets/sharedSchema-CQA5lnlU.js"><link rel="prefetch" href="/assets/index-e8udi7QT.js"><link rel="prefetch" href="/assets/stack-detail-query-C1GoxBeK.js"><link rel="prefetch" href="/assets/ComponentIcon-CSxdApv8.js"><link rel="prefetch" href="/assets/layout-h3cbx8WZ.js"><link rel="prefetch" href="/assets/login-command-CkqxPtV3.js"><link rel="prefetch" href="/assets/CodeSnippet-nRnOvbOJ.js"><link rel="prefetch" href="/assets/zod-C0xYeTvL.js"><link rel="prefetch" href="/assets/index.esm-D7jFlf5N.js"><link rel="prefetch" href="/assets/ProCta-BYSSivgY.js"><link rel="prefetch" href="/assets/check-DK77doTf.js"><link rel="prefetch" href="/assets/check-circle-mvyzYvIW.js"><link rel="prefetch" href="/assets/form-schemas-BaEJ1z87.js"><link rel="prefetch" href="/assets/EmptyState-M1jafpg6.js"><link rel="prefetch" href="/assets/UsageReason-DOMAzO02.js"><link rel="prefetch" href="/assets/gcp-CHNvgEss.js"><link rel="prefetch" href="/assets/kubernetes-D6OUjwSK.js"><link rel="prefetch" href="/assets/rocket-Cf-B-XOR.js"><link rel="prefetch" href="/assets/UpdatePasswordSchemas-3gg2tC-H.js"><link rel="prefetch" href="/assets/chevron-right-double-uNWbJT-C.js"><link rel="prefetch" href="/assets/plus-COjQg3AG.js"><link rel="prefetch" href="/assets/chevron-down-A-rmltmI.js"><link rel="prefetch" href="/assets/Error-DRhVeVHQ.js"><link rel="prefetch" href="/assets/Helpbox-Dsr3ZYcL.js"><link rel="prefetch" href="/assets/help-DyMolRxD.js"><link rel="prefetch" href="/assets/Tick-C4gtED35.js"><link rel="prefetch" href="/assets/file-text-BdxZdjP_.js"><link rel="prefetch" href="/assets/package-D1Mhqeh8.js"><link rel="prefetch" href="/assets/page-HIAPXq4w.js"><link rel="prefetch" href="/assets/page-KRP_w5zH.js"><link rel="prefetch" href="/assets/ProBadge-CDEqgzh8.js"><link rel="prefetch" href="/assets/page-B5clbTo4.js"><link rel="prefetch" href="/assets/page-DHDeVaMO.js"><link rel="prefetch" href="/assets/page-C-6XUKSp.js"><link rel="prefetch" href="/assets/404-o3nB5iwI.js"><link rel="prefetch" href="/assets/CsvVizualization-lxB2iyEh.js"><link rel="prefetch" href="/assets/MarkdownVisualization-URCyUPcZ.js"></head>
16
16
  <body>
17
17
  <div id="root"></div>
18
18
  </body>
@@ -18,7 +18,6 @@ import tarfile
18
18
  import tempfile
19
19
  from typing import (
20
20
  TYPE_CHECKING,
21
- Optional,
22
21
  )
23
22
 
24
23
  from zenml.artifacts.utils import _load_artifact_store
@@ -78,20 +77,15 @@ def verify_artifact_is_downloadable(
78
77
 
79
78
  def create_artifact_archive(
80
79
  artifact: "ArtifactVersionResponse",
81
- archive_path: Optional[str] = None,
82
80
  ) -> str:
83
81
  """Create an archive of the given artifact.
84
82
 
85
83
  Args:
86
84
  artifact: The artifact to archive.
87
- archive_path: The path to which to save the archive.
88
85
 
89
86
  Returns:
90
87
  The path to the created archive.
91
88
  """
92
- if archive_path is None:
93
- archive_path = tempfile.mktemp()
94
-
95
89
  artifact_store = verify_artifact_is_downloadable(artifact)
96
90
 
97
91
  def _prepare_tarinfo(path: str) -> tarfile.TarInfo:
@@ -101,26 +95,29 @@ def create_artifact_archive(
101
95
  tarinfo.size = size
102
96
  return tarinfo
103
97
 
104
- with tarfile.open(name=archive_path, mode="w:gz") as tar:
105
- if artifact_store.isdir(artifact.uri):
106
- for dir, _, files in artifact_store.walk(artifact.uri):
107
- dir = dir.decode() if isinstance(dir, bytes) else dir
108
- dir_info = tarfile.TarInfo(
109
- name=os.path.relpath(dir, artifact.uri)
110
- )
111
- dir_info.type = tarfile.DIRTYPE
112
- dir_info.mode = 0o755
113
- tar.addfile(dir_info)
114
-
115
- for file in files:
116
- file = file.decode() if isinstance(file, bytes) else file
117
- path = os.path.join(dir, file)
118
- tarinfo = _prepare_tarinfo(path)
119
- with artifact_store.open(path, "rb") as f:
120
- tar.addfile(tarinfo, fileobj=f)
121
- else:
122
- tarinfo = _prepare_tarinfo(artifact.uri)
123
- with artifact_store.open(artifact.uri, "rb") as f:
124
- tar.addfile(tarinfo, fileobj=f)
125
-
126
- return archive_path
98
+ with tempfile.NamedTemporaryFile(delete=False) as temp_file:
99
+ with tarfile.open(fileobj=temp_file, mode="w:gz") as tar:
100
+ if artifact_store.isdir(artifact.uri):
101
+ for dir, _, files in artifact_store.walk(artifact.uri):
102
+ dir = dir.decode() if isinstance(dir, bytes) else dir
103
+ dir_info = tarfile.TarInfo(
104
+ name=os.path.relpath(dir, artifact.uri)
105
+ )
106
+ dir_info.type = tarfile.DIRTYPE
107
+ dir_info.mode = 0o755
108
+ tar.addfile(dir_info)
109
+
110
+ for file in files:
111
+ file = (
112
+ file.decode() if isinstance(file, bytes) else file
113
+ )
114
+ path = os.path.join(dir, file)
115
+ tarinfo = _prepare_tarinfo(path)
116
+ with artifact_store.open(path, "rb") as f:
117
+ tar.addfile(tarinfo, fileobj=f)
118
+ else:
119
+ tarinfo = _prepare_tarinfo(artifact.uri)
120
+ with artifact_store.open(artifact.uri, "rb") as f:
121
+ tar.addfile(tarinfo, fileobj=f)
122
+
123
+ return temp_file.name
zenml/zen_server/jwt.py CHANGED
@@ -54,7 +54,6 @@ class JWTToken(BaseModel):
54
54
  api_key_id: Optional[UUID] = None
55
55
  schedule_id: Optional[UUID] = None
56
56
  pipeline_run_id: Optional[UUID] = None
57
- step_run_id: Optional[UUID] = None
58
57
  session_id: Optional[UUID] = None
59
58
  claims: Dict[str, Any] = {}
60
59
 
@@ -148,16 +147,6 @@ class JWTToken(BaseModel):
148
147
  "UUID"
149
148
  )
150
149
 
151
- step_run_id: Optional[UUID] = None
152
- if "step_run_id" in claims:
153
- try:
154
- step_run_id = UUID(claims.pop("step_run_id"))
155
- except ValueError:
156
- raise CredentialsNotValid(
157
- "Invalid JWT token: the step_run_id claim is not a valid "
158
- "UUID"
159
- )
160
-
161
150
  session_id: Optional[UUID] = None
162
151
  if "session_id" in claims:
163
152
  try:
@@ -174,7 +163,6 @@ class JWTToken(BaseModel):
174
163
  api_key_id=api_key_id,
175
164
  schedule_id=schedule_id,
176
165
  pipeline_run_id=pipeline_run_id,
177
- step_run_id=step_run_id,
178
166
  session_id=session_id,
179
167
  claims=claims,
180
168
  )
@@ -212,8 +200,6 @@ class JWTToken(BaseModel):
212
200
  claims["schedule_id"] = str(self.schedule_id)
213
201
  if self.pipeline_run_id:
214
202
  claims["pipeline_run_id"] = str(self.pipeline_run_id)
215
- if self.step_run_id:
216
- claims["step_run_id"] = str(self.step_run_id)
217
203
  if self.session_id:
218
204
  claims["session_id"] = str(self.session_id)
219
205
 
@@ -477,7 +477,6 @@ def api_token(
477
477
  expires_in: Optional[int] = None,
478
478
  schedule_id: Optional[UUID] = None,
479
479
  pipeline_run_id: Optional[UUID] = None,
480
- step_run_id: Optional[UUID] = None,
481
480
  auth_context: AuthContext = Security(authorize),
482
481
  ) -> str:
483
482
  """Generate an API token for the current user.
@@ -506,7 +505,6 @@ def api_token(
506
505
  schedule_id: The ID of the schedule to scope the workload API token to.
507
506
  pipeline_run_id: The ID of the pipeline run to scope the workload API
508
507
  token to.
509
- step_run_id: The ID of the step run to scope the workload API token to.
510
508
  auth_context: The authentication context.
511
509
 
512
510
  Returns:
@@ -522,10 +520,10 @@ def api_token(
522
520
  raise AuthorizationException("Not authenticated.")
523
521
 
524
522
  if token_type == APITokenType.GENERIC:
525
- if schedule_id or pipeline_run_id or step_run_id:
523
+ if schedule_id or pipeline_run_id:
526
524
  raise ValueError(
527
- "Generic API tokens cannot be scoped to a schedule, pipeline "
528
- "run or step run."
525
+ "Generic API tokens cannot be scoped to a schedule or pipeline "
526
+ "run."
529
527
  )
530
528
 
531
529
  config = server_config()
@@ -549,12 +547,10 @@ def api_token(
549
547
 
550
548
  schedule_id = schedule_id or token.schedule_id
551
549
  pipeline_run_id = pipeline_run_id or token.pipeline_run_id
552
- step_run_id = step_run_id or token.step_run_id
553
550
 
554
- if not pipeline_run_id and not schedule_id and not step_run_id:
551
+ if not pipeline_run_id and not schedule_id:
555
552
  raise ValueError(
556
- "Workload API tokens must be scoped to a schedule, pipeline run "
557
- "or step run."
553
+ "Workload API tokens must be scoped to a schedule or pipeline run."
558
554
  )
559
555
 
560
556
  if schedule_id and token.schedule_id and schedule_id != token.schedule_id:
@@ -575,13 +571,6 @@ def api_token(
575
571
  f"pipeline run {token.pipeline_run_id}."
576
572
  )
577
573
 
578
- if step_run_id and token.step_run_id and step_run_id != token.step_run_id:
579
- raise AuthorizationException(
580
- f"Unable to scope API token to step run {step_run_id}. The "
581
- f"token used to authorize this request is already scoped to "
582
- f"step run {token.step_run_id}."
583
- )
584
-
585
574
  project_id: Optional[UUID] = None
586
575
 
587
576
  if schedule_id:
@@ -623,25 +612,6 @@ def api_token(
623
612
  "for security reasons."
624
613
  )
625
614
 
626
- if step_run_id:
627
- # The step run must exist and the step must not be concluded
628
- try:
629
- step_run = zen_store().get_run_step(step_run_id, hydrate=False)
630
- except KeyError:
631
- raise ValueError(
632
- f"Step run {step_run_id} does not exist and API tokens cannot "
633
- "be generated for non-existent step runs for security reasons."
634
- )
635
-
636
- project_id = step_run.project.id
637
-
638
- if step_run.status.is_finished:
639
- raise ValueError(
640
- f"The execution of step run {step_run_id} has already "
641
- "concluded and API tokens can no longer be generated for it "
642
- "for security reasons."
643
- )
644
-
645
615
  assert project_id is not None
646
616
  verify_permission(
647
617
  resource_type=ResourceType.PIPELINE_RUN,
@@ -656,7 +626,6 @@ def api_token(
656
626
  device=auth_context.device,
657
627
  schedule_id=schedule_id,
658
628
  pipeline_run_id=pipeline_run_id,
659
- step_run_id=step_run_id,
660
629
  # Don't include the access token as a cookie in the response
661
630
  response=None,
662
631
  # Never expire the token
@@ -19,11 +19,13 @@ from uuid import UUID
19
19
  from fastapi import APIRouter, Depends, Security
20
20
 
21
21
  from zenml.constants import API, PIPELINE_DEPLOYMENTS, VERSION_1
22
+ from zenml.logging.step_logging import fetch_logs
22
23
  from zenml.models import (
23
24
  Page,
24
25
  PipelineDeploymentFilter,
25
26
  PipelineDeploymentRequest,
26
27
  PipelineDeploymentResponse,
28
+ PipelineRunFilter,
27
29
  )
28
30
  from zenml.zen_server.auth import AuthContext, authorize
29
31
  from zenml.zen_server.exceptions import error_response
@@ -179,33 +181,68 @@ def delete_deployment(
179
181
  )
180
182
 
181
183
 
182
- if server_config().workload_manager_enabled:
184
+ @router.get(
185
+ "/{deployment_id}/logs",
186
+ responses={
187
+ 401: error_response,
188
+ 404: error_response,
189
+ 422: error_response,
190
+ },
191
+ )
192
+ @handle_exceptions
193
+ def deployment_logs(
194
+ deployment_id: UUID,
195
+ offset: int = 0,
196
+ length: int = 1024 * 1024 * 16, # Default to 16MiB of data
197
+ _: AuthContext = Security(authorize),
198
+ ) -> str:
199
+ """Get deployment logs.
200
+
201
+ Args:
202
+ deployment_id: ID of the deployment.
203
+ offset: The offset from which to start reading.
204
+ length: The amount of bytes that should be read.
205
+
206
+ Returns:
207
+ The deployment logs.
208
+
209
+ Raises:
210
+ KeyError: If no logs are available for the deployment.
211
+ """
212
+ store = zen_store()
183
213
 
184
- @router.get(
185
- "/{deployment_id}/logs",
186
- responses={
187
- 401: error_response,
188
- 404: error_response,
189
- 422: error_response,
190
- },
214
+ deployment = verify_permissions_and_get_entity(
215
+ id=deployment_id,
216
+ get_method=store.get_deployment,
217
+ hydrate=True,
191
218
  )
192
- @handle_exceptions
193
- def deployment_logs(
194
- deployment_id: UUID,
195
- _: AuthContext = Security(authorize),
196
- ) -> str:
197
- """Get deployment logs.
198
-
199
- Args:
200
- deployment_id: ID of the deployment.
201
-
202
- Returns:
203
- The deployment logs.
204
- """
205
- deployment = verify_permissions_and_get_entity(
206
- id=deployment_id,
207
- get_method=zen_store().get_deployment,
208
- hydrate=True,
209
- )
210
219
 
220
+ if deployment.template_id and server_config().workload_manager_enabled:
211
221
  return workload_manager().get_logs(workload_id=deployment.id)
222
+
223
+ # Get the last pipeline run for this deployment
224
+ pipeline_runs = store.list_runs(
225
+ runs_filter_model=PipelineRunFilter(
226
+ project=deployment.project.id,
227
+ sort_by="asc:created",
228
+ size=1,
229
+ deployment_id=deployment.id,
230
+ )
231
+ )
232
+
233
+ if len(pipeline_runs.items) == 0:
234
+ return ""
235
+
236
+ run = pipeline_runs.items[0]
237
+
238
+ logs = run.logs
239
+ if logs is None:
240
+ raise KeyError("No logs available for this deployment")
241
+
242
+ return fetch_logs(
243
+ zen_store=store,
244
+ artifact_store_id=logs.artifact_store_id,
245
+ logs_uri=logs.uri,
246
+ offset=offset,
247
+ length=length,
248
+ )
@@ -29,6 +29,7 @@ from zenml.constants import (
29
29
  )
30
30
  from zenml.enums import ExecutionStatus, StackComponentType
31
31
  from zenml.logger import get_logger
32
+ from zenml.logging.step_logging import fetch_logs
32
33
  from zenml.models import (
33
34
  Page,
34
35
  PipelineRunFilter,
@@ -55,6 +56,8 @@ from zenml.zen_server.routers.projects_endpoints import workspace_router
55
56
  from zenml.zen_server.utils import (
56
57
  handle_exceptions,
57
58
  make_dependable,
59
+ server_config,
60
+ workload_manager,
58
61
  zen_store,
59
62
  )
60
63
 
@@ -375,3 +378,57 @@ def refresh_run_status(
375
378
  f"The stack, the run '{run.id}' was executed on, is deleted."
376
379
  )
377
380
  run.refresh_run_status()
381
+
382
+
383
+ @router.get(
384
+ "/{run_id}/logs",
385
+ responses={
386
+ 401: error_response,
387
+ 404: error_response,
388
+ 422: error_response,
389
+ },
390
+ )
391
+ @handle_exceptions
392
+ def run_logs(
393
+ run_id: UUID,
394
+ offset: int = 0,
395
+ length: int = 1024 * 1024 * 16, # Default to 16MiB of data
396
+ _: AuthContext = Security(authorize),
397
+ ) -> str:
398
+ """Get pipeline run logs.
399
+
400
+ Args:
401
+ run_id: ID of the pipeline run.
402
+ offset: The offset from which to start reading.
403
+ length: The amount of bytes that should be read.
404
+
405
+ Returns:
406
+ The pipeline run logs.
407
+
408
+ Raises:
409
+ KeyError: If no logs are available for the pipeline run.
410
+ """
411
+ store = zen_store()
412
+
413
+ run = verify_permissions_and_get_entity(
414
+ id=run_id,
415
+ get_method=store.get_run,
416
+ hydrate=True,
417
+ )
418
+
419
+ if run.deployment_id:
420
+ deployment = store.get_deployment(run.deployment_id)
421
+ if deployment.template_id and server_config().workload_manager_enabled:
422
+ return workload_manager().get_logs(workload_id=deployment.id)
423
+
424
+ logs = run.logs
425
+ if logs is None:
426
+ raise KeyError("No logs available for this pipeline run")
427
+
428
+ return fetch_logs(
429
+ zen_store=store,
430
+ artifact_store_id=logs.artifact_store_id,
431
+ logs_uri=logs.uri,
432
+ offset=offset,
433
+ length=length,
434
+ )
@@ -373,7 +373,7 @@ def deployment_request_from_template(
373
373
  )
374
374
 
375
375
  step_config_dict_base = pipeline_configuration.model_dump(
376
- exclude={"name", "parameters", "tags"}
376
+ exclude={"name", "parameters", "tags", "enable_pipeline_logs"}
377
377
  )
378
378
  steps = {}
379
379
  for invocation_id, step in deployment.step_configurations.items():
@@ -0,0 +1,23 @@
1
+ """Release [0.81.0].
2
+
3
+ Revision ID: 0.81.0
4
+ Revises: ff538a321a92
5
+ Create Date: 2025-04-15 13:02:07.885988
6
+
7
+ """
8
+
9
+ # revision identifiers, used by Alembic.
10
+ revision = "0.81.0"
11
+ down_revision = "ff538a321a92"
12
+ branch_labels = None
13
+ depends_on = None
14
+
15
+
16
+ def upgrade() -> None:
17
+ """Upgrade database schema and/or data, creating a new revision."""
18
+ pass
19
+
20
+
21
+ def downgrade() -> None:
22
+ """Downgrade database schema and/or data back to the previous revision."""
23
+ pass
@@ -4074,15 +4074,6 @@ class RestZenStore(BaseZenStore):
4074
4074
  # Check if username and password are configured
4075
4075
  username, password = credentials_store.get_password(self.url)
4076
4076
 
4077
- api_key_hint = (
4078
- "\nHint: If you're getting this error in an automated, "
4079
- "non-interactive workload like a pipeline run or a CI/CD job, "
4080
- "you should use a service account API key to authenticate to "
4081
- "the server instead of temporary CLI login credentials. For "
4082
- "more information, see "
4083
- "https://docs.zenml.io/how-to/project-setup-and-management/connecting-to-zenml/connect-with-a-service-account"
4084
- )
4085
-
4086
4077
  if api_key is not None:
4087
4078
  # An API key is configured. Use it as a password to
4088
4079
  # authenticate.
@@ -4119,14 +4110,12 @@ class RestZenStore(BaseZenStore):
4119
4110
  "You need to be logged in to ZenML Pro in order to "
4120
4111
  f"access the ZenML Pro server '{self.url}'. Please run "
4121
4112
  "'zenml login' to log in or choose a different server."
4122
- + api_key_hint
4123
4113
  )
4124
4114
 
4125
4115
  elif pro_token.expired:
4126
4116
  raise CredentialsNotValid(
4127
4117
  "Your ZenML Pro login session has expired. "
4128
4118
  "Please log in again using 'zenml login'."
4129
- + api_key_hint
4130
4119
  )
4131
4120
 
4132
4121
  data = {
@@ -4140,13 +4129,12 @@ class RestZenStore(BaseZenStore):
4140
4129
  raise CredentialsNotValid(
4141
4130
  "No valid credentials found. Please run 'zenml login "
4142
4131
  f"--url {self.url}' to connect to the current server."
4143
- + api_key_hint
4144
4132
  )
4145
4133
  elif token.expired:
4146
4134
  raise CredentialsNotValid(
4147
4135
  "Your authentication to the current server has expired. "
4148
4136
  "Please log in again using 'zenml login --url "
4149
- f"{self.url}'." + api_key_hint
4137
+ f"{self.url}'."
4150
4138
  )
4151
4139
 
4152
4140
  response = self._handle_response(
@@ -4405,6 +4393,7 @@ class RestZenStore(BaseZenStore):
4405
4393
  # explicitly indicates that the credentials are not valid and
4406
4394
  # they can be thrown away or when the request is not
4407
4395
  # authenticated at all.
4396
+ credentials_store = get_credentials_store()
4408
4397
 
4409
4398
  if self._api_token is None:
4410
4399
  # The last request was not authenticated with an API
@@ -4416,6 +4405,20 @@ class RestZenStore(BaseZenStore):
4416
4405
  "Re-authenticating and retrying..."
4417
4406
  )
4418
4407
  self.authenticate()
4408
+ elif not credentials_store.can_login(self.url):
4409
+ # The request failed either because we're not
4410
+ # authenticated or our current credentials are not valid
4411
+ # anymore.
4412
+ logger.error(
4413
+ "The current token is no longer valid, and "
4414
+ "it is not possible to generate a new token using the "
4415
+ "configured credentials. Please run "
4416
+ f"`zenml login --url {self.url}` to re-authenticate to "
4417
+ "the server or authenticate using an API key. See "
4418
+ "https://docs.zenml.io/how-to/project-setup-and-management/connecting-to-zenml/connect-with-a-service-account "
4419
+ "for more information."
4420
+ )
4421
+ raise e
4419
4422
  elif not re_authenticated:
4420
4423
  # The last request was authenticated with an API token
4421
4424
  # that was rejected by the server. We attempt a
@@ -412,6 +412,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
412
412
  resources = PipelineRunResponseResources(
413
413
  model_version=model_version,
414
414
  tags=[tag.to_model() for tag in self.tags],
415
+ logs=self.logs.to_model() if self.logs else None,
415
416
  )
416
417
 
417
418
  return PipelineRunResponse(
@@ -5022,6 +5022,24 @@ class SqlZenStore(BaseZenStore):
5022
5022
  new_run = PipelineRunSchema.from_request(pipeline_run)
5023
5023
 
5024
5024
  session.add(new_run)
5025
+
5026
+ # Add logs entry for the run if exists
5027
+ if pipeline_run.logs is not None:
5028
+ self._get_reference_schema_by_id(
5029
+ resource=pipeline_run,
5030
+ reference_schema=StackComponentSchema,
5031
+ reference_id=pipeline_run.logs.artifact_store_id,
5032
+ session=session,
5033
+ reference_type="logs artifact store",
5034
+ )
5035
+
5036
+ log_entry = LogsSchema(
5037
+ uri=pipeline_run.logs.uri,
5038
+ pipeline_run_id=new_run.id,
5039
+ artifact_store_id=pipeline_run.logs.artifact_store_id,
5040
+ )
5041
+ session.add(log_entry)
5042
+
5025
5043
  try:
5026
5044
  session.commit()
5027
5045
  except IntegrityError: