zenml-nightly 0.82.1.dev20250527__py3-none-any.whl → 0.83.0.dev20250529__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zenml/VERSION +1 -1
- zenml/cli/base.py +6 -1
- zenml/cli/model.py +16 -36
- zenml/cli/server.py +8 -3
- zenml/client.py +20 -4
- zenml/client_lazy_loader.py +2 -0
- zenml/config/docker_settings.py +15 -2
- zenml/enums.py +3 -0
- zenml/event_hub/event_hub.py +1 -1
- zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +1 -1
- zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +1 -1
- zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +3 -0
- zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +37 -26
- zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +45 -4
- zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +92 -84
- zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +207 -179
- zenml/integrations/skypilot/utils.py +273 -0
- zenml/integrations/skypilot_aws/__init__.py +1 -2
- zenml/integrations/skypilot_azure/__init__.py +1 -2
- zenml/integrations/skypilot_gcp/__init__.py +9 -1
- zenml/integrations/skypilot_kubernetes/__init__.py +2 -3
- zenml/integrations/skypilot_lambda/__init__.py +1 -2
- zenml/login/web_login.py +1 -1
- zenml/model/model.py +13 -23
- zenml/models/__init__.py +39 -2
- zenml/models/v2/base/scoped.py +34 -15
- zenml/models/v2/core/artifact.py +10 -9
- zenml/models/v2/core/artifact_version.py +16 -16
- zenml/models/v2/core/logs.py +8 -50
- zenml/models/v2/core/model.py +10 -10
- zenml/models/v2/core/model_version.py +155 -88
- zenml/models/v2/core/pipeline.py +10 -11
- zenml/models/v2/core/pipeline_deployment.py +1 -9
- zenml/models/v2/core/pipeline_run.py +10 -17
- zenml/models/v2/core/run_template.py +10 -10
- zenml/models/v2/core/step_run.py +100 -16
- zenml/models/v2/core/tag.py +5 -4
- zenml/models/v2/misc/pipeline_run_dag.py +46 -0
- zenml/orchestrators/base_orchestrator.py +8 -19
- zenml/orchestrators/cache_utils.py +48 -1
- zenml/orchestrators/input_utils.py +35 -39
- zenml/orchestrators/step_launcher.py +1 -1
- zenml/orchestrators/step_run_utils.py +26 -10
- zenml/pipelines/pipeline_definition.py +3 -3
- zenml/pipelines/run_utils.py +2 -3
- zenml/service_connectors/service_connector.py +5 -1
- zenml/stack/stack_component.py +1 -4
- zenml/steps/step_context.py +1 -1
- zenml/utils/dashboard_utils.py +3 -3
- zenml/zen_server/auth.py +6 -3
- zenml/zen_server/dashboard/assets/{404-_AtuLtaX.js → 404-DmJUgorp.js} +1 -1
- zenml/zen_server/dashboard/assets/{@radix-C7hRs6Kx.js → @radix-Cdvw4jJ8.js} +1 -1
- zenml/zen_server/dashboard/assets/{@react-router-CNP6g_RL.js → @react-router-DeDfXbUF.js} +5 -5
- zenml/zen_server/dashboard/assets/{@reactflow-CQi1Z1Wq.js → @reactflow-8OCk19Fi.js} +1 -1
- zenml/zen_server/dashboard/assets/{@tanstack-CSxjHCME.js → @tanstack-5gTMR7G2.js} +4 -4
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-CZW4QyWn.js +1 -0
- zenml/zen_server/dashboard/assets/ButtonGroup-DFWWFGUE.js +1 -0
- zenml/zen_server/dashboard/assets/{CodeSnippet-CvI6D0wx.js → CodeSnippet-D2HkkAGr.js} +1 -1
- zenml/zen_server/dashboard/assets/CollapsibleCard-CnS09ljw.js +1 -0
- zenml/zen_server/dashboard/assets/{ComponentBadge-DKw7Gndh.js → ComponentBadge-CDgdd0Ks.js} +1 -1
- zenml/zen_server/dashboard/assets/ComponentIcon-CbbOc7lb.js +1 -0
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DVvXt-S6.js → DeleteAlertDialog-VIOMDLmx.js} +1 -1
- zenml/zen_server/dashboard/assets/DialogItem-ClFCqxEp.js +1 -0
- zenml/zen_server/dashboard/assets/{DisplayDate-CYVBBSgr.js → DisplayDate-8RESqe5H.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-M1jafpg6.js → EmptyState-CjrgDtVk.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-BWaXP0VK.js → Error-CQzjbDcN.js} +1 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-CWreILP0.js +1 -0
- zenml/zen_server/dashboard/assets/{Helpbox-iE1xLmiZ.js → Helpbox-CiKxG5_X.js} +1 -1
- zenml/zen_server/dashboard/assets/Infobox-CGxFvqzi.js +1 -0
- zenml/zen_server/dashboard/assets/LeftSideMenu-DCsKdIjC.js +1 -0
- zenml/zen_server/dashboard/assets/{Lock-DW-0_M0o.js → Lock-CrIAdQo6.js} +1 -1
- zenml/zen_server/dashboard/assets/NestedCollapsible-3M4llYtH.js +1 -0
- zenml/zen_server/dashboard/assets/NumberBox-C0mQktmV.js +1 -0
- zenml/zen_server/dashboard/assets/Partials-DSjkttlz.js +1 -0
- zenml/zen_server/dashboard/assets/{PasswordChecker-lYTOtNom.js → PasswordChecker-B88WjuCe.js} +1 -1
- zenml/zen_server/dashboard/assets/ProCta-Dm5cWKpS.js +1 -0
- zenml/zen_server/dashboard/assets/{ProviderIcon-DLo7t1lo.js → ProviderIcon-DPwMR6nF.js} +1 -1
- zenml/zen_server/dashboard/assets/ProviderRadio-DEDNRgAb.js +1 -0
- zenml/zen_server/dashboard/assets/RunsBody-BRBn1e2O.js +1 -0
- zenml/zen_server/dashboard/assets/SearchField-DY6-UbRT.js +1 -0
- zenml/zen_server/dashboard/assets/SecretTooltip-CZTRnaCV.js +1 -0
- zenml/zen_server/dashboard/assets/{SetPassword-DR-EiLI5.js → SetPassword-BjNGDC5e.js} +1 -1
- zenml/zen_server/dashboard/assets/SheetHeader-CASpN2Lz.js +1 -0
- zenml/zen_server/dashboard/assets/StackComponentList-Be1pQt9m.js +1 -0
- zenml/zen_server/dashboard/assets/StackList-BdiR5DvR.js +1 -0
- zenml/zen_server/dashboard/assets/StackName-ojLC6xdl.js +1 -0
- zenml/zen_server/dashboard/assets/Tabs-DNSKblCM.js +1 -0
- zenml/zen_server/dashboard/assets/Tick-BPrWnNlN.js +1 -0
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DbFEaezI.js → UpdatePasswordSchemas-CNfKDo2Q.js} +1 -1
- zenml/zen_server/dashboard/assets/UsageReason-Cb-mpV8M.js +1 -0
- zenml/zen_server/dashboard/assets/{Wizard-CMI6Ksgz.js → Wizard-Dg8Pmn5A.js} +1 -1
- zenml/zen_server/dashboard/assets/WizardFooter-BcNDIvlQ.js +1 -0
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-BGASHYtF.js → all-pipeline-runs-query-DCdax7I5.js} +1 -1
- zenml/zen_server/dashboard/assets/{arrow-left-CwgF2MEM.js → arrow-left-MRXv5pAH.js} +1 -1
- zenml/zen_server/dashboard/assets/bulk-delete-C_kpIB9A.js +3 -0
- zenml/zen_server/dashboard/assets/{check-DK77doTf.js → check-B9QMTa3f.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-mvyzYvIW.js → check-circle-C4tYvbtw.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-A-rmltmI.js → chevron-down-jbbQh82s.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-uNWbJT-C.js → chevron-right-double-Dgp_gEsp.js} +1 -1
- zenml/zen_server/dashboard/assets/{clock-CPA5cYxq.js → clock-B_mTG8PH.js} +1 -1
- zenml/zen_server/dashboard/assets/{code-browser-j2EpcxIA.js → code-browser-CiD8qkBx.js} +1 -1
- zenml/zen_server/dashboard/assets/configuration-form-B2hmKGnF.js +1 -0
- zenml/zen_server/dashboard/assets/connectivity-4UKGMYnr.webp +0 -0
- zenml/zen_server/dashboard/assets/constants-1EZZxtay.js +1 -0
- zenml/zen_server/dashboard/assets/create-stack-TKmMtrkQ.js +1 -0
- zenml/zen_server/dashboard/assets/dates-Buh6SMo7.js +1 -0
- zenml/zen_server/dashboard/assets/delete-run-CCR9md_s.js +1 -0
- zenml/zen_server/dashboard/assets/eye-CbVlAYty.js +1 -0
- zenml/zen_server/dashboard/assets/{file-text-BdxZdjP_.js → file-text-Cd8wVfq5.js} +1 -1
- zenml/zen_server/dashboard/assets/form-DFJkaFDX.js +1 -0
- zenml/zen_server/dashboard/assets/form-schemas-CrznJVzA.js +1 -0
- zenml/zen_server/dashboard/assets/{gcp-CHNvgEss.js → gcp-B1I3Qvcx.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-DyMolRxD.js → help-Co6aedki.js} +1 -1
- zenml/zen_server/dashboard/assets/index-BFqbGSck.js +308 -0
- zenml/zen_server/dashboard/assets/{index-CrhdX_qG.js → index-BjUu1mP4.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-DR30v9MZ.js → index-DWpiv-Ft.js} +1 -1
- zenml/zen_server/dashboard/assets/index-DuhuqTCI.css +1 -0
- zenml/zen_server/dashboard/assets/index-U992soPJ.js +1 -0
- zenml/zen_server/dashboard/assets/index.es-C1gfATPn.js +14 -0
- zenml/zen_server/dashboard/assets/{index.esm-D7jFlf5N.js → index.esm-DhJo3mA6.js} +1 -1
- zenml/zen_server/dashboard/assets/info-QkbQz4QU.js +1 -0
- zenml/zen_server/dashboard/assets/{key-icon-DO4DPJHZ.js → key-icon-C07HKw8z.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-h3cbx8WZ.js → layout-DBbfEFBe.js} +1 -1
- zenml/zen_server/dashboard/assets/layout-Do9YI4QX.js +1 -0
- zenml/zen_server/dashboard/assets/login-mutation-D3tFP6Wm.js +1 -0
- zenml/zen_server/dashboard/assets/{logs-B5n0U7tB.js → logs-CQKlJjo0.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-D1Mhqeh8.js → package-miExReQl.js} +1 -1
- zenml/zen_server/dashboard/assets/page-9RjCitFH.js +1 -0
- zenml/zen_server/dashboard/assets/page-B0PsXWiT.js +1 -0
- zenml/zen_server/dashboard/assets/page-BCrKmYIZ.js +1 -0
- zenml/zen_server/dashboard/assets/page-BcRI3-aR.js +29 -0
- zenml/zen_server/dashboard/assets/page-Be3R2uYn.js +1 -0
- zenml/zen_server/dashboard/assets/page-BgknnddT.js +1 -0
- zenml/zen_server/dashboard/assets/page-BrT0_zSJ.js +40 -0
- zenml/zen_server/dashboard/assets/page-Bs3W2FDi.js +1 -0
- zenml/zen_server/dashboard/assets/page-C210HcBA.js +1 -0
- zenml/zen_server/dashboard/assets/page-C6KaiZ_W.js +1 -0
- zenml/zen_server/dashboard/assets/page-CAJ8B0vb.js +1 -0
- zenml/zen_server/dashboard/assets/page-CAUYrfui.js +1 -0
- zenml/zen_server/dashboard/assets/page-CHxVhF3x.js +1 -0
- zenml/zen_server/dashboard/assets/{page-CSwZxZMQ.js → page-CN7lkvXr.js} +1 -1
- zenml/zen_server/dashboard/assets/page-CUaMMoPG.js +1 -0
- zenml/zen_server/dashboard/assets/page-Cal6XQ4U.js +1 -0
- zenml/zen_server/dashboard/assets/page-CdZCmszX.js +1 -0
- zenml/zen_server/dashboard/assets/page-ChGcZI_6.js +1 -0
- zenml/zen_server/dashboard/assets/page-CktmtZ8Z.js +1 -0
- zenml/zen_server/dashboard/assets/page-ClvmVesa.js +1 -0
- zenml/zen_server/dashboard/assets/page-CnbIYE80.js +1 -0
- zenml/zen_server/dashboard/assets/page-CoXzjeEY.js +1 -0
- zenml/zen_server/dashboard/assets/page-CtiuMP_r.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9Hfx6GV.js +1 -0
- zenml/zen_server/dashboard/assets/page-D9iuB88h.js +1 -0
- zenml/zen_server/dashboard/assets/page-DCcuPZ8P.js +1 -0
- zenml/zen_server/dashboard/assets/page-DEohTSz6.js +1 -0
- zenml/zen_server/dashboard/assets/page-DJIGaUQ9.js +1 -0
- zenml/zen_server/dashboard/assets/page-DKK6ulgy.js +1 -0
- zenml/zen_server/dashboard/assets/page-DNjKHjnH.js +1 -0
- zenml/zen_server/dashboard/assets/page-DUK0Nd_1.js +1 -0
- zenml/zen_server/dashboard/assets/page-DUKbOhaD.js +1 -0
- zenml/zen_server/dashboard/assets/page-DYOucPtA.js +1 -0
- zenml/zen_server/dashboard/assets/page-DpqRelAy.js +1 -0
- zenml/zen_server/dashboard/assets/{page-ZfTtFicG.js → page-DwVPpCFg.js} +2 -2
- zenml/zen_server/dashboard/assets/page-XURWnYZP.js +1 -0
- zenml/zen_server/dashboard/assets/page-abw-2oeW.js +1 -0
- zenml/zen_server/dashboard/assets/page-akLcPcKw.js +1 -0
- zenml/zen_server/dashboard/assets/page-n9ejQ2V3.js +2 -0
- zenml/zen_server/dashboard/assets/page-sJjNT9xA.js +6 -0
- zenml/zen_server/dashboard/assets/{persist-UUym702q.js → persist-DWMWVP-y.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-D87V82eO.js → persist-Dec_w7aB.js} +1 -1
- zenml/zen_server/dashboard/assets/pipeline-CSUlkd50.js +1 -0
- zenml/zen_server/dashboard/assets/{plus-COjQg3AG.js → plus-Cl0_rCVF.js} +1 -1
- zenml/zen_server/dashboard/assets/{react-error-boundary.esm-fyoUBS25.js → react-error-boundary.esm-7_MuhCay.js} +1 -1
- zenml/zen_server/dashboard/assets/{refresh-CM5T3QeU.js → refresh-BcTM09NW.js} +1 -1
- zenml/zen_server/dashboard/assets/resource-tyes-list-o2LXiMay.js +1 -0
- zenml/zen_server/dashboard/assets/resource-type-tooltip-DwHrJstL.js +1 -0
- zenml/zen_server/dashboard/assets/service-connectors-DSEMwJ5A.js +1 -0
- zenml/zen_server/dashboard/assets/{service-BQ9KIhls.js → service-jxtvgks0.js} +2 -2
- zenml/zen_server/dashboard/assets/sharedSchema-BXzg0EZz.js +1 -0
- zenml/zen_server/dashboard/assets/stack-detail-query-Cm0fsgo-.js +1 -0
- zenml/zen_server/dashboard/assets/{terminal-square-DMtel8mb.js → terminal-XFL_4QN-.js} +1 -1
- zenml/zen_server/dashboard/assets/terminal-square-XFL_4QN-.js +1 -0
- zenml/zen_server/dashboard/assets/transform-CeZdrxDZ.js +1 -0
- zenml/zen_server/dashboard/assets/{trash-BWSZ7NRK.js → trash-DP6Tpp_E.js} +1 -1
- zenml/zen_server/dashboard/assets/type-guards-CNgPYg8l.js +1 -0
- zenml/zen_server/dashboard/assets/update-current-user-mutation-D5MjcQ6F.js +1 -0
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-CmnxdxiK.js +1 -0
- zenml/zen_server/dashboard/assets/{zod-C0xYeTvL.js → zod-XdS2h1ws.js} +1 -1
- zenml/zen_server/dashboard/index.html +7 -7
- zenml/zen_server/rbac/utils.py +2 -2
- zenml/zen_server/routers/auth_endpoints.py +2 -2
- zenml/zen_server/routers/devices_endpoints.py +8 -5
- zenml/zen_server/routers/pipeline_deployments_endpoints.py +1 -1
- zenml/zen_server/routers/pipelines_endpoints.py +1 -1
- zenml/zen_server/routers/run_templates_endpoints.py +3 -3
- zenml/zen_server/routers/runs_endpoints.py +35 -0
- zenml/zen_server/template_execution/utils.py +6 -6
- zenml/zen_stores/dag_generator.py +171 -0
- zenml/zen_stores/migrations/versions/0.83.0_release.py +23 -0
- zenml/zen_stores/rest_zen_store.py +17 -3
- zenml/zen_stores/schemas/action_schemas.py +40 -4
- zenml/zen_stores/schemas/api_key_schemas.py +29 -1
- zenml/zen_stores/schemas/artifact_schemas.py +168 -48
- zenml/zen_stores/schemas/base_schemas.py +26 -1
- zenml/zen_stores/schemas/code_repository_schemas.py +46 -5
- zenml/zen_stores/schemas/component_schemas.py +44 -3
- zenml/zen_stores/schemas/device_schemas.py +43 -2
- zenml/zen_stores/schemas/event_source_schemas.py +41 -5
- zenml/zen_stores/schemas/flavor_schemas.py +42 -2
- zenml/zen_stores/schemas/model_schemas.py +113 -77
- zenml/zen_stores/schemas/pipeline_build_schemas.py +53 -4
- zenml/zen_stores/schemas/pipeline_deployment_schemas.py +53 -4
- zenml/zen_stores/schemas/pipeline_run_schemas.py +111 -47
- zenml/zen_stores/schemas/pipeline_schemas.py +41 -9
- zenml/zen_stores/schemas/run_template_schemas.py +75 -11
- zenml/zen_stores/schemas/schedule_schema.py +50 -5
- zenml/zen_stores/schemas/secret_schemas.py +39 -2
- zenml/zen_stores/schemas/service_connector_schemas.py +39 -2
- zenml/zen_stores/schemas/service_schemas.py +39 -4
- zenml/zen_stores/schemas/stack_schemas.py +47 -2
- zenml/zen_stores/schemas/step_run_schemas.py +89 -26
- zenml/zen_stores/schemas/tag_schemas.py +69 -5
- zenml/zen_stores/schemas/trigger_schemas.py +44 -5
- zenml/zen_stores/schemas/utils.py +25 -4
- zenml/zen_stores/sql_zen_store.py +471 -28
- zenml/zen_stores/zen_store_interface.py +9 -1
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/METADATA +2 -2
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/RECORD +230 -222
- zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-BG7-Ki1L.js +0 -1
- zenml/zen_server/dashboard/assets/CollapsibleCard-D20FtrzC.js +0 -1
- zenml/zen_server/dashboard/assets/Commands-DGbAvMDk.js +0 -1
- zenml/zen_server/dashboard/assets/ComponentIcon-ils7uNAk.js +0 -1
- zenml/zen_server/dashboard/assets/CsvVizualization-DVN541XF.js +0 -15
- zenml/zen_server/dashboard/assets/DialogItem-BHWf3sIB.js +0 -1
- zenml/zen_server/dashboard/assets/ExecutionStatus-XrvT2r65.js +0 -1
- zenml/zen_server/dashboard/assets/Infobox-D9k5TFH4.js +0 -1
- zenml/zen_server/dashboard/assets/InlineAvatar-Cfz4WSLK.js +0 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-URCyUPcZ.js +0 -14
- zenml/zen_server/dashboard/assets/NestedCollapsible-Dor-bi98.js +0 -1
- zenml/zen_server/dashboard/assets/NumberBox-D2A7ENHb.js +0 -1
- zenml/zen_server/dashboard/assets/Partials-DQJFw1yW.js +0 -1
- zenml/zen_server/dashboard/assets/ProBadge-Cp4hb1YT.js +0 -1
- zenml/zen_server/dashboard/assets/ProCta-EYoV9CvK.js +0 -1
- zenml/zen_server/dashboard/assets/ProviderRadio-BVDA-fAr.js +0 -1
- zenml/zen_server/dashboard/assets/RunSelector-BLuBYNJt.js +0 -1
- zenml/zen_server/dashboard/assets/RunsBody-W4WHf-sq.js +0 -1
- zenml/zen_server/dashboard/assets/SearchField-D-h6jXyg.js +0 -1
- zenml/zen_server/dashboard/assets/SecretTooltip-CePCL8kd.js +0 -1
- zenml/zen_server/dashboard/assets/StackList-CgmN5H-i.js +0 -1
- zenml/zen_server/dashboard/assets/Tabs-DxQ8PDOD.js +0 -1
- zenml/zen_server/dashboard/assets/Tick-CEsT3HPR.js +0 -1
- zenml/zen_server/dashboard/assets/UsageReason-DjI5qMje.js +0 -1
- zenml/zen_server/dashboard/assets/WizardFooter-CFBHFZas.js +0 -1
- zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +0 -43
- zenml/zen_server/dashboard/assets/configuration-form-BtI2Y4eX.js +0 -1
- zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +0 -21
- zenml/zen_server/dashboard/assets/constants-DP3ZEnXH.js +0 -1
- zenml/zen_server/dashboard/assets/create-stack-BJ6x5rzj.js +0 -1
- zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +0 -1
- zenml/zen_server/dashboard/assets/delete-run-DlSLEl5T.js +0 -1
- zenml/zen_server/dashboard/assets/docker-BuDBFEDL.js +0 -1
- zenml/zen_server/dashboard/assets/dots-horizontal-BGRJCPCs.js +0 -1
- zenml/zen_server/dashboard/assets/flavor-select-BnPxvQDN.js +0 -1
- zenml/zen_server/dashboard/assets/form-schemas-CbvoEUHr.js +0 -1
- zenml/zen_server/dashboard/assets/index-CFESYpe4.js +0 -1
- zenml/zen_server/dashboard/assets/index-CmLcvK2z.js +0 -1
- zenml/zen_server/dashboard/assets/index-CzX3ZYlI.css +0 -1
- zenml/zen_server/dashboard/assets/index-D2iSHVZq.js +0 -64
- zenml/zen_server/dashboard/assets/kubernetes-D6OUjwSK.js +0 -1
- zenml/zen_server/dashboard/assets/link-external-DUhCSKNm.js +0 -1
- zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +0 -1
- zenml/zen_server/dashboard/assets/login-mutation-CXc-Klim.js +0 -1
- zenml/zen_server/dashboard/assets/not-found-olRU3fnu.js +0 -1
- zenml/zen_server/dashboard/assets/page-7keIM1V3.js +0 -1
- zenml/zen_server/dashboard/assets/page-B31neFwG.js +0 -1
- zenml/zen_server/dashboard/assets/page-B3zo4KYS.js +0 -1
- zenml/zen_server/dashboard/assets/page-BN3MHq1a.js +0 -1
- zenml/zen_server/dashboard/assets/page-BNgVExjN.js +0 -1
- zenml/zen_server/dashboard/assets/page-BPtvu74G.js +0 -1
- zenml/zen_server/dashboard/assets/page-BTIuG0ki.js +0 -2
- zenml/zen_server/dashboard/assets/page-BcQzleH6.js +0 -1
- zenml/zen_server/dashboard/assets/page-C05Jw4M2.js +0 -1
- zenml/zen_server/dashboard/assets/page-C28a7K8h.js +0 -1
- zenml/zen_server/dashboard/assets/page-C9WLk0X-.js +0 -1
- zenml/zen_server/dashboard/assets/page-CINMx64X.js +0 -1
- zenml/zen_server/dashboard/assets/page-CYrJbk7P.js +0 -1
- zenml/zen_server/dashboard/assets/page-Ce0cqLo3.js +0 -1
- zenml/zen_server/dashboard/assets/page-CgNsEkw-.js +0 -1
- zenml/zen_server/dashboard/assets/page-Ct2FUYuR.js +0 -1
- zenml/zen_server/dashboard/assets/page-D8G2B3Bu.js +0 -1
- zenml/zen_server/dashboard/assets/page-DL8a4_lg.js +0 -3
- zenml/zen_server/dashboard/assets/page-DMhYn1cF.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dd_Yq-Uf.js +0 -6
- zenml/zen_server/dashboard/assets/page-DfSvqT8g.js +0 -1
- zenml/zen_server/dashboard/assets/page-Dt6ANUTx.js +0 -1
- zenml/zen_server/dashboard/assets/page-DtvTleaT.js +0 -1
- zenml/zen_server/dashboard/assets/page-DwfGTiVs.js +0 -1
- zenml/zen_server/dashboard/assets/page-JgomSTDc.js +0 -1
- zenml/zen_server/dashboard/assets/page-L84ig6HB.js +0 -1
- zenml/zen_server/dashboard/assets/page-Mabsn4QJ.js +0 -1
- zenml/zen_server/dashboard/assets/page-P04L5cm9.js +0 -1
- zenml/zen_server/dashboard/assets/page-PfhAnvq4.js +0 -1
- zenml/zen_server/dashboard/assets/page-WdRrlNt_.js +0 -1
- zenml/zen_server/dashboard/assets/page-cqJDDDeK.js +0 -1
- zenml/zen_server/dashboard/assets/page-k-Wxh9L_.js +0 -1
- zenml/zen_server/dashboard/assets/page-y-zV4n0c.js +0 -1
- zenml/zen_server/dashboard/assets/rocket-Cf-B-XOR.js +0 -1
- zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
- zenml/zen_server/dashboard/assets/sharedSchema-Bse2agAf.js +0 -14
- zenml/zen_server/dashboard/assets/stack-detail-query-BAcZJrN3.js +0 -1
- zenml/zen_server/dashboard/assets/tick-circle-m94Aa6Zt.js +0 -1
- zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
- zenml/zen_server/dashboard/assets/type-guards-CaeD8wHO.js +0 -1
- zenml/zen_server/dashboard/assets/update-server-settings-mutation-DwMM1LJz.js +0 -1
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.82.1.dev20250527.dist-info → zenml_nightly-0.83.0.dev20250529.dist-info}/entry_points.txt +0 -0
zenml/models/v2/core/step_run.py
CHANGED
@@ -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
|
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) ->
|
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.
|
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.
|
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.
|
zenml/models/v2/core/tag.py
CHANGED
@@ -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.
|
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
|
223
|
+
from zenml.orchestrators import cache_utils
|
224
224
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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 =
|
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
|
-
|
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"
|
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
|
-
**
|
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
|
-
|
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.
|
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(
|
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 =
|
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,
|
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(
|
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).
|
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
|
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.
|
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),
|
zenml/pipelines/run_utils.py
CHANGED
@@ -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.
|
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,
|