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
@@ -318,30 +318,36 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
318
318
  disk_tier=settings.disk_tier,
319
319
  )
320
320
  )
321
- # Set the cluster name
321
+ # Do not detach run if logs are being streamed
322
+ # Otherwise, the logs will not be streamed after the task is submitted
323
+ # Could also be a parameter in the settings to control this behavior
324
+ detach_run = not settings.stream_logs
325
+
326
+ launch_new_cluster = True
322
327
  if settings.cluster_name:
323
- sky.exec(
324
- task,
325
- settings.cluster_name,
326
- down=down,
327
- stream_logs=settings.stream_logs,
328
- backend=None,
329
- detach_run=True,
328
+ cluster_info = sky.status(
329
+ refresh=True, cluster_names=settings.cluster_name
330
330
  )
331
+ if cluster_info:
332
+ logger.info(
333
+ f"Found existing cluster {settings.cluster_name}. Reusing..."
334
+ )
335
+ launch_new_cluster = False
336
+
337
+ else:
338
+ logger.info(
339
+ f"Cluster {settings.cluster_name} not found. Launching a new one..."
340
+ )
341
+ cluster_name = settings.cluster_name
331
342
  else:
332
- # Find existing cluster
333
- for i in sky.status(refresh=True):
334
- if isinstance(
335
- i["handle"].launched_resources.cloud, type(self.cloud)
336
- ):
337
- cluster_name = i["handle"].cluster_name
338
- logger.info(
339
- f"Found existing cluster {cluster_name}. Reusing..."
340
- )
341
343
  cluster_name = self.sanitize_cluster_name(
342
344
  f"{orchestrator_run_name}"
343
345
  )
344
- # Launch the cluster
346
+ logger.info(
347
+ f"No cluster name provided. Launching a new cluster with name {cluster_name}..."
348
+ )
349
+
350
+ if launch_new_cluster:
345
351
  sky.launch(
346
352
  task,
347
353
  cluster_name,
@@ -349,7 +355,26 @@ class SkypilotBaseOrchestrator(ContainerizedOrchestrator):
349
355
  idle_minutes_to_autostop=idle_minutes_to_autostop,
350
356
  down=down,
351
357
  stream_logs=settings.stream_logs,
358
+ backend=None,
352
359
  detach_setup=True,
360
+ detach_run=detach_run,
361
+ )
362
+ else:
363
+ # Make sure the cluster is up -
364
+ # If the cluster is already up, this will not do anything
365
+ sky.start(
366
+ settings.cluster_name,
367
+ down=down,
368
+ idle_minutes_to_autostop=idle_minutes_to_autostop,
369
+ retry_until_up=settings.retry_until_up,
370
+ )
371
+ sky.exec(
372
+ task,
373
+ settings.cluster_name,
374
+ down=down,
375
+ stream_logs=settings.stream_logs,
376
+ backend=None,
377
+ detach_run=detach_run,
353
378
  )
354
379
 
355
380
  except Exception as e:
@@ -32,7 +32,7 @@ class SkypilotAWSIntegration(Integration):
32
32
 
33
33
  NAME = SKYPILOT_AWS
34
34
  # all 0.6.x versions of skypilot[aws] are compatible
35
- REQUIREMENTS = ["skypilot[aws]~=0.6.0"]
35
+ REQUIREMENTS = ["skypilot[aws]~=0.8.0"]
36
36
  APT_PACKAGES = ["openssh-client", "rsync"]
37
37
 
38
38
  @classmethod
@@ -48,5 +48,3 @@ class SkypilotAWSIntegration(Integration):
48
48
 
49
49
  return [SkypilotAWSOrchestratorFlavor]
50
50
 
51
-
52
- SkypilotAWSIntegration.check_installation()
@@ -31,7 +31,7 @@ class SkypilotAzureIntegration(Integration):
31
31
  """Definition of Skypilot (Azure) Integration for ZenML."""
32
32
 
33
33
  NAME = SKYPILOT_AZURE
34
- REQUIREMENTS = ["skypilot[azure]>=0.6.1"]
34
+ REQUIREMENTS = ["skypilot[azure]~=0.8.0"]
35
35
  APT_PACKAGES = ["openssh-client", "rsync"]
36
36
 
37
37
  @classmethod
@@ -47,4 +47,3 @@ class SkypilotAzureIntegration(Integration):
47
47
 
48
48
  return [SkypilotAzureOrchestratorFlavor]
49
49
 
50
- SkypilotAzureIntegration.check_installation()
@@ -31,7 +31,7 @@ class SkypilotGCPIntegration(Integration):
31
31
  """Definition of Skypilot (GCP) Integration for ZenML."""
32
32
 
33
33
  NAME = SKYPILOT_GCP
34
- REQUIREMENTS = ["skypilot[gcp]~=0.6.0"]
34
+ REQUIREMENTS = ["skypilot[gcp]~=0.8.0"]
35
35
  APT_PACKAGES = ["openssh-client", "rsync"]
36
36
 
37
37
  @classmethod
@@ -46,5 +46,3 @@ class SkypilotGCPIntegration(Integration):
46
46
  )
47
47
 
48
48
  return [SkypilotGCPOrchestratorFlavor]
49
-
50
- SkypilotGCPIntegration.check_installation()
@@ -32,7 +32,7 @@ class SkypilotKubernetesIntegration(Integration):
32
32
 
33
33
  NAME = SKYPILOT_KUBERNETES
34
34
  # all 0.6.x versions of skypilot[kubernetes] are compatible
35
- REQUIREMENTS = ["skypilot[kubernetes]~=0.6.1"]
35
+ REQUIREMENTS = ["skypilot[kubernetes]~=0.8.0"]
36
36
  APT_PACKAGES = ["openssh-client", "rsync"]
37
37
 
38
38
  @classmethod
@@ -48,5 +48,3 @@ class SkypilotKubernetesIntegration(Integration):
48
48
 
49
49
  return [SkypilotKubernetesOrchestratorFlavor]
50
50
 
51
-
52
- SkypilotKubernetesIntegration.check_installation()
@@ -31,7 +31,7 @@ class SkypilotLambdaIntegration(Integration):
31
31
  """Definition of Skypilot Lambda Integration for ZenML."""
32
32
 
33
33
  NAME = SKYPILOT_LAMBDA
34
- REQUIREMENTS = ["skypilot[lambda]~=0.6.0"]
34
+ REQUIREMENTS = ["skypilot[lambda]~=0.8.0"]
35
35
 
36
36
  @classmethod
37
37
  def flavors(cls) -> List[Type[Flavor]]:
@@ -46,5 +46,3 @@ class SkypilotLambdaIntegration(Integration):
46
46
 
47
47
  return [SkypilotLambdaOrchestratorFlavor]
48
48
 
49
-
50
- SkypilotLambdaIntegration.check_installation()
@@ -44,4 +44,3 @@ class SlackIntegration(Integration):
44
44
  return [SlackAlerterFlavor]
45
45
 
46
46
 
47
- SlackIntegration.check_installation()
@@ -49,4 +49,3 @@ class SparkIntegration(Integration):
49
49
  return [KubernetesSparkStepOperatorFlavor]
50
50
 
51
51
 
52
- SparkIntegration.check_installation()
@@ -46,4 +46,3 @@ class TektonIntegration(Integration):
46
46
  return [TektonOrchestratorFlavor]
47
47
 
48
48
 
49
- TektonIntegration.check_installation()
@@ -42,5 +42,3 @@ class TensorBoardIntegration(Integration):
42
42
  """Activates the integration."""
43
43
  from zenml.integrations.tensorboard import services # noqa
44
44
 
45
-
46
- TensorBoardIntegration.check_installation()
@@ -19,6 +19,7 @@ from typing import Any, Dict, Union
19
19
  from tensorboard import default, program # type: ignore [import-untyped]
20
20
 
21
21
  from zenml.logger import get_logger
22
+ from zenml.models.v2.misc.service import ServiceType
22
23
  from zenml.services import (
23
24
  HTTPEndpointHealthMonitor,
24
25
  HTTPEndpointHealthMonitorConfig,
@@ -27,7 +28,6 @@ from zenml.services import (
27
28
  LocalDaemonServiceEndpoint,
28
29
  LocalDaemonServiceEndpointConfig,
29
30
  ServiceEndpointProtocol,
30
- ServiceType,
31
31
  )
32
32
 
33
33
  logger = get_logger(__name__)
@@ -64,5 +64,3 @@ class TensorflowIntegration(Integration):
64
64
  requirements.append("typing-extensions>=4.6.1")
65
65
  return requirements
66
66
 
67
-
68
- TensorflowIntegration.check_installation()
@@ -47,4 +47,3 @@ class VLLMIntegration(Integration):
47
47
  return [VLLMModelDeployerFlavor]
48
48
 
49
49
 
50
- VLLMIntegration.check_installation()
@@ -19,6 +19,7 @@ from typing import Any, List, Optional, Union
19
19
 
20
20
  from zenml.constants import DEFAULT_LOCAL_SERVICE_IP_ADDRESS
21
21
  from zenml.logger import get_logger
22
+ from zenml.models.v2.misc.service import ServiceType
22
23
  from zenml.services import (
23
24
  HTTPEndpointHealthMonitor,
24
25
  HTTPEndpointHealthMonitorConfig,
@@ -27,7 +28,6 @@ from zenml.services import (
27
28
  LocalDaemonServiceEndpoint,
28
29
  LocalDaemonServiceEndpointConfig,
29
30
  ServiceEndpointProtocol,
30
- ServiceType,
31
31
  )
32
32
  from zenml.services.service import BaseDeploymentService
33
33
 
@@ -47,4 +47,3 @@ class WandbIntegration(Integration):
47
47
  return [WandbExperimentTrackerFlavor]
48
48
 
49
49
 
50
- WandbIntegration.check_installation()
@@ -65,4 +65,3 @@ class WhylogsIntegration(Integration):
65
65
  PandasIntegration.get_requirements(target_os=target_os)
66
66
 
67
67
 
68
- WhylogsIntegration.check_installation()
@@ -28,5 +28,3 @@ class XgboostIntegration(Integration):
28
28
  """Activates the integration."""
29
29
  from zenml.integrations.xgboost import materializers # noqa
30
30
 
31
-
32
- XgboostIntegration.check_installation()
@@ -20,11 +20,11 @@ from uuid import UUID
20
20
 
21
21
  from pydantic import BaseModel, ConfigDict
22
22
 
23
+ from zenml.enums import ServiceState
23
24
  from zenml.login.pro.constants import ZENML_PRO_API_URL, ZENML_PRO_URL
24
25
  from zenml.login.pro.workspace.models import WorkspaceRead, WorkspaceStatus
25
26
  from zenml.models import ServerModel
26
27
  from zenml.models.v2.misc.server_models import ServerDeploymentType
27
- from zenml.services.service_status import ServiceState
28
28
  from zenml.utils.enum_utils import StrEnum
29
29
  from zenml.utils.string_utils import get_human_readable_time
30
30
  from zenml.utils.time_utils import to_local_tz, utc_now
@@ -33,6 +33,7 @@ from zenml.materializers.pydantic_materializer import PydanticMaterializer
33
33
  from zenml.materializers.service_materializer import ServiceMaterializer
34
34
  from zenml.materializers.uuid_materializer import UUIDMaterializer
35
35
 
36
+
36
37
  __all__ = [
37
38
  "BuiltInContainerMaterializer",
38
39
  "BuiltInMaterializer",
@@ -30,9 +30,9 @@ from uuid import UUID
30
30
  from zenml.client import Client
31
31
  from zenml.enums import StackComponentType
32
32
  from zenml.logger import get_logger
33
+ from zenml.models.v2.misc.service import ServiceType
33
34
  from zenml.services import BaseService, ServiceConfig
34
35
  from zenml.services.service import BaseDeploymentService
35
- from zenml.services.service_type import ServiceType
36
36
  from zenml.stack import StackComponent
37
37
  from zenml.stack.flavor import Flavor
38
38
  from zenml.stack.stack_component import StackComponentConfig
zenml/models/__init__.py CHANGED
@@ -29,6 +29,7 @@ from zenml.models.v2.base.base import (
29
29
  )
30
30
  from zenml.models.v2.base.scoped import (
31
31
  TaggableFilter,
32
+ RunMetadataFilterMixin,
32
33
  UserScopedRequest,
33
34
  UserScopedFilter,
34
35
  UserScopedResponse,
@@ -389,6 +390,7 @@ from zenml.models.v2.misc.server_models import (
389
390
  ServerDatabaseType,
390
391
  ServerDeploymentType,
391
392
  )
393
+ from zenml.models.v2.misc.service import ServiceType
392
394
  from zenml.models.v2.core.server_settings import (
393
395
  ServerActivationRequest,
394
396
  ServerSettingsResponse,
@@ -516,6 +518,7 @@ __all__ = [
516
518
  "NumericFilter",
517
519
  "UUIDFilter",
518
520
  "TaggableFilter",
521
+ "RunMetadataFilterMixin",
519
522
  "Page",
520
523
  # V2 Core
521
524
  "ActionFilter",
@@ -760,6 +763,7 @@ __all__ = [
760
763
  "ServerDatabaseType",
761
764
  "ServerDeploymentType",
762
765
  "ServerStatistics",
766
+ "ServiceType",
763
767
  "StackDeploymentConfig",
764
768
  "StackDeploymentInfo",
765
769
  "OAuthDeviceAuthorizationRequest",
@@ -37,7 +37,7 @@ from pydantic import (
37
37
  field_validator,
38
38
  model_validator,
39
39
  )
40
- from sqlalchemy import Float, and_, asc, cast, desc
40
+ from sqlalchemy import Float, and_, asc, cast, desc, or_
41
41
  from sqlmodel import SQLModel
42
42
 
43
43
  from zenml.constants import (
@@ -171,8 +171,6 @@ class BoolFilter(Filter):
171
171
  class StrFilter(Filter):
172
172
  """Filter for all string fields."""
173
173
 
174
- json_encode_value: bool = False
175
-
176
174
  ALLOWED_OPS: ClassVar[List[str]] = [
177
175
  GenericFilterOps.EQUALS,
178
176
  GenericFilterOps.NOT_EQUALS,
@@ -201,6 +199,23 @@ class StrFilter(Filter):
201
199
  raise ValueError(ONEOF_ERROR)
202
200
  return self
203
201
 
202
+ def _check_if_column_is_json_encoded(self, column: Any) -> bool:
203
+ """Check if the column is json encoded.
204
+
205
+ Args:
206
+ column: The column of an SQLModel table on which to filter.
207
+
208
+ Returns:
209
+ True if the column is json encoded, False otherwise.
210
+ """
211
+ from zenml.zen_stores.schemas import RunMetadataSchema
212
+
213
+ JSON_ENCODED_COLUMNS = [RunMetadataSchema.value]
214
+
215
+ if column in JSON_ENCODED_COLUMNS:
216
+ return True
217
+ return False
218
+
204
219
  def generate_query_conditions_from_column(self, column: Any) -> Any:
205
220
  """Generate query conditions for a string column.
206
221
 
@@ -209,70 +224,168 @@ class StrFilter(Filter):
209
224
 
210
225
  Returns:
211
226
  A list of query conditions.
212
-
213
- Raises:
214
- ValueError: the comparison of the column to a numeric value fails.
215
227
  """
228
+ # Handle numeric comparisons (GT, LT, GTE, LTE)
216
229
  if self.operation in {
217
230
  GenericFilterOps.GT,
218
231
  GenericFilterOps.LT,
219
232
  GenericFilterOps.GTE,
220
233
  GenericFilterOps.LTE,
221
234
  }:
222
- try:
223
- numeric_column = cast(column, Float)
224
-
225
- assert self.value is not None
226
-
227
- if self.operation == GenericFilterOps.GT:
228
- return and_(
229
- numeric_column, numeric_column > float(self.value)
230
- )
231
- if self.operation == GenericFilterOps.LT:
232
- return and_(
233
- numeric_column, numeric_column < float(self.value)
234
- )
235
- if self.operation == GenericFilterOps.GTE:
236
- return and_(
237
- numeric_column, numeric_column >= float(self.value)
238
- )
239
- if self.operation == GenericFilterOps.LTE:
240
- return and_(
241
- numeric_column, numeric_column <= float(self.value)
242
- )
243
- except Exception as e:
244
- raise ValueError(
245
- f"Failed to compare the column '{column}' to the "
246
- f"value '{self.value}' (must be numeric): {e}"
247
- )
235
+ return self._handle_numeric_comparison(column)
236
+
237
+ # Handle operations that need special treatment for JSON-encoded columns
238
+ is_json_encoded = self._check_if_column_is_json_encoded(column)
248
239
 
240
+ # Handle list operations
249
241
  if self.operation == GenericFilterOps.ONEOF:
250
242
  assert isinstance(self.value, list)
251
- # Convert the list of values to a list of json strings
252
- json_list = (
253
- [json.dumps(v) for v in self.value]
254
- if self.json_encode_value
255
- else self.value
256
- )
257
- return column.in_(json_list)
243
+ return self._handle_oneof(column, is_json_encoded)
258
244
 
259
- # Don't convert the value to a json string if the operation is contains
260
- # because the quotes around strings will mess with the comparison
245
+ # Handle pattern matching operations
261
246
  if self.operation == GenericFilterOps.CONTAINS:
262
247
  return column.like(f"%{self.value}%")
263
248
 
264
- json_value = (
265
- json.dumps(self.value) if self.json_encode_value else self.value
266
- )
267
-
268
249
  if self.operation == GenericFilterOps.STARTSWITH:
269
- return column.startswith(f"{json_value}")
250
+ return self._handle_startswith(column, is_json_encoded)
251
+
270
252
  if self.operation == GenericFilterOps.ENDSWITH:
271
- return column.endswith(f"{json_value}")
253
+ return self._handle_endswith(column, is_json_encoded)
254
+
272
255
  if self.operation == GenericFilterOps.NOT_EQUALS:
273
- return column != json_value
256
+ return self._handle_not_equals(column, is_json_encoded)
274
257
 
275
- return column == json_value
258
+ # Default case (EQUALS)
259
+ return self._handle_equals(column, is_json_encoded)
260
+
261
+ def _handle_numeric_comparison(self, column: Any) -> Any:
262
+ """Handle numeric comparison operations.
263
+
264
+ Args:
265
+ column: The column to compare.
266
+
267
+ Returns:
268
+ The query condition.
269
+
270
+ Raises:
271
+ ValueError: If the comparison fails.
272
+ """
273
+ try:
274
+ numeric_column = cast(column, Float)
275
+ assert self.value is not None
276
+
277
+ operations = {
278
+ GenericFilterOps.GT: lambda col, val: and_(
279
+ col, col > float(val)
280
+ ),
281
+ GenericFilterOps.LT: lambda col, val: and_(
282
+ col, col < float(val)
283
+ ),
284
+ GenericFilterOps.GTE: lambda col, val: and_(
285
+ col, col >= float(val)
286
+ ),
287
+ GenericFilterOps.LTE: lambda col, val: and_(
288
+ col, col <= float(val)
289
+ ),
290
+ }
291
+
292
+ return operations[self.operation](numeric_column, self.value) # type: ignore[no-untyped-call]
293
+ except Exception as e:
294
+ raise ValueError(
295
+ f"Failed to compare the column '{column}' to the "
296
+ f"value '{self.value}' (must be numeric): {e}"
297
+ )
298
+
299
+ def _handle_oneof(self, column: Any, is_json_encoded: bool) -> Any:
300
+ """Handle the ONEOF operation.
301
+
302
+ Args:
303
+ column: The column to check.
304
+ is_json_encoded: Whether the column is JSON encoded.
305
+
306
+ Returns:
307
+ The query condition.
308
+ """
309
+ from sqlalchemy import or_
310
+
311
+ conditions = []
312
+
313
+ assert isinstance(self.value, list)
314
+
315
+ for value in self.value:
316
+ if is_json_encoded:
317
+ # For JSON encoded columns, add conditions for both raw and JSON-quoted values
318
+ conditions.append(column == value)
319
+ conditions.append(column == f'"{value}"')
320
+ else:
321
+ conditions.append(column == value)
322
+
323
+ return or_(*conditions)
324
+
325
+ def _handle_startswith(self, column: Any, is_json_encoded: bool) -> Any:
326
+ """Handle the STARTSWITH operation.
327
+
328
+ Args:
329
+ column: The column to check.
330
+ is_json_encoded: Whether the column is JSON encoded.
331
+
332
+ Returns:
333
+ The query condition.
334
+ """
335
+ if is_json_encoded:
336
+ return or_(
337
+ column.startswith(self.value),
338
+ column.startswith(f'"{self.value}'),
339
+ )
340
+ else:
341
+ return column.startswith(self.value)
342
+
343
+ def _handle_endswith(self, column: Any, is_json_encoded: bool) -> Any:
344
+ """Handle the ENDSWITH operation.
345
+
346
+ Args:
347
+ column: The column to check.
348
+ is_json_encoded: Whether the column is JSON encoded.
349
+
350
+ Returns:
351
+ The query condition.
352
+ """
353
+ if is_json_encoded:
354
+ return or_(
355
+ column.endswith(self.value), column.endswith(f'{self.value}"')
356
+ )
357
+ else:
358
+ return column.endswith(self.value)
359
+
360
+ def _handle_not_equals(self, column: Any, is_json_encoded: bool) -> Any:
361
+ """Handle the NOT_EQUALS operation.
362
+
363
+ Args:
364
+ column: The column to check.
365
+ is_json_encoded: Whether the column is JSON encoded.
366
+
367
+ Returns:
368
+ The query condition.
369
+ """
370
+ if is_json_encoded:
371
+ return and_(column != self.value, column != f'"{self.value}"')
372
+ else:
373
+ return column != self.value
374
+
375
+ def _handle_equals(self, column: Any, is_json_encoded: bool) -> Any:
376
+ """Handle the EQUALS operation (default).
377
+
378
+ Args:
379
+ column: The column to check.
380
+ is_json_encoded: Whether the column is JSON encoded.
381
+
382
+ Returns:
383
+ The query condition.
384
+ """
385
+ if is_json_encoded:
386
+ return or_(column == self.value, column == f'"{self.value}"')
387
+ else:
388
+ return column == self.value
276
389
 
277
390
 
278
391
  class UUIDFilter(StrFilter):
@@ -751,7 +864,6 @@ class BaseFilter(BaseModel):
751
864
  value: Any,
752
865
  table: Type[SQLModel],
753
866
  column: str,
754
- json_encode_value: bool = False,
755
867
  ) -> "ColumnElement[bool]":
756
868
  """Generate custom filter conditions for a column of a table.
757
869
 
@@ -759,7 +871,6 @@ class BaseFilter(BaseModel):
759
871
  value: The filter value.
760
872
  table: The table which contains the column.
761
873
  column: The column name.
762
- json_encode_value: Whether to json encode the value.
763
874
 
764
875
  Returns:
765
876
  The query conditions.
@@ -768,9 +879,6 @@ class BaseFilter(BaseModel):
768
879
  filter_ = FilterGenerator(table).define_filter(
769
880
  column=column, value=value, operator=operator
770
881
  )
771
- if isinstance(filter_, StrFilter):
772
- filter_.json_encode_value = json_encode_value
773
-
774
882
  return filter_.generate_query_conditions(table=table)
775
883
 
776
884
  @property