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
@@ -15,10 +15,12 @@
|
|
15
15
|
|
16
16
|
import base64
|
17
17
|
import json
|
18
|
-
from typing import TYPE_CHECKING, Any, List, Optional
|
18
|
+
from typing import TYPE_CHECKING, Any, List, Optional, Sequence
|
19
19
|
from uuid import UUID
|
20
20
|
|
21
21
|
from sqlalchemy import UniqueConstraint
|
22
|
+
from sqlalchemy.orm import joinedload
|
23
|
+
from sqlalchemy.sql.base import ExecutableOption
|
22
24
|
from sqlmodel import Relationship
|
23
25
|
|
24
26
|
from zenml.enums import StackComponentType
|
@@ -38,6 +40,7 @@ from zenml.zen_stores.schemas.service_connector_schemas import (
|
|
38
40
|
)
|
39
41
|
from zenml.zen_stores.schemas.stack_schemas import StackCompositionSchema
|
40
42
|
from zenml.zen_stores.schemas.user_schemas import UserSchema
|
43
|
+
from zenml.zen_stores.schemas.utils import jl_arg
|
41
44
|
|
42
45
|
if TYPE_CHECKING:
|
43
46
|
from zenml.zen_stores.schemas.flavor_schemas import FlavorSchema
|
@@ -111,6 +114,43 @@ class StackComponentSchema(NamedSchema, table=True):
|
|
111
114
|
|
112
115
|
connector_resource_id: Optional[str]
|
113
116
|
|
117
|
+
@classmethod
|
118
|
+
def get_query_options(
|
119
|
+
cls,
|
120
|
+
include_metadata: bool = False,
|
121
|
+
include_resources: bool = False,
|
122
|
+
**kwargs: Any,
|
123
|
+
) -> Sequence[ExecutableOption]:
|
124
|
+
"""Get the query options for the schema.
|
125
|
+
|
126
|
+
Args:
|
127
|
+
include_metadata: Whether metadata will be included when converting
|
128
|
+
the schema to a model.
|
129
|
+
include_resources: Whether resources will be included when
|
130
|
+
converting the schema to a model.
|
131
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
132
|
+
|
133
|
+
Returns:
|
134
|
+
A list of query options.
|
135
|
+
"""
|
136
|
+
options = [
|
137
|
+
joinedload(jl_arg(StackComponentSchema.flavor_schema)),
|
138
|
+
]
|
139
|
+
|
140
|
+
if include_metadata:
|
141
|
+
options.extend(
|
142
|
+
[joinedload(jl_arg(StackComponentSchema.connector))]
|
143
|
+
)
|
144
|
+
|
145
|
+
if include_resources:
|
146
|
+
options.extend(
|
147
|
+
[
|
148
|
+
joinedload(jl_arg(StackComponentSchema.user)),
|
149
|
+
]
|
150
|
+
)
|
151
|
+
|
152
|
+
return options
|
153
|
+
|
114
154
|
@classmethod
|
115
155
|
def from_request(
|
116
156
|
cls,
|
@@ -190,9 +230,9 @@ class StackComponentSchema(NamedSchema, table=True):
|
|
190
230
|
A `ComponentModel`
|
191
231
|
"""
|
192
232
|
body = ComponentResponseBody(
|
233
|
+
user_id=self.user_id,
|
193
234
|
type=StackComponentType(self.type),
|
194
235
|
flavor_name=self.flavor,
|
195
|
-
user=self.user.to_model() if self.user else None,
|
196
236
|
created=self.created,
|
197
237
|
updated=self.updated,
|
198
238
|
logo_url=self.flavor_schema.logo_url
|
@@ -224,7 +264,8 @@ class StackComponentSchema(NamedSchema, table=True):
|
|
224
264
|
)
|
225
265
|
|
226
266
|
resources = ComponentResponseResources(
|
227
|
-
|
267
|
+
user=self.user.to_model() if self.user else None,
|
268
|
+
flavor=self.flavor_schema.to_model(),
|
228
269
|
)
|
229
270
|
return ComponentResponse(
|
230
271
|
id=self.id,
|
@@ -15,10 +15,12 @@
|
|
15
15
|
|
16
16
|
from datetime import datetime, timedelta
|
17
17
|
from secrets import token_hex
|
18
|
-
from typing import Any, Optional, Tuple
|
18
|
+
from typing import Any, Optional, Sequence, Tuple
|
19
19
|
from uuid import UUID
|
20
20
|
|
21
21
|
from passlib.context import CryptContext
|
22
|
+
from sqlalchemy.orm import joinedload
|
23
|
+
from sqlalchemy.sql.base import ExecutableOption
|
22
24
|
from sqlmodel import Relationship
|
23
25
|
|
24
26
|
from zenml.enums import OAuthDeviceStatus
|
@@ -29,12 +31,14 @@ from zenml.models import (
|
|
29
31
|
OAuthDeviceResponse,
|
30
32
|
OAuthDeviceResponseBody,
|
31
33
|
OAuthDeviceResponseMetadata,
|
34
|
+
OAuthDeviceResponseResources,
|
32
35
|
OAuthDeviceUpdate,
|
33
36
|
)
|
34
37
|
from zenml.utils.time_utils import utc_now
|
35
38
|
from zenml.zen_stores.schemas.base_schemas import BaseSchema
|
36
39
|
from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
|
37
40
|
from zenml.zen_stores.schemas.user_schemas import UserSchema
|
41
|
+
from zenml.zen_stores.schemas.utils import jl_arg
|
38
42
|
|
39
43
|
|
40
44
|
class OAuthDeviceSchema(BaseSchema, table=True):
|
@@ -69,6 +73,36 @@ class OAuthDeviceSchema(BaseSchema, table=True):
|
|
69
73
|
)
|
70
74
|
user: Optional["UserSchema"] = Relationship(back_populates="auth_devices")
|
71
75
|
|
76
|
+
@classmethod
|
77
|
+
def get_query_options(
|
78
|
+
cls,
|
79
|
+
include_metadata: bool = False,
|
80
|
+
include_resources: bool = False,
|
81
|
+
**kwargs: Any,
|
82
|
+
) -> Sequence[ExecutableOption]:
|
83
|
+
"""Get the query options for the schema.
|
84
|
+
|
85
|
+
Args:
|
86
|
+
include_metadata: Whether metadata will be included when converting
|
87
|
+
the schema to a model.
|
88
|
+
include_resources: Whether resources will be included when
|
89
|
+
converting the schema to a model.
|
90
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
91
|
+
|
92
|
+
Returns:
|
93
|
+
A list of query options.
|
94
|
+
"""
|
95
|
+
options = []
|
96
|
+
|
97
|
+
if include_resources:
|
98
|
+
options.extend(
|
99
|
+
[
|
100
|
+
joinedload(jl_arg(OAuthDeviceSchema.user)),
|
101
|
+
]
|
102
|
+
)
|
103
|
+
|
104
|
+
return options
|
105
|
+
|
72
106
|
@classmethod
|
73
107
|
def _generate_user_code(cls) -> str:
|
74
108
|
"""Generate a user code for an OAuth2 device.
|
@@ -230,7 +264,7 @@ class OAuthDeviceSchema(BaseSchema, table=True):
|
|
230
264
|
)
|
231
265
|
|
232
266
|
body = OAuthDeviceResponseBody(
|
233
|
-
|
267
|
+
user_id=self.user_id,
|
234
268
|
created=self.created,
|
235
269
|
updated=self.updated,
|
236
270
|
client_id=self.client_id,
|
@@ -241,10 +275,16 @@ class OAuthDeviceSchema(BaseSchema, table=True):
|
|
241
275
|
ip_address=self.ip_address,
|
242
276
|
hostname=self.hostname,
|
243
277
|
)
|
278
|
+
resources = None
|
279
|
+
if include_resources:
|
280
|
+
resources = OAuthDeviceResponseResources(
|
281
|
+
user=self.user.to_model() if self.user else None,
|
282
|
+
)
|
244
283
|
return OAuthDeviceResponse(
|
245
284
|
id=self.id,
|
246
285
|
body=body,
|
247
286
|
metadata=metadata,
|
287
|
+
resources=resources,
|
248
288
|
)
|
249
289
|
|
250
290
|
def to_internal_model(
|
@@ -269,6 +309,7 @@ class OAuthDeviceSchema(BaseSchema, table=True):
|
|
269
309
|
id=device_model.id,
|
270
310
|
body=device_model.body,
|
271
311
|
metadata=device_model.metadata,
|
312
|
+
resources=device_model.resources,
|
272
313
|
user_code=self.user_code,
|
273
314
|
device_code=self.device_code,
|
274
315
|
)
|
@@ -15,10 +15,12 @@
|
|
15
15
|
|
16
16
|
import base64
|
17
17
|
import json
|
18
|
-
from typing import TYPE_CHECKING, Any, List, Optional, cast
|
18
|
+
from typing import TYPE_CHECKING, Any, List, Optional, Sequence, cast
|
19
19
|
from uuid import UUID
|
20
20
|
|
21
21
|
from sqlalchemy import TEXT, Column, UniqueConstraint
|
22
|
+
from sqlalchemy.orm import joinedload
|
23
|
+
from sqlalchemy.sql.base import ExecutableOption
|
22
24
|
from sqlmodel import Field, Relationship
|
23
25
|
|
24
26
|
from zenml import EventSourceResponseMetadata
|
@@ -36,7 +38,10 @@ from zenml.zen_stores.schemas.base_schemas import NamedSchema
|
|
36
38
|
from zenml.zen_stores.schemas.project_schemas import ProjectSchema
|
37
39
|
from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
|
38
40
|
from zenml.zen_stores.schemas.user_schemas import UserSchema
|
39
|
-
from zenml.zen_stores.schemas.utils import
|
41
|
+
from zenml.zen_stores.schemas.utils import (
|
42
|
+
get_page_from_list,
|
43
|
+
jl_arg,
|
44
|
+
)
|
40
45
|
|
41
46
|
if TYPE_CHECKING:
|
42
47
|
from zenml.zen_stores.schemas import TriggerSchema
|
@@ -85,6 +90,37 @@ class EventSourceSchema(NamedSchema, table=True):
|
|
85
90
|
configuration: bytes
|
86
91
|
is_active: bool = Field(nullable=False)
|
87
92
|
|
93
|
+
@classmethod
|
94
|
+
def get_query_options(
|
95
|
+
cls,
|
96
|
+
include_metadata: bool = False,
|
97
|
+
include_resources: bool = False,
|
98
|
+
**kwargs: Any,
|
99
|
+
) -> Sequence[ExecutableOption]:
|
100
|
+
"""Get the query options for the schema.
|
101
|
+
|
102
|
+
Args:
|
103
|
+
include_metadata: Whether metadata will be included when converting
|
104
|
+
the schema to a model.
|
105
|
+
include_resources: Whether resources will be included when
|
106
|
+
converting the schema to a model.
|
107
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
A list of query options.
|
111
|
+
"""
|
112
|
+
options = []
|
113
|
+
|
114
|
+
if include_resources:
|
115
|
+
options.extend(
|
116
|
+
[
|
117
|
+
joinedload(jl_arg(EventSourceSchema.user)),
|
118
|
+
# joinedload(jl_arg(EventSourceSchema.triggers)),
|
119
|
+
]
|
120
|
+
)
|
121
|
+
|
122
|
+
return options
|
123
|
+
|
88
124
|
@classmethod
|
89
125
|
def from_request(cls, request: EventSourceRequest) -> "EventSourceSchema":
|
90
126
|
"""Convert an `EventSourceRequest` to an `EventSourceSchema`.
|
@@ -133,9 +169,10 @@ class EventSourceSchema(NamedSchema, table=True):
|
|
133
169
|
from zenml.models import TriggerResponse
|
134
170
|
|
135
171
|
body = EventSourceResponseBody(
|
172
|
+
user_id=self.user_id,
|
173
|
+
project_id=self.project_id,
|
136
174
|
created=self.created,
|
137
175
|
updated=self.updated,
|
138
|
-
user=self.user.to_model() if self.user else None,
|
139
176
|
flavor=self.flavor,
|
140
177
|
plugin_subtype=self.plugin_subtype,
|
141
178
|
is_active=self.is_active,
|
@@ -152,12 +189,12 @@ class EventSourceSchema(NamedSchema, table=True):
|
|
152
189
|
),
|
153
190
|
)
|
154
191
|
resources = EventSourceResponseResources(
|
192
|
+
user=self.user.to_model() if self.user else None,
|
155
193
|
triggers=triggers,
|
156
194
|
)
|
157
195
|
metadata = None
|
158
196
|
if include_metadata:
|
159
197
|
metadata = EventSourceResponseMetadata(
|
160
|
-
project=self.project.to_model(),
|
161
198
|
description=self.description,
|
162
199
|
configuration=json.loads(
|
163
200
|
base64.b64decode(self.configuration).decode()
|
@@ -165,7 +202,6 @@ class EventSourceSchema(NamedSchema, table=True):
|
|
165
202
|
)
|
166
203
|
return EventSourceResponse(
|
167
204
|
id=self.id,
|
168
|
-
project_id=self.project_id,
|
169
205
|
name=self.name,
|
170
206
|
body=body,
|
171
207
|
metadata=metadata,
|
@@ -14,10 +14,12 @@
|
|
14
14
|
"""SQL Model Implementations for Flavors."""
|
15
15
|
|
16
16
|
import json
|
17
|
-
from typing import Any, Optional
|
17
|
+
from typing import Any, Optional, Sequence
|
18
18
|
from uuid import UUID
|
19
19
|
|
20
20
|
from sqlalchemy import TEXT, Column, UniqueConstraint
|
21
|
+
from sqlalchemy.orm import joinedload
|
22
|
+
from sqlalchemy.sql.base import ExecutableOption
|
21
23
|
from sqlmodel import Field, Relationship
|
22
24
|
|
23
25
|
from zenml.enums import StackComponentType
|
@@ -25,12 +27,14 @@ from zenml.models import (
|
|
25
27
|
FlavorResponse,
|
26
28
|
FlavorResponseBody,
|
27
29
|
FlavorResponseMetadata,
|
30
|
+
FlavorResponseResources,
|
28
31
|
FlavorUpdate,
|
29
32
|
)
|
30
33
|
from zenml.utils.time_utils import utc_now
|
31
34
|
from zenml.zen_stores.schemas.base_schemas import NamedSchema
|
32
35
|
from zenml.zen_stores.schemas.schema_utils import build_foreign_key_field
|
33
36
|
from zenml.zen_stores.schemas.user_schemas import UserSchema
|
37
|
+
from zenml.zen_stores.schemas.utils import jl_arg
|
34
38
|
|
35
39
|
|
36
40
|
class FlavorSchema(NamedSchema, table=True):
|
@@ -78,6 +82,36 @@ class FlavorSchema(NamedSchema, table=True):
|
|
78
82
|
|
79
83
|
is_custom: bool = Field(default=True)
|
80
84
|
|
85
|
+
@classmethod
|
86
|
+
def get_query_options(
|
87
|
+
cls,
|
88
|
+
include_metadata: bool = False,
|
89
|
+
include_resources: bool = False,
|
90
|
+
**kwargs: Any,
|
91
|
+
) -> Sequence[ExecutableOption]:
|
92
|
+
"""Get the query options for the schema.
|
93
|
+
|
94
|
+
Args:
|
95
|
+
include_metadata: Whether metadata will be included when converting
|
96
|
+
the schema to a model.
|
97
|
+
include_resources: Whether resources will be included when
|
98
|
+
converting the schema to a model.
|
99
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
A list of query options.
|
103
|
+
"""
|
104
|
+
options = []
|
105
|
+
|
106
|
+
if include_resources:
|
107
|
+
options.extend(
|
108
|
+
[
|
109
|
+
joinedload(jl_arg(FlavorSchema.user)),
|
110
|
+
]
|
111
|
+
)
|
112
|
+
|
113
|
+
return options
|
114
|
+
|
81
115
|
def update(
|
82
116
|
self,
|
83
117
|
flavor_update: "FlavorUpdate",
|
@@ -121,7 +155,7 @@ class FlavorSchema(NamedSchema, table=True):
|
|
121
155
|
The flavor model.
|
122
156
|
"""
|
123
157
|
body = FlavorResponseBody(
|
124
|
-
|
158
|
+
user_id=self.user_id,
|
125
159
|
type=StackComponentType(self.type),
|
126
160
|
integration=self.integration,
|
127
161
|
source=self.source,
|
@@ -140,9 +174,15 @@ class FlavorSchema(NamedSchema, table=True):
|
|
140
174
|
docs_url=self.docs_url,
|
141
175
|
sdk_docs_url=self.sdk_docs_url,
|
142
176
|
)
|
177
|
+
resources = None
|
178
|
+
if include_resources:
|
179
|
+
resources = FlavorResponseResources(
|
180
|
+
user=self.user.to_model() if self.user else None,
|
181
|
+
)
|
143
182
|
return FlavorResponse(
|
144
183
|
id=self.id,
|
145
184
|
name=self.name,
|
146
185
|
body=body,
|
147
186
|
metadata=metadata,
|
187
|
+
resources=resources,
|
148
188
|
)
|
@@ -13,7 +13,7 @@
|
|
13
13
|
# permissions and limitations under the License.
|
14
14
|
"""SQLModel implementation of model tables."""
|
15
15
|
|
16
|
-
from typing import TYPE_CHECKING, Any,
|
16
|
+
from typing import TYPE_CHECKING, Any, List, Optional, Sequence, cast
|
17
17
|
from uuid import UUID, uuid4
|
18
18
|
|
19
19
|
from pydantic import ConfigDict
|
@@ -24,11 +24,11 @@ from sqlalchemy import (
|
|
24
24
|
Column,
|
25
25
|
UniqueConstraint,
|
26
26
|
)
|
27
|
-
from sqlalchemy.orm import object_session
|
27
|
+
from sqlalchemy.orm import joinedload, object_session
|
28
|
+
from sqlalchemy.sql.base import ExecutableOption
|
28
29
|
from sqlmodel import Field, Relationship, desc, select
|
29
30
|
|
30
31
|
from zenml.enums import (
|
31
|
-
ArtifactType,
|
32
32
|
MetadataResourceTypes,
|
33
33
|
TaggableResourceTypes,
|
34
34
|
)
|
@@ -38,6 +38,7 @@ from zenml.models import (
|
|
38
38
|
ModelResponse,
|
39
39
|
ModelResponseBody,
|
40
40
|
ModelResponseMetadata,
|
41
|
+
ModelResponseResources,
|
41
42
|
ModelUpdate,
|
42
43
|
ModelVersionArtifactRequest,
|
43
44
|
ModelVersionArtifactResponse,
|
@@ -65,6 +66,7 @@ from zenml.zen_stores.schemas.user_schemas import UserSchema
|
|
65
66
|
from zenml.zen_stores.schemas.utils import (
|
66
67
|
RunMetadataInterface,
|
67
68
|
get_page_from_list,
|
69
|
+
jl_arg,
|
68
70
|
)
|
69
71
|
|
70
72
|
if TYPE_CHECKING:
|
@@ -127,6 +129,37 @@ class ModelSchema(NamedSchema, table=True):
|
|
127
129
|
sa_relationship_kwargs={"cascade": "delete"},
|
128
130
|
)
|
129
131
|
|
132
|
+
@classmethod
|
133
|
+
def get_query_options(
|
134
|
+
cls,
|
135
|
+
include_metadata: bool = False,
|
136
|
+
include_resources: bool = False,
|
137
|
+
**kwargs: Any,
|
138
|
+
) -> Sequence[ExecutableOption]:
|
139
|
+
"""Get the query options for the schema.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
include_metadata: Whether metadata will be included when converting
|
143
|
+
the schema to a model.
|
144
|
+
include_resources: Whether resources will be included when
|
145
|
+
converting the schema to a model.
|
146
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
147
|
+
|
148
|
+
Returns:
|
149
|
+
A list of query options.
|
150
|
+
"""
|
151
|
+
options = []
|
152
|
+
|
153
|
+
if include_resources:
|
154
|
+
options.extend(
|
155
|
+
[
|
156
|
+
joinedload(jl_arg(ModelSchema.user)),
|
157
|
+
# joinedload(jl_arg(ModelSchema.tags)),
|
158
|
+
]
|
159
|
+
)
|
160
|
+
|
161
|
+
return options
|
162
|
+
|
130
163
|
@property
|
131
164
|
def latest_version(self) -> Optional["ModelVersionSchema"]:
|
132
165
|
"""Fetch the latest version for this model.
|
@@ -194,19 +227,9 @@ class ModelSchema(NamedSchema, table=True):
|
|
194
227
|
Returns:
|
195
228
|
The created `ModelResponse`.
|
196
229
|
"""
|
197
|
-
tags = [tag.to_model() for tag in self.tags]
|
198
|
-
|
199
|
-
if latest_version := self.latest_version:
|
200
|
-
latest_version_name = latest_version.name
|
201
|
-
latest_version_id = latest_version.id
|
202
|
-
else:
|
203
|
-
latest_version_name = None
|
204
|
-
latest_version_id = None
|
205
|
-
|
206
230
|
metadata = None
|
207
231
|
if include_metadata:
|
208
232
|
metadata = ModelResponseMetadata(
|
209
|
-
project=self.project.to_model(),
|
210
233
|
license=self.license,
|
211
234
|
description=self.description,
|
212
235
|
audience=self.audience,
|
@@ -217,21 +240,35 @@ class ModelSchema(NamedSchema, table=True):
|
|
217
240
|
save_models_to_registry=self.save_models_to_registry,
|
218
241
|
)
|
219
242
|
|
243
|
+
resources = None
|
244
|
+
if include_resources:
|
245
|
+
if latest_version := self.latest_version:
|
246
|
+
latest_version_name = latest_version.name
|
247
|
+
latest_version_id = latest_version.id
|
248
|
+
else:
|
249
|
+
latest_version_name = None
|
250
|
+
latest_version_id = None
|
251
|
+
|
252
|
+
resources = ModelResponseResources(
|
253
|
+
user=self.user.to_model() if self.user else None,
|
254
|
+
tags=[tag.to_model() for tag in self.tags],
|
255
|
+
latest_version_name=latest_version_name,
|
256
|
+
latest_version_id=latest_version_id,
|
257
|
+
)
|
258
|
+
|
220
259
|
body = ModelResponseBody(
|
221
|
-
|
260
|
+
user_id=self.user_id,
|
261
|
+
project_id=self.project_id,
|
222
262
|
created=self.created,
|
223
263
|
updated=self.updated,
|
224
|
-
tags=tags,
|
225
|
-
latest_version_name=latest_version_name,
|
226
|
-
latest_version_id=latest_version_id,
|
227
264
|
)
|
228
265
|
|
229
266
|
return ModelResponse(
|
230
267
|
id=self.id,
|
231
|
-
project_id=self.project_id,
|
232
268
|
name=self.name,
|
233
269
|
body=body,
|
234
270
|
metadata=metadata,
|
271
|
+
resources=resources,
|
235
272
|
)
|
236
273
|
|
237
274
|
def update(
|
@@ -317,14 +354,6 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
317
354
|
nullable=False,
|
318
355
|
)
|
319
356
|
model: "ModelSchema" = Relationship(back_populates="model_versions")
|
320
|
-
artifact_links: List["ModelVersionArtifactSchema"] = Relationship(
|
321
|
-
back_populates="model_version",
|
322
|
-
sa_relationship_kwargs={"cascade": "delete"},
|
323
|
-
)
|
324
|
-
pipeline_run_links: List["ModelVersionPipelineRunSchema"] = Relationship(
|
325
|
-
back_populates="model_version",
|
326
|
-
sa_relationship_kwargs={"cascade": "delete"},
|
327
|
-
)
|
328
357
|
tags: List["TagSchema"] = Relationship(
|
329
358
|
sa_relationship_kwargs=dict(
|
330
359
|
primaryjoin=f"and_(foreign(TagResourceSchema.resource_type)=='{TaggableResourceTypes.MODEL_VERSION.value}', foreign(TagResourceSchema.resource_id)==ModelVersionSchema.id)",
|
@@ -369,6 +398,16 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
369
398
|
# numeric.
|
370
399
|
producer_run_id_if_numeric: UUID
|
371
400
|
|
401
|
+
# Needed for cascade deletion behavior
|
402
|
+
artifact_links: List["ModelVersionArtifactSchema"] = Relationship(
|
403
|
+
back_populates="model_version",
|
404
|
+
sa_relationship_kwargs={"cascade": "delete"},
|
405
|
+
)
|
406
|
+
pipeline_run_links: List["ModelVersionPipelineRunSchema"] = Relationship(
|
407
|
+
back_populates="model_version",
|
408
|
+
sa_relationship_kwargs={"cascade": "delete"},
|
409
|
+
)
|
410
|
+
|
372
411
|
# TODO: In Pydantic v2, the `model_` is a protected namespaces for all
|
373
412
|
# fields defined under base models. If not handled, this raises a warning.
|
374
413
|
# It is possible to suppress this warning message with the following
|
@@ -377,6 +416,47 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
377
416
|
# careful we might overwrite some fields protected by pydantic.
|
378
417
|
model_config = ConfigDict(protected_namespaces=()) # type: ignore[assignment]
|
379
418
|
|
419
|
+
@classmethod
|
420
|
+
def get_query_options(
|
421
|
+
cls,
|
422
|
+
include_metadata: bool = False,
|
423
|
+
include_resources: bool = False,
|
424
|
+
**kwargs: Any,
|
425
|
+
) -> Sequence[ExecutableOption]:
|
426
|
+
"""Get the query options for the schema.
|
427
|
+
|
428
|
+
Args:
|
429
|
+
include_metadata: Whether metadata will be included when converting
|
430
|
+
the schema to a model.
|
431
|
+
include_resources: Whether resources will be included when
|
432
|
+
converting the schema to a model.
|
433
|
+
**kwargs: Keyword arguments to allow schema specific logic
|
434
|
+
|
435
|
+
Returns:
|
436
|
+
A list of query options.
|
437
|
+
"""
|
438
|
+
options = [
|
439
|
+
joinedload(jl_arg(ModelVersionSchema.model), innerjoin=True),
|
440
|
+
]
|
441
|
+
|
442
|
+
# if include_metadata:
|
443
|
+
# options.extend(
|
444
|
+
# [
|
445
|
+
# joinedload(jl_arg(ModelVersionSchema.run_metadata)),
|
446
|
+
# ]
|
447
|
+
# )
|
448
|
+
|
449
|
+
if include_resources:
|
450
|
+
options.extend(
|
451
|
+
[
|
452
|
+
joinedload(jl_arg(ModelVersionSchema.user)),
|
453
|
+
# joinedload(jl_arg(ModelVersionSchema.services)),
|
454
|
+
# joinedload(jl_arg(ModelVersionSchema.tags)),
|
455
|
+
]
|
456
|
+
)
|
457
|
+
|
458
|
+
return options
|
459
|
+
|
380
460
|
@classmethod
|
381
461
|
def from_request(
|
382
462
|
cls,
|
@@ -430,44 +510,9 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
430
510
|
"""
|
431
511
|
from zenml.models import ServiceResponse
|
432
512
|
|
433
|
-
# Construct {name: {version: id}} dicts for all linked artifacts
|
434
|
-
model_artifact_ids: Dict[str, Dict[str, UUID]] = {}
|
435
|
-
deployment_artifact_ids: Dict[str, Dict[str, UUID]] = {}
|
436
|
-
data_artifact_ids: Dict[str, Dict[str, UUID]] = {}
|
437
|
-
for artifact_link in self.artifact_links:
|
438
|
-
if not artifact_link.artifact_version:
|
439
|
-
continue
|
440
|
-
artifact_name = artifact_link.artifact_version.artifact.name
|
441
|
-
artifact_version = str(artifact_link.artifact_version.version)
|
442
|
-
artifact_version_id = artifact_link.artifact_version.id
|
443
|
-
if artifact_link.artifact_version.type == ArtifactType.MODEL.value:
|
444
|
-
model_artifact_ids.setdefault(artifact_name, {}).update(
|
445
|
-
{str(artifact_version): artifact_version_id}
|
446
|
-
)
|
447
|
-
elif (
|
448
|
-
artifact_link.artifact_version.type
|
449
|
-
== ArtifactType.SERVICE.value
|
450
|
-
):
|
451
|
-
deployment_artifact_ids.setdefault(artifact_name, {}).update(
|
452
|
-
{str(artifact_version): artifact_version_id}
|
453
|
-
)
|
454
|
-
else:
|
455
|
-
data_artifact_ids.setdefault(artifact_name, {}).update(
|
456
|
-
{str(artifact_version): artifact_version_id}
|
457
|
-
)
|
458
|
-
|
459
|
-
# Construct {name: id} dict for all linked pipeline runs
|
460
|
-
pipeline_run_ids: Dict[str, UUID] = {}
|
461
|
-
for pipeline_run_link in self.pipeline_run_links:
|
462
|
-
if not pipeline_run_link.pipeline_run:
|
463
|
-
continue
|
464
|
-
pipeline_run = pipeline_run_link.pipeline_run
|
465
|
-
pipeline_run_ids[pipeline_run.name] = pipeline_run.id
|
466
|
-
|
467
513
|
metadata = None
|
468
514
|
if include_metadata:
|
469
515
|
metadata = ModelVersionResponseMetadata(
|
470
|
-
project=self.project.to_model(),
|
471
516
|
description=self.description,
|
472
517
|
run_metadata=self.fetch_metadata(),
|
473
518
|
)
|
@@ -484,26 +529,23 @@ class ModelVersionSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
484
529
|
),
|
485
530
|
)
|
486
531
|
resources = ModelVersionResponseResources(
|
532
|
+
user=self.user.to_model() if self.user else None,
|
487
533
|
services=services,
|
534
|
+
tags=[tag.to_model() for tag in self.tags],
|
488
535
|
)
|
489
536
|
|
490
537
|
body = ModelVersionResponseBody(
|
491
|
-
|
538
|
+
user_id=self.user_id,
|
539
|
+
project_id=self.project_id,
|
492
540
|
created=self.created,
|
493
541
|
updated=self.updated,
|
494
542
|
stage=self.stage,
|
495
543
|
number=self.number,
|
496
544
|
model=self.model.to_model(),
|
497
|
-
model_artifact_ids=model_artifact_ids,
|
498
|
-
data_artifact_ids=data_artifact_ids,
|
499
|
-
deployment_artifact_ids=deployment_artifact_ids,
|
500
|
-
pipeline_run_ids=pipeline_run_ids,
|
501
|
-
tags=[tag.to_model() for tag in self.tags],
|
502
545
|
)
|
503
546
|
|
504
547
|
return ModelVersionResponse(
|
505
548
|
id=self.id,
|
506
|
-
project_id=self.project_id,
|
507
549
|
name=self.name,
|
508
550
|
body=body,
|
509
551
|
metadata=metadata,
|
@@ -549,9 +591,7 @@ class ModelVersionArtifactSchema(BaseSchema, table=True):
|
|
549
591
|
ondelete="CASCADE",
|
550
592
|
nullable=False,
|
551
593
|
)
|
552
|
-
model_version: "ModelVersionSchema" = Relationship(
|
553
|
-
back_populates="artifact_links"
|
554
|
-
)
|
594
|
+
model_version: "ModelVersionSchema" = Relationship()
|
555
595
|
artifact_version_id: UUID = build_foreign_key_field(
|
556
596
|
source=__tablename__,
|
557
597
|
target=ArtifactVersionSchema.__tablename__,
|
@@ -632,9 +672,7 @@ class ModelVersionPipelineRunSchema(BaseSchema, table=True):
|
|
632
672
|
ondelete="CASCADE",
|
633
673
|
nullable=False,
|
634
674
|
)
|
635
|
-
model_version: "ModelVersionSchema" = Relationship(
|
636
|
-
back_populates="pipeline_run_links"
|
637
|
-
)
|
675
|
+
model_version: "ModelVersionSchema" = Relationship()
|
638
676
|
pipeline_run_id: UUID = build_foreign_key_field(
|
639
677
|
source=__tablename__,
|
640
678
|
target=PipelineRunSchema.__tablename__,
|
@@ -643,9 +681,7 @@ class ModelVersionPipelineRunSchema(BaseSchema, table=True):
|
|
643
681
|
ondelete="CASCADE",
|
644
682
|
nullable=False,
|
645
683
|
)
|
646
|
-
pipeline_run: "PipelineRunSchema" = Relationship(
|
647
|
-
back_populates="model_versions_pipeline_runs_links"
|
648
|
-
)
|
684
|
+
pipeline_run: "PipelineRunSchema" = Relationship()
|
649
685
|
|
650
686
|
# TODO: In Pydantic v2, the `model_` is a protected namespaces for all
|
651
687
|
# fields defined under base models. If not handled, this raises a warning.
|