zenml-nightly 0.82.1.dev20250526__py3-none-any.whl → 0.82.1.dev20250528__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- zenml/VERSION +1 -1
- zenml/artifacts/utils.py +8 -0
- 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/logging/step_logging.py +17 -4
- 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/cloud_utils.py +2 -2
- 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/rbac/zenml_cloud_rbac.py +4 -3
- 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/routers/steps_endpoints.py +3 -0
- zenml/zen_server/template_execution/utils.py +6 -6
- zenml/zen_stores/dag_generator.py +171 -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.dev20250526.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/METADATA +1 -1
- {zenml_nightly-0.82.1.dev20250526.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/RECORD +225 -219
- 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.dev20250526.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.82.1.dev20250526.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.82.1.dev20250526.dist-info → zenml_nightly-0.82.1.dev20250528.dist-info}/entry_points.txt +0 -0
zenml/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.82.1.
|
1
|
+
0.82.1.dev20250528
|
zenml/artifacts/utils.py
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
import base64
|
17
17
|
import contextlib
|
18
18
|
import os
|
19
|
+
import re
|
19
20
|
import tempfile
|
20
21
|
import zipfile
|
21
22
|
from pathlib import Path
|
@@ -940,6 +941,13 @@ def _load_file_from_artifact_store(
|
|
940
941
|
)
|
941
942
|
|
942
943
|
|
944
|
+
def _strip_timestamp_from_multiline_string(
|
945
|
+
input: str,
|
946
|
+
pattern: str = r"^\[?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} UTC\]?\s*",
|
947
|
+
) -> str:
|
948
|
+
return re.sub(pattern, "", input, flags=re.MULTILINE)
|
949
|
+
|
950
|
+
|
943
951
|
# --------------------
|
944
952
|
# Model Artifact Utils
|
945
953
|
# --------------------
|
zenml/cli/base.py
CHANGED
@@ -610,6 +610,11 @@ def info(
|
|
610
610
|
|
611
611
|
store_cfg = gc.store_configuration
|
612
612
|
|
613
|
+
try:
|
614
|
+
active_project = client.active_project
|
615
|
+
except RuntimeError:
|
616
|
+
active_project = None
|
617
|
+
|
613
618
|
user_info = {
|
614
619
|
"zenml_local_version": zenml_version,
|
615
620
|
"zenml_server_version": store_info.version,
|
@@ -622,7 +627,7 @@ def info(
|
|
622
627
|
"python_version": environment.python_version(),
|
623
628
|
"environment": get_environment(),
|
624
629
|
"system_info": environment.get_system_info(),
|
625
|
-
"active_project":
|
630
|
+
"active_project": active_project.name if active_project else None,
|
626
631
|
"active_stack": client.active_stack_model.name,
|
627
632
|
"active_user": client.active_user.name,
|
628
633
|
"telemetry_status": "enabled" if gc.analytics_opt_in else "disabled",
|
zenml/cli/model.py
CHANGED
@@ -68,12 +68,6 @@ def _model_version_to_print(
|
|
68
68
|
"stage": model_version.stage,
|
69
69
|
"run_metadata": model_version.run_metadata,
|
70
70
|
"tags": [t.name for t in model_version.tags],
|
71
|
-
"data_artifacts_count": len(model_version.data_artifact_ids),
|
72
|
-
"model_artifacts_count": len(model_version.model_artifact_ids),
|
73
|
-
"deployment_artifacts_count": len(
|
74
|
-
model_version.deployment_artifact_ids
|
75
|
-
),
|
76
|
-
"pipeline_runs_count": len(model_version.pipeline_run_ids),
|
77
71
|
"updated": model_version.updated.date(),
|
78
72
|
}
|
79
73
|
|
@@ -601,21 +595,6 @@ def _print_artifacts_links_generic(
|
|
601
595
|
else "model artifacts"
|
602
596
|
)
|
603
597
|
|
604
|
-
if (
|
605
|
-
(only_data_artifacts and not model_version.data_artifact_ids)
|
606
|
-
or (
|
607
|
-
only_deployment_artifacts
|
608
|
-
and not model_version.deployment_artifact_ids
|
609
|
-
)
|
610
|
-
or (only_model_artifacts and not model_version.model_artifact_ids)
|
611
|
-
):
|
612
|
-
cli_utils.declare(f"No {type_} linked to the model version found.")
|
613
|
-
return
|
614
|
-
|
615
|
-
cli_utils.title(
|
616
|
-
f"{type_} linked to the model version `{model_version.name}[{model_version.number}]`:"
|
617
|
-
)
|
618
|
-
|
619
598
|
links = Client().list_model_version_artifact_links(
|
620
599
|
model_version_id=model_version.id,
|
621
600
|
only_data_artifacts=only_data_artifacts,
|
@@ -624,6 +603,13 @@ def _print_artifacts_links_generic(
|
|
624
603
|
**kwargs,
|
625
604
|
)
|
626
605
|
|
606
|
+
if not links:
|
607
|
+
cli_utils.declare(f"No {type_} linked to the model version found.")
|
608
|
+
return
|
609
|
+
|
610
|
+
cli_utils.title(
|
611
|
+
f"{type_} linked to the model version `{model_version.name}[{model_version.number}]`:"
|
612
|
+
)
|
627
613
|
cli_utils.print_pydantic_models(
|
628
614
|
links,
|
629
615
|
columns=["artifact_version", "created"],
|
@@ -732,29 +718,23 @@ def list_model_version_pipeline_runs(
|
|
732
718
|
model_name: The ID or name of the model containing version.
|
733
719
|
model_version: The name, number or ID of the model version. If not
|
734
720
|
provided, the latest version is used.
|
735
|
-
**kwargs: Keyword arguments to filter
|
721
|
+
**kwargs: Keyword arguments to filter runs.
|
736
722
|
"""
|
737
723
|
model_version_response_model = Client().get_model_version(
|
738
724
|
model_name_or_id=model_name,
|
739
725
|
model_version_name_or_number_or_id=model_version,
|
740
726
|
)
|
741
727
|
|
742
|
-
|
743
|
-
cli_utils.declare("No pipeline runs attached to model version found.")
|
744
|
-
return
|
745
|
-
cli_utils.title(
|
746
|
-
f"Pipeline runs linked to the model version `{model_version_response_model.name}[{model_version_response_model.number}]`:"
|
747
|
-
)
|
748
|
-
|
749
|
-
links = Client().list_model_version_pipeline_run_links(
|
728
|
+
runs = Client().list_model_version_pipeline_run_links(
|
750
729
|
model_version_id=model_version_response_model.id,
|
751
730
|
**kwargs,
|
752
731
|
)
|
753
732
|
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
]
|
733
|
+
if not runs:
|
734
|
+
cli_utils.declare("No pipeline runs attached to model version found.")
|
735
|
+
return
|
736
|
+
|
737
|
+
cli_utils.title(
|
738
|
+
f"Pipeline runs linked to the model version `{model_version_response_model.name}[{model_version_response_model.number}]`:"
|
760
739
|
)
|
740
|
+
cli_utils.print_pydantic_models(runs)
|
zenml/cli/server.py
CHANGED
@@ -268,9 +268,14 @@ def status() -> None:
|
|
268
268
|
# Write about the active entities
|
269
269
|
scope = "repository" if client.uses_local_configuration else "global"
|
270
270
|
cli_utils.declare(f" The active user is: '{client.active_user.name}'")
|
271
|
-
|
272
|
-
|
273
|
-
|
271
|
+
|
272
|
+
try:
|
273
|
+
cli_utils.declare(
|
274
|
+
f" The active project is: '{client.active_project.name}' ({scope})"
|
275
|
+
)
|
276
|
+
except RuntimeError:
|
277
|
+
cli_utils.declare(" No active project set.")
|
278
|
+
|
274
279
|
cli_utils.declare(
|
275
280
|
f" The active stack is: '{client.active_stack_model.name}' ({scope})"
|
276
281
|
)
|
zenml/client.py
CHANGED
@@ -2573,7 +2573,7 @@ class Client(metaclass=ClientMetaClass):
|
|
2573
2573
|
self.list_run_templates,
|
2574
2574
|
pipeline_id=pipeline.id,
|
2575
2575
|
stack_id=stack.id if stack else None,
|
2576
|
-
project=project or pipeline.
|
2576
|
+
project=project or pipeline.project_id,
|
2577
2577
|
)
|
2578
2578
|
|
2579
2579
|
for template in templates:
|
@@ -3855,6 +3855,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3855
3855
|
allow_name_prefix_match: bool = True,
|
3856
3856
|
project: Optional[Union[str, UUID]] = None,
|
3857
3857
|
hydrate: bool = True,
|
3858
|
+
include_full_metadata: bool = False,
|
3858
3859
|
) -> PipelineRunResponse:
|
3859
3860
|
"""Gets a pipeline run by name, ID, or prefix.
|
3860
3861
|
|
@@ -3864,6 +3865,8 @@ class Client(metaclass=ClientMetaClass):
|
|
3864
3865
|
project: The project name/ID to filter by.
|
3865
3866
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
3866
3867
|
by including metadata fields in the response.
|
3868
|
+
include_full_metadata: If True, include metadata of all steps in
|
3869
|
+
the response.
|
3867
3870
|
|
3868
3871
|
Returns:
|
3869
3872
|
The pipeline run.
|
@@ -3875,6 +3878,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3875
3878
|
allow_name_prefix_match=allow_name_prefix_match,
|
3876
3879
|
project=project,
|
3877
3880
|
hydrate=hydrate,
|
3881
|
+
include_full_metadata=include_full_metadata,
|
3878
3882
|
)
|
3879
3883
|
|
3880
3884
|
def list_pipeline_runs(
|
@@ -3913,6 +3917,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3913
3917
|
stack: Optional[Union[UUID, str]] = None,
|
3914
3918
|
stack_component: Optional[Union[UUID, str]] = None,
|
3915
3919
|
hydrate: bool = False,
|
3920
|
+
include_full_metadata: bool = False,
|
3916
3921
|
) -> Page[PipelineRunResponse]:
|
3917
3922
|
"""List all pipeline runs.
|
3918
3923
|
|
@@ -3953,6 +3958,8 @@ class Client(metaclass=ClientMetaClass):
|
|
3953
3958
|
stack_component: Filter by stack component name/ID.
|
3954
3959
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
3955
3960
|
by including metadata fields in the response.
|
3961
|
+
include_full_metadata: If True, include metadata of all steps in
|
3962
|
+
the response.
|
3956
3963
|
|
3957
3964
|
Returns:
|
3958
3965
|
A page with Pipeline Runs fitting the filter description
|
@@ -3995,6 +4002,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3995
4002
|
return self.zen_store.list_runs(
|
3996
4003
|
runs_filter_model=runs_filter_model,
|
3997
4004
|
hydrate=hydrate,
|
4005
|
+
include_full_metadata=include_full_metadata,
|
3998
4006
|
)
|
3999
4007
|
|
4000
4008
|
def delete_pipeline_run(
|
@@ -6368,7 +6376,7 @@ class Client(metaclass=ClientMetaClass):
|
|
6368
6376
|
model_version=ModelVersionRequest(
|
6369
6377
|
name=name,
|
6370
6378
|
description=description,
|
6371
|
-
project=model.
|
6379
|
+
project=model.project_id,
|
6372
6380
|
model=model.id,
|
6373
6381
|
tags=tags,
|
6374
6382
|
)
|
@@ -6623,7 +6631,7 @@ class Client(metaclass=ClientMetaClass):
|
|
6623
6631
|
if not is_valid_uuid(model_name_or_id):
|
6624
6632
|
model = self.get_model(model_name_or_id, project=project)
|
6625
6633
|
model_name_or_id = model.id
|
6626
|
-
project = project or model.
|
6634
|
+
project = project or model.project_id
|
6627
6635
|
if not is_valid_uuid(version_name_or_id):
|
6628
6636
|
version_name_or_id = self.get_model_version(
|
6629
6637
|
model_name_or_id, version_name_or_id, project=project
|
@@ -7032,6 +7040,7 @@ class Client(metaclass=ClientMetaClass):
|
|
7032
7040
|
allow_name_prefix_match: bool = True,
|
7033
7041
|
project: Optional[Union[str, UUID]] = None,
|
7034
7042
|
hydrate: bool = True,
|
7043
|
+
**kwargs: Any,
|
7035
7044
|
) -> AnyResponse:
|
7036
7045
|
"""Fetches an entity using the id, name, or partial id/name.
|
7037
7046
|
|
@@ -7044,6 +7053,8 @@ class Client(metaclass=ClientMetaClass):
|
|
7044
7053
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
7045
7054
|
by including metadata fields in the response.
|
7046
7055
|
project: The project name/ID to filter by.
|
7056
|
+
**kwargs: Additional keyword arguments to pass to the get and list
|
7057
|
+
methods.
|
7047
7058
|
|
7048
7059
|
Returns:
|
7049
7060
|
The entity with the given name, id or partial id.
|
@@ -7058,13 +7069,14 @@ class Client(metaclass=ClientMetaClass):
|
|
7058
7069
|
|
7059
7070
|
# First interpret as full UUID
|
7060
7071
|
if is_valid_uuid(name_id_or_prefix):
|
7061
|
-
return get_method(name_id_or_prefix, hydrate=hydrate)
|
7072
|
+
return get_method(name_id_or_prefix, hydrate=hydrate, **kwargs)
|
7062
7073
|
|
7063
7074
|
# If not a UUID, try to find by name
|
7064
7075
|
assert not isinstance(name_id_or_prefix, UUID)
|
7065
7076
|
list_kwargs: Dict[str, Any] = dict(
|
7066
7077
|
name=f"equals:{name_id_or_prefix}",
|
7067
7078
|
hydrate=hydrate,
|
7079
|
+
**kwargs,
|
7068
7080
|
)
|
7069
7081
|
scope = ""
|
7070
7082
|
if project:
|
@@ -7182,6 +7194,7 @@ class Client(metaclass=ClientMetaClass):
|
|
7182
7194
|
allow_name_prefix_match: bool,
|
7183
7195
|
project: Optional[Union[str, UUID]] = None,
|
7184
7196
|
hydrate: bool = True,
|
7197
|
+
**kwargs: Any,
|
7185
7198
|
) -> AnyResponse:
|
7186
7199
|
"""Fetches an entity using a partial ID or name.
|
7187
7200
|
|
@@ -7193,6 +7206,8 @@ class Client(metaclass=ClientMetaClass):
|
|
7193
7206
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
7194
7207
|
by including metadata fields in the response.
|
7195
7208
|
project: The project name/ID to filter by.
|
7209
|
+
**kwargs: Additional keyword arguments to pass to the get and list
|
7210
|
+
methods.
|
7196
7211
|
|
7197
7212
|
Returns:
|
7198
7213
|
The entity with the given partial ID or name.
|
@@ -7206,6 +7221,7 @@ class Client(metaclass=ClientMetaClass):
|
|
7206
7221
|
"logical_operator": LogicalOperators.OR,
|
7207
7222
|
"id": f"startswith:{partial_id_or_name}",
|
7208
7223
|
"hydrate": hydrate,
|
7224
|
+
**kwargs,
|
7209
7225
|
}
|
7210
7226
|
if allow_name_prefix_match:
|
7211
7227
|
list_method_args["name"] = f"startswith:{partial_id_or_name}"
|
zenml/client_lazy_loader.py
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
"""Lazy loading functionality for Client methods."""
|
15
15
|
|
16
16
|
import contextlib
|
17
|
+
import functools
|
17
18
|
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type
|
18
19
|
|
19
20
|
from pydantic import BaseModel, Field
|
@@ -188,6 +189,7 @@ def evaluate_all_lazy_load_args_in_client_methods(
|
|
188
189
|
def _evaluate_args(
|
189
190
|
func: Callable[..., Any], is_instance_method: bool
|
190
191
|
) -> Any:
|
192
|
+
@functools.wraps(func)
|
191
193
|
def _inner(*args: Any, **kwargs: Any) -> Any:
|
192
194
|
args_ = list(args)
|
193
195
|
if not is_instance_method:
|
zenml/config/docker_settings.py
CHANGED
@@ -72,6 +72,9 @@ class DockerBuildConfig(BaseModel):
|
|
72
72
|
dockerignore: Optional[str] = None
|
73
73
|
|
74
74
|
|
75
|
+
_docker_settings_warnings_logged = []
|
76
|
+
|
77
|
+
|
75
78
|
class DockerSettings(BaseSettings):
|
76
79
|
"""Settings for building Docker images to run ZenML pipelines.
|
77
80
|
|
@@ -372,6 +375,9 @@ class DockerSettings(BaseSettings):
|
|
372
375
|
if isinstance(
|
373
376
|
self.replicate_local_python_environment,
|
374
377
|
(str, list, PythonEnvironmentExportMethod),
|
378
|
+
) and (
|
379
|
+
"replicate_local_python_environment"
|
380
|
+
not in _docker_settings_warnings_logged
|
375
381
|
):
|
376
382
|
logger.warning(
|
377
383
|
"Specifying a command (`%s`) for "
|
@@ -383,7 +389,9 @@ class DockerSettings(BaseSettings):
|
|
383
389
|
"file, use `DockerSettings.pyproject_path` and "
|
384
390
|
"`DockerSettings.pyproject_export_command` instead."
|
385
391
|
)
|
386
|
-
|
392
|
+
_docker_settings_warnings_logged.append(
|
393
|
+
"replicate_local_python_environment"
|
394
|
+
)
|
387
395
|
return self
|
388
396
|
|
389
397
|
@model_validator(mode="before")
|
@@ -400,7 +408,11 @@ class DockerSettings(BaseSettings):
|
|
400
408
|
Returns:
|
401
409
|
The validated settings values.
|
402
410
|
"""
|
403
|
-
if
|
411
|
+
if (
|
412
|
+
"python_package_installer" not in data
|
413
|
+
and "python_package_installer"
|
414
|
+
not in _docker_settings_warnings_logged
|
415
|
+
):
|
404
416
|
logger.warning(
|
405
417
|
"In a future release, the default Python package installer "
|
406
418
|
"used by ZenML to build container images for your "
|
@@ -409,6 +421,7 @@ class DockerSettings(BaseSettings):
|
|
409
421
|
"`python_package_installer=PythonPackageInstaller.PIP` "
|
410
422
|
"in your DockerSettings."
|
411
423
|
)
|
424
|
+
_docker_settings_warnings_logged.append("python_package_installer")
|
412
425
|
return data
|
413
426
|
|
414
427
|
model_config = ConfigDict(
|
zenml/enums.py
CHANGED
@@ -408,6 +408,8 @@ class OnboardingStep(StrEnum):
|
|
408
408
|
DEVICE_VERIFIED = "device_verified"
|
409
409
|
PROJECT_CREATED = "project_created"
|
410
410
|
PIPELINE_RUN = "pipeline_run"
|
411
|
+
SECOND_PIPELINE_RUN = "second_pipeline_run"
|
412
|
+
THIRD_PIPELINE_RUN = "third_pipeline_run"
|
411
413
|
STARTER_SETUP_COMPLETED = "starter_setup_completed"
|
412
414
|
STACK_WITH_REMOTE_ORCHESTRATOR_CREATED = (
|
413
415
|
"stack_with_remote_orchestrator_created"
|
@@ -422,6 +424,7 @@ class OnboardingStep(StrEnum):
|
|
422
424
|
"pipeline_run_with_remote_artifact_store"
|
423
425
|
)
|
424
426
|
PRODUCTION_SETUP_COMPLETED = "production_setup_completed"
|
427
|
+
PRO_ONBOARDING_COMPLETED = "pro_onboarding_completed"
|
425
428
|
|
426
429
|
|
427
430
|
class StackDeploymentProvider(StrEnum):
|
zenml/event_hub/event_hub.py
CHANGED
@@ -126,7 +126,7 @@ class InternalEventHub(BaseEventHub):
|
|
126
126
|
triggers: List[TriggerResponse] = depaginate(
|
127
127
|
self.zen_store.list_triggers,
|
128
128
|
trigger_filter_model=TriggerFilter(
|
129
|
-
project=event_source.
|
129
|
+
project=event_source.project_id,
|
130
130
|
event_source_id=event_source.id,
|
131
131
|
is_active=True,
|
132
132
|
),
|
@@ -326,7 +326,7 @@ class BitbucketWebhookEventSourceHandler(BaseWebhookEventSourceHandler):
|
|
326
326
|
config: Event source configuration instantiated from the response.
|
327
327
|
"""
|
328
328
|
assert isinstance(config, BitbucketWebhookEventSourceConfiguration)
|
329
|
-
assert event_source.
|
329
|
+
assert event_source.user_id is not None, (
|
330
330
|
"User is not set for event source"
|
331
331
|
)
|
332
332
|
|
@@ -352,7 +352,7 @@ class GithubWebhookEventSourceHandler(BaseWebhookEventSourceHandler):
|
|
352
352
|
config: Event source configuration instantiated from the response.
|
353
353
|
"""
|
354
354
|
assert isinstance(config, GithubWebhookEventSourceConfiguration)
|
355
|
-
assert event_source.
|
355
|
+
assert event_source.user_id is not None, (
|
356
356
|
"User is not set for event source"
|
357
357
|
)
|
358
358
|
|
@@ -67,6 +67,8 @@ class KubernetesOrchestratorSettings(BaseSettings):
|
|
67
67
|
ttl_seconds_after_finished: The amount of seconds to keep finished jobs
|
68
68
|
before deleting them. This only applies to jobs created when
|
69
69
|
scheduling a pipeline.
|
70
|
+
prevent_orchestrator_pod_caching: If `True`, the orchestrator pod will
|
71
|
+
not try to compute cached steps before starting the step pods.
|
70
72
|
"""
|
71
73
|
|
72
74
|
synchronous: bool = True
|
@@ -85,6 +87,7 @@ class KubernetesOrchestratorSettings(BaseSettings):
|
|
85
87
|
successful_jobs_history_limit: Optional[NonNegativeInt] = None
|
86
88
|
failed_jobs_history_limit: Optional[NonNegativeInt] = None
|
87
89
|
ttl_seconds_after_finished: Optional[NonNegativeInt] = None
|
90
|
+
prevent_orchestrator_pod_caching: bool = False
|
88
91
|
|
89
92
|
|
90
93
|
class KubernetesOrchestratorConfig(
|
@@ -74,23 +74,37 @@ def main() -> None:
|
|
74
74
|
orchestrator_pod_name = socket.gethostname()
|
75
75
|
|
76
76
|
client = Client()
|
77
|
+
active_stack = client.active_stack
|
78
|
+
orchestrator = active_stack.orchestrator
|
79
|
+
assert isinstance(orchestrator, KubernetesOrchestrator)
|
77
80
|
|
78
|
-
|
81
|
+
deployment = client.get_deployment(args.deployment_id)
|
82
|
+
pipeline_settings = cast(
|
83
|
+
KubernetesOrchestratorSettings,
|
84
|
+
orchestrator.get_settings(deployment),
|
85
|
+
)
|
79
86
|
|
80
|
-
pipeline_dag = {
|
81
|
-
step_name: step.spec.upstream_steps
|
82
|
-
for step_name, step in deployment_config.step_configurations.items()
|
83
|
-
}
|
84
87
|
step_command = StepEntrypointConfiguration.get_entrypoint_command()
|
85
88
|
|
86
|
-
|
89
|
+
if args.run_id and not pipeline_settings.prevent_orchestrator_pod_caching:
|
90
|
+
from zenml.orchestrators import cache_utils
|
91
|
+
|
92
|
+
run_required = (
|
93
|
+
cache_utils.create_cached_step_runs_and_prune_deployment(
|
94
|
+
deployment=deployment,
|
95
|
+
pipeline_run=client.get_pipeline_run(args.run_id),
|
96
|
+
stack=active_stack,
|
97
|
+
)
|
98
|
+
)
|
99
|
+
|
100
|
+
if not run_required:
|
101
|
+
return
|
102
|
+
|
87
103
|
mount_local_stores = active_stack.orchestrator.config.is_local
|
88
104
|
|
89
105
|
# Get a Kubernetes client from the active Kubernetes orchestrator, but
|
90
106
|
# override the `incluster` setting to `True` since we are running inside
|
91
107
|
# the Kubernetes cluster.
|
92
|
-
orchestrator = active_stack.orchestrator
|
93
|
-
assert isinstance(orchestrator, KubernetesOrchestrator)
|
94
108
|
kube_client = orchestrator.get_kube_client(incluster=True)
|
95
109
|
core_api = k8s_client.CoreV1Api(kube_client)
|
96
110
|
|
@@ -121,7 +135,7 @@ def main() -> None:
|
|
121
135
|
Raises:
|
122
136
|
Exception: If the pod fails to start.
|
123
137
|
"""
|
124
|
-
step_config =
|
138
|
+
step_config = deployment.step_configurations[step_name].config
|
125
139
|
settings = step_config.settings.get("orchestrator.kubernetes", None)
|
126
140
|
settings = KubernetesOrchestratorSettings.model_validate(
|
127
141
|
settings.model_dump() if settings else {}
|
@@ -147,10 +161,10 @@ def main() -> None:
|
|
147
161
|
)
|
148
162
|
|
149
163
|
image = KubernetesOrchestrator.get_image(
|
150
|
-
deployment=
|
164
|
+
deployment=deployment, step_name=step_name
|
151
165
|
)
|
152
166
|
step_args = StepEntrypointConfiguration.get_entrypoint_arguments(
|
153
|
-
step_name=step_name, deployment_id=
|
167
|
+
step_name=step_name, deployment_id=deployment.id
|
154
168
|
)
|
155
169
|
|
156
170
|
# We set some default minimum memory resource requests for the step pod
|
@@ -165,9 +179,7 @@ def main() -> None:
|
|
165
179
|
|
166
180
|
if orchestrator.config.pass_zenml_token_as_secret:
|
167
181
|
env.pop("ZENML_STORE_API_TOKEN", None)
|
168
|
-
secret_name = orchestrator.get_token_secret_name(
|
169
|
-
deployment_config.id
|
170
|
-
)
|
182
|
+
secret_name = orchestrator.get_token_secret_name(deployment.id)
|
171
183
|
pod_settings.env.append(
|
172
184
|
{
|
173
185
|
"name": "ZENML_STORE_API_TOKEN",
|
@@ -184,7 +196,7 @@ def main() -> None:
|
|
184
196
|
pod_manifest = build_pod_manifest(
|
185
197
|
pod_name=pod_name,
|
186
198
|
run_name=args.run_name,
|
187
|
-
pipeline_name=
|
199
|
+
pipeline_name=deployment.pipeline_configuration.name,
|
188
200
|
image_name=image,
|
189
201
|
command=step_command,
|
190
202
|
args=step_args,
|
@@ -251,8 +263,8 @@ def main() -> None:
|
|
251
263
|
|
252
264
|
pipeline_runs = client.list_pipeline_runs(
|
253
265
|
hydrate=True,
|
254
|
-
project=
|
255
|
-
deployment_id=
|
266
|
+
project=deployment.project_id,
|
267
|
+
deployment_id=deployment.id,
|
256
268
|
**list_args,
|
257
269
|
)
|
258
270
|
if not len(pipeline_runs):
|
@@ -298,27 +310,26 @@ def main() -> None:
|
|
298
310
|
parallel_node_startup_waiting_period = (
|
299
311
|
orchestrator.config.parallel_step_startup_waiting_period or 0.0
|
300
312
|
)
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
313
|
+
|
314
|
+
pipeline_dag = {
|
315
|
+
step_name: step.spec.upstream_steps
|
316
|
+
for step_name, step in deployment.step_configurations.items()
|
317
|
+
}
|
305
318
|
try:
|
306
319
|
ThreadedDagRunner(
|
307
320
|
dag=pipeline_dag,
|
308
321
|
run_fn=run_step_on_kubernetes,
|
309
322
|
finalize_fn=finalize_run,
|
310
323
|
parallel_node_startup_waiting_period=parallel_node_startup_waiting_period,
|
311
|
-
max_parallelism=
|
324
|
+
max_parallelism=pipeline_settings.max_parallelism,
|
312
325
|
).run()
|
313
326
|
logger.info("Orchestration pod completed.")
|
314
327
|
finally:
|
315
328
|
if (
|
316
329
|
orchestrator.config.pass_zenml_token_as_secret
|
317
|
-
and
|
330
|
+
and deployment.schedule is None
|
318
331
|
):
|
319
|
-
secret_name = orchestrator.get_token_secret_name(
|
320
|
-
deployment_config.id
|
321
|
-
)
|
332
|
+
secret_name = orchestrator.get_token_secret_name(deployment.id)
|
322
333
|
try:
|
323
334
|
kube_utils.delete_secret(
|
324
335
|
core_api=core_api,
|
zenml/logging/step_logging.py
CHANGED
@@ -28,6 +28,7 @@ from zenml.artifact_stores import BaseArtifactStore
|
|
28
28
|
from zenml.artifacts.utils import (
|
29
29
|
_load_artifact_store,
|
30
30
|
_load_file_from_artifact_store,
|
31
|
+
_strip_timestamp_from_multiline_string,
|
31
32
|
)
|
32
33
|
from zenml.constants import (
|
33
34
|
ENV_ZENML_DISABLE_STEP_NAMES_IN_LOGS,
|
@@ -117,6 +118,7 @@ def fetch_logs(
|
|
117
118
|
logs_uri: str,
|
118
119
|
offset: int = 0,
|
119
120
|
length: int = 1024 * 1024 * 16, # Default to 16MiB of data
|
121
|
+
strip_timestamp: bool = False,
|
120
122
|
) -> str:
|
121
123
|
"""Fetches the logs from the artifact store.
|
122
124
|
|
@@ -126,6 +128,7 @@ def fetch_logs(
|
|
126
128
|
logs_uri: The URI of the artifact.
|
127
129
|
offset: The offset from which to start reading.
|
128
130
|
length: The amount of bytes that should be read.
|
131
|
+
strip_timestamp: Whether to strip timestamps in logs or not
|
129
132
|
|
130
133
|
Returns:
|
131
134
|
The logs as a string.
|
@@ -136,9 +139,12 @@ def fetch_logs(
|
|
136
139
|
"""
|
137
140
|
|
138
141
|
def _read_file(
|
139
|
-
uri: str,
|
142
|
+
uri: str,
|
143
|
+
offset: int = 0,
|
144
|
+
length: Optional[int] = None,
|
145
|
+
strip_timestamp: bool = False,
|
140
146
|
) -> str:
|
141
|
-
|
147
|
+
file_content = str(
|
142
148
|
_load_file_from_artifact_store(
|
143
149
|
uri,
|
144
150
|
artifact_store=artifact_store,
|
@@ -147,16 +153,22 @@ def fetch_logs(
|
|
147
153
|
length=length,
|
148
154
|
).decode()
|
149
155
|
)
|
156
|
+
if strip_timestamp:
|
157
|
+
file_content = _strip_timestamp_from_multiline_string(file_content)
|
158
|
+
return file_content
|
150
159
|
|
151
160
|
artifact_store = _load_artifact_store(artifact_store_id, zen_store)
|
152
161
|
try:
|
153
162
|
if not artifact_store.isdir(logs_uri):
|
154
|
-
return _read_file(logs_uri, offset, length)
|
163
|
+
return _read_file(logs_uri, offset, length, strip_timestamp)
|
155
164
|
else:
|
156
165
|
files = artifact_store.listdir(logs_uri)
|
157
166
|
if len(files) == 1:
|
158
167
|
return _read_file(
|
159
|
-
os.path.join(logs_uri, str(files[0])),
|
168
|
+
os.path.join(logs_uri, str(files[0])),
|
169
|
+
offset,
|
170
|
+
length,
|
171
|
+
strip_timestamp,
|
160
172
|
)
|
161
173
|
else:
|
162
174
|
is_negative_offset = offset < 0
|
@@ -191,6 +203,7 @@ def fetch_logs(
|
|
191
203
|
os.path.join(logs_uri, str(file)),
|
192
204
|
offset,
|
193
205
|
length,
|
206
|
+
strip_timestamp,
|
194
207
|
)
|
195
208
|
)
|
196
209
|
offset = 0
|
zenml/login/web_login.py
CHANGED
@@ -239,7 +239,7 @@ def web_login(
|
|
239
239
|
else:
|
240
240
|
# There was another error with the request
|
241
241
|
raise AuthorizationException(
|
242
|
-
f"Error: {response.status_code} {response.
|
242
|
+
f"Error: {response.status_code} {response.text}"
|
243
243
|
)
|
244
244
|
|
245
245
|
# Save the token in the credentials store
|