zenml-nightly 0.68.1.dev20241103__py3-none-any.whl → 0.70.0.dev20241115__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. README.md +1 -1
  2. RELEASE_NOTES.md +77 -0
  3. zenml/VERSION +1 -1
  4. zenml/__init__.py +2 -0
  5. zenml/artifacts/external_artifact.py +2 -1
  6. zenml/artifacts/{load_directory_materializer.py → preexisting_data_materializer.py} +8 -9
  7. zenml/artifacts/utils.py +139 -80
  8. zenml/cli/base.py +4 -4
  9. zenml/cli/model.py +1 -6
  10. zenml/cli/stack.py +1 -0
  11. zenml/client.py +29 -74
  12. zenml/config/server_config.py +17 -1
  13. zenml/constants.py +2 -7
  14. zenml/data_validators/base_data_validator.py +2 -2
  15. zenml/enums.py +20 -4
  16. zenml/exceptions.py +4 -0
  17. zenml/integrations/__init__.py +3 -1
  18. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +20 -18
  19. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +1 -1
  20. zenml/integrations/bentoml/materializers/bentoml_bento_materializer.py +19 -31
  21. zenml/integrations/constants.py +1 -0
  22. zenml/integrations/deepchecks/data_validators/deepchecks_data_validator.py +1 -1
  23. zenml/integrations/evidently/__init__.py +1 -1
  24. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  25. zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +8 -12
  26. zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +17 -18
  27. zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +2 -5
  28. zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +17 -18
  29. zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +2 -3
  30. zenml/integrations/langchain/__init__.py +2 -1
  31. zenml/integrations/langchain/materializers/openai_embedding_materializer.py +28 -2
  32. zenml/integrations/lightgbm/materializers/lightgbm_booster_materializer.py +8 -15
  33. zenml/integrations/lightgbm/materializers/lightgbm_dataset_materializer.py +11 -16
  34. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +29 -9
  35. zenml/integrations/openai/__init__.py +1 -1
  36. zenml/integrations/openai/hooks/open_ai_failure_hook.py +39 -14
  37. zenml/integrations/pillow/materializers/pillow_image_materializer.py +17 -20
  38. zenml/integrations/polars/materializers/dataframe_materializer.py +26 -39
  39. zenml/integrations/pycaret/materializers/model_materializer.py +7 -22
  40. zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +60 -54
  41. zenml/integrations/tensorflow/materializers/keras_materializer.py +11 -22
  42. zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +8 -15
  43. zenml/integrations/vllm/__init__.py +50 -0
  44. zenml/integrations/vllm/flavors/__init__.py +21 -0
  45. zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py +91 -0
  46. zenml/integrations/vllm/model_deployers/__init__.py +19 -0
  47. zenml/integrations/vllm/model_deployers/vllm_model_deployer.py +263 -0
  48. zenml/integrations/vllm/services/__init__.py +19 -0
  49. zenml/integrations/vllm/services/vllm_deployment.py +206 -0
  50. zenml/integrations/whylogs/materializers/whylogs_materializer.py +11 -18
  51. zenml/integrations/xgboost/materializers/xgboost_booster_materializer.py +11 -22
  52. zenml/integrations/xgboost/materializers/xgboost_dmatrix_materializer.py +10 -19
  53. zenml/materializers/base_materializer.py +68 -1
  54. zenml/metadata/lazy_load.py +20 -7
  55. zenml/model/model.py +17 -64
  56. zenml/model/utils.py +5 -0
  57. zenml/models/__init__.py +0 -12
  58. zenml/models/v2/base/filter.py +121 -8
  59. zenml/models/v2/core/artifact_version.py +42 -7
  60. zenml/models/v2/core/model_version.py +26 -5
  61. zenml/models/v2/core/pipeline_run.py +25 -6
  62. zenml/models/v2/core/run_metadata.py +2 -217
  63. zenml/models/v2/core/step_run.py +62 -24
  64. zenml/orchestrators/base_orchestrator.py +12 -1
  65. zenml/orchestrators/input_utils.py +44 -19
  66. zenml/orchestrators/step_launcher.py +4 -3
  67. zenml/orchestrators/step_run_utils.py +19 -15
  68. zenml/orchestrators/step_runner.py +25 -14
  69. zenml/orchestrators/utils.py +45 -26
  70. zenml/stack/flavor.py +9 -5
  71. zenml/stack_deployments/aws_stack_deployment.py +23 -6
  72. zenml/stack_deployments/azure_stack_deployment.py +28 -5
  73. zenml/stack_deployments/gcp_stack_deployment.py +25 -8
  74. zenml/stack_deployments/stack_deployment.py +3 -5
  75. zenml/steps/base_step.py +1 -1
  76. zenml/steps/entrypoint_function_utils.py +3 -5
  77. zenml/steps/step_context.py +5 -2
  78. zenml/steps/utils.py +13 -2
  79. zenml/utils/callback_registry.py +71 -0
  80. zenml/utils/metadata_utils.py +335 -0
  81. zenml/zen_server/auth.py +221 -3
  82. zenml/zen_server/cache.py +208 -0
  83. zenml/zen_server/dashboard/assets/{404-DT4QRUqN.js → 404-NVXKFp-x.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{@radix-DP6vWzyx.js → @radix-DeK6qiuw.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{@react-router-BMhZulnd.js → @react-router-B3Z5rLr2.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{@reactflow-8U9qNlMR.js → @reactflow-CK0KJUen.js} +2 -2
  87. zenml/zen_server/dashboard/assets/{@tanstack-BUCbhJyH.js → @tanstack-DT5WLu9C.js} +1 -1
  88. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-DezXKmDf.js +1 -0
  89. zenml/zen_server/dashboard/assets/{CodeSnippet-CqybNv0k.js → CodeSnippet-JzR8CEtw.js} +2 -2
  90. zenml/zen_server/dashboard/assets/{CollapsibleCard-0r_8G2Lj.js → CollapsibleCard-DQW_ktMO.js} +1 -1
  91. zenml/zen_server/dashboard/assets/{Commands-BDjgBQKi.js → Commands-DL2kwkRd.js} +1 -1
  92. zenml/zen_server/dashboard/assets/ComponentBadge-D_g62Wv8.js +1 -0
  93. zenml/zen_server/dashboard/assets/{CopyButton-C745BrKi.js → CopyButton-LNcWaa14.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{CsvVizualization-PpAq0CeZ.js → CsvVizualization-DknpE5ej.js} +5 -5
  95. zenml/zen_server/dashboard/assets/{DialogItem-DcVCZEew.js → DialogItem-Bxf8FuAT.js} +1 -1
  96. zenml/zen_server/dashboard/assets/{DisplayDate-BeXgUG_C.js → DisplayDate-CDMUcQHS.js} +1 -1
  97. zenml/zen_server/dashboard/assets/{EmptyState-DeK7H4pr.js → EmptyState-BzdlCwp3.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{Error-BMlzibXj.js → Error-DYflYyps.js} +1 -1
  99. zenml/zen_server/dashboard/assets/ExecutionStatus-C7zyIQKZ.js +1 -0
  100. zenml/zen_server/dashboard/assets/{Helpbox-BLf40fLV.js → Helpbox-oYSGpLqd.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{Infobox-BwisKifi.js → Infobox-Cx4xGoXR.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{InlineAvatar-jEgodSgX.js → InlineAvatar-DiGOWNKF.js} +1 -1
  103. zenml/zen_server/dashboard/assets/{Lock-3lLt1ih0.js → Lock-CYYy18Mm.js} +1 -1
  104. zenml/zen_server/dashboard/assets/{MarkdownVisualization-8O9kTr-2.js → MarkdownVisualization-ylXaAxev.js} +1 -1
  105. zenml/zen_server/dashboard/assets/NestedCollapsible-DYbgyKxK.js +1 -0
  106. zenml/zen_server/dashboard/assets/{NumberBox-T9eELfLZ.js → NumberBox-Dtp3J6g5.js} +1 -1
  107. zenml/zen_server/dashboard/assets/Partials-03iZf8-N.js +1 -0
  108. zenml/zen_server/dashboard/assets/{PasswordChecker-CW0kqY0W.js → PasswordChecker-B0nadgh6.js} +1 -1
  109. zenml/zen_server/dashboard/assets/ProBadge-D_EB8HNo.js +1 -0
  110. zenml/zen_server/dashboard/assets/ProCta-DqNS4v3x.js +1 -0
  111. zenml/zen_server/dashboard/assets/ProviderIcon-Bki2aw8w.js +1 -0
  112. zenml/zen_server/dashboard/assets/{ProviderRadio-BROY1700.js → ProviderRadio-8f43sPD4.js} +1 -1
  113. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +1 -0
  114. zenml/zen_server/dashboard/assets/RunsBody-07YEO7qI.js +1 -0
  115. zenml/zen_server/dashboard/assets/SearchField-lp1KgU4e.js +1 -0
  116. zenml/zen_server/dashboard/assets/{SecretTooltip-C_qByGWB.js → SecretTooltip-CgnbyeOx.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{SetPassword-7pRB00El.js → SetPassword-CpP418A2.js} +1 -1
  118. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +1 -0
  119. zenml/zen_server/dashboard/assets/Tabs-BktHkCJJ.js +1 -0
  120. zenml/zen_server/dashboard/assets/Tick-BlMoIlJT.js +1 -0
  121. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DckMEkFf.js → UpdatePasswordSchemas-Sc0A0pP-.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{UsageReason-DVceN14P.js → UsageReason-YYduL4fj.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{WizardFooter-CW0Cvd70.js → WizardFooter-dgmizSJC.js} +1 -1
  124. zenml/zen_server/dashboard/assets/all-pipeline-runs-query-D-c2G6lV.js +1 -0
  125. zenml/zen_server/dashboard/assets/check-DloQpStc.js +1 -0
  126. zenml/zen_server/dashboard/assets/{check-circle-Dwxliy1Z.js → check-circle-jNbX5-sR.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{chevron-down-8wLBS5pQ.js → chevron-down-6JyMkfjR.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{chevron-right-double-DoD8iXWM.js → chevron-right-double-D7ojK9Co.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{code-browser-CZUQs3Wa.js → code-browser-CUFUIHfp.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{copy-CaSMXwiU.js → copy-C8XQA2Ug.js} +1 -1
  131. zenml/zen_server/dashboard/assets/create-stack-DM_JPgef.js +1 -0
  132. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +1 -0
  133. zenml/zen_server/dashboard/assets/{docker-BFNgg-z3.js → docker-BdA9vrnW.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{dots-horizontal-DK5Duzx4.js → dots-horizontal-otGBOSDJ.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{form-schemas-1AyOCx90.js → form-schemas-K6FYKjwa.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{gcp-7M2Yf3ZK.js → gcp-CFtm4BA7.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{help-Dam461dC.js → help-Cc9bBIJH.js} +1 -1
  138. zenml/zen_server/dashboard/assets/index-B1mVPYxf.js +1 -0
  139. zenml/zen_server/dashboard/assets/index-BAkC7FXi.js +1 -0
  140. zenml/zen_server/dashboard/assets/{index-QQb7wQEC.js → index-CCOPpudF.js} +8 -8
  141. zenml/zen_server/dashboard/assets/index-CEV4Cvaf.js +1 -0
  142. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +1 -0
  143. zenml/zen_server/dashboard/assets/{index-BVJ8n2-j.js → index-Uu49AX48.js} +1 -1
  144. zenml/zen_server/dashboard/assets/{index.esm-cuVep_NJ.js → index.esm-Dy6Z9Ung.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{kubernetes--g7r02Zu.js → kubernetes-B2wmAJ1d.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{layout-DCSYN7-C.js → layout-BtHBmE4w.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{link-external-CBEk6kEG.js → link-external-b9AXw_sW.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{login-mutation-DTcAFP1l.js → login-mutation-hf-lK87O.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{logs-D5bdJGur.js → logs-WMSM52RF.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{not-found-Cc-JkRH2.js → not-found-BGirLjU-.js} +1 -1
  151. zenml/zen_server/dashboard/assets/{package-Cs35Szwh.js → package-C6uypY4h.js} +1 -1
  152. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +1 -0
  153. zenml/zen_server/dashboard/assets/{page-DH_Z7iW1.js → page-6m6yHHlE.js} +1 -1
  154. zenml/zen_server/dashboard/assets/page-BDigxVpo.js +1 -0
  155. zenml/zen_server/dashboard/assets/page-BR68V0V1.js +1 -0
  156. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +1 -0
  157. zenml/zen_server/dashboard/assets/{page-BQQKaabe.js → page-BU7huvKw.js} +3 -3
  158. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +1 -0
  159. zenml/zen_server/dashboard/assets/page-C00YAkaB.js +1 -0
  160. zenml/zen_server/dashboard/assets/{page-N4qoPHKb.js → page-CD-DcWoy.js} +1 -1
  161. zenml/zen_server/dashboard/assets/page-COXXJj1k.js +1 -0
  162. zenml/zen_server/dashboard/assets/page-CbpvrsDL.js +1 -0
  163. zenml/zen_server/dashboard/assets/page-CdMWnQak.js +1 -0
  164. zenml/zen_server/dashboard/assets/{page-ClUVkl-O.js → page-CjGdWY13.js} +1 -1
  165. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +1 -0
  166. zenml/zen_server/dashboard/assets/{page-DLixvR-7.js → page-D01JhjQB.js} +1 -1
  167. zenml/zen_server/dashboard/assets/page-D6uU2ax4.js +1 -0
  168. zenml/zen_server/dashboard/assets/page-D7S3aCbF.js +1 -0
  169. zenml/zen_server/dashboard/assets/{page-9yplj5JT.js → page-DLC-bNBP.js} +1 -1
  170. zenml/zen_server/dashboard/assets/page-DXSTpqRD.js +1 -0
  171. zenml/zen_server/dashboard/assets/{page-DzpVUZ8f.js → page-DakHVWXF.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{page-DIOXwhiD.js → page-Df-Fw0aq.js} +1 -1
  173. zenml/zen_server/dashboard/assets/{page-B-y2XKIc.js → page-DfbXf_8s.js} +1 -1
  174. zenml/zen_server/dashboard/assets/page-DjRJCGb3.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-C0N5q3l7.js → page-Djikxq_S.js} +1 -1
  176. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +3 -0
  177. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +1 -0
  178. zenml/zen_server/dashboard/assets/page-Vcxara9U.js +1 -0
  179. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +14 -0
  180. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +1 -0
  181. zenml/zen_server/dashboard/assets/page-yYC9OI-E.js +1 -0
  182. zenml/zen_server/dashboard/assets/{persist-DNb5cdrU.js → persist-Coz7ZWvz.js} +1 -1
  183. zenml/zen_server/dashboard/assets/{persist-CP0JmYZ4.js → persist-GjC8PZoC.js} +1 -1
  184. zenml/zen_server/dashboard/assets/{plus-C9IxgN2M.js → plus-tf1V2hTJ.js} +1 -1
  185. zenml/zen_server/dashboard/assets/{refresh-BVu22P_C.js → refresh-BjOeWlEq.js} +1 -1
  186. zenml/zen_server/dashboard/assets/{rocket-CONEmRmB.js → rocket-DjT2cDvG.js} +1 -1
  187. zenml/zen_server/dashboard/assets/sharedSchema-CQb14VSr.js +14 -0
  188. zenml/zen_server/dashboard/assets/stack-detail-query-OPEW-cDJ.js +1 -0
  189. zenml/zen_server/dashboard/assets/{tick-circle-CM1ZScbQ.js → tick-circle-BEX_Tp4v.js} +1 -1
  190. zenml/zen_server/dashboard/assets/{trash-DkJHMOg7.js → trash-arLUMWMS.js} +1 -1
  191. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-DsU8cNVl.js → update-server-settings-mutation-LwuQfHYn.js} +1 -1
  192. zenml/zen_server/dashboard/assets/upgrade-form-CwRHBuXB.webp +0 -0
  193. zenml/zen_server/dashboard/assets/url-CkvKAnwF.js +1 -0
  194. zenml/zen_server/dashboard/assets/{zod-D89GC_vc.js → zod-BwEbpOxH.js} +1 -1
  195. zenml/zen_server/dashboard/index.html +7 -7
  196. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  197. zenml/zen_server/deploy/helm/README.md +2 -2
  198. zenml/zen_server/exceptions.py +2 -0
  199. zenml/zen_server/jwt.py +30 -13
  200. zenml/zen_server/rbac/endpoint_utils.py +43 -1
  201. zenml/zen_server/rbac/utils.py +0 -2
  202. zenml/zen_server/routers/artifact_version_endpoints.py +27 -1
  203. zenml/zen_server/routers/auth_endpoints.py +134 -102
  204. zenml/zen_server/routers/logs_endpoints.py +66 -0
  205. zenml/zen_server/routers/workspaces_endpoints.py +3 -4
  206. zenml/zen_server/template_execution/utils.py +14 -16
  207. zenml/zen_server/utils.py +27 -0
  208. zenml/zen_server/zen_server_api.py +6 -3
  209. zenml/zen_stores/migrations/versions/0.70.0_release.py +23 -0
  210. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
  211. zenml/zen_stores/migrations/versions/904464ea4041_add_pipeline_model_run_unique_constraints.py +192 -0
  212. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
  213. zenml/zen_stores/rest_zen_store.py +68 -64
  214. zenml/zen_stores/schemas/artifact_schemas.py +8 -1
  215. zenml/zen_stores/schemas/model_schemas.py +27 -3
  216. zenml/zen_stores/schemas/pipeline_run_schemas.py +6 -1
  217. zenml/zen_stores/schemas/pipeline_schemas.py +8 -2
  218. zenml/zen_stores/schemas/run_metadata_schemas.py +1 -48
  219. zenml/zen_stores/schemas/step_run_schemas.py +18 -10
  220. zenml/zen_stores/sql_zen_store.py +283 -219
  221. zenml/zen_stores/zen_store_interface.py +15 -42
  222. {zenml_nightly-0.68.1.dev20241103.dist-info → zenml_nightly-0.70.0.dev20241115.dist-info}/METADATA +2 -2
  223. {zenml_nightly-0.68.1.dev20241103.dist-info → zenml_nightly-0.70.0.dev20241115.dist-info}/RECORD +226 -203
  224. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-C6N2rGrB.js +0 -1
  225. zenml/zen_server/dashboard/assets/ComponentBadge-DUiEYJHu.js +0 -1
  226. zenml/zen_server/dashboard/assets/ComponentFallbackDialog-BFoH5K4V.js +0 -1
  227. zenml/zen_server/dashboard/assets/ComponentIcon-CAIoUis2.js +0 -1
  228. zenml/zen_server/dashboard/assets/Partials-YPBB3V4q.js +0 -1
  229. zenml/zen_server/dashboard/assets/ProviderIcon-Bb3Xha5A.js +0 -1
  230. zenml/zen_server/dashboard/assets/RunSelector-DCiL3M1c.js +0 -1
  231. zenml/zen_server/dashboard/assets/SearchField-DfUiGFVd.js +0 -1
  232. zenml/zen_server/dashboard/assets/Tick-CykQFPj2.js +0 -1
  233. zenml/zen_server/dashboard/assets/cloud-only-B-s_HMDm.js +0 -1
  234. zenml/zen_server/dashboard/assets/codespaces-BitYDX9d.gif +0 -0
  235. zenml/zen_server/dashboard/assets/create-stack-CEmaPZ4c.js +0 -1
  236. zenml/zen_server/dashboard/assets/delete-run-D-LKbGyz.js +0 -1
  237. zenml/zen_server/dashboard/assets/index-Bpmj40BI.js +0 -1
  238. zenml/zen_server/dashboard/assets/index-CbU4Ln_E.css +0 -1
  239. zenml/zen_server/dashboard/assets/index-DKPhqP2B.js +0 -1
  240. zenml/zen_server/dashboard/assets/page-BBpOxVcY.js +0 -1
  241. zenml/zen_server/dashboard/assets/page-BRInM1Lg.js +0 -1
  242. zenml/zen_server/dashboard/assets/page-BjjlMk7s.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-Bvd7YH2A.js +0 -1
  244. zenml/zen_server/dashboard/assets/page-CT3Nep8W.js +0 -1
  245. zenml/zen_server/dashboard/assets/page-C_f47pBf.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-Cmv8C_yM.js +0 -3
  247. zenml/zen_server/dashboard/assets/page-CyN2bdWG.js +0 -1
  248. zenml/zen_server/dashboard/assets/page-CzzXH4fs.js +0 -1
  249. zenml/zen_server/dashboard/assets/page-DTlGjgnG.js +0 -1
  250. zenml/zen_server/dashboard/assets/page-Dbpl86h0.js +0 -1
  251. zenml/zen_server/dashboard/assets/page-Ddgy6kDS.js +0 -1
  252. zenml/zen_server/dashboard/assets/page-DtCAfBLy.js +0 -9
  253. zenml/zen_server/dashboard/assets/page-Dx16z7nA.js +0 -1
  254. zenml/zen_server/dashboard/assets/page-McUyYbo1.js +0 -1
  255. zenml/zen_server/dashboard/assets/page-T1P3RyAR.js +0 -1
  256. zenml/zen_server/dashboard/assets/page-bKaULTGG.js +0 -1
  257. zenml/zen_server/dashboard/assets/page-sbXUJy9t.js +0 -1
  258. zenml/zen_server/dashboard/assets/sharedSchema-TMLu-nYQ.js +0 -14
  259. zenml/zen_server/dashboard/assets/stack-detail-query-xmYxSsUY.js +0 -1
  260. zenml/zen_server/dashboard/assets/url-D5le3J4q.js +0 -1
  261. zenml/zen_server/routers/run_metadata_endpoints.py +0 -96
  262. {zenml_nightly-0.68.1.dev20241103.dist-info → zenml_nightly-0.70.0.dev20241115.dist-info}/LICENSE +0 -0
  263. {zenml_nightly-0.68.1.dev20241103.dist-info → zenml_nightly-0.70.0.dev20241115.dist-info}/WHEEL +0 -0
  264. {zenml_nightly-0.68.1.dev20241103.dist-info → zenml_nightly-0.70.0.dev20241115.dist-info}/entry_points.txt +0 -0
@@ -29,6 +29,7 @@ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, field_validator
29
29
 
30
30
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
31
31
  from zenml.enums import ModelStages
32
+ from zenml.metadata.metadata_types import MetadataType
32
33
  from zenml.models.v2.base.filter import AnyQuery
33
34
  from zenml.models.v2.base.page import Page
34
35
  from zenml.models.v2.base.scoped import (
@@ -49,9 +50,6 @@ if TYPE_CHECKING:
49
50
  from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
50
51
  from zenml.models.v2.core.model import ModelResponse
51
52
  from zenml.models.v2.core.pipeline_run import PipelineRunResponse
52
- from zenml.models.v2.core.run_metadata import (
53
- RunMetadataResponse,
54
- )
55
53
  from zenml.zen_stores.schemas import BaseSchema
56
54
 
57
55
  AnySchema = TypeVar("AnySchema", bound=BaseSchema)
@@ -193,7 +191,7 @@ class ModelVersionResponseMetadata(WorkspaceScopedResponseMetadata):
193
191
  max_length=TEXT_FIELD_MAX_LENGTH,
194
192
  default=None,
195
193
  )
196
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
194
+ run_metadata: Dict[str, MetadataType] = Field(
197
195
  description="Metadata linked to the model version",
198
196
  default={},
199
197
  )
@@ -304,7 +302,7 @@ class ModelVersionResponse(
304
302
  return self.get_metadata().description
305
303
 
306
304
  @property
307
- def run_metadata(self) -> Optional[Dict[str, "RunMetadataResponse"]]:
305
+ def run_metadata(self) -> Dict[str, MetadataType]:
308
306
  """The `run_metadata` property.
309
307
 
310
308
  Returns:
@@ -592,6 +590,7 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
592
590
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
593
591
  *WorkspaceScopedTaggableFilter.FILTER_EXCLUDE_FIELDS,
594
592
  "user",
593
+ "run_metadata",
595
594
  ]
596
595
 
597
596
  name: Optional[str] = Field(
@@ -621,6 +620,10 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
621
620
  default=None,
622
621
  description="Name/ID of the user that created the model version.",
623
622
  )
623
+ run_metadata: Optional[Dict[str, str]] = Field(
624
+ default=None,
625
+ description="The run_metadata to filter the model versions by.",
626
+ )
624
627
 
625
628
  _model_id: UUID = PrivateAttr(None)
626
629
 
@@ -653,6 +656,7 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
653
656
 
654
657
  from zenml.zen_stores.schemas import (
655
658
  ModelVersionSchema,
659
+ RunMetadataSchema,
656
660
  UserSchema,
657
661
  )
658
662
 
@@ -667,6 +671,23 @@ class ModelVersionFilter(WorkspaceScopedTaggableFilter):
667
671
  )
668
672
  custom_filters.append(user_filter)
669
673
 
674
+ if self.run_metadata is not None:
675
+ from zenml.enums import MetadataResourceTypes
676
+
677
+ for key, value in self.run_metadata.items():
678
+ additional_filter = and_(
679
+ RunMetadataSchema.resource_id == ModelVersionSchema.id,
680
+ RunMetadataSchema.resource_type
681
+ == MetadataResourceTypes.MODEL_VERSION,
682
+ RunMetadataSchema.key == key,
683
+ self.generate_custom_query_conditions_for_column(
684
+ value=value,
685
+ table=RunMetadataSchema,
686
+ column="value",
687
+ ),
688
+ )
689
+ custom_filters.append(additional_filter)
690
+
670
691
  return custom_filters
671
692
 
672
693
  def apply_filter(
@@ -30,6 +30,7 @@ from pydantic import BaseModel, ConfigDict, Field
30
30
  from zenml.config.pipeline_configurations import PipelineConfiguration
31
31
  from zenml.constants import STR_FIELD_MAX_LENGTH
32
32
  from zenml.enums import ExecutionStatus
33
+ from zenml.metadata.metadata_types import MetadataType
33
34
  from zenml.models.v2.base.scoped import (
34
35
  WorkspaceScopedRequest,
35
36
  WorkspaceScopedResponse,
@@ -51,9 +52,6 @@ if TYPE_CHECKING:
51
52
  from zenml.models.v2.core.pipeline_build import (
52
53
  PipelineBuildResponse,
53
54
  )
54
- from zenml.models.v2.core.run_metadata import (
55
- RunMetadataResponse,
56
- )
57
55
  from zenml.models.v2.core.schedule import ScheduleResponse
58
56
  from zenml.models.v2.core.stack import StackResponse
59
57
  from zenml.models.v2.core.step_run import StepRunResponse
@@ -190,7 +188,7 @@ class PipelineRunResponseBody(WorkspaceScopedResponseBody):
190
188
  class PipelineRunResponseMetadata(WorkspaceScopedResponseMetadata):
191
189
  """Response metadata for pipeline runs."""
192
190
 
193
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
191
+ run_metadata: Dict[str, MetadataType] = Field(
194
192
  default={},
195
193
  title="Metadata associated with this pipeline run.",
196
194
  )
@@ -450,7 +448,7 @@ class PipelineRunResponse(
450
448
  return self.get_body().model_version_id
451
449
 
452
450
  @property
453
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
451
+ def run_metadata(self) -> Dict[str, MetadataType]:
454
452
  """The `run_metadata` property.
455
453
 
456
454
  Returns:
@@ -589,6 +587,7 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
589
587
  "stack_component",
590
588
  "pipeline_name",
591
589
  "templatable",
590
+ "run_metadata",
592
591
  ]
593
592
  name: Optional[str] = Field(
594
593
  default=None,
@@ -667,6 +666,10 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
667
666
  default=None,
668
667
  description="Name/ID of the user that created the run.",
669
668
  )
669
+ run_metadata: Optional[Dict[str, str]] = Field(
670
+ default=None,
671
+ description="The run_metadata to filter the pipeline runs by.",
672
+ )
670
673
  # TODO: Remove once frontend is ready for it. This is replaced by the more
671
674
  # generic `pipeline` filter below.
672
675
  pipeline_name: Optional[str] = Field(
@@ -696,7 +699,6 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
696
699
  templatable: Optional[bool] = Field(
697
700
  default=None, description="Whether the run is templatable."
698
701
  )
699
-
700
702
  model_config = ConfigDict(protected_namespaces=())
701
703
 
702
704
  def get_custom_filters(
@@ -720,6 +722,7 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
720
722
  PipelineDeploymentSchema,
721
723
  PipelineRunSchema,
722
724
  PipelineSchema,
725
+ RunMetadataSchema,
723
726
  ScheduleSchema,
724
727
  StackComponentSchema,
725
728
  StackCompositionSchema,
@@ -889,5 +892,21 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
889
892
  )
890
893
 
891
894
  custom_filters.append(templatable_filter)
895
+ if self.run_metadata is not None:
896
+ from zenml.enums import MetadataResourceTypes
897
+
898
+ for key, value in self.run_metadata.items():
899
+ additional_filter = and_(
900
+ RunMetadataSchema.resource_id == PipelineRunSchema.id,
901
+ RunMetadataSchema.resource_type
902
+ == MetadataResourceTypes.PIPELINE_RUN,
903
+ RunMetadataSchema.key == key,
904
+ self.generate_custom_query_conditions_for_column(
905
+ value=value,
906
+ table=RunMetadataSchema,
907
+ column="value",
908
+ ),
909
+ )
910
+ custom_filters.append(additional_filter)
892
911
 
893
912
  return custom_filters
@@ -13,21 +13,15 @@
13
13
  # permissions and limitations under the License.
14
14
  """Models representing run metadata."""
15
15
 
16
- from typing import Any, Dict, Optional, Union
16
+ from typing import Dict, Optional
17
17
  from uuid import UUID
18
18
 
19
- from pydantic import Field, field_validator
19
+ from pydantic import Field
20
20
 
21
- from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
22
21
  from zenml.enums import MetadataResourceTypes
23
22
  from zenml.metadata.metadata_types import MetadataType, MetadataTypeEnum
24
23
  from zenml.models.v2.base.scoped import (
25
- WorkspaceScopedFilter,
26
24
  WorkspaceScopedRequest,
27
- WorkspaceScopedResponse,
28
- WorkspaceScopedResponseBody,
29
- WorkspaceScopedResponseMetadata,
30
- WorkspaceScopedResponseResources,
31
25
  )
32
26
 
33
27
  # ------------------ Request Model ------------------
@@ -51,212 +45,3 @@ class RunMetadataRequest(WorkspaceScopedRequest):
51
45
  types: Dict[str, "MetadataTypeEnum"] = Field(
52
46
  title="The types of the metadata to be created.",
53
47
  )
54
-
55
-
56
- # ------------------ Update Model ------------------
57
-
58
- # There is no update model for run metadata.
59
-
60
- # ------------------ Response Model ------------------
61
-
62
-
63
- class RunMetadataResponseBody(WorkspaceScopedResponseBody):
64
- """Response body for run metadata."""
65
-
66
- key: str = Field(title="The key of the metadata.")
67
- value: MetadataType = Field(
68
- title="The value of the metadata.", union_mode="smart"
69
- )
70
- type: MetadataTypeEnum = Field(title="The type of the metadata.")
71
-
72
- @field_validator("key", "type")
73
- @classmethod
74
- def str_field_max_length_check(cls, value: Any) -> Any:
75
- """Checks if the length of the value exceeds the maximum str length.
76
-
77
- Args:
78
- value: the value set in the field
79
-
80
- Returns:
81
- the value itself.
82
-
83
- Raises:
84
- AssertionError: if the length of the field is longer than the
85
- maximum threshold.
86
- """
87
- assert len(str(value)) < STR_FIELD_MAX_LENGTH, (
88
- "The length of the value for this field can not "
89
- f"exceed {STR_FIELD_MAX_LENGTH}"
90
- )
91
- return value
92
-
93
- @field_validator("value")
94
- @classmethod
95
- def text_field_max_length_check(cls, value: Any) -> Any:
96
- """Checks if the length of the value exceeds the maximum text length.
97
-
98
- Args:
99
- value: the value set in the field
100
-
101
- Returns:
102
- the value itself.
103
-
104
- Raises:
105
- AssertionError: if the length of the field is longer than the
106
- maximum threshold.
107
- """
108
- assert len(str(value)) < TEXT_FIELD_MAX_LENGTH, (
109
- "The length of the value for this field can not "
110
- f"exceed {TEXT_FIELD_MAX_LENGTH}"
111
- )
112
- return value
113
-
114
-
115
- class RunMetadataResponseMetadata(WorkspaceScopedResponseMetadata):
116
- """Response metadata for run metadata."""
117
-
118
- resource_id: UUID = Field(
119
- title="The ID of the resource that this metadata belongs to.",
120
- )
121
- resource_type: MetadataResourceTypes = Field(
122
- title="The type of the resource that this metadata belongs to.",
123
- )
124
- stack_component_id: Optional[UUID] = Field(
125
- title="The ID of the stack component that this metadata belongs to."
126
- )
127
-
128
-
129
- class RunMetadataResponseResources(WorkspaceScopedResponseResources):
130
- """Class for all resource models associated with the run metadata entity."""
131
-
132
-
133
- class RunMetadataResponse(
134
- WorkspaceScopedResponse[
135
- RunMetadataResponseBody,
136
- RunMetadataResponseMetadata,
137
- RunMetadataResponseResources,
138
- ]
139
- ):
140
- """Response model for run metadata."""
141
-
142
- def get_hydrated_version(self) -> "RunMetadataResponse":
143
- """Get the hydrated version of this run metadata.
144
-
145
- Returns:
146
- an instance of the same entity with the metadata field attached.
147
- """
148
- from zenml.client import Client
149
-
150
- return Client().zen_store.get_run_metadata(self.id)
151
-
152
- # Body and metadata properties
153
- @property
154
- def key(self) -> str:
155
- """The `key` property.
156
-
157
- Returns:
158
- the value of the property.
159
- """
160
- return self.get_body().key
161
-
162
- @property
163
- def value(self) -> MetadataType:
164
- """The `value` property.
165
-
166
- Returns:
167
- the value of the property.
168
- """
169
- return self.get_body().value
170
-
171
- @property
172
- def type(self) -> MetadataTypeEnum:
173
- """The `type` property.
174
-
175
- Returns:
176
- the value of the property.
177
- """
178
- return self.get_body().type
179
-
180
- @property
181
- def resource_id(self) -> UUID:
182
- """The `resource_id` property.
183
-
184
- Returns:
185
- the value of the property.
186
- """
187
- return self.get_metadata().resource_id
188
-
189
- @property
190
- def resource_type(self) -> MetadataResourceTypes:
191
- """The `resource_type` property.
192
-
193
- Returns:
194
- the value of the property.
195
- """
196
- return MetadataResourceTypes(self.get_metadata().resource_type)
197
-
198
- @property
199
- def stack_component_id(self) -> Optional[UUID]:
200
- """The `stack_component_id` property.
201
-
202
- Returns:
203
- the value of the property.
204
- """
205
- return self.get_metadata().stack_component_id
206
-
207
-
208
- # ------------------ Filter Model ------------------
209
-
210
-
211
- class RunMetadataFilter(WorkspaceScopedFilter):
212
- """Model to enable advanced filtering of run metadata."""
213
-
214
- resource_id: Optional[Union[str, UUID]] = Field(
215
- default=None, union_mode="left_to_right"
216
- )
217
- resource_type: Optional[MetadataResourceTypes] = None
218
- stack_component_id: Optional[Union[str, UUID]] = Field(
219
- default=None, union_mode="left_to_right"
220
- )
221
- key: Optional[str] = None
222
- type: Optional[Union[str, MetadataTypeEnum]] = Field(
223
- default=None, union_mode="left_to_right"
224
- )
225
-
226
-
227
- # -------------------- Lazy Loader --------------------
228
-
229
-
230
- class LazyRunMetadataResponse(RunMetadataResponse):
231
- """Lazy run metadata response.
232
-
233
- Used if the run metadata is accessed from the model in
234
- a pipeline context available only during pipeline compilation.
235
- """
236
-
237
- id: Optional[UUID] = None # type: ignore[assignment]
238
- lazy_load_artifact_name: Optional[str] = None
239
- lazy_load_artifact_version: Optional[str] = None
240
- lazy_load_metadata_name: Optional[str] = None
241
- lazy_load_model_name: str
242
- lazy_load_model_version: Optional[str] = None
243
-
244
- def get_body(self) -> None: # type: ignore[override]
245
- """Protects from misuse of the lazy loader.
246
-
247
- Raises:
248
- RuntimeError: always
249
- """
250
- raise RuntimeError(
251
- "Cannot access run metadata body before pipeline runs."
252
- )
253
-
254
- def get_metadata(self) -> None: # type: ignore[override]
255
- """Protects from misuse of the lazy loader.
256
-
257
- Raises:
258
- RuntimeError: always
259
- """
260
- raise RuntimeError(
261
- "Cannot access run metadata metadata before pipeline runs."
262
- )
@@ -21,7 +21,8 @@ from pydantic import BaseModel, ConfigDict, Field
21
21
 
22
22
  from zenml.config.step_configurations import StepConfiguration, StepSpec
23
23
  from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
24
- from zenml.enums import ExecutionStatus
24
+ from zenml.enums import ExecutionStatus, StepRunInputArtifactType
25
+ from zenml.metadata.metadata_types import MetadataType
25
26
  from zenml.models.v2.base.scoped import (
26
27
  WorkspaceScopedFilter,
27
28
  WorkspaceScopedRequest,
@@ -30,19 +31,35 @@ from zenml.models.v2.base.scoped import (
30
31
  WorkspaceScopedResponseMetadata,
31
32
  WorkspaceScopedResponseResources,
32
33
  )
34
+ from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
33
35
  from zenml.models.v2.core.model_version import ModelVersionResponse
34
36
 
35
37
  if TYPE_CHECKING:
36
38
  from sqlalchemy.sql.elements import ColumnElement
37
39
 
38
- from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
39
40
  from zenml.models.v2.core.logs import (
40
41
  LogsRequest,
41
42
  LogsResponse,
42
43
  )
43
- from zenml.models.v2.core.run_metadata import (
44
- RunMetadataResponse,
45
- )
44
+
45
+
46
+ class StepRunInputResponse(ArtifactVersionResponse):
47
+ """Response model for step run inputs."""
48
+
49
+ input_type: StepRunInputArtifactType
50
+
51
+ def get_hydrated_version(self) -> "StepRunInputResponse":
52
+ """Get the hydrated version of this step run input.
53
+
54
+ Returns:
55
+ an instance of the same entity with the metadata field attached.
56
+ """
57
+ from zenml.client import Client
58
+
59
+ return StepRunInputResponse(
60
+ input_type=self.input_type,
61
+ **Client().zen_store.get_artifact_version(self.id).model_dump(),
62
+ )
46
63
 
47
64
 
48
65
  # ------------------ Request Model ------------------
@@ -97,11 +114,11 @@ class StepRunRequest(WorkspaceScopedRequest):
97
114
  )
98
115
  inputs: Dict[str, UUID] = Field(
99
116
  title="The IDs of the input artifact versions of the step run.",
100
- default={},
117
+ default_factory=dict,
101
118
  )
102
- outputs: Dict[str, UUID] = Field(
119
+ outputs: Dict[str, List[UUID]] = Field(
103
120
  title="The IDs of the output artifact versions of the step run.",
104
- default={},
121
+ default_factory=dict,
105
122
  )
106
123
  logs: Optional["LogsRequest"] = Field(
107
124
  title="Logs associated with this step run.",
@@ -129,10 +146,6 @@ class StepRunUpdate(BaseModel):
129
146
  title="The IDs of the output artifact versions of the step run.",
130
147
  default={},
131
148
  )
132
- saved_artifact_versions: Dict[str, UUID] = Field(
133
- title="The IDs of artifact versions that were saved by this step run.",
134
- default={},
135
- )
136
149
  loaded_artifact_versions: Dict[str, UUID] = Field(
137
150
  title="The IDs of artifact versions that were loaded by this step run.",
138
151
  default={},
@@ -166,13 +179,13 @@ class StepRunResponseBody(WorkspaceScopedResponseBody):
166
179
  title="The end time of the step run.",
167
180
  default=None,
168
181
  )
169
- inputs: Dict[str, "ArtifactVersionResponse"] = Field(
182
+ inputs: Dict[str, StepRunInputResponse] = Field(
170
183
  title="The input artifact versions of the step run.",
171
- default={},
184
+ default_factory=dict,
172
185
  )
173
- outputs: Dict[str, "ArtifactVersionResponse"] = Field(
186
+ outputs: Dict[str, List[ArtifactVersionResponse]] = Field(
174
187
  title="The output artifact versions of the step run.",
175
- default={},
188
+ default_factory=dict,
176
189
  )
177
190
  model_version_id: Optional[UUID] = Field(
178
191
  title="The ID of the model version that was "
@@ -230,7 +243,7 @@ class StepRunResponseMetadata(WorkspaceScopedResponseMetadata):
230
243
  title="The IDs of the parent steps of this step run.",
231
244
  default_factory=list,
232
245
  )
233
- run_metadata: Dict[str, "RunMetadataResponse"] = Field(
246
+ run_metadata: Dict[str, MetadataType] = Field(
234
247
  title="Metadata associated with this step run.",
235
248
  default={},
236
249
  )
@@ -274,7 +287,7 @@ class StepRunResponse(
274
287
 
275
288
  # Helper properties
276
289
  @property
277
- def input(self) -> "ArtifactVersionResponse":
290
+ def input(self) -> ArtifactVersionResponse:
278
291
  """Returns the input artifact that was used to run this step.
279
292
 
280
293
  Returns:
@@ -293,7 +306,7 @@ class StepRunResponse(
293
306
  return next(iter(self.inputs.values()))
294
307
 
295
308
  @property
296
- def output(self) -> "ArtifactVersionResponse":
309
+ def output(self) -> ArtifactVersionResponse:
297
310
  """Returns the output artifact that was written by this step.
298
311
 
299
312
  Returns:
@@ -304,12 +317,15 @@ class StepRunResponse(
304
317
  """
305
318
  if not self.outputs:
306
319
  raise ValueError(f"Step {self.name} has no outputs.")
307
- if len(self.outputs) > 1:
320
+ if len(self.outputs) > 1 or (
321
+ len(self.outputs) == 1
322
+ and len(next(iter(self.outputs.values()))) > 1
323
+ ):
308
324
  raise ValueError(
309
325
  f"Step {self.name} has multiple outputs, so `Step.output` is "
310
326
  "ambiguous. Please use `Step.outputs` instead."
311
327
  )
312
- return next(iter(self.outputs.values()))
328
+ return next(iter(self.outputs.values()))[0]
313
329
 
314
330
  # Body and metadata properties
315
331
  @property
@@ -322,7 +338,7 @@ class StepRunResponse(
322
338
  return self.get_body().status
323
339
 
324
340
  @property
325
- def inputs(self) -> Dict[str, "ArtifactVersionResponse"]:
341
+ def inputs(self) -> Dict[str, StepRunInputResponse]:
326
342
  """The `inputs` property.
327
343
 
328
344
  Returns:
@@ -331,7 +347,7 @@ class StepRunResponse(
331
347
  return self.get_body().inputs
332
348
 
333
349
  @property
334
- def outputs(self) -> Dict[str, "ArtifactVersionResponse"]:
350
+ def outputs(self) -> Dict[str, List[ArtifactVersionResponse]]:
335
351
  """The `outputs` property.
336
352
 
337
353
  Returns:
@@ -466,7 +482,7 @@ class StepRunResponse(
466
482
  return self.get_metadata().parent_step_ids
467
483
 
468
484
  @property
469
- def run_metadata(self) -> Dict[str, "RunMetadataResponse"]:
485
+ def run_metadata(self) -> Dict[str, MetadataType]:
470
486
  """The `run_metadata` property.
471
487
 
472
488
  Returns:
@@ -493,6 +509,7 @@ class StepRunFilter(WorkspaceScopedFilter):
493
509
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
494
510
  *WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
495
511
  "model",
512
+ "run_metadata",
496
513
  ]
497
514
 
498
515
  name: Optional[str] = Field(
@@ -555,6 +572,10 @@ class StepRunFilter(WorkspaceScopedFilter):
555
572
  default=None,
556
573
  description="Name/ID of the model associated with the step run.",
557
574
  )
575
+ run_metadata: Optional[Dict[str, str]] = Field(
576
+ default=None,
577
+ description="The run_metadata to filter the step runs by.",
578
+ )
558
579
 
559
580
  model_config = ConfigDict(protected_namespaces=())
560
581
 
@@ -573,6 +594,7 @@ class StepRunFilter(WorkspaceScopedFilter):
573
594
  from zenml.zen_stores.schemas import (
574
595
  ModelSchema,
575
596
  ModelVersionSchema,
597
+ RunMetadataSchema,
576
598
  StepRunSchema,
577
599
  )
578
600
 
@@ -585,5 +607,21 @@ class StepRunFilter(WorkspaceScopedFilter):
585
607
  ),
586
608
  )
587
609
  custom_filters.append(model_filter)
610
+ if self.run_metadata is not None:
611
+ from zenml.enums import MetadataResourceTypes
612
+
613
+ for key, value in self.run_metadata.items():
614
+ additional_filter = and_(
615
+ RunMetadataSchema.resource_id == StepRunSchema.id,
616
+ RunMetadataSchema.resource_type
617
+ == MetadataResourceTypes.STEP_RUN,
618
+ RunMetadataSchema.key == key,
619
+ self.generate_custom_query_conditions_for_column(
620
+ value=value,
621
+ table=RunMetadataSchema,
622
+ column="value",
623
+ ),
624
+ )
625
+ custom_filters.append(additional_filter)
588
626
 
589
627
  return custom_filters
@@ -15,6 +15,7 @@
15
15
 
16
16
  from abc import ABC, abstractmethod
17
17
  from typing import TYPE_CHECKING, Any, Dict, Iterator, Optional, Type, cast
18
+ from uuid import UUID
18
19
 
19
20
  from pydantic import model_validator
20
21
 
@@ -186,7 +187,17 @@ class BaseOrchestrator(StackComponent, ABC):
186
187
  """
187
188
  self._prepare_run(deployment=deployment)
188
189
 
189
- environment = get_config_environment_vars(deployment=deployment)
190
+ pipeline_run_id: Optional[UUID] = None
191
+ schedule_id: Optional[UUID] = None
192
+ if deployment.schedule:
193
+ schedule_id = deployment.schedule.id
194
+ if placeholder_run:
195
+ pipeline_run_id = placeholder_run.id
196
+
197
+ environment = get_config_environment_vars(
198
+ schedule_id=schedule_id,
199
+ pipeline_run_id=pipeline_run_id,
200
+ )
190
201
 
191
202
  prevent_client_side_caching = handle_bool_env_var(
192
203
  ENV_ZENML_PREVENT_CLIENT_SIDE_CACHING, default=False