zenml-nightly 0.75.0.dev20250318__py3-none-any.whl → 0.80.0.dev20250321__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 (254) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +3 -1
  3. zenml/artifacts/artifact_config.py +2 -2
  4. zenml/artifacts/utils.py +4 -8
  5. zenml/cli/__init__.py +6 -6
  6. zenml/cli/base.py +2 -2
  7. zenml/cli/login.py +2 -2
  8. zenml/cli/server.py +6 -4
  9. zenml/cli/utils.py +3 -3
  10. zenml/client.py +9 -9
  11. zenml/config/compiler.py +1 -1
  12. zenml/config/server_config.py +1 -1
  13. zenml/constants.py +2 -1
  14. zenml/enums.py +12 -0
  15. zenml/integrations/airflow/__init__.py +0 -2
  16. zenml/integrations/argilla/__init__.py +0 -1
  17. zenml/integrations/aws/__init__.py +0 -3
  18. zenml/integrations/azure/__init__.py +0 -2
  19. zenml/integrations/azure/service_connectors/azure_service_connector.py +1 -1
  20. zenml/integrations/bentoml/__init__.py +0 -2
  21. zenml/integrations/bentoml/services/bentoml_container_deployment.py +2 -2
  22. zenml/integrations/bentoml/services/bentoml_local_deployment.py +1 -1
  23. zenml/integrations/bentoml/steps/bentoml_deployer.py +1 -1
  24. zenml/integrations/bitbucket/__init__.py +0 -2
  25. zenml/integrations/comet/__init__.py +0 -2
  26. zenml/integrations/databricks/__init__.py +0 -2
  27. zenml/integrations/databricks/services/databricks_deployment.py +3 -1
  28. zenml/integrations/deepchecks/__init__.py +0 -2
  29. zenml/integrations/discord/__init__.py +0 -2
  30. zenml/integrations/evidently/__init__.py +0 -2
  31. zenml/integrations/facets/__init__.py +0 -2
  32. zenml/integrations/feast/__init__.py +0 -2
  33. zenml/integrations/gcp/__init__.py +0 -3
  34. zenml/integrations/github/__init__.py +0 -2
  35. zenml/integrations/github/code_repositories/github_code_repository.py +7 -2
  36. zenml/integrations/gitlab/__init__.py +0 -1
  37. zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +5 -2
  38. zenml/integrations/great_expectations/__init__.py +0 -3
  39. zenml/integrations/huggingface/__init__.py +0 -1
  40. zenml/integrations/huggingface/services/huggingface_deployment.py +3 -1
  41. zenml/integrations/hyperai/__init__.py +0 -2
  42. zenml/integrations/kaniko/__init__.py +0 -2
  43. zenml/integrations/kubeflow/__init__.py +0 -1
  44. zenml/integrations/kubernetes/__init__.py +0 -2
  45. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +4 -0
  46. zenml/integrations/kubernetes/orchestrators/kube_utils.py +89 -1
  47. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +82 -48
  48. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +44 -10
  49. zenml/integrations/kubernetes/orchestrators/manifest_utils.py +33 -1
  50. zenml/integrations/label_studio/__init__.py +0 -2
  51. zenml/integrations/langchain/__init__.py +0 -2
  52. zenml/integrations/lightgbm/__init__.py +0 -1
  53. zenml/integrations/lightning/__init__.py +0 -2
  54. zenml/integrations/mlflow/__init__.py +1 -3
  55. zenml/integrations/mlflow/services/mlflow_deployment.py +1 -1
  56. zenml/integrations/modal/__init__.py +0 -1
  57. zenml/integrations/neptune/__init__.py +0 -2
  58. zenml/integrations/neural_prophet/__init__.py +0 -2
  59. zenml/integrations/numpy/__init__.py +0 -2
  60. zenml/integrations/openai/__init__.py +0 -1
  61. zenml/integrations/pandas/__init__.py +0 -2
  62. zenml/integrations/pigeon/__init__.py +0 -1
  63. zenml/integrations/pillow/__init__.py +0 -3
  64. zenml/integrations/polars/__init__.py +0 -2
  65. zenml/integrations/prodigy/__init__.py +0 -1
  66. zenml/integrations/pycaret/__init__.py +0 -2
  67. zenml/integrations/pytorch/__init__.py +0 -1
  68. zenml/integrations/pytorch_lightning/__init__.py +0 -2
  69. zenml/integrations/s3/__init__.py +0 -2
  70. zenml/integrations/scipy/__init__.py +0 -2
  71. zenml/integrations/seldon/__init__.py +0 -2
  72. zenml/integrations/seldon/services/seldon_deployment.py +3 -2
  73. zenml/integrations/sklearn/__init__.py +1 -1
  74. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +43 -18
  75. zenml/integrations/skypilot_aws/__init__.py +1 -3
  76. zenml/integrations/skypilot_azure/__init__.py +1 -2
  77. zenml/integrations/skypilot_gcp/__init__.py +1 -3
  78. zenml/integrations/skypilot_kubernetes/__init__.py +1 -3
  79. zenml/integrations/skypilot_lambda/__init__.py +1 -3
  80. zenml/integrations/slack/__init__.py +0 -1
  81. zenml/integrations/spark/__init__.py +0 -1
  82. zenml/integrations/tekton/__init__.py +0 -1
  83. zenml/integrations/tensorboard/__init__.py +0 -2
  84. zenml/integrations/tensorboard/services/tensorboard_service.py +1 -1
  85. zenml/integrations/tensorflow/__init__.py +0 -2
  86. zenml/integrations/vllm/__init__.py +0 -1
  87. zenml/integrations/vllm/services/vllm_deployment.py +1 -1
  88. zenml/integrations/wandb/__init__.py +0 -1
  89. zenml/integrations/whylogs/__init__.py +0 -1
  90. zenml/integrations/xgboost/__init__.py +0 -2
  91. zenml/login/credentials.py +1 -1
  92. zenml/materializers/__init__.py +1 -0
  93. zenml/model_deployers/base_model_deployer.py +1 -1
  94. zenml/models/__init__.py +4 -0
  95. zenml/models/v2/base/filter.py +162 -54
  96. zenml/models/v2/base/scoped.py +132 -0
  97. zenml/models/v2/core/artifact_version.py +12 -33
  98. zenml/models/v2/core/model_version.py +12 -50
  99. zenml/models/v2/core/pipeline_run.py +12 -32
  100. zenml/models/v2/core/service.py +2 -2
  101. zenml/models/v2/core/step_run.py +15 -32
  102. zenml/{services/service_type.py → models/v2/misc/service.py} +1 -1
  103. zenml/orchestrators/step_run_utils.py +1 -1
  104. zenml/orchestrators/utils.py +1 -1
  105. zenml/services/__init__.py +3 -5
  106. zenml/services/container/container_service.py +2 -1
  107. zenml/services/local/local_service.py +2 -1
  108. zenml/services/service.py +3 -2
  109. zenml/services/service_endpoint.py +2 -1
  110. zenml/services/service_monitor.py +1 -1
  111. zenml/services/service_status.py +1 -12
  112. zenml/steps/entrypoint_function_utils.py +1 -1
  113. zenml/utils/dashboard_utils.py +73 -8
  114. zenml/utils/server_utils.py +52 -0
  115. zenml/zen_server/dashboard/assets/{404-BbAvjc7Z.js → 404-2I8egBQu.js} +1 -1
  116. zenml/zen_server/dashboard/assets/@reactflow-BHoFKFSZ.js +17 -0
  117. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-XL2NfFgP.js → AlertDialogDropdownItem-D7KZcPFw.js} +1 -1
  118. zenml/zen_server/dashboard/assets/CodeSnippet-DUkCnBpQ.js +9 -0
  119. zenml/zen_server/dashboard/assets/{CollapsibleCard-Djtd_ocf.js → CollapsibleCard-B5-5Plnd.js} +1 -1
  120. zenml/zen_server/dashboard/assets/{Commands-V-hH_IKQ.js → Commands-CbOMmarC.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{ComponentBadge-CVN2FsiW.js → ComponentBadge-FrujKBC6.js} +1 -1
  122. zenml/zen_server/dashboard/assets/ComponentIcon-Dx5fBrDX.js +1 -0
  123. zenml/zen_server/dashboard/assets/{CsvVizualization-CWaQcWIN.js → CsvVizualization-B8E3p9we.js} +1 -1
  124. zenml/zen_server/dashboard/assets/{DeleteAlertDialog-CTLRrcFM.js → DeleteAlertDialog-BgTZbbAt.js} +1 -1
  125. zenml/zen_server/dashboard/assets/{DialogItem-ST291Hsl.js → DialogItem-CNWLiJcc.js} +1 -1
  126. zenml/zen_server/dashboard/assets/{Error-CIBjAdSc.js → Error-BkUP4Luv.js} +1 -1
  127. zenml/zen_server/dashboard/assets/ExecutionStatus-CD8Vj7sp.js +1 -0
  128. zenml/zen_server/dashboard/assets/{Helpbox-cwQNH06F.js → Helpbox-DIx6mDOH.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{Infobox-DYKoAVhW.js → Infobox-BHEdNmME.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{InlineAvatar-Bk4QLPTU.js → InlineAvatar-Bin9UPKJ.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{NestedCollapsible-CE4OF670.js → NestedCollapsible-Da-k0Mff.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{Partials-cL1-u_sT.js → Partials-TNaYjHsV.js} +1 -1
  133. zenml/zen_server/dashboard/assets/ProBadge-BfPp-B97.js +1 -0
  134. zenml/zen_server/dashboard/assets/{ProCta-DtUutIul.js → ProCta-7_FtpX3I.js} +1 -1
  135. zenml/zen_server/dashboard/assets/ProviderIcon-CxeziA5a.js +1 -0
  136. zenml/zen_server/dashboard/assets/{ProviderRadio-C4bltH6-.js → ProviderRadio-DPmZHff_.js} +1 -1
  137. zenml/zen_server/dashboard/assets/RunSelector-BVKB4Z8F.js +1 -0
  138. zenml/zen_server/dashboard/assets/{RunsBody-D2VoO-cR.js → RunsBody-Cj4sIqQB.js} +1 -1
  139. zenml/zen_server/dashboard/assets/{SearchField-DfNxVtjV.js → SearchField-DjAOZic5.js} +1 -1
  140. zenml/zen_server/dashboard/assets/SecretTooltip-mMAAP4dM.js +1 -0
  141. zenml/zen_server/dashboard/assets/{SetPassword-CWl2mwz8.js → SetPassword-B0o5kSJU.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{StackList-C8KNd00o.js → StackList-5UB8LoEq.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{Tabs-BEWDPvPV.js → Tabs-AuhCyzle.js} +1 -1
  144. zenml/zen_server/dashboard/assets/Tick-CHW0jc8Y.js +1 -0
  145. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-DCuCj7NK.js → UpdatePasswordSchemas-Bauivjf-.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{UsageReason-CwUrEwEz.js → UsageReason-Dr5ca5M4.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{Wizard-CynnoHg4.js → Wizard-XEp9rGmf.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{WizardFooter-B2bYs89C.js → WizardFooter-BtL1Gi1k.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-B509kMlL.js → all-pipeline-runs-query-COvsm3bC.js} +1 -1
  150. zenml/zen_server/dashboard/assets/configuration-form-BJUCr0wl.js +1 -0
  151. zenml/zen_server/dashboard/assets/{create-stack-BjWXz5nx.js → create-stack-B2c98UlP.js} +1 -1
  152. zenml/zen_server/dashboard/assets/{delete-run-CzPWbsBy.js → delete-run-Do3XyF4W.js} +1 -1
  153. zenml/zen_server/dashboard/assets/flavor-select-D8CranSY.js +1 -0
  154. zenml/zen_server/dashboard/assets/{form-schemas-B6u3P_a4.js → form-schemas-Bm-dTV3L.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{index-BCKg1Y5r.css → index-6mLFgFwe.css} +1 -1
  156. zenml/zen_server/dashboard/assets/{index-Bjeu4_0O.js → index-CzhJC6pc.js} +1 -1
  157. zenml/zen_server/dashboard/assets/{index-CaRx22lH.js → index-D-n6tspq.js} +1 -1
  158. zenml/zen_server/dashboard/assets/{index-DWoLoYDY.js → index-DPjvk73v.js} +8 -8
  159. zenml/zen_server/dashboard/assets/{index-Dba8yULY.js → index-eIIP-0dQ.js} +1 -1
  160. zenml/zen_server/dashboard/assets/login-mutation-D6uiKsKk.js +1 -0
  161. zenml/zen_server/dashboard/assets/{not-found-DGQ8rm7B.js → not-found-DFrksY0r.js} +1 -1
  162. zenml/zen_server/dashboard/assets/page-B-uHUFcm.js +1 -0
  163. zenml/zen_server/dashboard/assets/page-B0Llmzo_.js +1 -0
  164. zenml/zen_server/dashboard/assets/page-B150LbzG.js +1 -0
  165. zenml/zen_server/dashboard/assets/{page-CfeQbejg.js → page-B1Un9vAU.js} +1 -1
  166. zenml/zen_server/dashboard/assets/{page-CxrLV30P.js → page-B80TE04v.js} +1 -1
  167. zenml/zen_server/dashboard/assets/page-BIseZTJt.js +2 -0
  168. zenml/zen_server/dashboard/assets/{page-C5xq6rqE.js → page-BJ15SGwt.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{page-B6msmF1h.js → page-BJrZsPSh.js} +1 -1
  170. zenml/zen_server/dashboard/assets/page-BMZaECzB.js +1 -0
  171. zenml/zen_server/dashboard/assets/{page-D1upvSPi.js → page-BTvnIFGR.js} +1 -1
  172. zenml/zen_server/dashboard/assets/{page-DLw1Apss.js → page-BXh1mF-D.js} +1 -1
  173. zenml/zen_server/dashboard/assets/page-BZUxCBoD.js +1 -0
  174. zenml/zen_server/dashboard/assets/page-BeFiRx31.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-C89bN6VV.js → page-BnUwQBeg.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{page-k-UXKVnV.js → page-BqQ6y8Hb.js} +1 -1
  177. zenml/zen_server/dashboard/assets/page-BwAFqFCf.js +1 -0
  178. zenml/zen_server/dashboard/assets/page-BzlVs5tC.js +1 -0
  179. zenml/zen_server/dashboard/assets/{page-C3BbJ-5n.js → page-C11vPVkH.js} +1 -1
  180. zenml/zen_server/dashboard/assets/{page-AnG2ilmi.js → page-CAKBSE9f.js} +1 -1
  181. zenml/zen_server/dashboard/assets/page-CPe9nQSo.js +1 -0
  182. zenml/zen_server/dashboard/assets/page-D0Zt2-7X.js +1 -0
  183. zenml/zen_server/dashboard/assets/page-D2F0Rvak.js +1 -0
  184. zenml/zen_server/dashboard/assets/{page-2EzZ5aWS.js → page-D5GZlpKq.js} +1 -1
  185. zenml/zen_server/dashboard/assets/{page-CxoG4zme.js → page-DBNBYSwq.js} +1 -1
  186. zenml/zen_server/dashboard/assets/page-DDvwWgKP.js +6 -0
  187. zenml/zen_server/dashboard/assets/page-DF9q7ySu.js +1 -0
  188. zenml/zen_server/dashboard/assets/page-DOzFoJuo.js +1 -0
  189. zenml/zen_server/dashboard/assets/page-DaHH2ZEF.js +1 -0
  190. zenml/zen_server/dashboard/assets/{page-B9ELcPAy.js → page-Dd-0y3SU.js} +1 -1
  191. zenml/zen_server/dashboard/assets/{page-Dy6HYsJr.js → page-DhNnHHmX.js} +1 -1
  192. zenml/zen_server/dashboard/assets/{page-CZ_3LB0U.js → page-DkJfgcDi.js} +1 -1
  193. zenml/zen_server/dashboard/assets/page-EhqRFAZc.js +1 -0
  194. zenml/zen_server/dashboard/assets/{page-nHAZvd76.js → page-NIWnUdVg.js} +1 -1
  195. zenml/zen_server/dashboard/assets/{page-DazwBcbq.js → page-kYlFrH53.js} +1 -1
  196. zenml/zen_server/dashboard/assets/page-ygCPGHAV.js +1 -0
  197. zenml/zen_server/dashboard/assets/{persist-BglceT_t.js → persist-C5RlwSq6.js} +1 -1
  198. zenml/zen_server/dashboard/assets/{persist-CMkLV2Cs.js → persist-DHGuHP2H.js} +1 -1
  199. zenml/zen_server/dashboard/assets/{service-DNKY_ZYd.js → service-Do7yitqe.js} +1 -1
  200. zenml/zen_server/dashboard/assets/{sharedSchema-BOmQa793.js → sharedSchema-i_9Y4WcA.js} +1 -1
  201. zenml/zen_server/dashboard/assets/stack-detail-query-omCumL7U.js +1 -0
  202. zenml/zen_server/dashboard/assets/update-server-settings-mutation-B4eE33z-.js +1 -0
  203. zenml/zen_server/dashboard/index.html +4 -4
  204. zenml/zen_server/deploy/daemon/daemon_zen_server.py +1 -1
  205. zenml/zen_server/deploy/deployment.py +1 -2
  206. zenml/zen_server/deploy/docker/docker_zen_server.py +1 -1
  207. zenml/zen_server/rbac/endpoint_utils.py +1 -2
  208. zenml/zen_server/routers/projects_endpoints.py +14 -3
  209. zenml/zen_server/utils.py +2 -86
  210. zenml/zen_stores/migrations/versions/0.80.0_release.py +23 -0
  211. zenml/zen_stores/schemas/artifact_visualization_schemas.py +1 -1
  212. zenml/zen_stores/schemas/model_schemas.py +1 -1
  213. zenml/zen_stores/schemas/service_schemas.py +1 -1
  214. zenml/zen_stores/schemas/step_run_schemas.py +1 -1
  215. zenml/zen_stores/schemas/trigger_schemas.py +1 -1
  216. zenml/zen_stores/sql_zen_store.py +5 -0
  217. {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/METADATA +2 -2
  218. {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/RECORD +221 -220
  219. zenml/zen_server/dashboard/assets/@reactflow-DMaYqp8l.js +0 -17
  220. zenml/zen_server/dashboard/assets/CodeSnippet-D8ptwPjg.js +0 -9
  221. zenml/zen_server/dashboard/assets/ComponentIcon-gpMJ2Y2e.js +0 -1
  222. zenml/zen_server/dashboard/assets/ExecutionStatus-DHiK3Am-.js +0 -1
  223. zenml/zen_server/dashboard/assets/ProBadge-ypma7R8i.js +0 -1
  224. zenml/zen_server/dashboard/assets/ProviderIcon-DKN3Gdcg.js +0 -1
  225. zenml/zen_server/dashboard/assets/RunSelector-CYmRHGdm.js +0 -1
  226. zenml/zen_server/dashboard/assets/SecretTooltip-CHPWF0bu.js +0 -1
  227. zenml/zen_server/dashboard/assets/Tick-DgU4udUn.js +0 -1
  228. zenml/zen_server/dashboard/assets/configuration-form-BEwWCxqY.js +0 -1
  229. zenml/zen_server/dashboard/assets/flavor-select-C1pyy8gq.js +0 -1
  230. zenml/zen_server/dashboard/assets/login-mutation-7WFxPe10.js +0 -1
  231. zenml/zen_server/dashboard/assets/page-BKN4SYXY.js +0 -1
  232. zenml/zen_server/dashboard/assets/page-BNrOW_3T.js +0 -2
  233. zenml/zen_server/dashboard/assets/page-BX6ZrAVH.js +0 -1
  234. zenml/zen_server/dashboard/assets/page-BnOdORy3.js +0 -1
  235. zenml/zen_server/dashboard/assets/page-BtkfcEI7.js +0 -1
  236. zenml/zen_server/dashboard/assets/page-Bz_grLBY.js +0 -1
  237. zenml/zen_server/dashboard/assets/page-CCEwuGU4.js +0 -1
  238. zenml/zen_server/dashboard/assets/page-COAGXWJu.js +0 -1
  239. zenml/zen_server/dashboard/assets/page-CaibMa0l.js +0 -1
  240. zenml/zen_server/dashboard/assets/page-CskoTYOC.js +0 -1
  241. zenml/zen_server/dashboard/assets/page-Cyoe7AtN.js +0 -1
  242. zenml/zen_server/dashboard/assets/page-D03wm5f1.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-D8UimvyP.js +0 -1
  244. zenml/zen_server/dashboard/assets/page-DEnmFyzi.js +0 -1
  245. zenml/zen_server/dashboard/assets/page-TiOZeeo0.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-cveasWUr.js +0 -6
  247. zenml/zen_server/dashboard/assets/page-iTvxfhgZ.js +0 -1
  248. zenml/zen_server/dashboard/assets/page-niRD8Hqz.js +0 -1
  249. zenml/zen_server/dashboard/assets/stack-detail-query-CI_YMUx6.js +0 -1
  250. zenml/zen_server/dashboard/assets/transform-DKsRLKTv.js +0 -1
  251. zenml/zen_server/dashboard/assets/update-server-settings-mutation-CNYCc-FU.js +0 -1
  252. {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/LICENSE +0 -0
  253. {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/WHEEL +0 -0
  254. {zenml_nightly-0.75.0.dev20250318.dist-info → zenml_nightly-0.80.0.dev20250321.dist-info}/entry_points.txt +0 -0
@@ -426,6 +426,10 @@ class TaggableFilter(BaseFilter):
426
426
  *BaseFilter.CUSTOM_SORTING_OPTIONS,
427
427
  "tags",
428
428
  ]
429
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
430
+ *BaseFilter.API_MULTI_INPUT_PARAMS,
431
+ "tags",
432
+ ]
429
433
 
430
434
  @model_validator(mode="after")
431
435
  def add_tag_to_tags(self) -> "TaggableFilter":
@@ -583,3 +587,131 @@ class TaggableFilter(BaseFilter):
583
587
  return query
584
588
 
585
589
  return super().apply_sorting(query=query, table=table)
590
+
591
+
592
+ class RunMetadataFilterMixin(BaseFilter):
593
+ """Model to enable filtering and sorting by run metadata."""
594
+
595
+ run_metadata: Optional[List[str]] = Field(
596
+ default=None,
597
+ description="The run_metadata to filter the pipeline runs by.",
598
+ )
599
+ FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
600
+ *BaseFilter.FILTER_EXCLUDE_FIELDS,
601
+ "run_metadata",
602
+ ]
603
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
604
+ *BaseFilter.API_MULTI_INPUT_PARAMS,
605
+ "run_metadata",
606
+ ]
607
+
608
+ @model_validator(mode="after")
609
+ def validate_run_metadata_format(self) -> "RunMetadataFilterMixin":
610
+ """Validates that run_metadata entries are in the correct format.
611
+
612
+ Each run_metadata entry must be in one of the following formats:
613
+ 1. "key:value" - Direct equality comparison (key equals value)
614
+ 2. "key:filterop:value" - Where filterop is one of the GenericFilterOps:
615
+ - equals: Exact match
616
+ - notequals: Not equal to
617
+ - contains: String contains value
618
+ - startswith: String starts with value
619
+ - endswith: String ends with value
620
+ - oneof: Value is one of the specified options
621
+ - gte: Greater than or equal to
622
+ - gt: Greater than
623
+ - lte: Less than or equal to
624
+ - lt: Less than
625
+ - in: Value is in a list
626
+
627
+ Examples:
628
+ - "status:completed" - Find entries where status equals "completed"
629
+ - "name:contains:test" - Find entries where name contains "test"
630
+ - "duration:gt:10" - Find entries where duration is greater than 10
631
+
632
+ Returns:
633
+ self
634
+
635
+ Raises:
636
+ ValueError: If any entry in run_metadata does not contain a colon.
637
+ """
638
+ if self.run_metadata:
639
+ for entry in self.run_metadata:
640
+ if ":" not in entry:
641
+ raise ValueError(
642
+ f"Invalid run_metadata entry format: '{entry}'. "
643
+ "Entry must be in format 'key:value' for direct "
644
+ "equality comparison or 'key:filterop:value' where "
645
+ "filterop is one of: equals, notequals, "
646
+ f"contains, startswith, endswith, oneof, gte, gt, "
647
+ f"lte, lt, in."
648
+ )
649
+ return self
650
+
651
+ def get_custom_filters(
652
+ self, table: Type["AnySchema"]
653
+ ) -> List["ColumnElement[bool]"]:
654
+ """Get custom run metadata filters.
655
+
656
+ Args:
657
+ table: The query table.
658
+
659
+ Returns:
660
+ A list of custom filters.
661
+ """
662
+ custom_filters = super().get_custom_filters(table)
663
+
664
+ if self.run_metadata is not None:
665
+ from sqlmodel import exists, select
666
+
667
+ from zenml.enums import MetadataResourceTypes
668
+ from zenml.zen_stores.schemas import (
669
+ ArtifactVersionSchema,
670
+ ModelVersionSchema,
671
+ PipelineRunSchema,
672
+ RunMetadataResourceSchema,
673
+ RunMetadataSchema,
674
+ ScheduleSchema,
675
+ StepRunSchema,
676
+ )
677
+
678
+ resource_type_mapping = {
679
+ ArtifactVersionSchema: MetadataResourceTypes.ARTIFACT_VERSION,
680
+ ModelVersionSchema: MetadataResourceTypes.MODEL_VERSION,
681
+ PipelineRunSchema: MetadataResourceTypes.PIPELINE_RUN,
682
+ StepRunSchema: MetadataResourceTypes.STEP_RUN,
683
+ ScheduleSchema: MetadataResourceTypes.SCHEDULE,
684
+ }
685
+
686
+ # Create an EXISTS subquery for each run_metadata filter
687
+ for entry in self.run_metadata:
688
+ # Split at the first colon to get the key
689
+ key, value = entry.split(":", 1)
690
+
691
+ # Create an exists subquery
692
+ exists_subquery = exists(
693
+ select(RunMetadataResourceSchema.id)
694
+ .join(
695
+ RunMetadataSchema,
696
+ RunMetadataSchema.id # type: ignore[arg-type]
697
+ == RunMetadataResourceSchema.run_metadata_id,
698
+ )
699
+ .where(
700
+ RunMetadataResourceSchema.resource_id == table.id,
701
+ RunMetadataResourceSchema.resource_type
702
+ == resource_type_mapping[table].value,
703
+ self.generate_custom_query_conditions_for_column(
704
+ value=key,
705
+ table=RunMetadataSchema,
706
+ column="key",
707
+ ),
708
+ self.generate_custom_query_conditions_for_column(
709
+ value=value,
710
+ table=RunMetadataSchema,
711
+ column="value",
712
+ ),
713
+ )
714
+ )
715
+ custom_filters.append(exists_subquery)
716
+
717
+ return custom_filters
@@ -47,6 +47,7 @@ from zenml.models.v2.base.scoped import (
47
47
  ProjectScopedResponseBody,
48
48
  ProjectScopedResponseMetadata,
49
49
  ProjectScopedResponseResources,
50
+ RunMetadataFilterMixin,
50
51
  TaggableFilter,
51
52
  )
52
53
  from zenml.models.v2.core.artifact import ArtifactResponse
@@ -470,12 +471,15 @@ class ArtifactVersionResponse(
470
471
  # ------------------ Filter Model ------------------
471
472
 
472
473
 
473
- class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
474
+ class ArtifactVersionFilter(
475
+ ProjectScopedFilter, TaggableFilter, RunMetadataFilterMixin
476
+ ):
474
477
  """Model to enable advanced filtering of artifact versions."""
475
478
 
476
479
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
477
480
  *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
478
481
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
482
+ *RunMetadataFilterMixin.FILTER_EXCLUDE_FIELDS,
479
483
  "artifact_id",
480
484
  "artifact",
481
485
  "only_unused",
@@ -483,17 +487,23 @@ class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
483
487
  "model",
484
488
  "pipeline_run",
485
489
  "model_version_id",
486
- "run_metadata",
487
490
  ]
488
491
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
489
492
  *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
490
493
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
494
+ *RunMetadataFilterMixin.CUSTOM_SORTING_OPTIONS,
491
495
  ]
492
496
  CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
493
497
  *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
494
498
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
499
+ *RunMetadataFilterMixin.CLI_EXCLUDE_FIELDS,
495
500
  "artifact_id",
496
501
  ]
502
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
503
+ *ProjectScopedFilter.API_MULTI_INPUT_PARAMS,
504
+ *TaggableFilter.API_MULTI_INPUT_PARAMS,
505
+ *RunMetadataFilterMixin.API_MULTI_INPUT_PARAMS,
506
+ ]
497
507
 
498
508
  artifact: Optional[Union[UUID, str]] = Field(
499
509
  default=None,
@@ -561,10 +571,6 @@ class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
561
571
  description="Name/ID of a pipeline run that is associated with this "
562
572
  "artifact version.",
563
573
  )
564
- run_metadata: Optional[Dict[str, Any]] = Field(
565
- default=None,
566
- description="The run_metadata to filter the artifact versions by.",
567
- )
568
574
 
569
575
  model_config = ConfigDict(protected_namespaces=())
570
576
 
@@ -590,8 +596,6 @@ class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
590
596
  ModelVersionArtifactSchema,
591
597
  ModelVersionSchema,
592
598
  PipelineRunSchema,
593
- RunMetadataResourceSchema,
594
- RunMetadataSchema,
595
599
  StepRunInputArtifactSchema,
596
600
  StepRunOutputArtifactSchema,
597
601
  StepRunSchema,
@@ -674,31 +678,6 @@ class ArtifactVersionFilter(ProjectScopedFilter, TaggableFilter):
674
678
  )
675
679
  custom_filters.append(pipeline_run_filter)
676
680
 
677
- if self.run_metadata is not None:
678
- from zenml.enums import MetadataResourceTypes
679
-
680
- for key, value in self.run_metadata.items():
681
- additional_filter = and_(
682
- RunMetadataResourceSchema.resource_id
683
- == ArtifactVersionSchema.id,
684
- RunMetadataResourceSchema.resource_type
685
- == MetadataResourceTypes.ARTIFACT_VERSION.value,
686
- RunMetadataResourceSchema.run_metadata_id
687
- == RunMetadataSchema.id,
688
- self.generate_custom_query_conditions_for_column(
689
- value=key,
690
- table=RunMetadataSchema,
691
- column="key",
692
- ),
693
- self.generate_custom_query_conditions_for_column(
694
- value=value,
695
- table=RunMetadataSchema,
696
- column="value",
697
- json_encode_value=True,
698
- ),
699
- )
700
- custom_filters.append(additional_filter)
701
-
702
681
  return custom_filters
703
682
 
704
683
  @model_validator(mode="after")
@@ -40,14 +40,13 @@ from zenml.models.v2.base.scoped import (
40
40
  ProjectScopedResponseBody,
41
41
  ProjectScopedResponseMetadata,
42
42
  ProjectScopedResponseResources,
43
+ RunMetadataFilterMixin,
43
44
  TaggableFilter,
44
45
  )
45
46
  from zenml.models.v2.core.service import ServiceResponse
46
47
  from zenml.models.v2.core.tag import TagResponse
47
48
 
48
49
  if TYPE_CHECKING:
49
- from sqlalchemy.sql.elements import ColumnElement
50
-
51
50
  from zenml.model.model import Model
52
51
  from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
53
52
  from zenml.models.v2.core.model import ModelResponse
@@ -566,24 +565,33 @@ class ModelVersionResponse(
566
565
  # ------------------ Filter Model ------------------
567
566
 
568
567
 
569
- class ModelVersionFilter(ProjectScopedFilter, TaggableFilter):
568
+ class ModelVersionFilter(
569
+ ProjectScopedFilter, TaggableFilter, RunMetadataFilterMixin
570
+ ):
570
571
  """Filter model for model versions."""
571
572
 
572
573
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
573
574
  *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
574
575
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
576
+ *RunMetadataFilterMixin.FILTER_EXCLUDE_FIELDS,
575
577
  "model",
576
- "run_metadata",
577
578
  ]
578
579
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
579
580
  *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
580
581
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
582
+ *RunMetadataFilterMixin.CUSTOM_SORTING_OPTIONS,
581
583
  ]
582
584
  CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
583
585
  *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
584
586
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
587
+ *RunMetadataFilterMixin.CLI_EXCLUDE_FIELDS,
585
588
  "model",
586
589
  ]
590
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
591
+ *ProjectScopedFilter.API_MULTI_INPUT_PARAMS,
592
+ *TaggableFilter.API_MULTI_INPUT_PARAMS,
593
+ *RunMetadataFilterMixin.API_MULTI_INPUT_PARAMS,
594
+ ]
587
595
 
588
596
  name: Optional[str] = Field(
589
597
  default=None,
@@ -598,10 +606,6 @@ class ModelVersionFilter(ProjectScopedFilter, TaggableFilter):
598
606
  default=None,
599
607
  union_mode="left_to_right",
600
608
  )
601
- run_metadata: Optional[Dict[str, str]] = Field(
602
- default=None,
603
- description="The run_metadata to filter the model versions by.",
604
- )
605
609
  model: Optional[Union[str, UUID]] = Field(
606
610
  default=None,
607
611
  description="The name or ID of the model which the search is scoped "
@@ -611,48 +615,6 @@ class ModelVersionFilter(ProjectScopedFilter, TaggableFilter):
611
615
  union_mode="left_to_right",
612
616
  )
613
617
 
614
- def get_custom_filters(
615
- self, table: Type["AnySchema"]
616
- ) -> List["ColumnElement[bool]"]:
617
- """Get custom filters.
618
-
619
- Args:
620
- table: The query table.
621
-
622
- Returns:
623
- A list of custom filters.
624
- """
625
- custom_filters = super().get_custom_filters(table)
626
-
627
- from sqlmodel import and_
628
-
629
- from zenml.zen_stores.schemas import (
630
- ModelVersionSchema,
631
- RunMetadataResourceSchema,
632
- RunMetadataSchema,
633
- )
634
-
635
- if self.run_metadata is not None:
636
- from zenml.enums import MetadataResourceTypes
637
-
638
- for key, value in self.run_metadata.items():
639
- additional_filter = and_(
640
- RunMetadataResourceSchema.resource_id
641
- == ModelVersionSchema.id,
642
- RunMetadataResourceSchema.resource_type
643
- == MetadataResourceTypes.MODEL_VERSION,
644
- RunMetadataResourceSchema.run_metadata_id
645
- == RunMetadataSchema.id,
646
- self.generate_custom_query_conditions_for_column(
647
- value=value,
648
- table=RunMetadataSchema,
649
- column="value",
650
- ),
651
- )
652
- custom_filters.append(additional_filter)
653
-
654
- return custom_filters
655
-
656
618
  def apply_filter(
657
619
  self,
658
620
  query: AnyQuery,
@@ -42,6 +42,7 @@ from zenml.models.v2.base.scoped import (
42
42
  ProjectScopedResponseBody,
43
43
  ProjectScopedResponseMetadata,
44
44
  ProjectScopedResponseResources,
45
+ RunMetadataFilterMixin,
45
46
  TaggableFilter,
46
47
  )
47
48
  from zenml.models.v2.core.model_version import ModelVersionResponse
@@ -582,12 +583,15 @@ class PipelineRunResponse(
582
583
  # ------------------ Filter Model ------------------
583
584
 
584
585
 
585
- class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
586
+ class PipelineRunFilter(
587
+ ProjectScopedFilter, TaggableFilter, RunMetadataFilterMixin
588
+ ):
586
589
  """Model to enable advanced filtering of all pipeline runs."""
587
590
 
588
591
  CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
589
592
  *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
590
593
  *TaggableFilter.CUSTOM_SORTING_OPTIONS,
594
+ *RunMetadataFilterMixin.CUSTOM_SORTING_OPTIONS,
591
595
  "tag",
592
596
  "stack",
593
597
  "pipeline",
@@ -597,6 +601,7 @@ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
597
601
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
598
602
  *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
599
603
  *TaggableFilter.FILTER_EXCLUDE_FIELDS,
604
+ *RunMetadataFilterMixin.FILTER_EXCLUDE_FIELDS,
600
605
  "unlisted",
601
606
  "code_repository_id",
602
607
  "build_id",
@@ -610,11 +615,16 @@ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
610
615
  "stack_component",
611
616
  "pipeline_name",
612
617
  "templatable",
613
- "run_metadata",
614
618
  ]
615
619
  CLI_EXCLUDE_FIELDS = [
616
620
  *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
617
621
  *TaggableFilter.CLI_EXCLUDE_FIELDS,
622
+ *RunMetadataFilterMixin.CLI_EXCLUDE_FIELDS,
623
+ ]
624
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
625
+ *ProjectScopedFilter.API_MULTI_INPUT_PARAMS,
626
+ *TaggableFilter.API_MULTI_INPUT_PARAMS,
627
+ *RunMetadataFilterMixin.API_MULTI_INPUT_PARAMS,
618
628
  ]
619
629
 
620
630
  name: Optional[str] = Field(
@@ -680,10 +690,6 @@ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
680
690
  union_mode="left_to_right",
681
691
  )
682
692
  unlisted: Optional[bool] = None
683
- run_metadata: Optional[Dict[str, Any]] = Field(
684
- default=None,
685
- description="The run_metadata to filter the pipeline runs by.",
686
- )
687
693
  # TODO: Remove once frontend is ready for it. This is replaced by the more
688
694
  # generic `pipeline` filter below.
689
695
  pipeline_name: Optional[str] = Field(
@@ -740,8 +746,6 @@ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
740
746
  PipelineDeploymentSchema,
741
747
  PipelineRunSchema,
742
748
  PipelineSchema,
743
- RunMetadataResourceSchema,
744
- RunMetadataSchema,
745
749
  ScheduleSchema,
746
750
  StackComponentSchema,
747
751
  StackCompositionSchema,
@@ -899,30 +903,6 @@ class PipelineRunFilter(ProjectScopedFilter, TaggableFilter):
899
903
  )
900
904
 
901
905
  custom_filters.append(templatable_filter)
902
- if self.run_metadata is not None:
903
- from zenml.enums import MetadataResourceTypes
904
-
905
- for key, value in self.run_metadata.items():
906
- additional_filter = and_(
907
- RunMetadataResourceSchema.resource_id
908
- == PipelineRunSchema.id,
909
- RunMetadataResourceSchema.resource_type
910
- == MetadataResourceTypes.PIPELINE_RUN.value,
911
- RunMetadataResourceSchema.run_metadata_id
912
- == RunMetadataSchema.id,
913
- self.generate_custom_query_conditions_for_column(
914
- value=key,
915
- table=RunMetadataSchema,
916
- column="key",
917
- ),
918
- self.generate_custom_query_conditions_for_column(
919
- value=value,
920
- table=RunMetadataSchema,
921
- column="value",
922
- json_encode_value=True,
923
- ),
924
- )
925
- custom_filters.append(additional_filter)
926
906
 
927
907
  return custom_filters
928
908
 
@@ -31,6 +31,7 @@ from pydantic import ConfigDict, Field
31
31
  from sqlalchemy.sql.elements import ColumnElement
32
32
 
33
33
  from zenml.constants import STR_FIELD_MAX_LENGTH
34
+ from zenml.enums import ServiceState
34
35
  from zenml.models.v2.base.base import BaseUpdate
35
36
  from zenml.models.v2.base.scoped import (
36
37
  ProjectScopedFilter,
@@ -40,8 +41,7 @@ from zenml.models.v2.base.scoped import (
40
41
  ProjectScopedResponseMetadata,
41
42
  ProjectScopedResponseResources,
42
43
  )
43
- from zenml.services.service_status import ServiceState
44
- from zenml.services.service_type import ServiceType
44
+ from zenml.models.v2.misc.service import ServiceType
45
45
 
46
46
  if TYPE_CHECKING:
47
47
  from zenml.models.v2.core.model_version import ModelVersionResponse
@@ -16,7 +16,6 @@
16
16
  from datetime import datetime
17
17
  from typing import (
18
18
  TYPE_CHECKING,
19
- Any,
20
19
  ClassVar,
21
20
  Dict,
22
21
  List,
@@ -41,6 +40,7 @@ from zenml.models.v2.base.scoped import (
41
40
  ProjectScopedResponseBody,
42
41
  ProjectScopedResponseMetadata,
43
42
  ProjectScopedResponseResources,
43
+ RunMetadataFilterMixin,
44
44
  )
45
45
  from zenml.models.v2.core.artifact_version import ArtifactVersionResponse
46
46
  from zenml.models.v2.core.model_version import ModelVersionResponse
@@ -504,13 +504,25 @@ class StepRunResponse(
504
504
  # ------------------ Filter Model ------------------
505
505
 
506
506
 
507
- class StepRunFilter(ProjectScopedFilter):
507
+ class StepRunFilter(ProjectScopedFilter, RunMetadataFilterMixin):
508
508
  """Model to enable advanced filtering of step runs."""
509
509
 
510
510
  FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
511
511
  *ProjectScopedFilter.FILTER_EXCLUDE_FIELDS,
512
+ *RunMetadataFilterMixin.FILTER_EXCLUDE_FIELDS,
512
513
  "model",
513
- "run_metadata",
514
+ ]
515
+ CLI_EXCLUDE_FIELDS: ClassVar[List[str]] = [
516
+ *ProjectScopedFilter.CLI_EXCLUDE_FIELDS,
517
+ *RunMetadataFilterMixin.CLI_EXCLUDE_FIELDS,
518
+ ]
519
+ CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
520
+ *ProjectScopedFilter.CUSTOM_SORTING_OPTIONS,
521
+ *RunMetadataFilterMixin.CUSTOM_SORTING_OPTIONS,
522
+ ]
523
+ API_MULTI_INPUT_PARAMS: ClassVar[List[str]] = [
524
+ *ProjectScopedFilter.API_MULTI_INPUT_PARAMS,
525
+ *RunMetadataFilterMixin.API_MULTI_INPUT_PARAMS,
514
526
  ]
515
527
 
516
528
  name: Optional[str] = Field(
@@ -563,10 +575,6 @@ class StepRunFilter(ProjectScopedFilter):
563
575
  default=None,
564
576
  description="Name/ID of the model associated with the step run.",
565
577
  )
566
- run_metadata: Optional[Dict[str, Any]] = Field(
567
- default=None,
568
- description="The run_metadata to filter the step runs by.",
569
- )
570
578
  model_config = ConfigDict(protected_namespaces=())
571
579
 
572
580
  def get_custom_filters(
@@ -587,8 +595,6 @@ class StepRunFilter(ProjectScopedFilter):
587
595
  from zenml.zen_stores.schemas import (
588
596
  ModelSchema,
589
597
  ModelVersionSchema,
590
- RunMetadataResourceSchema,
591
- RunMetadataSchema,
592
598
  StepRunSchema,
593
599
  )
594
600
 
@@ -601,28 +607,5 @@ class StepRunFilter(ProjectScopedFilter):
601
607
  ),
602
608
  )
603
609
  custom_filters.append(model_filter)
604
- if self.run_metadata is not None:
605
- from zenml.enums import MetadataResourceTypes
606
-
607
- for key, value in self.run_metadata.items():
608
- additional_filter = and_(
609
- RunMetadataResourceSchema.resource_id == StepRunSchema.id,
610
- RunMetadataResourceSchema.resource_type
611
- == MetadataResourceTypes.STEP_RUN.value,
612
- RunMetadataResourceSchema.run_metadata_id
613
- == RunMetadataSchema.id,
614
- self.generate_custom_query_conditions_for_column(
615
- value=key,
616
- table=RunMetadataSchema,
617
- column="key",
618
- ),
619
- self.generate_custom_query_conditions_for_column(
620
- value=value,
621
- table=RunMetadataSchema,
622
- column="value",
623
- json_encode_value=True,
624
- ),
625
- )
626
- custom_filters.append(additional_filter)
627
610
 
628
611
  return custom_filters
@@ -11,7 +11,7 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
- """Implementation of a ZenML ServiceType class."""
14
+ """Misc models for services."""
15
15
 
16
16
  from pydantic import BaseModel, ConfigDict
17
17
 
@@ -352,7 +352,7 @@ def log_model_version_dashboard_url(
352
352
  """
353
353
  from zenml.utils.dashboard_utils import get_model_version_url
354
354
 
355
- if model_version_url := get_model_version_url(model_version.id):
355
+ if model_version_url := get_model_version_url(model_version):
356
356
  logger.info(
357
357
  "Dashboard URL for Model Version `%s (%s)`:\n%s",
358
358
  model_version.model.name,
@@ -184,7 +184,7 @@ def get_config_environment_vars(
184
184
  "service account API key to authenticate to the ZenML "
185
185
  "server instead of your regular user account. For more "
186
186
  "information, see "
187
- "https://docs.zenml.io/how-to/connecting-to-zenml/connect-with-a-service-account"
187
+ "https://docs.zenml.io/how-to/manage-zenml-server/connecting-to-zenml/connect-with-a-service-account"
188
188
  )
189
189
 
190
190
  # The schedule, pipeline run or step run credentials are scoped to
@@ -51,19 +51,17 @@ from zenml.services.service_monitor import (
51
51
  TCPEndpointHealthMonitor,
52
52
  TCPEndpointHealthMonitorConfig,
53
53
  )
54
- from zenml.services.service_status import ServiceState, ServiceStatus
55
- from zenml.services.service_type import ServiceType
56
-
54
+ from zenml.services.service_status import ServiceStatus
55
+ from zenml.enums import ServiceState
56
+ from zenml.models.v2.misc.service import ServiceType
57
57
 
58
58
  __all__ = [
59
- "ServiceState",
60
59
  "ServiceConfig",
61
60
  "ServiceStatus",
62
61
  "ServiceEndpointProtocol",
63
62
  "ServiceEndpointConfig",
64
63
  "ServiceEndpointStatus",
65
64
  "BaseServiceEndpoint",
66
- "ServiceType",
67
65
  "BaseService",
68
66
  "ServiceEndpointHealthMonitorConfig",
69
67
  "BaseServiceEndpointHealthMonitor",
@@ -27,12 +27,13 @@ from docker.models.containers import Container
27
27
  from pydantic import Field
28
28
 
29
29
  from zenml.constants import ENV_ZENML_CONFIG_PATH
30
+ from zenml.enums import ServiceState
30
31
  from zenml.logger import get_logger
31
32
  from zenml.services.container.container_service_endpoint import (
32
33
  ContainerServiceEndpoint,
33
34
  )
34
35
  from zenml.services.service import BaseService, ServiceConfig
35
- from zenml.services.service_status import ServiceState, ServiceStatus
36
+ from zenml.services.service_status import ServiceStatus
36
37
  from zenml.utils import docker_utils
37
38
  from zenml.utils.io_utils import (
38
39
  create_dir_recursive_if_not_exists,
@@ -26,12 +26,13 @@ import psutil
26
26
  from psutil import NoSuchProcess
27
27
  from pydantic import Field
28
28
 
29
+ from zenml.enums import ServiceState
29
30
  from zenml.logger import get_logger
30
31
  from zenml.services.local.local_service_endpoint import (
31
32
  LocalDaemonServiceEndpoint,
32
33
  )
33
34
  from zenml.services.service import BaseService, ServiceConfig
34
- from zenml.services.service_status import ServiceState, ServiceStatus
35
+ from zenml.services.service_status import ServiceStatus
35
36
  from zenml.utils.io_utils import create_dir_recursive_if_not_exists
36
37
 
37
38
  logger = get_logger(__name__)
zenml/services/service.py CHANGED
@@ -34,11 +34,12 @@ from uuid import UUID
34
34
  from pydantic import ConfigDict
35
35
 
36
36
  from zenml.console import console
37
+ from zenml.enums import ServiceState
37
38
  from zenml.logger import get_logger
39
+ from zenml.models.v2.misc.service import ServiceType
38
40
  from zenml.services.service_endpoint import BaseServiceEndpoint
39
41
  from zenml.services.service_monitor import HTTPEndpointHealthMonitor
40
- from zenml.services.service_status import ServiceState, ServiceStatus
41
- from zenml.services.service_type import ServiceType
42
+ from zenml.services.service_status import ServiceStatus
42
43
  from zenml.utils import source_utils
43
44
  from zenml.utils.typed_model import BaseTypedModel
44
45
 
@@ -16,9 +16,10 @@
16
16
  from typing import Any, Optional, Tuple
17
17
 
18
18
  from zenml.constants import DEFAULT_LOCAL_SERVICE_IP_ADDRESS
19
+ from zenml.enums import ServiceState
19
20
  from zenml.logger import get_logger
20
21
  from zenml.services.service_monitor import BaseServiceEndpointHealthMonitor
21
- from zenml.services.service_status import ServiceState, ServiceStatus
22
+ from zenml.services.service_status import ServiceStatus
22
23
  from zenml.utils.enum_utils import StrEnum
23
24
  from zenml.utils.typed_model import BaseTypedModel
24
25