zenml-nightly 0.55.0.dev20240124__py3-none-any.whl → 0.72.0.dev20250116__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 (1240) hide show
  1. zenml/VERSION +1 -1
  2. zenml/__init__.py +9 -12
  3. zenml/actions/__init__.py +14 -0
  4. zenml/actions/base_action.py +682 -0
  5. zenml/actions/pipeline_run/__init__.py +0 -0
  6. zenml/actions/pipeline_run/pipeline_run_action.py +223 -0
  7. zenml/analytics/context.py +70 -15
  8. zenml/analytics/enums.py +21 -17
  9. zenml/analytics/models.py +1 -0
  10. zenml/analytics/utils.py +19 -7
  11. zenml/annotators/base_annotator.py +4 -3
  12. zenml/artifact_stores/base_artifact_store.py +155 -72
  13. zenml/artifact_stores/local_artifact_store.py +3 -2
  14. zenml/artifacts/artifact_config.py +67 -58
  15. zenml/artifacts/external_artifact.py +24 -39
  16. zenml/artifacts/external_artifact_config.py +27 -37
  17. zenml/artifacts/preexisting_data_materializer.py +90 -0
  18. zenml/artifacts/unmaterialized_artifact.py +2 -12
  19. zenml/artifacts/utils.py +521 -220
  20. zenml/cli/__init__.py +1511 -456
  21. zenml/cli/annotator.py +48 -14
  22. zenml/cli/artifact.py +22 -4
  23. zenml/cli/authorized_device.py +1 -0
  24. zenml/cli/base.py +185 -22
  25. zenml/cli/code_repository.py +1 -0
  26. zenml/cli/formatter.py +1 -1
  27. zenml/cli/integration.py +119 -24
  28. zenml/cli/login.py +1053 -0
  29. zenml/cli/model.py +42 -15
  30. zenml/cli/model_registry.py +1 -2
  31. zenml/cli/pipeline.py +168 -82
  32. zenml/cli/secret.py +1 -2
  33. zenml/cli/served_model.py +56 -26
  34. zenml/cli/server.py +486 -619
  35. zenml/cli/service_accounts.py +55 -14
  36. zenml/cli/service_connectors.py +97 -6
  37. zenml/cli/stack.py +821 -531
  38. zenml/cli/stack_components.py +15 -598
  39. zenml/cli/tag.py +1 -0
  40. zenml/cli/text_utils.py +36 -2
  41. zenml/cli/user_management.py +204 -6
  42. zenml/cli/utils.py +411 -290
  43. zenml/client.py +1742 -298
  44. zenml/client_lazy_loader.py +224 -0
  45. zenml/code_repositories/base_code_repository.py +5 -4
  46. zenml/code_repositories/git/local_git_repository_context.py +1 -0
  47. zenml/code_repositories/local_repository_context.py +1 -0
  48. zenml/config/__init__.py +2 -0
  49. zenml/config/base_settings.py +6 -6
  50. zenml/config/build_configuration.py +43 -17
  51. zenml/config/compiler.py +82 -49
  52. zenml/config/docker_settings.py +139 -83
  53. zenml/config/global_config.py +260 -234
  54. zenml/config/pipeline_configurations.py +32 -11
  55. zenml/config/pipeline_run_configuration.py +15 -3
  56. zenml/config/pipeline_spec.py +6 -6
  57. zenml/config/resource_settings.py +8 -9
  58. zenml/config/retry_config.py +27 -0
  59. zenml/config/schedule.py +27 -18
  60. zenml/config/secret_reference_mixin.py +8 -4
  61. zenml/config/secrets_store_config.py +16 -24
  62. zenml/config/server_config.py +434 -51
  63. zenml/config/settings_resolver.py +2 -1
  64. zenml/config/source.py +97 -31
  65. zenml/config/step_configurations.py +83 -39
  66. zenml/config/step_run_info.py +3 -0
  67. zenml/config/store_config.py +20 -54
  68. zenml/config/strict_base_model.py +2 -6
  69. zenml/console.py +0 -1
  70. zenml/constants.py +232 -74
  71. zenml/container_registries/azure_container_registry.py +1 -0
  72. zenml/container_registries/base_container_registry.py +7 -3
  73. zenml/container_registries/default_container_registry.py +4 -3
  74. zenml/container_registries/dockerhub_container_registry.py +1 -0
  75. zenml/container_registries/gcp_container_registry.py +1 -0
  76. zenml/container_registries/github_container_registry.py +2 -10
  77. zenml/data_validators/base_data_validator.py +2 -2
  78. zenml/entrypoints/base_entrypoint_configuration.py +76 -17
  79. zenml/entrypoints/pipeline_entrypoint_configuration.py +1 -0
  80. zenml/entrypoints/step_entrypoint_configuration.py +21 -2
  81. zenml/enums.py +91 -9
  82. zenml/environment.py +52 -319
  83. zenml/{steps/base_parameters.py → event_hub/__init__.py} +5 -7
  84. zenml/event_hub/base_event_hub.py +196 -0
  85. zenml/event_hub/event_hub.py +181 -0
  86. zenml/event_sources/__init__.py +14 -0
  87. zenml/{lineage_graph/edge.py → event_sources/base_event.py} +5 -7
  88. zenml/event_sources/base_event_source.py +695 -0
  89. zenml/event_sources/webhooks/__init__.py +14 -0
  90. zenml/event_sources/webhooks/base_webhook_event_source.py +231 -0
  91. zenml/exceptions.py +40 -41
  92. zenml/feature_stores/base_feature_store.py +4 -6
  93. zenml/hooks/hook_validators.py +3 -11
  94. zenml/image_builders/base_image_builder.py +5 -2
  95. zenml/image_builders/build_context.py +24 -80
  96. zenml/image_builders/local_image_builder.py +14 -6
  97. zenml/integrations/__init__.py +16 -4
  98. zenml/integrations/airflow/__init__.py +3 -5
  99. zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +15 -7
  100. zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +15 -252
  101. zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
  102. zenml/integrations/argilla/__init__.py +46 -0
  103. zenml/integrations/argilla/annotators/__init__.py +20 -0
  104. zenml/integrations/argilla/annotators/argilla_annotator.py +443 -0
  105. zenml/{post_execution → integrations/argilla/flavors}/__init__.py +9 -13
  106. zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +150 -0
  107. zenml/integrations/aws/__init__.py +7 -3
  108. zenml/integrations/aws/container_registries/aws_container_registry.py +44 -8
  109. zenml/integrations/aws/flavors/__init__.py +6 -0
  110. zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
  111. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  112. zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +104 -16
  113. zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
  114. zenml/integrations/aws/image_builders/__init__.py +20 -0
  115. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  116. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +421 -133
  117. zenml/integrations/aws/service_connectors/aws_service_connector.py +175 -48
  118. zenml/integrations/aws/step_operators/sagemaker_step_operator.py +1 -1
  119. zenml/integrations/azure/__init__.py +14 -5
  120. zenml/integrations/azure/azureml_utils.py +201 -0
  121. zenml/integrations/azure/flavors/__init__.py +11 -0
  122. zenml/integrations/azure/flavors/azureml.py +139 -0
  123. zenml/integrations/azure/flavors/azureml_orchestrator_flavor.py +166 -0
  124. zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +71 -18
  125. zenml/integrations/azure/orchestrators/__init__.py +19 -0
  126. zenml/integrations/azure/orchestrators/azureml_orchestrator.py +583 -0
  127. zenml/integrations/azure/orchestrators/azureml_orchestrator_entrypoint_config.py +82 -0
  128. zenml/integrations/azure/service_connectors/azure_service_connector.py +15 -6
  129. zenml/integrations/azure/step_operators/azureml_step_operator.py +78 -173
  130. zenml/integrations/bentoml/__init__.py +1 -1
  131. zenml/integrations/bentoml/constants.py +1 -1
  132. zenml/integrations/bentoml/materializers/bentoml_bento_materializer.py +19 -31
  133. zenml/integrations/bentoml/model_deployers/bentoml_model_deployer.py +128 -239
  134. zenml/integrations/bentoml/services/__init__.py +15 -4
  135. zenml/integrations/bentoml/services/bentoml_container_deployment.py +399 -0
  136. zenml/integrations/bentoml/services/{bentoml_deployment.py → bentoml_local_deployment.py} +85 -43
  137. zenml/integrations/bentoml/services/deployment_type.py +23 -0
  138. zenml/integrations/bentoml/steps/bento_builder.py +2 -0
  139. zenml/integrations/bentoml/steps/bentoml_deployer.py +97 -47
  140. zenml/integrations/bitbucket/__init__.py +42 -0
  141. zenml/integrations/bitbucket/plugins/__init__.py +20 -0
  142. zenml/integrations/bitbucket/plugins/bitbucket_webhook_event_source_flavor.py +43 -0
  143. zenml/integrations/bitbucket/plugins/event_sources/__init__.py +0 -0
  144. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +486 -0
  145. zenml/integrations/comet/__init__.py +49 -0
  146. zenml/integrations/{kserve/services → comet/experiment_trackers}/__init__.py +5 -6
  147. zenml/integrations/comet/experiment_trackers/comet_experiment_tracker.py +175 -0
  148. zenml/integrations/comet/flavors/__init__.py +24 -0
  149. zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +129 -0
  150. zenml/integrations/constants.py +14 -2
  151. zenml/integrations/databricks/__init__.py +70 -0
  152. zenml/{lineage_graph → integrations/databricks/flavors}/__init__.py +14 -18
  153. zenml/integrations/databricks/flavors/databricks_model_deployer_flavor.py +118 -0
  154. zenml/integrations/databricks/flavors/databricks_orchestrator_flavor.py +174 -0
  155. zenml/integrations/{kserve → databricks}/model_deployers/__init__.py +5 -5
  156. zenml/integrations/databricks/model_deployers/databricks_model_deployer.py +249 -0
  157. zenml/integrations/databricks/orchestrators/__init__.py +20 -0
  158. zenml/integrations/databricks/orchestrators/databricks_orchestrator.py +501 -0
  159. zenml/integrations/databricks/orchestrators/databricks_orchestrator_entrypoint_config.py +97 -0
  160. zenml/integrations/databricks/services/__init__.py +19 -0
  161. zenml/integrations/databricks/services/databricks_deployment.py +407 -0
  162. zenml/integrations/{gcp/orchestrators/vertex_scheduler → databricks/utils}/__init__.py +2 -2
  163. zenml/integrations/databricks/utils/databricks_utils.py +87 -0
  164. zenml/integrations/deepchecks/__init__.py +30 -10
  165. zenml/integrations/deepchecks/data_validators/deepchecks_data_validator.py +59 -18
  166. zenml/integrations/deepchecks/materializers/deepchecks_dataset_materializer.py +3 -1
  167. zenml/integrations/deepchecks/materializers/deepchecks_results_materializer.py +3 -3
  168. zenml/integrations/deepchecks/validation_checks.py +62 -35
  169. zenml/integrations/discord/__init__.py +1 -0
  170. zenml/integrations/discord/steps/discord_alerter_ask_step.py +1 -0
  171. zenml/integrations/discord/steps/discord_alerter_post_step.py +1 -0
  172. zenml/integrations/evidently/__init__.py +22 -4
  173. zenml/integrations/evidently/column_mapping.py +11 -3
  174. zenml/integrations/evidently/data_validators/evidently_data_validator.py +24 -6
  175. zenml/integrations/evidently/metrics.py +7 -8
  176. zenml/integrations/evidently/tests.py +7 -8
  177. zenml/integrations/facets/__init__.py +22 -5
  178. zenml/integrations/facets/models.py +2 -7
  179. zenml/integrations/feast/__init__.py +19 -3
  180. zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -32
  181. zenml/integrations/gcp/__init__.py +6 -6
  182. zenml/integrations/gcp/artifact_stores/gcp_artifact_store.py +6 -0
  183. zenml/integrations/gcp/flavors/gcp_artifact_store_flavor.py +1 -0
  184. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +24 -2
  185. zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +14 -1
  186. zenml/integrations/gcp/google_credentials_mixin.py +1 -1
  187. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +519 -296
  188. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +788 -113
  189. zenml/integrations/gcp/step_operators/vertex_step_operator.py +9 -1
  190. zenml/integrations/github/__init__.py +15 -0
  191. zenml/integrations/github/code_repositories/github_code_repository.py +3 -2
  192. zenml/integrations/github/plugins/__init__.py +19 -0
  193. zenml/integrations/github/plugins/event_sources/__init__.py +0 -0
  194. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +510 -0
  195. zenml/integrations/github/plugins/github_webhook_event_source_flavor.py +43 -0
  196. zenml/integrations/gitlab/code_repositories/gitlab_code_repository.py +7 -1
  197. zenml/integrations/great_expectations/__init__.py +22 -10
  198. zenml/integrations/great_expectations/data_validators/ge_data_validator.py +61 -57
  199. zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
  200. zenml/integrations/great_expectations/ge_store_backend.py +24 -11
  201. zenml/integrations/great_expectations/materializers/ge_materializer.py +9 -9
  202. zenml/integrations/great_expectations/utils.py +5 -5
  203. zenml/integrations/huggingface/__init__.py +52 -1
  204. zenml/integrations/huggingface/flavors/__init__.py +26 -0
  205. zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +130 -0
  206. zenml/integrations/huggingface/materializers/__init__.py +3 -0
  207. zenml/integrations/huggingface/materializers/huggingface_datasets_materializer.py +102 -19
  208. zenml/integrations/huggingface/materializers/huggingface_pt_model_materializer.py +18 -19
  209. zenml/integrations/huggingface/materializers/huggingface_t5_materializer.py +104 -0
  210. zenml/integrations/huggingface/materializers/huggingface_tf_model_materializer.py +18 -19
  211. zenml/integrations/huggingface/materializers/huggingface_tokenizer_materializer.py +13 -15
  212. zenml/integrations/huggingface/model_deployers/__init__.py +20 -0
  213. zenml/integrations/huggingface/model_deployers/huggingface_model_deployer.py +247 -0
  214. zenml/integrations/huggingface/services/__init__.py +19 -0
  215. zenml/integrations/huggingface/services/huggingface_deployment.py +292 -0
  216. zenml/integrations/huggingface/steps/__init__.py +21 -0
  217. zenml/integrations/huggingface/steps/accelerate_runner.py +166 -0
  218. zenml/integrations/huggingface/steps/huggingface_deployer.py +110 -0
  219. zenml/integrations/hyperai/__init__.py +53 -0
  220. zenml/integrations/hyperai/flavors/__init__.py +20 -0
  221. zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +170 -0
  222. zenml/integrations/hyperai/orchestrators/__init__.py +21 -0
  223. zenml/integrations/hyperai/orchestrators/hyperai_orchestrator.py +510 -0
  224. zenml/integrations/hyperai/service_connectors/__init__.py +20 -0
  225. zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +375 -0
  226. zenml/integrations/integration.py +101 -47
  227. zenml/integrations/kaniko/flavors/kaniko_image_builder_flavor.py +6 -44
  228. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +9 -6
  229. zenml/integrations/kubeflow/__init__.py +4 -1
  230. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +67 -82
  231. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +306 -248
  232. zenml/integrations/kubernetes/__init__.py +6 -3
  233. zenml/integrations/kubernetes/flavors/__init__.py +8 -0
  234. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +43 -2
  235. zenml/integrations/kubernetes/flavors/kubernetes_step_operator_flavor.py +166 -0
  236. zenml/integrations/kubernetes/orchestrators/kube_utils.py +67 -12
  237. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +89 -21
  238. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +39 -7
  239. zenml/integrations/kubernetes/orchestrators/manifest_utils.py +42 -19
  240. zenml/integrations/kubernetes/pod_settings.py +21 -31
  241. zenml/integrations/kubernetes/serialization_utils.py +3 -3
  242. zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +14 -11
  243. zenml/integrations/kubernetes/step_operators/__init__.py +22 -0
  244. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +236 -0
  245. zenml/integrations/label_studio/__init__.py +1 -3
  246. zenml/integrations/label_studio/annotators/label_studio_annotator.py +46 -14
  247. zenml/integrations/label_studio/flavors/__init__.py +2 -0
  248. zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +20 -5
  249. zenml/integrations/langchain/__init__.py +7 -1
  250. zenml/integrations/langchain/materializers/document_materializer.py +44 -8
  251. zenml/integrations/langchain/materializers/openai_embedding_materializer.py +28 -2
  252. zenml/integrations/lightgbm/__init__.py +1 -0
  253. zenml/integrations/lightgbm/materializers/lightgbm_booster_materializer.py +8 -15
  254. zenml/integrations/lightgbm/materializers/lightgbm_dataset_materializer.py +11 -16
  255. zenml/integrations/lightning/__init__.py +48 -0
  256. zenml/integrations/lightning/flavors/__init__.py +23 -0
  257. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +168 -0
  258. zenml/integrations/lightning/orchestrators/__init__.py +23 -0
  259. zenml/integrations/lightning/orchestrators/lightning_orchestrator.py +617 -0
  260. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint.py +303 -0
  261. zenml/integrations/lightning/orchestrators/lightning_orchestrator_entrypoint_configuration.py +77 -0
  262. zenml/integrations/lightning/orchestrators/utils.py +67 -0
  263. zenml/integrations/mlflow/__init__.py +55 -8
  264. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +31 -13
  265. zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +32 -37
  266. zenml/integrations/mlflow/model_deployers/mlflow_model_deployer.py +42 -233
  267. zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +42 -49
  268. zenml/integrations/mlflow/services/mlflow_deployment.py +30 -5
  269. zenml/integrations/mlflow/steps/mlflow_deployer.py +25 -27
  270. zenml/integrations/mlflow/steps/mlflow_registry.py +3 -1
  271. zenml/integrations/modal/__init__.py +46 -0
  272. zenml/integrations/modal/flavors/__init__.py +26 -0
  273. zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
  274. zenml/integrations/modal/step_operators/__init__.py +22 -0
  275. zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
  276. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  277. zenml/integrations/neptune/experiment_trackers/run_state.py +71 -55
  278. zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
  279. zenml/integrations/neural_prophet/__init__.py +6 -1
  280. zenml/integrations/numpy/__init__.py +32 -0
  281. zenml/integrations/{kserve/constants.py → numpy/materializers/__init__.py} +5 -4
  282. zenml/integrations/numpy/materializers/numpy_materializer.py +246 -0
  283. zenml/integrations/openai/__init__.py +1 -1
  284. zenml/integrations/openai/hooks/open_ai_failure_hook.py +39 -14
  285. zenml/{steps/external_artifact.py → integrations/pandas/__init__.py} +17 -11
  286. zenml/integrations/{kserve/custom_deployer → pandas/materializers}/__init__.py +5 -5
  287. zenml/integrations/pandas/materializers/pandas_materializer.py +192 -0
  288. zenml/integrations/pigeon/__init__.py +44 -0
  289. zenml/integrations/pigeon/annotators/__init__.py +20 -0
  290. zenml/integrations/pigeon/annotators/pigeon_annotator.py +330 -0
  291. zenml/integrations/{kserve → pigeon}/flavors/__init__.py +7 -7
  292. zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +104 -0
  293. zenml/integrations/pillow/materializers/pillow_image_materializer.py +17 -20
  294. zenml/integrations/polars/__init__.py +1 -0
  295. zenml/integrations/polars/materializers/dataframe_materializer.py +26 -39
  296. zenml/integrations/prodigy/__init__.py +48 -0
  297. zenml/integrations/prodigy/annotators/__init__.py +20 -0
  298. zenml/integrations/prodigy/annotators/prodigy_annotator.py +275 -0
  299. zenml/integrations/prodigy/flavors/__init__.py +24 -0
  300. zenml/integrations/prodigy/flavors/prodigy_annotator_flavor.py +101 -0
  301. zenml/integrations/pycaret/__init__.py +6 -0
  302. zenml/integrations/pycaret/materializers/model_materializer.py +7 -22
  303. zenml/integrations/pytorch/materializers/base_pytorch_materializer.py +8 -2
  304. zenml/integrations/pytorch/materializers/pytorch_module_materializer.py +4 -1
  305. zenml/integrations/registry.py +38 -1
  306. zenml/integrations/s3/__init__.py +2 -3
  307. zenml/integrations/s3/artifact_stores/s3_artifact_store.py +191 -9
  308. zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +22 -45
  309. zenml/integrations/s3/utils.py +39 -0
  310. zenml/integrations/seldon/__init__.py +18 -2
  311. zenml/integrations/seldon/model_deployers/seldon_model_deployer.py +19 -141
  312. zenml/integrations/seldon/secret_schemas/secret_schemas.py +2 -2
  313. zenml/integrations/seldon/seldon_client.py +55 -70
  314. zenml/integrations/seldon/services/seldon_deployment.py +4 -5
  315. zenml/integrations/seldon/steps/seldon_deployer.py +21 -20
  316. zenml/integrations/sklearn/__init__.py +1 -1
  317. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +29 -7
  318. zenml/integrations/skypilot/orchestrators/skypilot_base_vm_orchestrator.py +47 -28
  319. zenml/integrations/skypilot/orchestrators/skypilot_orchestrator_entrypoint.py +2 -2
  320. zenml/integrations/skypilot_aws/__init__.py +3 -2
  321. zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
  322. zenml/integrations/skypilot_azure/__init__.py +2 -4
  323. zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
  324. zenml/integrations/skypilot_gcp/__init__.py +3 -2
  325. zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
  326. zenml/integrations/skypilot_kubernetes/__init__.py +52 -0
  327. zenml/integrations/skypilot_kubernetes/flavors/__init__.py +26 -0
  328. zenml/integrations/skypilot_kubernetes/flavors/skypilot_orchestrator_kubernetes_vm_flavor.py +125 -0
  329. zenml/integrations/skypilot_kubernetes/orchestrators/__init__.py +25 -0
  330. zenml/integrations/skypilot_kubernetes/orchestrators/skypilot_kubernetes_vm_orchestrator.py +74 -0
  331. zenml/integrations/skypilot_lambda/__init__.py +50 -0
  332. zenml/integrations/{kserve/secret_schemas → skypilot_lambda/flavors}/__init__.py +9 -12
  333. zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +130 -0
  334. zenml/{lineage_graph/node → integrations/skypilot_lambda/orchestrators}/__init__.py +8 -15
  335. zenml/integrations/skypilot_lambda/orchestrators/skypilot_lambda_vm_orchestrator.py +92 -0
  336. zenml/integrations/slack/__init__.py +1 -0
  337. zenml/integrations/slack/alerters/slack_alerter.py +22 -2
  338. zenml/integrations/slack/flavors/__init__.py +2 -0
  339. zenml/integrations/slack/flavors/slack_alerter_flavor.py +13 -4
  340. zenml/integrations/slack/steps/slack_alerter_ask_step.py +1 -0
  341. zenml/integrations/slack/steps/slack_alerter_post_step.py +1 -0
  342. zenml/integrations/spark/flavors/spark_step_operator_flavor.py +2 -39
  343. zenml/integrations/spark/step_operators/kubernetes_step_operator.py +1 -0
  344. zenml/integrations/spark/step_operators/spark_entrypoint_configuration.py +1 -0
  345. zenml/integrations/spark/step_operators/spark_step_operator.py +2 -0
  346. zenml/integrations/tekton/__init__.py +2 -1
  347. zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
  348. zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +549 -235
  349. zenml/integrations/tensorboard/__init__.py +1 -13
  350. zenml/integrations/tensorboard/services/tensorboard_service.py +3 -4
  351. zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +66 -59
  352. zenml/integrations/tensorflow/__init__.py +10 -15
  353. zenml/integrations/tensorflow/materializers/keras_materializer.py +24 -27
  354. zenml/integrations/tensorflow/materializers/tf_dataset_materializer.py +9 -16
  355. zenml/integrations/vllm/__init__.py +50 -0
  356. zenml/integrations/vllm/flavors/__init__.py +21 -0
  357. zenml/integrations/vllm/flavors/vllm_model_deployer_flavor.py +91 -0
  358. zenml/integrations/vllm/model_deployers/__init__.py +19 -0
  359. zenml/integrations/vllm/model_deployers/vllm_model_deployer.py +263 -0
  360. zenml/integrations/vllm/services/__init__.py +19 -0
  361. zenml/integrations/vllm/services/vllm_deployment.py +206 -0
  362. zenml/integrations/wandb/__init__.py +1 -0
  363. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +21 -18
  364. zenml/integrations/whylogs/__init__.py +18 -2
  365. zenml/integrations/whylogs/data_validators/whylogs_data_validator.py +3 -3
  366. zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
  367. zenml/integrations/whylogs/materializers/whylogs_materializer.py +14 -21
  368. zenml/integrations/xgboost/materializers/xgboost_booster_materializer.py +11 -22
  369. zenml/integrations/xgboost/materializers/xgboost_dmatrix_materializer.py +10 -19
  370. zenml/io/fileio.py +1 -0
  371. zenml/io/filesystem.py +2 -2
  372. zenml/io/local_filesystem.py +3 -3
  373. zenml/logger.py +41 -17
  374. zenml/logging/__init__.py +5 -0
  375. zenml/logging/step_logging.py +280 -32
  376. zenml/{new/steps → login}/__init__.py +4 -1
  377. zenml/login/credentials.py +370 -0
  378. zenml/login/credentials_store.py +638 -0
  379. zenml/{new/pipelines → login/pro}/__init__.py +4 -1
  380. zenml/login/pro/client.py +492 -0
  381. zenml/login/pro/constants.py +28 -0
  382. zenml/{zen_stores/schemas/identity_schemas.py → login/pro/models.py} +9 -11
  383. zenml/login/pro/organization/__init__.py +14 -0
  384. zenml/login/pro/organization/client.py +79 -0
  385. zenml/{lineage_graph/node/base_node.py → login/pro/organization/models.py} +13 -12
  386. zenml/{_hub → login/pro/tenant}/__init__.py +2 -2
  387. zenml/login/pro/tenant/client.py +92 -0
  388. zenml/login/pro/tenant/models.py +176 -0
  389. zenml/login/pro/utils.py +107 -0
  390. zenml/login/server_info.py +52 -0
  391. zenml/{cli → login}/web_login.py +71 -21
  392. zenml/materializers/__init__.py +2 -4
  393. zenml/materializers/base_materializer.py +180 -51
  394. zenml/materializers/built_in_materializer.py +50 -23
  395. zenml/materializers/cloudpickle_materializer.py +4 -5
  396. zenml/materializers/numpy_materializer.py +23 -233
  397. zenml/materializers/pandas_materializer.py +22 -174
  398. zenml/materializers/pydantic_materializer.py +2 -2
  399. zenml/materializers/service_materializer.py +12 -10
  400. zenml/materializers/structured_string_materializer.py +12 -6
  401. zenml/materializers/uuid_materializer.py +79 -0
  402. zenml/metadata/lazy_load.py +33 -17
  403. zenml/metadata/metadata_types.py +112 -3
  404. zenml/model/lazy_load.py +85 -4
  405. zenml/model/model.py +236 -226
  406. zenml/model/utils.py +99 -141
  407. zenml/model_deployers/base_model_deployer.py +319 -47
  408. zenml/model_registries/base_model_registry.py +17 -15
  409. zenml/models/__init__.py +254 -175
  410. zenml/models/v2/base/base.py +254 -112
  411. zenml/models/v2/base/base_plugin_flavor.py +76 -0
  412. zenml/models/v2/base/filter.py +530 -199
  413. zenml/models/v2/base/page.py +2 -12
  414. zenml/models/v2/base/scoped.py +292 -22
  415. zenml/models/v2/core/action.py +276 -0
  416. zenml/models/v2/core/action_flavor.py +57 -0
  417. zenml/models/v2/core/api_key.py +35 -12
  418. zenml/models/v2/core/artifact.py +126 -6
  419. zenml/models/v2/core/artifact_version.py +289 -65
  420. zenml/models/v2/core/artifact_visualization.py +10 -4
  421. zenml/models/v2/core/code_reference.py +13 -4
  422. zenml/models/v2/core/code_repository.py +39 -16
  423. zenml/models/v2/core/component.py +113 -61
  424. zenml/models/v2/core/device.py +25 -5
  425. zenml/models/v2/core/event_source.py +244 -0
  426. zenml/models/v2/core/event_source_flavor.py +67 -0
  427. zenml/models/v2/core/flavor.py +90 -27
  428. zenml/models/v2/core/logs.py +81 -12
  429. zenml/models/v2/core/model.py +91 -42
  430. zenml/models/v2/core/model_version.py +100 -55
  431. zenml/models/v2/core/model_version_artifact.py +96 -89
  432. zenml/models/v2/core/model_version_pipeline_run.py +86 -53
  433. zenml/models/v2/core/pipeline.py +205 -80
  434. zenml/models/v2/core/pipeline_build.py +110 -21
  435. zenml/models/v2/core/pipeline_deployment.py +101 -36
  436. zenml/models/v2/core/pipeline_run.py +545 -33
  437. zenml/models/v2/core/run_metadata.py +23 -181
  438. zenml/models/v2/core/run_template.py +439 -0
  439. zenml/models/v2/core/schedule.py +66 -29
  440. zenml/models/v2/core/secret.py +33 -21
  441. zenml/models/v2/core/server_settings.py +224 -0
  442. zenml/models/v2/core/service.py +500 -0
  443. zenml/models/v2/core/service_account.py +40 -15
  444. zenml/models/v2/core/service_connector.py +247 -49
  445. zenml/models/v2/core/stack.py +163 -70
  446. zenml/models/v2/core/step_run.py +210 -48
  447. zenml/models/v2/core/tag.py +21 -8
  448. zenml/models/v2/core/tag_resource.py +13 -4
  449. zenml/models/v2/core/trigger.py +422 -0
  450. zenml/models/v2/core/trigger_execution.py +119 -0
  451. zenml/models/v2/core/user.py +136 -69
  452. zenml/models/v2/core/workspace.py +26 -7
  453. zenml/models/v2/misc/auth_models.py +11 -2
  454. zenml/models/v2/misc/build_item.py +3 -3
  455. zenml/models/v2/misc/external_user.py +3 -6
  456. zenml/models/v2/misc/info_models.py +78 -0
  457. zenml/models/v2/misc/loaded_visualization.py +2 -2
  458. zenml/models/v2/misc/run_metadata.py +38 -0
  459. zenml/models/v2/misc/server_models.py +100 -0
  460. zenml/models/v2/misc/service_connector_type.py +9 -17
  461. zenml/models/v2/misc/stack_deployment.py +96 -0
  462. zenml/models/v2/misc/user_auth.py +7 -9
  463. zenml/orchestrators/__init__.py +4 -0
  464. zenml/orchestrators/base_orchestrator.py +136 -25
  465. zenml/orchestrators/containerized_orchestrator.py +1 -0
  466. zenml/orchestrators/dag_runner.py +18 -3
  467. zenml/orchestrators/input_utils.py +109 -48
  468. zenml/orchestrators/local/local_orchestrator.py +10 -0
  469. zenml/orchestrators/local_docker/local_docker_orchestrator.py +14 -42
  470. zenml/orchestrators/output_utils.py +16 -6
  471. zenml/orchestrators/publish_utils.py +12 -5
  472. zenml/orchestrators/step_launcher.py +142 -194
  473. zenml/orchestrators/step_run_utils.py +386 -0
  474. zenml/orchestrators/step_runner.py +181 -270
  475. zenml/orchestrators/utils.py +219 -84
  476. zenml/orchestrators/wheeled_orchestrator.py +147 -0
  477. zenml/pipelines/__init__.py +3 -16
  478. zenml/{new/pipelines → pipelines}/build_utils.py +287 -47
  479. zenml/{new/pipelines → pipelines}/pipeline_context.py +6 -2
  480. zenml/pipelines/pipeline_decorator.py +40 -64
  481. zenml/{new/pipelines/pipeline.py → pipelines/pipeline_definition.py} +376 -440
  482. zenml/pipelines/run_utils.py +358 -0
  483. zenml/plugins/__init__.py +0 -0
  484. zenml/plugins/base_plugin_flavor.py +88 -0
  485. zenml/plugins/plugin_flavor_registry.py +342 -0
  486. zenml/secret/base_secret.py +7 -8
  487. zenml/secret/schemas/basic_auth_secret_schema.py +0 -1
  488. zenml/service_connectors/docker_service_connector.py +19 -4
  489. zenml/service_connectors/service_connector.py +12 -14
  490. zenml/service_connectors/service_connector_registry.py +71 -55
  491. zenml/service_connectors/service_connector_utils.py +418 -0
  492. zenml/services/__init__.py +0 -2
  493. zenml/services/container/container_service.py +9 -6
  494. zenml/services/container/container_service_endpoint.py +1 -1
  495. zenml/services/container/entrypoint.py +3 -2
  496. zenml/services/local/local_daemon_entrypoint.py +9 -6
  497. zenml/services/local/local_service.py +1 -1
  498. zenml/services/local/local_service_endpoint.py +1 -1
  499. zenml/services/service.py +222 -130
  500. zenml/services/service_status.py +2 -1
  501. zenml/services/service_type.py +6 -5
  502. zenml/stack/flavor.py +25 -18
  503. zenml/stack/flavor_registry.py +4 -4
  504. zenml/stack/stack.py +20 -131
  505. zenml/stack/stack_component.py +136 -110
  506. zenml/stack/utils.py +36 -15
  507. zenml/stack_deployments/__init__.py +14 -0
  508. zenml/stack_deployments/aws_stack_deployment.py +320 -0
  509. zenml/stack_deployments/azure_stack_deployment.py +315 -0
  510. zenml/stack_deployments/gcp_stack_deployment.py +315 -0
  511. zenml/stack_deployments/stack_deployment.py +232 -0
  512. zenml/stack_deployments/utils.py +48 -0
  513. zenml/step_operators/step_operator_entrypoint_configuration.py +2 -1
  514. zenml/steps/__init__.py +3 -9
  515. zenml/steps/base_step.py +172 -315
  516. zenml/{new/steps → steps}/decorated_step.py +1 -0
  517. zenml/steps/entrypoint_function_utils.py +33 -93
  518. zenml/{new/steps → steps}/step_context.py +70 -50
  519. zenml/steps/step_decorator.py +47 -93
  520. zenml/steps/step_invocation.py +22 -60
  521. zenml/steps/utils.py +161 -48
  522. zenml/types.py +14 -1
  523. zenml/utils/archivable.py +178 -0
  524. zenml/utils/callback_registry.py +71 -0
  525. zenml/utils/code_repository_utils.py +1 -0
  526. zenml/utils/code_utils.py +346 -0
  527. zenml/utils/cuda_utils.py +50 -0
  528. zenml/utils/dashboard_utils.py +67 -21
  529. zenml/utils/deprecation_utils.py +22 -24
  530. zenml/utils/dict_utils.py +22 -0
  531. zenml/utils/docker_utils.py +34 -5
  532. zenml/utils/downloaded_repository_context.py +1 -0
  533. zenml/utils/env_utils.py +55 -1
  534. zenml/utils/filesync_model.py +65 -28
  535. zenml/utils/function_utils.py +260 -0
  536. zenml/utils/integration_utils.py +1 -0
  537. zenml/utils/json_utils.py +131 -0
  538. zenml/utils/materializer_utils.py +1 -1
  539. zenml/utils/metadata_utils.py +368 -0
  540. zenml/utils/notebook_utils.py +136 -0
  541. zenml/utils/package_utils.py +89 -0
  542. zenml/utils/pagination_utils.py +9 -7
  543. zenml/utils/pipeline_docker_image_builder.py +152 -149
  544. zenml/utils/pydantic_utils.py +276 -66
  545. zenml/utils/requirements_utils.py +71 -0
  546. zenml/utils/secret_utils.py +66 -12
  547. zenml/utils/settings_utils.py +2 -1
  548. zenml/utils/singleton.py +15 -3
  549. zenml/utils/source_code_utils.py +1 -0
  550. zenml/utils/source_utils.py +236 -14
  551. zenml/utils/string_utils.py +140 -0
  552. zenml/utils/typed_model.py +5 -3
  553. zenml/utils/typing_utils.py +223 -0
  554. zenml/utils/visualization_utils.py +5 -3
  555. zenml/utils/yaml_utils.py +1 -1
  556. zenml/zen_server/auth.py +387 -55
  557. zenml/zen_server/cache.py +208 -0
  558. zenml/zen_server/cloud_utils.py +253 -0
  559. zenml/zen_server/csrf.py +91 -0
  560. zenml/zen_server/dashboard/assets/404-Dfq64Boz.js +1 -0
  561. zenml/zen_server/dashboard/assets/@radix-DeK6qiuw.js +85 -0
  562. zenml/zen_server/dashboard/assets/@react-router-B3Z5rLr2.js +29 -0
  563. zenml/zen_server/dashboard/assets/@reactflow-BUNIMFeC.js +17 -0
  564. zenml/zen_server/dashboard/assets/@reactflow-C26Olbza.css +1 -0
  565. zenml/zen_server/dashboard/assets/@tanstack-DT5WLu9C.js +22 -0
  566. zenml/zen_server/dashboard/assets/AlertDialogDropdownItem-B73Vs10T.js +1 -0
  567. zenml/zen_server/dashboard/assets/CodeSnippet-Bbx6fIb6.css +1 -0
  568. zenml/zen_server/dashboard/assets/CodeSnippet-DIJRT2NT.js +9 -0
  569. zenml/zen_server/dashboard/assets/CollapsibleCard-BzUHGZOU.js +1 -0
  570. zenml/zen_server/dashboard/assets/Commands-BEGyld4c.js +1 -0
  571. zenml/zen_server/dashboard/assets/ComponentBadge-xyKiek1s.js +1 -0
  572. zenml/zen_server/dashboard/assets/CopyButton-DhW-mapu.js +2 -0
  573. zenml/zen_server/dashboard/assets/CsvVizualization-D8oazBiE.js +15 -0
  574. zenml/zen_server/dashboard/assets/DeleteAlertDialog-WkSIIgfy.js +1 -0
  575. zenml/zen_server/dashboard/assets/DialogItem-Bgroeg29.js +1 -0
  576. zenml/zen_server/dashboard/assets/DisplayDate-CDMUcQHS.js +1 -0
  577. zenml/zen_server/dashboard/assets/EmptyState-BzdlCwp3.js +1 -0
  578. zenml/zen_server/dashboard/assets/Error-CY5tlu17.js +1 -0
  579. zenml/zen_server/dashboard/assets/ExecutionStatus-G8mjIaeA.js +1 -0
  580. zenml/zen_server/dashboard/assets/Helpbox-Bb1ed--O.js +1 -0
  581. zenml/zen_server/dashboard/assets/Infobox-Da6-76M2.js +1 -0
  582. zenml/zen_server/dashboard/assets/InlineAvatar-DqnZaBNq.js +1 -0
  583. zenml/zen_server/dashboard/assets/Lock-CYYy18Mm.js +1 -0
  584. zenml/zen_server/dashboard/assets/MarkdownVisualization-ylXaAxev.js +14 -0
  585. zenml/zen_server/dashboard/assets/NestedCollapsible-aK5ojKoF.js +1 -0
  586. zenml/zen_server/dashboard/assets/NumberBox-Dtp3J6g5.js +1 -0
  587. zenml/zen_server/dashboard/assets/Partials-CqZp5NMX.js +1 -0
  588. zenml/zen_server/dashboard/assets/PasswordChecker-B0nadgh6.js +1 -0
  589. zenml/zen_server/dashboard/assets/ProBadge-B4tRUYve.js +1 -0
  590. zenml/zen_server/dashboard/assets/ProCta-CZuP29Qz.js +1 -0
  591. zenml/zen_server/dashboard/assets/ProviderIcon-Bd7GUQ1_.js +1 -0
  592. zenml/zen_server/dashboard/assets/ProviderRadio-mstdqzsS.js +1 -0
  593. zenml/zen_server/dashboard/assets/RunSelector-CsruSB4i.js +1 -0
  594. zenml/zen_server/dashboard/assets/RunsBody-DxxtWVYz.js +1 -0
  595. zenml/zen_server/dashboard/assets/SearchField-D6tPxyqw.js +1 -0
  596. zenml/zen_server/dashboard/assets/SecretTooltip-CLzJIYW_.js +1 -0
  597. zenml/zen_server/dashboard/assets/SetPassword-Yn50ooBC.js +1 -0
  598. zenml/zen_server/dashboard/assets/StackList-U537qoYd.js +1 -0
  599. zenml/zen_server/dashboard/assets/Tabs-CNv-eTYM.js +1 -0
  600. zenml/zen_server/dashboard/assets/Tick-jEIevzVf.js +1 -0
  601. zenml/zen_server/dashboard/assets/UpdatePasswordSchemas-C16GW-kX.js +1 -0
  602. zenml/zen_server/dashboard/assets/UsageReason-Bf2tzhv1.js +1 -0
  603. zenml/zen_server/dashboard/assets/WizardFooter-D6i-AP1K.js +1 -0
  604. zenml/zen_server/dashboard/assets/acp-DOsXjFc7.webp +0 -0
  605. zenml/zen_server/dashboard/assets/adam-e-y0WnB_.webp +0 -0
  606. zenml/zen_server/dashboard/assets/alex-DcCuDHPg.webp +0 -0
  607. zenml/zen_server/dashboard/assets/all-pipeline-runs-query-DUti43aF.js +1 -0
  608. zenml/zen_server/dashboard/assets/baris-C0ZrZ10g.webp +0 -0
  609. zenml/zen_server/dashboard/assets/check-DloQpStc.js +1 -0
  610. zenml/zen_server/dashboard/assets/check-circle-jNbX5-sR.js +1 -0
  611. zenml/zen_server/dashboard/assets/chevron-down-6JyMkfjR.js +1 -0
  612. zenml/zen_server/dashboard/assets/chevron-right-double-D7ojK9Co.js +1 -0
  613. zenml/zen_server/dashboard/assets/cloud-squares-DeRLMopf.svg +43 -0
  614. zenml/zen_server/dashboard/assets/code-browser-CUFUIHfp.js +1 -0
  615. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  616. zenml/zen_server/dashboard/assets/components-Br2ezRib.js +1 -0
  617. zenml/zen_server/dashboard/assets/connectors-video-C9qY4syJ.svg +21 -0
  618. zenml/zen_server/dashboard/assets/copy-C8XQA2Ug.js +1 -0
  619. zenml/zen_server/dashboard/assets/create-stack-Ch2WPs9U.js +1 -0
  620. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  621. zenml/zen_server/dashboard/assets/delete-run-Byf9hTjA.js +1 -0
  622. zenml/zen_server/dashboard/assets/docker-BdA9vrnW.js +1 -0
  623. zenml/zen_server/dashboard/assets/dots-horizontal-otGBOSDJ.js +1 -0
  624. zenml/zen_server/dashboard/assets/flyte-Cj-xy_8I.svg +10 -0
  625. zenml/zen_server/dashboard/assets/form-schemas-BZqKBPBF.js +1 -0
  626. zenml/zen_server/dashboard/assets/gcp-CFtm4BA7.js +1 -0
  627. zenml/zen_server/dashboard/assets/hamza-NKKOZz1I.webp +0 -0
  628. zenml/zen_server/dashboard/assets/help-Cc9bBIJH.js +1 -0
  629. zenml/zen_server/dashboard/assets/index-CE0aQlv8.js +55 -0
  630. zenml/zen_server/dashboard/assets/index-CtdYkjUi.js +1 -0
  631. zenml/zen_server/dashboard/assets/index-CyBKZcpO.js +1 -0
  632. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  633. zenml/zen_server/dashboard/assets/index-Uu49AX48.js +1 -0
  634. zenml/zen_server/dashboard/assets/index-v6gQjDEo.js +1 -0
  635. zenml/zen_server/dashboard/assets/index.esm-Dy6Z9Ung.js +1 -0
  636. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2 +0 -0
  637. zenml/zen_server/dashboard/assets/inter-cyrillic-400-normal-ZzOtrSSW.woff +0 -0
  638. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-D4Vwzodn.woff2 +0 -0
  639. zenml/zen_server/dashboard/assets/inter-cyrillic-500-normal-DH2hs3aW.woff +0 -0
  640. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BGBWG807.woff2 +0 -0
  641. zenml/zen_server/dashboard/assets/inter-cyrillic-600-normal-BuzJQFbW.woff +0 -0
  642. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-BPnxn4xp.woff +0 -0
  643. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2 +0 -0
  644. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-BShVwWPj.woff2 +0 -0
  645. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-500-normal-CUiC4oBV.woff +0 -0
  646. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-Bt9VVOA-.woff +0 -0
  647. zenml/zen_server/dashboard/assets/inter-cyrillic-ext-600-normal-CaqZN2hq.woff2 +0 -0
  648. zenml/zen_server/dashboard/assets/inter-greek-400-normal-BZzXV7-1.woff +0 -0
  649. zenml/zen_server/dashboard/assets/inter-greek-400-normal-DxZsaF_h.woff2 +0 -0
  650. zenml/zen_server/dashboard/assets/inter-greek-500-normal-CeQXL5ds.woff2 +0 -0
  651. zenml/zen_server/dashboard/assets/inter-greek-500-normal-d_eO-yCQ.woff +0 -0
  652. zenml/zen_server/dashboard/assets/inter-greek-600-normal-CwicyhtI.woff +0 -0
  653. zenml/zen_server/dashboard/assets/inter-greek-600-normal-Dhlb-90d.woff2 +0 -0
  654. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-Bput3-QP.woff2 +0 -0
  655. zenml/zen_server/dashboard/assets/inter-greek-ext-400-normal-DCpCPQOf.woff +0 -0
  656. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-B6guLgqG.woff2 +0 -0
  657. zenml/zen_server/dashboard/assets/inter-greek-ext-500-normal-M2hEX8vc.woff +0 -0
  658. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-C9WLioJ8.woff +0 -0
  659. zenml/zen_server/dashboard/assets/inter-greek-ext-600-normal-Cnui8OiR.woff2 +0 -0
  660. zenml/zen_server/dashboard/assets/inter-latin-400-normal-BOOGhInR.woff2 +0 -0
  661. zenml/zen_server/dashboard/assets/inter-latin-400-normal-gitzw0hO.woff +0 -0
  662. zenml/zen_server/dashboard/assets/inter-latin-500-normal-D2bGa7uu.woff2 +0 -0
  663. zenml/zen_server/dashboard/assets/inter-latin-500-normal-deR1Tlfd.woff +0 -0
  664. zenml/zen_server/dashboard/assets/inter-latin-600-normal-B5cFAncS.woff +0 -0
  665. zenml/zen_server/dashboard/assets/inter-latin-600-normal-D273HNI0.woff2 +0 -0
  666. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-C1t-h-pH.woff +0 -0
  667. zenml/zen_server/dashboard/assets/inter-latin-ext-400-normal-hnt3BR84.woff2 +0 -0
  668. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-CIS2RHJS.woff2 +0 -0
  669. zenml/zen_server/dashboard/assets/inter-latin-ext-500-normal-UMdmhHu2.woff +0 -0
  670. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-BnYJhD27.woff2 +0 -0
  671. zenml/zen_server/dashboard/assets/inter-latin-ext-600-normal-CAF0vJDd.woff +0 -0
  672. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-BUNmGMP1.woff +0 -0
  673. zenml/zen_server/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  674. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  675. zenml/zen_server/dashboard/assets/inter-vietnamese-500-normal-DQPw2Hwd.woff +0 -0
  676. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  677. zenml/zen_server/dashboard/assets/inter-vietnamese-600-normal-Cm6aH8_k.woff +0 -0
  678. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  679. zenml/zen_server/dashboard/assets/kubernetes-B2wmAJ1d.js +1 -0
  680. zenml/zen_server/dashboard/assets/layout-BtHBmE4w.js +1 -0
  681. zenml/zen_server/dashboard/assets/link-external-b9AXw_sW.js +1 -0
  682. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  683. zenml/zen_server/dashboard/assets/login-mutation-DNDVp_2H.js +1 -0
  684. zenml/zen_server/dashboard/assets/logs-WMSM52RF.js +1 -0
  685. zenml/zen_server/dashboard/assets/mcp-Cb1aMeoq.webp +0 -0
  686. zenml/zen_server/dashboard/assets/metaflow-weOkWNyT.svg +10 -0
  687. zenml/zen_server/dashboard/assets/not-found-Bmup4ctE.js +1 -0
  688. zenml/zen_server/dashboard/assets/package-C6uypY4h.js +1 -0
  689. zenml/zen_server/dashboard/assets/page--XLMzHrn.js +1 -0
  690. zenml/zen_server/dashboard/assets/page-ANYGfEUL.js +1 -0
  691. zenml/zen_server/dashboard/assets/page-B5Sr8pib.js +1 -0
  692. zenml/zen_server/dashboard/assets/page-BC27C_OI.js +2 -0
  693. zenml/zen_server/dashboard/assets/page-BNxYrN0q.js +1 -0
  694. zenml/zen_server/dashboard/assets/page-BYJfqgLN.js +1 -0
  695. zenml/zen_server/dashboard/assets/page-B_0XkV48.js +1 -0
  696. zenml/zen_server/dashboard/assets/page-BrmJp1Wt.js +1 -0
  697. zenml/zen_server/dashboard/assets/page-C2nU3Gxn.js +1 -0
  698. zenml/zen_server/dashboard/assets/page-C70wZtV2.js +1 -0
  699. zenml/zen_server/dashboard/assets/page-CHRn1fQm.js +1 -0
  700. zenml/zen_server/dashboard/assets/page-CWr96ZKN.js +1 -0
  701. zenml/zen_server/dashboard/assets/page-CXAbSyp9.js +1 -0
  702. zenml/zen_server/dashboard/assets/page-CaeI9ptC.js +1 -0
  703. zenml/zen_server/dashboard/assets/page-Cc8ZEuj4.js +1 -0
  704. zenml/zen_server/dashboard/assets/page-CltCNL0T.js +1 -0
  705. zenml/zen_server/dashboard/assets/page-CmlYj7Nl.js +1 -0
  706. zenml/zen_server/dashboard/assets/page-D6Ev5P8V.js +1 -0
  707. zenml/zen_server/dashboard/assets/page-D9Oh05fl.js +1 -0
  708. zenml/zen_server/dashboard/assets/page-DGlm1RVc.js +1 -0
  709. zenml/zen_server/dashboard/assets/page-DN4BVIOL.js +1 -0
  710. zenml/zen_server/dashboard/assets/page-Dif8CWyZ.js +1 -0
  711. zenml/zen_server/dashboard/assets/page-DlIi5ThM.js +1 -0
  712. zenml/zen_server/dashboard/assets/page-DoW7YxTu.js +1 -0
  713. zenml/zen_server/dashboard/assets/page-Dth9X1Ih.js +1 -0
  714. zenml/zen_server/dashboard/assets/page-DweqqCkF.js +1 -0
  715. zenml/zen_server/dashboard/assets/page-DyOJ_pq3.js +1 -0
  716. zenml/zen_server/dashboard/assets/page-Hn8q9iJZ.js +1 -0
  717. zenml/zen_server/dashboard/assets/page-IhckKFnD.js +6 -0
  718. zenml/zen_server/dashboard/assets/page-LyZ_l8vR.js +1 -0
  719. zenml/zen_server/dashboard/assets/page-PamGpk0j.js +1 -0
  720. zenml/zen_server/dashboard/assets/page-PxOWfKgF.js +2 -0
  721. zenml/zen_server/dashboard/assets/persist-DeXRG61d.js +1 -0
  722. zenml/zen_server/dashboard/assets/persist-vP0-Xl4f.js +1 -0
  723. zenml/zen_server/dashboard/assets/plus-tf1V2hTJ.js +1 -0
  724. zenml/zen_server/dashboard/assets/refresh-BjOeWlEq.js +1 -0
  725. zenml/zen_server/dashboard/assets/repos-video-D8kpu60k.svg +9 -0
  726. zenml/zen_server/dashboard/assets/rocket-DjT2cDvG.js +1 -0
  727. zenml/zen_server/dashboard/assets/service-DH_oUqQj.js +2 -0
  728. zenml/zen_server/dashboard/assets/settings_preview-0JLrRgHP.webp +0 -0
  729. zenml/zen_server/dashboard/assets/sharedSchema-Bw1_Wa7l.js +14 -0
  730. zenml/zen_server/dashboard/assets/stack-detail-query-B_0R_fd6.js +1 -0
  731. zenml/zen_server/dashboard/assets/stefan-B08Ftbba.webp +0 -0
  732. zenml/zen_server/dashboard/assets/templates-1S_8WeSK.webp +0 -0
  733. zenml/zen_server/dashboard/assets/tick-circle-BEX_Tp4v.js +1 -0
  734. zenml/zen_server/dashboard/assets/tour-cover-BYfeen6M.webp +0 -0
  735. zenml/zen_server/dashboard/assets/trash-arLUMWMS.js +1 -0
  736. zenml/zen_server/dashboard/assets/update-server-settings-mutation-D9qYhfaN.js +1 -0
  737. zenml/zen_server/dashboard/assets/upgrade-form-CwRHBuXB.webp +0 -0
  738. zenml/zen_server/dashboard/assets/url-Dh93fvh0.js +1 -0
  739. zenml/zen_server/dashboard/assets/zod-BwEbpOxH.js +1 -0
  740. zenml/zen_server/dashboard/index.html +19 -1
  741. zenml/zen_server/deploy/__init__.py +7 -16
  742. zenml/zen_server/deploy/base_provider.py +49 -78
  743. zenml/zen_server/deploy/{local → daemon}/__init__.py +3 -3
  744. zenml/zen_server/deploy/{local/local_provider.py → daemon/daemon_provider.py} +48 -66
  745. zenml/zen_server/deploy/{local/local_zen_server.py → daemon/daemon_zen_server.py} +78 -62
  746. zenml/zen_server/deploy/deployer.py +94 -175
  747. zenml/zen_server/deploy/deployment.py +23 -17
  748. zenml/zen_server/deploy/docker/docker_provider.py +15 -31
  749. zenml/zen_server/deploy/docker/docker_zen_server.py +30 -35
  750. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  751. zenml/zen_server/deploy/helm/README.md +3 -13
  752. zenml/zen_server/deploy/helm/templates/NOTES.txt +23 -7
  753. zenml/zen_server/deploy/helm/templates/_environment.tpl +175 -23
  754. zenml/zen_server/deploy/helm/templates/server-db-job.yaml +45 -18
  755. zenml/zen_server/deploy/helm/templates/server-db-pvc.yaml +25 -0
  756. zenml/zen_server/deploy/helm/templates/server-deployment.yaml +22 -6
  757. zenml/zen_server/deploy/helm/templates/server-secret.yaml +11 -10
  758. zenml/zen_server/deploy/helm/values.yaml +210 -28
  759. zenml/zen_server/exceptions.py +20 -1
  760. zenml/zen_server/feature_gate/__init__.py +13 -0
  761. zenml/zen_server/feature_gate/endpoint_utils.py +61 -0
  762. zenml/zen_server/feature_gate/feature_gate_interface.py +49 -0
  763. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +125 -0
  764. zenml/zen_server/jwt.py +64 -32
  765. zenml/zen_server/rate_limit.py +200 -0
  766. zenml/zen_server/rbac/endpoint_utils.py +92 -9
  767. zenml/zen_server/rbac/models.py +21 -17
  768. zenml/zen_server/rbac/rbac_sql_zen_store.py +175 -0
  769. zenml/zen_server/rbac/utils.py +71 -30
  770. zenml/zen_server/rbac/zenml_cloud_rbac.py +13 -188
  771. zenml/zen_server/routers/actions_endpoints.py +324 -0
  772. zenml/zen_server/routers/artifact_version_endpoints.py +28 -2
  773. zenml/zen_server/routers/auth_endpoints.py +249 -131
  774. zenml/zen_server/routers/code_repositories_endpoints.py +1 -0
  775. zenml/zen_server/routers/devices_endpoints.py +56 -49
  776. zenml/zen_server/routers/event_source_endpoints.py +327 -0
  777. zenml/zen_server/routers/logs_endpoints.py +66 -0
  778. zenml/zen_server/routers/model_versions_endpoints.py +59 -0
  779. zenml/zen_server/routers/models_endpoints.py +7 -1
  780. zenml/zen_server/routers/pipeline_builds_endpoints.py +6 -1
  781. zenml/zen_server/routers/pipeline_deployments_endpoints.py +35 -0
  782. zenml/zen_server/routers/pipelines_endpoints.py +19 -32
  783. zenml/zen_server/routers/plugin_endpoints.py +107 -0
  784. zenml/zen_server/routers/run_templates_endpoints.py +212 -0
  785. zenml/zen_server/routers/runs_endpoints.py +91 -32
  786. zenml/zen_server/routers/schedule_endpoints.py +1 -0
  787. zenml/zen_server/routers/secrets_endpoints.py +4 -2
  788. zenml/zen_server/routers/server_endpoints.py +186 -4
  789. zenml/zen_server/routers/service_connectors_endpoints.py +56 -0
  790. zenml/zen_server/routers/service_endpoints.py +180 -0
  791. zenml/zen_server/routers/stack_components_endpoints.py +2 -1
  792. zenml/zen_server/routers/stack_deployment_endpoints.py +164 -0
  793. zenml/zen_server/routers/steps_endpoints.py +21 -12
  794. zenml/zen_server/routers/triggers_endpoints.py +336 -0
  795. zenml/zen_server/routers/users_endpoints.py +280 -45
  796. zenml/zen_server/routers/webhook_endpoints.py +127 -0
  797. zenml/zen_server/routers/workspaces_endpoints.py +220 -185
  798. zenml/zen_server/secure_headers.py +120 -0
  799. zenml/{new → zen_server/template_execution}/__init__.py +1 -1
  800. zenml/zen_server/template_execution/runner_entrypoint_configuration.py +42 -0
  801. zenml/zen_server/template_execution/utils.py +474 -0
  802. zenml/zen_server/template_execution/workload_manager_interface.py +92 -0
  803. zenml/zen_server/utils.py +374 -74
  804. zenml/zen_server/zen_server_api.py +299 -52
  805. zenml/zen_stores/base_zen_store.py +90 -58
  806. zenml/zen_stores/migrations/alembic.py +22 -9
  807. zenml/zen_stores/migrations/env.py +2 -2
  808. zenml/zen_stores/migrations/utils.py +731 -0
  809. zenml/zen_stores/migrations/versions/0.21.0_release.py +0 -1
  810. zenml/zen_stores/migrations/versions/0.21.1_release.py +0 -1
  811. zenml/zen_stores/migrations/versions/0.22.0_release.py +0 -1
  812. zenml/zen_stores/migrations/versions/0.23.0_release.py +0 -1
  813. zenml/zen_stores/migrations/versions/0.30.0_release.py +0 -1
  814. zenml/zen_stores/migrations/versions/0.31.0_release.py +0 -1
  815. zenml/zen_stores/migrations/versions/0.31.1_release.py +0 -1
  816. zenml/zen_stores/migrations/versions/0.32.0_release.py +0 -1
  817. zenml/zen_stores/migrations/versions/0.32.1_release.py +0 -1
  818. zenml/zen_stores/migrations/versions/0.33.0_release.py +0 -1
  819. zenml/zen_stores/migrations/versions/0.34.0_release.py +0 -1
  820. zenml/zen_stores/migrations/versions/0.35.0_release.py +0 -1
  821. zenml/zen_stores/migrations/versions/0.35.1_release.py +0 -1
  822. zenml/zen_stores/migrations/versions/0.36.0_release.py +0 -1
  823. zenml/zen_stores/migrations/versions/0.36.1_release.py +0 -1
  824. zenml/zen_stores/migrations/versions/0.37.0_release.py +0 -1
  825. zenml/zen_stores/migrations/versions/0.38.0_release.py +0 -1
  826. zenml/zen_stores/migrations/versions/0.39.0_release.py +0 -1
  827. zenml/zen_stores/migrations/versions/0.39.1_release.py +0 -1
  828. zenml/zen_stores/migrations/versions/0.40.0_release.py +0 -1
  829. zenml/zen_stores/migrations/versions/0.40.1_release.py +0 -1
  830. zenml/zen_stores/migrations/versions/0.40.2_release.py +0 -1
  831. zenml/zen_stores/migrations/versions/0.40.3_release.py +0 -1
  832. zenml/zen_stores/migrations/versions/0.41.0_release.py +0 -1
  833. zenml/zen_stores/migrations/versions/0.42.0_release.py +0 -1
  834. zenml/zen_stores/migrations/versions/0.42.1_release.py +0 -1
  835. zenml/zen_stores/migrations/versions/0.43.0_release.py +0 -1
  836. zenml/zen_stores/migrations/versions/0.44.0_release.py +0 -1
  837. zenml/zen_stores/migrations/versions/0.44.1_release.py +0 -1
  838. zenml/zen_stores/migrations/versions/0.44.2_release.py +0 -1
  839. zenml/zen_stores/migrations/versions/0.44.3_release.py +0 -1
  840. zenml/zen_stores/migrations/versions/0.45.0_release.py +0 -1
  841. zenml/zen_stores/migrations/versions/0.45.1_release_0_45_1.py +0 -1
  842. zenml/zen_stores/migrations/versions/0.45.2_release.py +0 -1
  843. zenml/zen_stores/migrations/versions/0.45.3_release.py +0 -1
  844. zenml/zen_stores/migrations/versions/0.45.4_release.py +0 -1
  845. zenml/zen_stores/migrations/versions/0.45.5_release.py +0 -1
  846. zenml/zen_stores/migrations/versions/0.45.6_release.py +0 -1
  847. zenml/zen_stores/migrations/versions/0.46.0_release.py +0 -1
  848. zenml/zen_stores/migrations/versions/0.46.1_release.py +0 -1
  849. zenml/zen_stores/migrations/versions/0.47.0_release.py +0 -1
  850. zenml/zen_stores/migrations/versions/0.50.0_release.py +0 -1
  851. zenml/zen_stores/migrations/versions/0.51.0_release.py +0 -1
  852. zenml/zen_stores/migrations/versions/0.52.0_release.py +0 -1
  853. zenml/zen_stores/migrations/versions/0.53.0_release.py +0 -1
  854. zenml/zen_stores/migrations/versions/0.53.1_release.py +0 -1
  855. zenml/zen_stores/migrations/versions/0.54.0_release.py +0 -1
  856. zenml/zen_stores/migrations/versions/0.54.1_release.py +0 -1
  857. zenml/zen_stores/migrations/versions/0.55.0_release.py +0 -1
  858. zenml/zen_stores/migrations/versions/0.55.1_release.py +23 -0
  859. zenml/zen_stores/migrations/versions/0.55.2_release.py +23 -0
  860. zenml/zen_stores/migrations/versions/0.55.3_release.py +23 -0
  861. zenml/zen_stores/migrations/versions/0.55.4_release.py +23 -0
  862. zenml/zen_stores/migrations/versions/0.55.5_release.py +23 -0
  863. zenml/zen_stores/migrations/versions/0.56.0_release.py +23 -0
  864. zenml/zen_stores/migrations/versions/0.56.1_release.py +23 -0
  865. zenml/zen_stores/migrations/versions/0.56.2_release.py +23 -0
  866. zenml/zen_stores/migrations/versions/0.56.3_release.py +23 -0
  867. zenml/zen_stores/migrations/versions/0.56.4_release.py +23 -0
  868. zenml/zen_stores/migrations/versions/0.57.0.rc1_release.py +23 -0
  869. zenml/zen_stores/migrations/versions/0.57.0.rc2_release.py +23 -0
  870. zenml/zen_stores/migrations/versions/0.57.0_release.py +23 -0
  871. zenml/zen_stores/migrations/versions/0.57.1_release.py +23 -0
  872. zenml/zen_stores/migrations/versions/0.58.0_release.py +23 -0
  873. zenml/zen_stores/migrations/versions/0.58.1_release.py +23 -0
  874. zenml/zen_stores/migrations/versions/0.58.2_release.py +23 -0
  875. zenml/zen_stores/migrations/versions/0.60.0_release.py +23 -0
  876. zenml/zen_stores/migrations/versions/0.61.0_release.py +23 -0
  877. zenml/zen_stores/migrations/versions/0.62.0_release.py +23 -0
  878. zenml/zen_stores/migrations/versions/0.63.0_release.py +23 -0
  879. zenml/zen_stores/migrations/versions/0.64.0_release.py +23 -0
  880. zenml/zen_stores/migrations/versions/0.65.0_release.py +23 -0
  881. zenml/zen_stores/migrations/versions/0.66.0_release.py +23 -0
  882. zenml/zen_stores/migrations/versions/0.67.0_release.py +23 -0
  883. zenml/zen_stores/migrations/versions/0.68.0_release.py +23 -0
  884. zenml/zen_stores/migrations/versions/0.68.1_release.py +23 -0
  885. zenml/zen_stores/migrations/versions/0.70.0_release.py +23 -0
  886. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  887. zenml/zen_stores/migrations/versions/0.72.0_release.py +23 -0
  888. zenml/zen_stores/migrations/versions/026d4577b6a0_add_code_path.py +39 -0
  889. zenml/zen_stores/migrations/versions/03742aa7fdd7_add_secrets.py +1 -0
  890. zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +94 -0
  891. zenml/zen_stores/migrations/versions/0b06faa59c93_add_service_connectors.py +1 -0
  892. zenml/zen_stores/migrations/versions/0d707865f404_adding_labels_to_stacks.py +30 -0
  893. zenml/zen_stores/migrations/versions/0e4735b23577_increase_pipeline_spec_field_length.py +1 -0
  894. zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +6 -3
  895. zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +2 -1
  896. zenml/zen_stores/migrations/versions/14d687c8fa1c_rename_model_config_to_model_version.py +1 -0
  897. zenml/zen_stores/migrations/versions/19f27d5b234e_add_build_and_deployment_tables.py +1 -0
  898. zenml/zen_stores/migrations/versions/1a9a9d2a836d_admin_users.py +56 -0
  899. zenml/zen_stores/migrations/versions/1ac1b9c04da1_make_secrets_values_optional.py +1 -0
  900. zenml/zen_stores/migrations/versions/1cb6477f72d6_move_artifact_save_type.py +99 -0
  901. zenml/zen_stores/migrations/versions/1d74e596abb8_add_run_once_start_time_to_schedule.py +36 -0
  902. zenml/zen_stores/migrations/versions/1d8f30c54477_migrate_to_new_.py +124 -0
  903. zenml/zen_stores/migrations/versions/248dfd320b68_update_size_of_flavor_config_schema.py +1 -0
  904. zenml/zen_stores/migrations/versions/25155145c545_separate_actions_and_triggers.py +228 -0
  905. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  906. zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +9 -10
  907. zenml/zen_stores/migrations/versions/2d201872e23c_remove_db_dependency_loop.py +29 -0
  908. zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +4 -3
  909. zenml/zen_stores/migrations/versions/389046140cad_data_versioning.py +1 -0
  910. zenml/zen_stores/migrations/versions/3944116bbd56_rename_project_to_workspace.py +1 -0
  911. zenml/zen_stores/migrations/versions/3b68abe58f44_add_model_watchtower_entities.py +1 -0
  912. zenml/zen_stores/migrations/versions/3c5a367730c2_add_environment_info_to_runs.py +1 -0
  913. zenml/zen_stores/migrations/versions/3dcc5d20e82f_add_last_user_activity.py +51 -0
  914. zenml/zen_stores/migrations/versions/43a86093b60e_add_labels_for_stack_components.py +1 -0
  915. zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +123 -0
  916. zenml/zen_stores/migrations/versions/479103df60b6_add_triggers.py +162 -0
  917. zenml/zen_stores/migrations/versions/4a3087070f4e_add_step_source_code.py +1 -0
  918. zenml/zen_stores/migrations/versions/4c41c0ca42db_add_code_repository_table.py +1 -0
  919. zenml/zen_stores/migrations/versions/4d688d8f7aff_rename_model_version_to_model.py +1 -0
  920. zenml/zen_stores/migrations/versions/4e1972485075_endpoint_artifact_deployment_artifact.py +1 -0
  921. zenml/zen_stores/migrations/versions/4f66af55fbb9_rename_model_config_model_to_model_.py +1 -0
  922. zenml/zen_stores/migrations/versions/5330ba58bf20_rename_tables_and_foreign_keys.py +8 -9
  923. zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +4 -2
  924. zenml/zen_stores/migrations/versions/5cc3f41cf048_add_save_models_to_registry.py +1 -0
  925. zenml/zen_stores/migrations/versions/6119cd9b93c2_tags_table.py +1 -0
  926. zenml/zen_stores/migrations/versions/623a234c11f5_add_sdk_docs_url_to_flavors.py +1 -0
  927. zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +5 -4
  928. zenml/zen_stores/migrations/versions/6a28c4fd0ef2_add_caching_info.py +1 -0
  929. zenml/zen_stores/migrations/versions/6f707b385dc1_fix_model_artifacts.py +1 -0
  930. zenml/zen_stores/migrations/versions/722392c91006_make_is_service_account_mandatory.py +1 -0
  931. zenml/zen_stores/migrations/versions/72675226b2de_unique_users.py +31 -0
  932. zenml/zen_stores/migrations/versions/72722dee4686_track_server_version.py +1 -0
  933. zenml/zen_stores/migrations/versions/7280c14811d6_use_text_type.py +1 -0
  934. zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +4 -2
  935. zenml/zen_stores/migrations/versions/729263e47b55_fix_external_input_artifacts.py +1 -0
  936. zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +3 -2
  937. zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +4 -2
  938. zenml/zen_stores/migrations/versions/76a7b9451ccd_add_build_template_deployment_id.py +52 -0
  939. zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +9 -7
  940. zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +7 -7
  941. zenml/zen_stores/migrations/versions/7d1919bb1ef0_add_run_templates.py +100 -0
  942. zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +3 -2
  943. zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +2 -1
  944. zenml/zen_stores/migrations/versions/86fa52918b54_remove_teams_and_roles.py +1 -0
  945. zenml/zen_stores/migrations/versions/8a64fbfecda0_add_num_outputs_to_run_step.py +1 -0
  946. zenml/zen_stores/migrations/versions/8ed03137cacc_polymorthic_run_metadata.py +1 -0
  947. zenml/zen_stores/migrations/versions/904464ea4041_add_pipeline_model_run_unique_constraints.py +192 -0
  948. zenml/zen_stores/migrations/versions/909550c7c4da_remove_user_hub_token.py +36 -0
  949. zenml/zen_stores/migrations/versions/93cbda80a732_add_service_accounts.py +1 -0
  950. zenml/zen_stores/migrations/versions/979eff8fc4b1_add_code_repo_description_and_logo_url.py +1 -0
  951. zenml/zen_stores/migrations/versions/9971237fa937_artifact_visualizations.py +1 -0
  952. zenml/zen_stores/migrations/versions/9d8020441014_increase_step_configuration_length.py +1 -0
  953. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  954. zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +3 -2
  955. zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +5 -4
  956. zenml/zen_stores/migrations/versions/ade72effebaf_added_logs_table.py +1 -0
  957. zenml/zen_stores/migrations/versions/alembic_start.py +2 -1
  958. zenml/zen_stores/migrations/versions/b4eccf34dfa3_add_hub_token_to_user_model.py +1 -0
  959. zenml/zen_stores/migrations/versions/b4fca5241eea_migrate_onboarding_state.py +167 -0
  960. zenml/zen_stores/migrations/versions/b557b2871693_update_step_run_input_types.py +33 -0
  961. zenml/zen_stores/migrations/versions/b59aa68fdb1f_simplify_pipelines.py +139 -0
  962. zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
  963. zenml/zen_stores/migrations/versions/bf2120261b5a_add_configured_model_version_id.py +74 -0
  964. zenml/zen_stores/migrations/versions/c1b18cec3a48_increase_length_on_flavor_config_schema.py +1 -0
  965. zenml/zen_stores/migrations/versions/c22561cbb3a9_add_artifact_unique_constraints.py +86 -0
  966. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
  967. zenml/zen_stores/migrations/versions/cc9894cb58aa_add_user_metadata.py +41 -0
  968. zenml/zen_stores/migrations/versions/ccd68b7825ae_add_status_to_pipeline_and_step_run.py +1 -0
  969. zenml/zen_stores/migrations/versions/d02b3d3464cf_add_orchestrator_run_id_column.py +1 -0
  970. zenml/zen_stores/migrations/versions/d26471b6fe8f_update_build_filtering.py +1 -0
  971. zenml/zen_stores/migrations/versions/d7b3acf9aa46_create_schedule_table.py +1 -0
  972. zenml/zen_stores/migrations/versions/e1d66d91a099_add_stack_and_component_spec_paths_to_.py +1 -0
  973. zenml/zen_stores/migrations/versions/e5225281b4d3_add_connector_skew_tolerance.py +1 -0
  974. zenml/zen_stores/migrations/versions/e65aa6708ff7_pipeline_versioning.py +1 -0
  975. zenml/zen_stores/migrations/versions/ec0d785ca296_create_run_metadata_table.py +1 -0
  976. zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +119 -0
  977. zenml/zen_stores/migrations/versions/f3b3964e3a0f_add_oauth_devices.py +1 -0
  978. zenml/zen_stores/migrations/versions/f49904a80aa7_increase_length_of_artifact_table_sources.py +1 -0
  979. zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +5 -4
  980. zenml/zen_stores/rest_zen_store.py +1326 -305
  981. zenml/zen_stores/schemas/__init__.py +22 -3
  982. zenml/zen_stores/schemas/action_schemas.py +192 -0
  983. zenml/zen_stores/schemas/api_key_schemas.py +23 -10
  984. zenml/zen_stores/schemas/artifact_schemas.py +112 -49
  985. zenml/zen_stores/schemas/artifact_visualization_schemas.py +17 -8
  986. zenml/zen_stores/schemas/base_schemas.py +27 -0
  987. zenml/zen_stores/schemas/code_repository_schemas.py +25 -10
  988. zenml/zen_stores/schemas/component_schemas.py +74 -11
  989. zenml/zen_stores/schemas/constants.py +16 -0
  990. zenml/zen_stores/schemas/device_schemas.py +29 -15
  991. zenml/zen_stores/schemas/event_source_schemas.py +188 -0
  992. zenml/zen_stores/schemas/flavor_schemas.py +19 -9
  993. zenml/zen_stores/schemas/logs_schemas.py +12 -6
  994. zenml/zen_stores/schemas/model_schemas.py +192 -139
  995. zenml/zen_stores/schemas/pipeline_build_schemas.py +16 -16
  996. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +58 -17
  997. zenml/zen_stores/schemas/pipeline_run_schemas.py +170 -35
  998. zenml/zen_stores/schemas/pipeline_schemas.py +51 -33
  999. zenml/zen_stores/schemas/run_metadata_schemas.py +28 -78
  1000. zenml/zen_stores/schemas/run_template_schemas.py +267 -0
  1001. zenml/zen_stores/schemas/schedule_schema.py +15 -5
  1002. zenml/zen_stores/schemas/secret_schemas.py +18 -10
  1003. zenml/zen_stores/schemas/server_settings_schemas.py +129 -0
  1004. zenml/zen_stores/schemas/service_connector_schemas.py +13 -6
  1005. zenml/zen_stores/schemas/service_schemas.py +258 -0
  1006. zenml/zen_stores/schemas/stack_schemas.py +23 -6
  1007. zenml/zen_stores/schemas/step_run_schemas.py +132 -41
  1008. zenml/zen_stores/schemas/tag_schemas.py +31 -50
  1009. zenml/zen_stores/schemas/trigger_schemas.py +316 -0
  1010. zenml/zen_stores/schemas/user_schemas.py +66 -23
  1011. zenml/zen_stores/schemas/utils.py +112 -0
  1012. zenml/zen_stores/schemas/workspace_schemas.py +36 -19
  1013. zenml/zen_stores/secrets_stores/aws_secrets_store.py +41 -32
  1014. zenml/zen_stores/secrets_stores/azure_secrets_store.py +20 -23
  1015. zenml/zen_stores/secrets_stores/base_secrets_store.py +80 -12
  1016. zenml/zen_stores/secrets_stores/gcp_secrets_store.py +42 -33
  1017. zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +7 -11
  1018. zenml/zen_stores/secrets_stores/secrets_store_interface.py +1 -0
  1019. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +15 -8
  1020. zenml/zen_stores/secrets_stores/sql_secrets_store.py +8 -9
  1021. zenml/zen_stores/sql_zen_store.py +4062 -799
  1022. zenml/zen_stores/template_utils.py +263 -0
  1023. zenml/zen_stores/zen_store_interface.py +614 -44
  1024. zenml_nightly-0.72.0.dev20250116.dist-info/METADATA +486 -0
  1025. zenml_nightly-0.72.0.dev20250116.dist-info/RECORD +1294 -0
  1026. {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/WHEEL +1 -1
  1027. CLA.md +0 -110
  1028. CODE-OF-CONDUCT.md +0 -132
  1029. CONTRIBUTING.md +0 -260
  1030. README.md +0 -304
  1031. RELEASE_NOTES.md +0 -3919
  1032. ROADMAP.md +0 -5
  1033. SECURITY.md +0 -15
  1034. zenml/_hub/client.py +0 -285
  1035. zenml/_hub/constants.py +0 -21
  1036. zenml/_hub/utils.py +0 -80
  1037. zenml/api.py +0 -61
  1038. zenml/cli/hub.py +0 -1115
  1039. zenml/cli/stack_recipes.py +0 -469
  1040. zenml/integrations/gcp/google_cloud_function.py +0 -187
  1041. zenml/integrations/gcp/google_cloud_scheduler.py +0 -83
  1042. zenml/integrations/gcp/orchestrators/vertex_scheduler/main.py +0 -91
  1043. zenml/integrations/gcp/orchestrators/vertex_scheduler/requirements.txt +0 -2
  1044. zenml/integrations/kserve/__init__.py +0 -57
  1045. zenml/integrations/kserve/custom_deployer/zenml_custom_model.py +0 -175
  1046. zenml/integrations/kserve/flavors/kserve_model_deployer_flavor.py +0 -137
  1047. zenml/integrations/kserve/model_deployers/kserve_model_deployer.py +0 -1003
  1048. zenml/integrations/kserve/secret_schemas/secret_schemas.py +0 -65
  1049. zenml/integrations/kserve/services/kserve_deployment.py +0 -596
  1050. zenml/integrations/kserve/steps/__init__.py +0 -22
  1051. zenml/integrations/kserve/steps/kserve_deployer.py +0 -472
  1052. zenml/integrations/kserve/steps/kserve_step_utils.py +0 -293
  1053. zenml/integrations/kubeflow/utils.py +0 -96
  1054. zenml/lineage_graph/lineage_graph.py +0 -244
  1055. zenml/lineage_graph/node/artifact_node.py +0 -52
  1056. zenml/lineage_graph/node/step_node.py +0 -41
  1057. zenml/models/v2/base/internal.py +0 -37
  1058. zenml/models/v2/base/update.py +0 -40
  1059. zenml/models/v2/misc/hub_plugin_models.py +0 -79
  1060. zenml/new/pipelines/deserialization_utils.py +0 -291
  1061. zenml/new/pipelines/model_utils.py +0 -72
  1062. zenml/new/pipelines/pipeline_decorator.py +0 -109
  1063. zenml/new/steps/step_decorator.py +0 -160
  1064. zenml/pipelines/base_pipeline.py +0 -274
  1065. zenml/post_execution/pipeline.py +0 -58
  1066. zenml/post_execution/pipeline_run.py +0 -55
  1067. zenml/services/service_registry.py +0 -214
  1068. zenml/services/terraform/__init__.py +0 -14
  1069. zenml/services/terraform/terraform_service.py +0 -441
  1070. zenml/steps/step_environment.py +0 -108
  1071. zenml/steps/step_output.py +0 -36
  1072. zenml/utils/mlstacks_utils.py +0 -635
  1073. zenml/utils/terraform_utils.py +0 -42
  1074. zenml/zen_server/dashboard/_redirects +0 -1
  1075. zenml/zen_server/dashboard/asset-manifest.json +0 -131
  1076. zenml/zen_server/dashboard/manifest.json +0 -25
  1077. zenml/zen_server/dashboard/precache-manifest.c139638dcc4d9d3425353266447a2fad.js +0 -462
  1078. zenml/zen_server/dashboard/robots.txt +0 -2
  1079. zenml/zen_server/dashboard/service-worker.js +0 -39
  1080. zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css +0 -16
  1081. zenml/zen_server/dashboard/static/css/2.5b37d44a.chunk.css.map +0 -1
  1082. zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css +0 -2
  1083. zenml/zen_server/dashboard/static/css/main.77e46c35.chunk.css.map +0 -1
  1084. zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js +0 -3
  1085. zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.LICENSE.txt +0 -95
  1086. zenml/zen_server/dashboard/static/js/2.bb4cef22.chunk.js.map +0 -1
  1087. zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js +0 -2
  1088. zenml/zen_server/dashboard/static/js/main.270838b4.chunk.js.map +0 -1
  1089. zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js +0 -2
  1090. zenml/zen_server/dashboard/static/js/runtime-main.bfca2edd.js.map +0 -1
  1091. zenml/zen_server/dashboard/static/media/AlertTriangle.28aee535.svg +0 -5
  1092. zenml/zen_server/dashboard/static/media/ArrowSquareOut.abfb9bc7.svg +0 -5
  1093. zenml/zen_server/dashboard/static/media/Back.86c23a22.svg +0 -4
  1094. zenml/zen_server/dashboard/static/media/BookOpen.5cb101ff.svg +0 -4
  1095. zenml/zen_server/dashboard/static/media/BoundingBox.1eb98717.svg +0 -10
  1096. zenml/zen_server/dashboard/static/media/Burger.9b1c67d7.svg +0 -3
  1097. zenml/zen_server/dashboard/static/media/Cached.2381fb8d.svg +0 -1
  1098. zenml/zen_server/dashboard/static/media/Calendar.356e11c7.svg +0 -3
  1099. zenml/zen_server/dashboard/static/media/ChartBarHorizontal.0247447b.svg +0 -6
  1100. zenml/zen_server/dashboard/static/media/ChartLine.0d79e18d.svg +0 -4
  1101. zenml/zen_server/dashboard/static/media/ChatDots.2e1c9211.svg +0 -6
  1102. zenml/zen_server/dashboard/static/media/Check.dad6beb2.svg +0 -3
  1103. zenml/zen_server/dashboard/static/media/CheckCircleFilled.c19566d0.svg +0 -3
  1104. zenml/zen_server/dashboard/static/media/Checkbox.af50e31e.svg +0 -3
  1105. zenml/zen_server/dashboard/static/media/ChevronDown.f860ce32.svg +0 -3
  1106. zenml/zen_server/dashboard/static/media/ChevronDownLight.6642d756.svg +0 -3
  1107. zenml/zen_server/dashboard/static/media/ChevronLeft.f6edfcdb.svg +0 -3
  1108. zenml/zen_server/dashboard/static/media/CircleCheck.f98fd6ca.svg +0 -1
  1109. zenml/zen_server/dashboard/static/media/Clock.ffc9de95.svg +0 -3
  1110. zenml/zen_server/dashboard/static/media/Close.74e9efbc.svg +0 -5
  1111. zenml/zen_server/dashboard/static/media/CloseWithBorder.6960930a.svg +0 -3
  1112. zenml/zen_server/dashboard/static/media/CloseWithoutBorder.cd6f71df.svg +0 -3
  1113. zenml/zen_server/dashboard/static/media/CloudArrowUp.0aecb235.svg +0 -6
  1114. zenml/zen_server/dashboard/static/media/Code.ef0f33b5.svg +0 -3
  1115. zenml/zen_server/dashboard/static/media/Config.0be63f8a.svg +0 -1
  1116. zenml/zen_server/dashboard/static/media/Connector.9fd46ef1.svg +0 -10
  1117. zenml/zen_server/dashboard/static/media/Copy.36e2112a.svg +0 -1
  1118. zenml/zen_server/dashboard/static/media/Dashboard.d05787e0.svg +0 -3
  1119. zenml/zen_server/dashboard/static/media/Data.b1c3b5f8.svg +0 -3
  1120. zenml/zen_server/dashboard/static/media/Delete.3c361b28.svg +0 -8
  1121. zenml/zen_server/dashboard/static/media/Docs.7541d478.svg +0 -7
  1122. zenml/zen_server/dashboard/static/media/Download.fba04d87.svg +0 -5
  1123. zenml/zen_server/dashboard/static/media/Edit.490eb294.svg +0 -6
  1124. zenml/zen_server/dashboard/static/media/EmptyRightArrow.23749d01.svg +0 -3
  1125. zenml/zen_server/dashboard/static/media/Example.6396cd37.svg +0 -5
  1126. zenml/zen_server/dashboard/static/media/Extension.1394cd4a.svg +0 -3
  1127. zenml/zen_server/dashboard/static/media/Eye.d9e4ee62.svg +0 -4
  1128. zenml/zen_server/dashboard/static/media/Failed.0213c1a0.svg +0 -1
  1129. zenml/zen_server/dashboard/static/media/FileText.1f15bacd.svg +0 -7
  1130. zenml/zen_server/dashboard/static/media/Filter.ab6b9c0d.svg +0 -3
  1131. zenml/zen_server/dashboard/static/media/Folders.12b29887.svg +0 -5
  1132. zenml/zen_server/dashboard/static/media/FunnelFill.6df4c143.svg +0 -3
  1133. zenml/zen_server/dashboard/static/media/GitCommit.7dd9c2aa.svg +0 -5
  1134. zenml/zen_server/dashboard/static/media/GitHub_Logo.cefc2023.png +0 -0
  1135. zenml/zen_server/dashboard/static/media/Graph.2c63a892.svg +0 -11
  1136. zenml/zen_server/dashboard/static/media/History.08329240.svg +0 -3
  1137. zenml/zen_server/dashboard/static/media/Home.0843b0d5.svg +0 -3
  1138. zenml/zen_server/dashboard/static/media/ImageBuilder.ea762d9c.svg +0 -6
  1139. zenml/zen_server/dashboard/static/media/InProgress.304a0edc.svg +0 -1
  1140. zenml/zen_server/dashboard/static/media/Info.9fe10c5c.svg +0 -3
  1141. zenml/zen_server/dashboard/static/media/KeyboardReturn.491afbe3.svg +0 -3
  1142. zenml/zen_server/dashboard/static/media/Link.72bbb55d.svg +0 -4
  1143. zenml/zen_server/dashboard/static/media/Lock.30f5e1fe.svg +0 -5
  1144. zenml/zen_server/dashboard/static/media/Lock2.a769ea52.svg +0 -3
  1145. zenml/zen_server/dashboard/static/media/LockKey.92f21621.svg +0 -6
  1146. zenml/zen_server/dashboard/static/media/Logs.8bf4d005.svg +0 -5
  1147. zenml/zen_server/dashboard/static/media/MinusCircle.4188f418.svg +0 -4
  1148. zenml/zen_server/dashboard/static/media/ModelRegistry.f0de050a.svg +0 -6
  1149. zenml/zen_server/dashboard/static/media/MultiUser.a2ba7c67.svg +0 -10
  1150. zenml/zen_server/dashboard/static/media/PaginationFirst.92628634.svg +0 -4
  1151. zenml/zen_server/dashboard/static/media/PaginationLast.00d3c732.svg +0 -4
  1152. zenml/zen_server/dashboard/static/media/PaginationNext.86158845.svg +0 -3
  1153. zenml/zen_server/dashboard/static/media/PaginationPrev.60c18a88.svg +0 -3
  1154. zenml/zen_server/dashboard/static/media/Pen.f2d831d4.svg +0 -6
  1155. zenml/zen_server/dashboard/static/media/PhotoCamera.179d6d4c.svg +0 -3
  1156. zenml/zen_server/dashboard/static/media/Pipeline.30d298b0.svg +0 -7
  1157. zenml/zen_server/dashboard/static/media/Plus.5aa1c16b.svg +0 -3
  1158. zenml/zen_server/dashboard/static/media/PlusCircle.92d860dd.svg +0 -5
  1159. zenml/zen_server/dashboard/static/media/Repositories.71a36b8c.svg +0 -3
  1160. zenml/zen_server/dashboard/static/media/RightArrow.f30d3871.svg +0 -29
  1161. zenml/zen_server/dashboard/static/media/Rocket.63bf7b9d.svg +0 -3
  1162. zenml/zen_server/dashboard/static/media/RocketLaunch.1bff2b59.svg +0 -6
  1163. zenml/zen_server/dashboard/static/media/Rubik-Medium.c87313aa.ttf +0 -0
  1164. zenml/zen_server/dashboard/static/media/Rubik-Regular.b3d0902b.ttf +0 -0
  1165. zenml/zen_server/dashboard/static/media/Run.daec4fb2.svg +0 -6
  1166. zenml/zen_server/dashboard/static/media/Search.d1afcce5.svg +0 -4
  1167. zenml/zen_server/dashboard/static/media/Settings.59ca73ae.svg +0 -4
  1168. zenml/zen_server/dashboard/static/media/Share2.46c3ff66.svg +0 -3
  1169. zenml/zen_server/dashboard/static/media/SignOut.6aa718c5.svg +0 -3
  1170. zenml/zen_server/dashboard/static/media/SimplePlus.5cf7ec20.svg +0 -3
  1171. zenml/zen_server/dashboard/static/media/SingleUser.bef3a095.svg +0 -4
  1172. zenml/zen_server/dashboard/static/media/SourceCodePro-Regular.b484b32f.ttf +0 -0
  1173. zenml/zen_server/dashboard/static/media/Stack.19b604ac.svg +0 -5
  1174. zenml/zen_server/dashboard/static/media/StackComponent.b1ba90b5.svg +0 -4
  1175. zenml/zen_server/dashboard/static/media/Star.f0c25022.svg +0 -9
  1176. zenml/zen_server/dashboard/static/media/StarOutline.94ca8cd9.svg +0 -3
  1177. zenml/zen_server/dashboard/static/media/Storefront.4b4796fe.svg +0 -3
  1178. zenml/zen_server/dashboard/static/media/Stream.543e3039.svg +0 -3
  1179. zenml/zen_server/dashboard/static/media/SupportAgent.510ddf1f.svg +0 -8
  1180. zenml/zen_server/dashboard/static/media/Table.77033750.svg +0 -6
  1181. zenml/zen_server/dashboard/static/media/Tool.d5785486.svg +0 -3
  1182. zenml/zen_server/dashboard/static/media/UserPlus.741a99d7.svg +0 -6
  1183. zenml/zen_server/dashboard/static/media/Verified.0625b2a0.svg +0 -3
  1184. zenml/zen_server/dashboard/static/media/addNew.4fb6c939.svg +0 -8
  1185. zenml/zen_server/dashboard/static/media/arrowClose.cbd53f3f.svg +0 -3
  1186. zenml/zen_server/dashboard/static/media/arrowOpen.6ceef0af.svg +0 -3
  1187. zenml/zen_server/dashboard/static/media/check_small.30bc0138.svg +0 -3
  1188. zenml/zen_server/dashboard/static/media/circleArrowSideClose.98d6013e.svg +0 -18
  1189. zenml/zen_server/dashboard/static/media/circleArrowSideOpen.63653df6.svg +0 -18
  1190. zenml/zen_server/dashboard/static/media/image.104fd14b.png +0 -0
  1191. zenml/zen_server/dashboard/static/media/imageAddIcon.e83004a9.svg +0 -7
  1192. zenml/zen_server/dashboard/static/media/logo.93333e5c.svg +0 -1
  1193. zenml/zen_server/dashboard/static/media/logo_small.4204397d.svg +0 -3
  1194. zenml/zen_server/dashboard/static/media/logo_white.d4b4414e.svg +0 -20
  1195. zenml/zen_server/dashboard/static/media/notConnected.5e2c8ea7.svg +0 -8
  1196. zenml/zen_server/dashboard/static/media/plugin-fallback.72c294e6.svg +0 -6
  1197. zenml/zen_server/dashboard/static/media/share.bcd998b0.svg +0 -5
  1198. zenml/zen_server/dashboard/static/media/stars.08a9b19a.svg +0 -8
  1199. zenml/zen_server/deploy/terraform/__init__.py +0 -41
  1200. zenml/zen_server/deploy/terraform/providers/__init__.py +0 -14
  1201. zenml/zen_server/deploy/terraform/providers/aws_provider.py +0 -61
  1202. zenml/zen_server/deploy/terraform/providers/azure_provider.py +0 -59
  1203. zenml/zen_server/deploy/terraform/providers/gcp_provider.py +0 -59
  1204. zenml/zen_server/deploy/terraform/providers/terraform_provider.py +0 -332
  1205. zenml/zen_server/deploy/terraform/recipes/aws/.gitignore +0 -8
  1206. zenml/zen_server/deploy/terraform/recipes/aws/helm.tf +0 -20
  1207. zenml/zen_server/deploy/terraform/recipes/aws/ingress.tf +0 -30
  1208. zenml/zen_server/deploy/terraform/recipes/aws/outputs.tf +0 -14
  1209. zenml/zen_server/deploy/terraform/recipes/aws/printf.cmd +0 -2
  1210. zenml/zen_server/deploy/terraform/recipes/aws/sql.tf +0 -62
  1211. zenml/zen_server/deploy/terraform/recipes/aws/terraform.tf +0 -44
  1212. zenml/zen_server/deploy/terraform/recipes/aws/variables.tf +0 -179
  1213. zenml/zen_server/deploy/terraform/recipes/aws/vpc.tf +0 -47
  1214. zenml/zen_server/deploy/terraform/recipes/aws/zen_server.tf +0 -111
  1215. zenml/zen_server/deploy/terraform/recipes/azure/.gitignore +0 -8
  1216. zenml/zen_server/deploy/terraform/recipes/azure/helm.tf +0 -20
  1217. zenml/zen_server/deploy/terraform/recipes/azure/ingress.tf +0 -30
  1218. zenml/zen_server/deploy/terraform/recipes/azure/key_vault.tf +0 -73
  1219. zenml/zen_server/deploy/terraform/recipes/azure/outputs.tf +0 -14
  1220. zenml/zen_server/deploy/terraform/recipes/azure/printf.cmd +0 -2
  1221. zenml/zen_server/deploy/terraform/recipes/azure/rg.tf +0 -36
  1222. zenml/zen_server/deploy/terraform/recipes/azure/sql.tf +0 -65
  1223. zenml/zen_server/deploy/terraform/recipes/azure/terraform.tf +0 -52
  1224. zenml/zen_server/deploy/terraform/recipes/azure/variables.tf +0 -188
  1225. zenml/zen_server/deploy/terraform/recipes/azure/zen_server.tf +0 -111
  1226. zenml/zen_server/deploy/terraform/recipes/gcp/.gitignore +0 -8
  1227. zenml/zen_server/deploy/terraform/recipes/gcp/helm.tf +0 -20
  1228. zenml/zen_server/deploy/terraform/recipes/gcp/ingress.tf +0 -30
  1229. zenml/zen_server/deploy/terraform/recipes/gcp/outputs.tf +0 -14
  1230. zenml/zen_server/deploy/terraform/recipes/gcp/printf.cmd +0 -2
  1231. zenml/zen_server/deploy/terraform/recipes/gcp/sql.tf +0 -64
  1232. zenml/zen_server/deploy/terraform/recipes/gcp/terraform.tf +0 -44
  1233. zenml/zen_server/deploy/terraform/recipes/gcp/variables.tf +0 -183
  1234. zenml/zen_server/deploy/terraform/recipes/gcp/zen_server.tf +0 -122
  1235. zenml/zen_server/deploy/terraform/terraform_zen_server.py +0 -255
  1236. zenml/zen_server/routers/run_metadata_endpoints.py +0 -97
  1237. zenml_nightly-0.55.0.dev20240124.dist-info/METADATA +0 -438
  1238. zenml_nightly-0.55.0.dev20240124.dist-info/RECORD +0 -1072
  1239. {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/LICENSE +0 -0
  1240. {zenml_nightly-0.55.0.dev20240124.dist-info → zenml_nightly-0.72.0.dev20250116.dist-info}/entry_points.txt +0 -0
zenml/cli/utils.py CHANGED
@@ -12,10 +12,12 @@
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
14
  """Utility functions for the CLI."""
15
+
15
16
  import contextlib
16
17
  import datetime
17
18
  import json
18
19
  import os
20
+ import platform
19
21
  import re
20
22
  import subprocess
21
23
  import sys
@@ -38,22 +40,23 @@ from typing import (
38
40
  )
39
41
 
40
42
  import click
43
+ import pkg_resources
41
44
  import yaml
42
45
  from pydantic import BaseModel, SecretStr
43
46
  from rich import box, table
47
+ from rich.console import Console
44
48
  from rich.emoji import Emoji, NoEmoji
45
49
  from rich.markdown import Markdown
46
50
  from rich.markup import escape
47
- from rich.prompt import Confirm
51
+ from rich.prompt import Confirm, Prompt
48
52
  from rich.style import Style
53
+ from rich.table import Table
49
54
 
50
55
  from zenml.client import Client
51
56
  from zenml.console import console, zenml_style_defaults
52
57
  from zenml.constants import (
53
58
  FILTERING_DATETIME_FORMAT,
54
59
  IS_DEBUG_ENV,
55
- NOT_INSTALLED_MESSAGE,
56
- TERRAFORM_NOT_INSTALLED_MESSAGE,
57
60
  )
58
61
  from zenml.enums import GenericFilterOps, StackComponentType
59
62
  from zenml.logger import get_logger
@@ -63,18 +66,19 @@ from zenml.model_registries.base_model_registry import (
63
66
  )
64
67
  from zenml.models import (
65
68
  BaseFilter,
66
- BaseResponse,
69
+ BaseIdentifiedResponse,
67
70
  BoolFilter,
68
71
  NumericFilter,
69
72
  Page,
73
+ ServiceConnectorRequirements,
70
74
  StrFilter,
71
75
  UUIDFilter,
72
76
  )
77
+ from zenml.models.v2.base.filter import FilterGenerator
73
78
  from zenml.services import BaseService, ServiceState
74
79
  from zenml.stack import StackComponent
75
80
  from zenml.stack.stack_component import StackComponentConfig
76
81
  from zenml.utils import secret_utils
77
- from zenml.zen_server.deploy import ServerDeployment
78
82
 
79
83
  if TYPE_CHECKING:
80
84
  from uuid import UUID
@@ -103,7 +107,7 @@ logger = get_logger(__name__)
103
107
  MAX_ARGUMENT_VALUE_SIZE = 10240
104
108
 
105
109
 
106
- T = TypeVar("T", bound=BaseResponse) # type: ignore[type-arg]
110
+ T = TypeVar("T", bound=BaseIdentifiedResponse) # type: ignore[type-arg]
107
111
 
108
112
 
109
113
  def title(text: str) -> None:
@@ -218,6 +222,8 @@ def print_table(
218
222
  caption: Caption of the table.
219
223
  columns: Optional column configurations to be used in the table.
220
224
  """
225
+ from rich.text import Text
226
+
221
227
  column_keys = {key: None for dict_ in obj for key in dict_}
222
228
  column_names = [columns.get(key, key.upper()) for key in column_keys]
223
229
  rich_table = table.Table(
@@ -236,10 +242,19 @@ def print_table(
236
242
  if key is None:
237
243
  values.append(None)
238
244
  else:
239
- value = str(dict_.get(key) or " ")
240
- # escape text when square brackets are used
241
- if "[" in value:
242
- value = escape(value)
245
+ v = dict_.get(key) or " "
246
+ if isinstance(v, str) and (
247
+ v.startswith("http://") or v.startswith("https://")
248
+ ):
249
+ # Display the URL as a hyperlink in a way that doesn't break
250
+ # the URL when it needs to be wrapped over multiple lines
251
+ value: Union[str, Text] = Text(v, style=f"link {v}")
252
+ else:
253
+ value = str(v)
254
+ # Escape text when square brackets are used, but allow
255
+ # links to be decorated as rich style links
256
+ if "[" in value and "[link=" not in value:
257
+ value = escape(value)
243
258
  values.append(value)
244
259
  rich_table.add_row(*values)
245
260
  if len(rich_table.columns) > 1:
@@ -253,6 +268,7 @@ def print_pydantic_models(
253
268
  exclude_columns: Optional[List[str]] = None,
254
269
  active_models: Optional[List[T]] = None,
255
270
  show_active: bool = False,
271
+ rename_columns: Dict[str, str] = {},
256
272
  ) -> None:
257
273
  """Prints the list of Pydantic models in a table.
258
274
 
@@ -265,6 +281,7 @@ def print_pydantic_models(
265
281
  active_models: Optional list of active models of the given type T.
266
282
  show_active: Flag to decide whether to append the active model on the
267
283
  top of the list.
284
+ rename_columns: Optional dictionary to rename columns.
268
285
  """
269
286
  if exclude_columns is None:
270
287
  exclude_columns = list()
@@ -285,32 +302,34 @@ def print_pydantic_models(
285
302
  """
286
303
  # Explicitly defined columns take precedence over exclude columns
287
304
  if not columns:
288
- if isinstance(model, BaseResponse):
305
+ if isinstance(model, BaseIdentifiedResponse):
289
306
  include_columns = ["id"]
290
307
 
291
- if "name" in model.__fields__:
308
+ if "name" in model.model_fields:
292
309
  include_columns.append("name")
293
310
 
294
311
  include_columns.extend(
295
312
  [
296
313
  k
297
- for k in model.__fields__[
298
- "body"
299
- ].type_.__fields__.keys()
300
- if k not in exclude_columns
301
- ]
302
- + [
303
- k
304
- for k in model.__fields__[
305
- "metadata"
306
- ].type_.__fields__.keys()
314
+ for k in model.get_body().model_fields.keys()
307
315
  if k not in exclude_columns
308
316
  ]
309
317
  )
310
318
 
319
+ if model.metadata is not None:
320
+ include_columns.extend(
321
+ [
322
+ k
323
+ for k in model.get_metadata().model_fields.keys()
324
+ if k not in exclude_columns
325
+ ]
326
+ )
327
+
311
328
  else:
312
329
  include_columns = [
313
- k for k in model.dict().keys() if k not in exclude_columns
330
+ k
331
+ for k in model.model_dump().keys()
332
+ if k not in exclude_columns
314
333
  ]
315
334
  else:
316
335
  include_columns = columns
@@ -319,11 +338,13 @@ def print_pydantic_models(
319
338
 
320
339
  for k in include_columns:
321
340
  value = getattr(model, k)
341
+ if k in rename_columns:
342
+ k = rename_columns[k]
322
343
  # In case the response model contains nested `BaseResponse`s
323
344
  # we want to attempt to represent them by name, if they contain
324
345
  # such a field, else the id is used
325
- if isinstance(value, BaseResponse):
326
- if "name" in value.__fields__:
346
+ if isinstance(value, BaseIdentifiedResponse):
347
+ if "name" in value.model_fields:
327
348
  items[k] = str(getattr(value, "name"))
328
349
  else:
329
350
  items[k] = str(value.id)
@@ -332,8 +353,8 @@ def print_pydantic_models(
332
353
  # the list and extract either name or id
333
354
  elif isinstance(value, list):
334
355
  for v in value:
335
- if isinstance(v, BaseResponse):
336
- if "name" in v.__fields__:
356
+ if isinstance(v, BaseIdentifiedResponse):
357
+ if "name" in v.model_fields:
337
358
  items.setdefault(k, []).append(
338
359
  str(getattr(v, "name"))
339
360
  )
@@ -343,6 +364,7 @@ def print_pydantic_models(
343
364
  items[k] = [str(v) for v in value]
344
365
  else:
345
366
  items[k] = str(value)
367
+
346
368
  # prepend an active marker if a function to mark active was passed
347
369
  if not active_models and not show_active:
348
370
  return items
@@ -352,9 +374,11 @@ def print_pydantic_models(
352
374
  marker = "current"
353
375
  if active_models is not None and show_active_column:
354
376
  return {
355
- marker: ":point_right:"
356
- if any(model.id == a.id for a in active_models)
357
- else "",
377
+ marker: (
378
+ ":point_right:"
379
+ if any(model.id == a.id for a in active_models)
380
+ else ""
381
+ ),
358
382
  **items,
359
383
  }
360
384
 
@@ -418,30 +442,34 @@ def print_pydantic_model(
418
442
  exclude_columns = set()
419
443
 
420
444
  if not columns:
421
- if isinstance(model, BaseResponse):
445
+ if isinstance(model, BaseIdentifiedResponse):
422
446
  include_columns = ["id"]
423
447
 
424
- if "name" in model.__fields__:
448
+ if "name" in model.model_fields:
425
449
  include_columns.append("name")
426
450
 
427
451
  include_columns.extend(
428
452
  [
429
453
  k
430
- for k in model.__fields__["body"].type_.__fields__.keys()
431
- if k not in exclude_columns
432
- ]
433
- + [
434
- k
435
- for k in model.__fields__[
436
- "metadata"
437
- ].type_.__fields__.keys()
454
+ for k in model.get_body().model_fields.keys()
438
455
  if k not in exclude_columns
439
456
  ]
440
457
  )
441
458
 
459
+ if model.metadata is not None:
460
+ include_columns.extend(
461
+ [
462
+ k
463
+ for k in model.get_metadata().model_fields.keys()
464
+ if k not in exclude_columns
465
+ ]
466
+ )
467
+
442
468
  else:
443
469
  include_columns = [
444
- k for k in model.dict().keys() if k not in exclude_columns
470
+ k
471
+ for k in model.model_dump().keys()
472
+ if k not in exclude_columns
445
473
  ]
446
474
  else:
447
475
  include_columns = list(columns)
@@ -450,8 +478,8 @@ def print_pydantic_model(
450
478
 
451
479
  for k in include_columns:
452
480
  value = getattr(model, k)
453
- if isinstance(value, BaseResponse):
454
- if "name" in value.__fields__:
481
+ if isinstance(value, BaseIdentifiedResponse):
482
+ if "name" in value.model_fields:
455
483
  items[k] = str(getattr(value, "name"))
456
484
  else:
457
485
  items[k] = str(value.id)
@@ -460,8 +488,8 @@ def print_pydantic_model(
460
488
  # the list and extract either name or id
461
489
  elif isinstance(value, list):
462
490
  for v in value:
463
- if isinstance(v, BaseResponse):
464
- if "name" in v.__fields__:
491
+ if isinstance(v, BaseIdentifiedResponse):
492
+ if "name" in v.model_fields:
465
493
  items.setdefault(k, []).append(str(getattr(v, "name")))
466
494
  else:
467
495
  items.setdefault(k, []).append(str(v.id))
@@ -508,43 +536,6 @@ def format_integration_list(
508
536
  return list_of_dicts
509
537
 
510
538
 
511
- def print_stack_outputs(stack: "StackResponse") -> None:
512
- """Prints outputs for stacks deployed with mlstacks.
513
-
514
- Args:
515
- stack: Instance of a stack model.
516
- """
517
- verify_mlstacks_prerequisites_installation()
518
-
519
- if not stack.stack_spec_path:
520
- declare("No stack spec path is set for this stack.")
521
- return
522
- stack_caption = f"'{stack.name}' stack"
523
- rich_table = table.Table(
524
- box=box.HEAVY_EDGE,
525
- title="MLStacks Outputs",
526
- caption=stack_caption,
527
- show_lines=True,
528
- )
529
- rich_table.add_column("OUTPUT_KEY", overflow="fold")
530
- rich_table.add_column("OUTPUT_VALUE", overflow="fold")
531
-
532
- from mlstacks.utils.terraform_utils import get_stack_outputs
533
-
534
- stack_spec_file = stack.stack_spec_path
535
- stack_outputs = get_stack_outputs(stack_path=stack_spec_file)
536
-
537
- for output_key, output_value in stack_outputs.items():
538
- rich_table.add_row(output_key, output_value)
539
-
540
- # capitalize entries in first column
541
- rich_table.columns[0]._cells = [
542
- component.upper() # type: ignore[union-attr]
543
- for component in rich_table.columns[0]._cells
544
- ]
545
- console.print(rich_table)
546
-
547
-
548
539
  def print_stack_configuration(stack: "StackResponse", active: bool) -> None:
549
540
  """Prints the configuration options of a stack.
550
541
 
@@ -572,14 +563,28 @@ def print_stack_configuration(stack: "StackResponse", active: bool) -> None:
572
563
  for component in rich_table.columns[0]._cells
573
564
  ]
574
565
  console.print(rich_table)
566
+
567
+ if not stack.labels:
568
+ declare("No labels are set for this stack.")
569
+ else:
570
+ rich_table = table.Table(
571
+ box=box.HEAVY_EDGE,
572
+ title="Labels",
573
+ show_lines=True,
574
+ )
575
+ rich_table.add_column("LABEL")
576
+ rich_table.add_column("VALUE", overflow="fold")
577
+
578
+ for label, value in stack.labels.items():
579
+ rich_table.add_row(label, str(value))
580
+
581
+ console.print(rich_table)
582
+
575
583
  declare(
576
584
  f"Stack '{stack.name}' with id '{stack.id}' is "
577
585
  f"{f'owned by user {stack.user.name}.' if stack.user else 'unowned.'}"
578
586
  )
579
587
 
580
- if stack.stack_spec_path:
581
- declare(f"Stack spec path for `mlstacks`: '{stack.stack_spec_path}'")
582
-
583
588
 
584
589
  def print_flavor_list(flavors: Page["FlavorResponse"]) -> None:
585
590
  """Prints the list of flavors.
@@ -603,13 +608,18 @@ def print_flavor_list(flavors: Page["FlavorResponse"]) -> None:
603
608
 
604
609
 
605
610
  def print_stack_component_configuration(
606
- component: "ComponentResponse", active_status: bool
611
+ component: "ComponentResponse",
612
+ active_status: bool,
613
+ connector_requirements: Optional[ServiceConnectorRequirements] = None,
607
614
  ) -> None:
608
615
  """Prints the configuration options of a stack component.
609
616
 
610
617
  Args:
611
618
  component: The stack component to print.
612
619
  active_status: Whether the stack component is active.
620
+ connector_requirements: Connector requirements for the component, taken
621
+ from the component flavor. Only needed if the component has a
622
+ connector.
613
623
  """
614
624
  if component.user:
615
625
  user_name = component.user.name
@@ -618,7 +628,7 @@ def print_stack_component_configuration(
618
628
 
619
629
  declare(
620
630
  f"{component.type.value.title()} '{component.name}' of flavor "
621
- f"'{component.flavor}' with id '{component.id}' is owned by "
631
+ f"'{component.flavor_name}' with id '{component.id}' is owned by "
622
632
  f"user '{user_name}'."
623
633
  )
624
634
 
@@ -665,7 +675,7 @@ def print_stack_component_configuration(
665
675
  rich_table.add_column("VALUE", overflow="fold")
666
676
 
667
677
  for label, value in component.labels.items():
668
- rich_table.add_row(label, value)
678
+ rich_table.add_row(label, str(value))
669
679
 
670
680
  console.print(rich_table)
671
681
 
@@ -680,11 +690,17 @@ def print_stack_component_configuration(
680
690
  rich_table.add_column("PROPERTY")
681
691
  rich_table.add_column("VALUE", overflow="fold")
682
692
 
693
+ resource_type = (
694
+ connector_requirements.resource_type
695
+ if connector_requirements
696
+ else component.connector.resource_types[0]
697
+ )
698
+
683
699
  connector_dict = {
684
700
  "ID": str(component.connector.id),
685
701
  "NAME": component.connector.name,
686
702
  "TYPE": component.connector.type,
687
- "RESOURCE TYPE": component.connector.resource_types[0],
703
+ "RESOURCE TYPE": resource_type,
688
704
  "RESOURCE NAME": component.connector_resource_id
689
705
  or component.connector.resource_id
690
706
  or "N/A",
@@ -695,11 +711,6 @@ def print_stack_component_configuration(
695
711
 
696
712
  console.print(rich_table)
697
713
 
698
- if component.component_spec_path:
699
- declare(
700
- f"Component spec path for `mlstacks`: {component.component_spec_path}"
701
- )
702
-
703
714
 
704
715
  def expand_argument_value_from_file(name: str, value: str) -> str:
705
716
  """Expands the value of an argument pointing to a file into the contents of that file.
@@ -915,12 +926,14 @@ def prompt_configuration(
915
926
  config_dict = {}
916
927
  for attr_name, attr_schema in config_schema.get("properties", {}).items():
917
928
  title = attr_schema.get("title", attr_name)
918
- attr_type = attr_schema.get("type", "string")
929
+ attr_type_name = attr_type = attr_schema.get("type", "string")
930
+ if attr_type == "array":
931
+ attr_type_name = "list (CSV or JSON)"
919
932
  title = f"[{attr_name}] {title}"
920
933
  required = attr_name in config_schema.get("required", [])
921
934
  hidden = attr_schema.get("format", "") == "password"
922
935
  subtitles: List[str] = []
923
- subtitles.append(attr_type)
936
+ subtitles.append(attr_type_name)
924
937
  if hidden:
925
938
  subtitles.append("secret")
926
939
  if required:
@@ -938,6 +951,8 @@ def prompt_configuration(
938
951
  if hidden and not show_secrets:
939
952
  title += " is currently set to: [HIDDEN]"
940
953
  else:
954
+ if attr_type == "array":
955
+ existing_value = json.dumps(existing_value)
941
956
  title += f" is currently set to: '{existing_value}'"
942
957
  else:
943
958
  title += " is not currently set"
@@ -999,12 +1014,19 @@ def prompt_configuration(
999
1014
  def install_packages(
1000
1015
  packages: List[str],
1001
1016
  upgrade: bool = False,
1017
+ use_uv: bool = False,
1002
1018
  ) -> None:
1003
- """Installs pypi packages into the current environment with pip.
1019
+ """Installs pypi packages into the current environment with pip or uv.
1020
+
1021
+ When using with `uv`, a virtual environment is required.
1004
1022
 
1005
1023
  Args:
1006
1024
  packages: List of packages to install.
1007
1025
  upgrade: Whether to upgrade the packages if they are already installed.
1026
+ use_uv: Whether to use uv for package installation.
1027
+
1028
+ Raises:
1029
+ e: If the package installation fails.
1008
1030
  """
1009
1031
  if "neptune" in packages:
1010
1032
  declare(
@@ -1013,53 +1035,120 @@ def install_packages(
1013
1035
  )
1014
1036
  uninstall_package("neptune-client")
1015
1037
 
1038
+ if "prodigy" in packages:
1039
+ packages.remove("prodigy")
1040
+ declare(
1041
+ "The `prodigy` package should be installed manually using your "
1042
+ "license key. Please visit https://prodi.gy/docs/install for more "
1043
+ "information."
1044
+ )
1045
+ if not packages:
1046
+ # if user only tried to install prodigy, we can
1047
+ # just return without doing anything
1048
+ return
1049
+
1050
+ pip_command = ["uv", "pip"] if use_uv else ["pip"]
1016
1051
  if upgrade:
1017
- command = [
1018
- sys.executable,
1019
- "-m",
1020
- "pip",
1021
- "install",
1022
- "--upgrade",
1023
- ] + packages
1052
+ command = (
1053
+ [
1054
+ sys.executable,
1055
+ "-m",
1056
+ ]
1057
+ + pip_command
1058
+ + [
1059
+ "install",
1060
+ "--upgrade",
1061
+ ]
1062
+ + packages
1063
+ )
1024
1064
  else:
1025
- command = [sys.executable, "-m", "pip", "install"] + packages
1065
+ command = [sys.executable, "-m"] + pip_command + ["install"] + packages
1026
1066
 
1027
1067
  if not IS_DEBUG_ENV:
1028
- command += [
1029
- "-qqq",
1030
- "--no-warn-conflicts",
1031
- ]
1032
-
1033
- subprocess.check_call(command)
1068
+ quiet_flag = "-q" if use_uv else "-qqq"
1069
+ command.append(quiet_flag)
1070
+ if not use_uv:
1071
+ command.append("--no-warn-conflicts")
1034
1072
 
1035
- if "label-studio" in packages:
1036
- warning(
1037
- "There is a known issue with Label Studio installations "
1038
- "via zenml. You might find that the Label Studio "
1039
- "installation breaks the ZenML CLI. In this case, please "
1040
- "run `pip install 'pydantic<1.11,>=1.9.0'` to fix the "
1041
- "issue or message us on Slack if you need help with this. "
1042
- "We are working on a more definitive fix."
1043
- )
1073
+ try:
1074
+ subprocess.check_call(command)
1075
+ except subprocess.CalledProcessError as e:
1076
+ if (
1077
+ use_uv
1078
+ and "Failed to locate a virtualenv or Conda environment" in str(e)
1079
+ ):
1080
+ error(
1081
+ "Failed to locate a virtualenv or Conda environment. "
1082
+ "When using uv, a virtual environment is required. "
1083
+ "Run `uv venv` to create a virtualenv and retry."
1084
+ )
1085
+ else:
1086
+ raise e
1044
1087
 
1045
1088
 
1046
- def uninstall_package(package: str) -> None:
1047
- """Uninstalls pypi package from the current environment with pip.
1089
+ def uninstall_package(package: str, use_uv: bool = False) -> None:
1090
+ """Uninstalls pypi package from the current environment with pip or uv.
1048
1091
 
1049
1092
  Args:
1050
1093
  package: The package to uninstall.
1094
+ use_uv: Whether to use uv for package uninstallation.
1051
1095
  """
1052
- subprocess.check_call(
1053
- [
1054
- sys.executable,
1055
- "-m",
1056
- "pip",
1057
- "uninstall",
1058
- "-qqq",
1059
- "-y",
1060
- package,
1061
- ]
1062
- )
1096
+ pip_command = ["uv", "pip"] if use_uv else ["pip"]
1097
+ quiet_flag = "-q" if use_uv else "-qqq"
1098
+
1099
+ if use_uv:
1100
+ subprocess.check_call(
1101
+ [
1102
+ sys.executable,
1103
+ "-m",
1104
+ ]
1105
+ + pip_command
1106
+ + [
1107
+ "uninstall",
1108
+ quiet_flag,
1109
+ package,
1110
+ ]
1111
+ )
1112
+ else:
1113
+ subprocess.check_call(
1114
+ [
1115
+ sys.executable,
1116
+ "-m",
1117
+ ]
1118
+ + pip_command
1119
+ + [
1120
+ "uninstall",
1121
+ quiet_flag,
1122
+ "-y",
1123
+ package,
1124
+ ]
1125
+ )
1126
+
1127
+
1128
+ def is_uv_installed() -> bool:
1129
+ """Check if uv is installed in the current environment.
1130
+
1131
+ Returns:
1132
+ True if uv is installed, False otherwise.
1133
+ """
1134
+ try:
1135
+ pkg_resources.get_distribution("uv")
1136
+ return True
1137
+ except pkg_resources.DistributionNotFound:
1138
+ return False
1139
+
1140
+
1141
+ def is_pip_installed() -> bool:
1142
+ """Check if pip is installed in the current environment.
1143
+
1144
+ Returns:
1145
+ True if pip is installed, False otherwise.
1146
+ """
1147
+ try:
1148
+ pkg_resources.get_distribution("pip")
1149
+ return True
1150
+ except pkg_resources.DistributionNotFound:
1151
+ return False
1063
1152
 
1064
1153
 
1065
1154
  def pretty_print_secret(
@@ -1127,6 +1216,10 @@ def get_service_state_emoji(state: "ServiceState") -> str:
1127
1216
  return ":pause_button:"
1128
1217
  if state == ServiceState.ERROR:
1129
1218
  return ":heavy_exclamation_mark:"
1219
+ if state == ServiceState.PENDING_STARTUP:
1220
+ return ":hourglass:"
1221
+ if state == ServiceState.SCALED_TO_ZERO:
1222
+ return ":chart_decreasing:"
1130
1223
  return ":hourglass_not_done:"
1131
1224
 
1132
1225
 
@@ -1141,15 +1234,18 @@ def pretty_print_model_deployer(
1141
1234
  """
1142
1235
  model_service_dicts = []
1143
1236
  for model_service in model_services:
1144
- served_model_info = model_deployer.get_model_server_info(model_service)
1145
1237
  dict_uuid = str(model_service.uuid)
1146
1238
  dict_pl_name = model_service.config.pipeline_name
1147
1239
  dict_pl_stp_name = model_service.config.pipeline_step_name
1148
- dict_model_name = served_model_info.get("MODEL_NAME", "")
1240
+ dict_model_name = model_service.config.model_name
1241
+ type = model_service.SERVICE_TYPE.type
1242
+ flavor = model_service.SERVICE_TYPE.flavor
1149
1243
  model_service_dicts.append(
1150
1244
  {
1151
1245
  "STATUS": get_service_state_emoji(model_service.status.state),
1152
1246
  "UUID": dict_uuid,
1247
+ "TYPE": type,
1248
+ "FLAVOR": flavor,
1153
1249
  "PIPELINE_NAME": dict_pl_name,
1154
1250
  "PIPELINE_STEP_NAME": dict_pl_stp_name,
1155
1251
  "MODEL_NAME": dict_model_name,
@@ -1194,9 +1290,11 @@ def pretty_print_model_version_table(
1194
1290
  "NAME": model_version.registered_model.name,
1195
1291
  "MODEL_VERSION": model_version.version,
1196
1292
  "VERSION_DESCRIPTION": model_version.description,
1197
- "METADATA": model_version.metadata.dict()
1198
- if model_version.metadata
1199
- else {},
1293
+ "METADATA": (
1294
+ model_version.metadata.model_dump()
1295
+ if model_version.metadata
1296
+ else {}
1297
+ ),
1200
1298
  }
1201
1299
  for model_version in model_versions
1202
1300
  ]
@@ -1226,15 +1324,21 @@ def pretty_print_model_version_details(
1226
1324
  "REGISTERED_MODEL_NAME": model_version.registered_model.name,
1227
1325
  "VERSION": model_version.version,
1228
1326
  "VERSION_DESCRIPTION": model_version.description,
1229
- "CREATED_AT": str(model_version.created_at)
1230
- if model_version.created_at
1231
- else "N/A",
1232
- "UPDATED_AT": str(model_version.last_updated_at)
1233
- if model_version.last_updated_at
1234
- else "N/A",
1235
- "METADATA": model_version.metadata.dict()
1236
- if model_version.metadata
1237
- else {},
1327
+ "CREATED_AT": (
1328
+ str(model_version.created_at)
1329
+ if model_version.created_at
1330
+ else "N/A"
1331
+ ),
1332
+ "UPDATED_AT": (
1333
+ str(model_version.last_updated_at)
1334
+ if model_version.last_updated_at
1335
+ else "N/A"
1336
+ ),
1337
+ "METADATA": (
1338
+ model_version.metadata.model_dump()
1339
+ if model_version.metadata
1340
+ else {}
1341
+ ),
1238
1342
  "MODEL_SOURCE_URI": model_version.model_source_uri,
1239
1343
  "STAGE": model_version.stage.value,
1240
1344
  }
@@ -1276,9 +1380,10 @@ def print_served_model_configuration(
1276
1380
  **served_model_info,
1277
1381
  "UUID": str(model_service.uuid),
1278
1382
  "STATUS": get_service_state_emoji(model_service.status.state),
1383
+ "TYPE": model_service.SERVICE_TYPE.type,
1384
+ "FLAVOR": model_service.SERVICE_TYPE.flavor,
1279
1385
  "STATUS_MESSAGE": model_service.status.last_error,
1280
1386
  "PIPELINE_NAME": model_service.config.pipeline_name,
1281
- "RUN_NAME": model_service.config.run_name,
1282
1387
  "PIPELINE_STEP_NAME": model_service.config.pipeline_step_name,
1283
1388
  }
1284
1389
 
@@ -1296,74 +1401,6 @@ def print_served_model_configuration(
1296
1401
  console.print(rich_table)
1297
1402
 
1298
1403
 
1299
- def print_server_deployment_list(servers: List["ServerDeployment"]) -> None:
1300
- """Print a table with a list of ZenML server deployments.
1301
-
1302
- Args:
1303
- servers: list of ZenML server deployments
1304
- """
1305
- server_dicts = []
1306
- for server in servers:
1307
- status = ""
1308
- url = ""
1309
- connected = ""
1310
- if server.status:
1311
- status = get_service_state_emoji(server.status.status)
1312
- if server.status.url:
1313
- url = server.status.url
1314
- if server.status.connected:
1315
- connected = ":point_left:"
1316
- server_dicts.append(
1317
- {
1318
- "STATUS": status,
1319
- "NAME": server.config.name,
1320
- "PROVIDER": server.config.provider.value,
1321
- "URL": url,
1322
- "CONNECTED": connected,
1323
- }
1324
- )
1325
- print_table(server_dicts)
1326
-
1327
-
1328
- def print_server_deployment(server: "ServerDeployment") -> None:
1329
- """Prints the configuration and status of a ZenML server deployment.
1330
-
1331
- Args:
1332
- server: Server deployment to print
1333
- """
1334
- server_name = server.config.name
1335
- title_ = f"ZenML server '{server_name}'"
1336
-
1337
- rich_table = table.Table(
1338
- box=box.HEAVY_EDGE,
1339
- title=title_,
1340
- show_header=False,
1341
- show_lines=True,
1342
- )
1343
- rich_table.add_column("", overflow="fold")
1344
- rich_table.add_column("", overflow="fold")
1345
-
1346
- server_info = []
1347
-
1348
- if server.status:
1349
- server_info.extend(
1350
- [
1351
- ("URL", server.status.url or ""),
1352
- ("STATUS", get_service_state_emoji(server.status.status)),
1353
- ("STATUS_MESSAGE", server.status.status_message or ""),
1354
- (
1355
- "CONNECTED",
1356
- ":white_check_mark:" if server.status.connected else "",
1357
- ),
1358
- ]
1359
- )
1360
-
1361
- for item in server_info:
1362
- rich_table.add_row(*item)
1363
-
1364
- console.print(rich_table)
1365
-
1366
-
1367
1404
  def describe_pydantic_object(schema_json: Dict[str, Any]) -> None:
1368
1405
  """Describes a Pydantic object based on the dict-representation of its schema.
1369
1406
 
@@ -1537,7 +1574,7 @@ def print_components_table(
1537
1574
  "ACTIVE": ":point_right:" if is_active else "",
1538
1575
  "NAME": component.name,
1539
1576
  "COMPONENT ID": component.id,
1540
- "FLAVOR": component.flavor,
1577
+ "FLAVOR": component.flavor_name,
1541
1578
  "OWNER": f"{component.user.name if component.user else '-'}",
1542
1579
  }
1543
1580
  configurations.append(component_config)
@@ -1593,7 +1630,7 @@ def expires_in(
1593
1630
  expires_at -= datetime.timedelta(seconds=skew_tolerance)
1594
1631
  if expires_at < now:
1595
1632
  return expired_str
1596
- return seconds_to_human_readable((expires_at - now).seconds)
1633
+ return seconds_to_human_readable(int((expires_at - now).total_seconds()))
1597
1634
 
1598
1635
 
1599
1636
  def print_service_connectors_table(
@@ -1656,13 +1693,15 @@ def print_service_connectors_table(
1656
1693
  "RESOURCE TYPES": "\n".join(connector.emojified_resource_types),
1657
1694
  "RESOURCE NAME": resource_name,
1658
1695
  "OWNER": f"{connector.user.name if connector.user else '-'}",
1659
- "EXPIRES IN": expires_in(
1660
- connector.expires_at,
1661
- ":name_badge: Expired!",
1662
- connector.expires_skew_tolerance,
1663
- )
1664
- if connector.expires_at
1665
- else "",
1696
+ "EXPIRES IN": (
1697
+ expires_in(
1698
+ connector.expires_at,
1699
+ ":name_badge: Expired!",
1700
+ connector.expires_skew_tolerance,
1701
+ )
1702
+ if connector.expires_at
1703
+ else ""
1704
+ ),
1666
1705
  "LABELS": "\n".join(labels),
1667
1706
  }
1668
1707
  configurations.append(connector_config)
@@ -1718,15 +1757,17 @@ def print_service_connector_resource_table(
1718
1757
  resource_row = {}
1719
1758
  if not show_resources_only:
1720
1759
  resource_row = {
1721
- "CONNECTOR ID": str(resource_model.id)
1722
- if not printed_connector
1723
- else "",
1724
- "CONNECTOR NAME": resource_model.name
1725
- if not printed_connector
1726
- else "",
1727
- "CONNECTOR TYPE": resource_model.emojified_connector_type
1728
- if not printed_connector
1729
- else "",
1760
+ "CONNECTOR ID": (
1761
+ str(resource_model.id) if not printed_connector else ""
1762
+ ),
1763
+ "CONNECTOR NAME": (
1764
+ resource_model.name if not printed_connector else ""
1765
+ ),
1766
+ "CONNECTOR TYPE": (
1767
+ resource_model.emojified_connector_type
1768
+ if not printed_connector
1769
+ else ""
1770
+ ),
1730
1771
  }
1731
1772
  resource_row.update(
1732
1773
  {
@@ -1771,8 +1812,7 @@ def print_service_connector_configuration(
1771
1812
  )
1772
1813
  else:
1773
1814
  declare(
1774
- f"Service connector '{connector.name}' of type "
1775
- f"'{connector.type}'."
1815
+ f"Service connector '{connector.name}' of type '{connector.type}'."
1776
1816
  )
1777
1817
 
1778
1818
  title_ = f"'{connector.name}' {connector.type} Service Connector Details"
@@ -1802,16 +1842,20 @@ def print_service_connector_configuration(
1802
1842
  "RESOURCE NAME": connector.resource_id or "<multiple>",
1803
1843
  "SECRET ID": connector.secret_id or "",
1804
1844
  "SESSION DURATION": expiration,
1805
- "EXPIRES IN": expires_in(
1806
- connector.expires_at,
1807
- ":name_badge: Expired!",
1808
- connector.expires_skew_tolerance,
1809
- )
1810
- if connector.expires_at
1811
- else "N/A",
1812
- "EXPIRES_SKEW_TOLERANCE": connector.expires_skew_tolerance
1813
- if connector.expires_skew_tolerance
1814
- else "N/A",
1845
+ "EXPIRES IN": (
1846
+ expires_in(
1847
+ connector.expires_at,
1848
+ ":name_badge: Expired!",
1849
+ connector.expires_skew_tolerance,
1850
+ )
1851
+ if connector.expires_at
1852
+ else "N/A"
1853
+ ),
1854
+ "EXPIRES_SKEW_TOLERANCE": (
1855
+ connector.expires_skew_tolerance
1856
+ if connector.expires_skew_tolerance
1857
+ else "N/A"
1858
+ ),
1815
1859
  "OWNER": user_name,
1816
1860
  "WORKSPACE": connector.workspace.name,
1817
1861
  "CREATED_AT": connector.created,
@@ -1825,16 +1869,20 @@ def print_service_connector_configuration(
1825
1869
  "RESOURCE TYPES": ", ".join(connector.emojified_resource_types),
1826
1870
  "RESOURCE NAME": connector.resource_id or "<multiple>",
1827
1871
  "SESSION DURATION": expiration,
1828
- "EXPIRES IN": expires_in(
1829
- connector.expires_at,
1830
- ":name_badge: Expired!",
1831
- connector.expires_skew_tolerance,
1832
- )
1833
- if connector.expires_at
1834
- else "N/A",
1835
- "EXPIRES_SKEW_TOLERANCE": connector.expires_skew_tolerance
1836
- if connector.expires_skew_tolerance
1837
- else "N/A",
1872
+ "EXPIRES IN": (
1873
+ expires_in(
1874
+ connector.expires_at,
1875
+ ":name_badge: Expired!",
1876
+ connector.expires_skew_tolerance,
1877
+ )
1878
+ if connector.expires_at
1879
+ else "N/A"
1880
+ ),
1881
+ "EXPIRES_SKEW_TOLERANCE": (
1882
+ connector.expires_skew_tolerance
1883
+ if connector.expires_skew_tolerance
1884
+ else "N/A"
1885
+ ),
1838
1886
  }
1839
1887
 
1840
1888
  for item in properties.items():
@@ -1944,7 +1992,7 @@ def print_service_connector_resource_type(
1944
1992
  message = f"{title}\n" if title else ""
1945
1993
  emoji = replace_emojis(resource_type.emoji) if resource_type.emoji else ""
1946
1994
  supported_auth_methods = [
1947
- f'{Emoji("lock")} {a}' for a in resource_type.auth_methods
1995
+ f"{Emoji('lock')} {a}" for a in resource_type.auth_methods
1948
1996
  ]
1949
1997
  message += (
1950
1998
  f"{heading} {emoji} {resource_type.name} "
@@ -2068,7 +2116,7 @@ def print_service_connector_type(
2068
2116
  """
2069
2117
  message = f"{title}\n" if title else ""
2070
2118
  supported_auth_methods = [
2071
- f'{Emoji("lock")} {a.auth_method}' for a in connector_type.auth_methods
2119
+ f"{Emoji('lock')} {a.auth_method}" for a in connector_type.auth_methods
2072
2120
  ]
2073
2121
  supported_resource_types = [
2074
2122
  f"{replace_emojis(r.emoji)} {r.resource_type}"
@@ -2153,7 +2201,7 @@ def _scrub_secret(config: StackComponentConfig) -> Dict[str, Any]:
2153
2201
  A configuration with secret values removed.
2154
2202
  """
2155
2203
  config_dict = {}
2156
- config_fields = dict(config.__class__.__fields__)
2204
+ config_fields = config.__class__.model_fields
2157
2205
  for key, value in config_fields.items():
2158
2206
  if secret_utils.is_secret_field(value):
2159
2207
  config_dict[key] = "********"
@@ -2329,12 +2377,13 @@ def create_filter_help_text(filter_model: Type[BaseFilter], field: str) -> str:
2329
2377
  Returns:
2330
2378
  The help text.
2331
2379
  """
2332
- if filter_model.is_sort_by_field(field):
2380
+ filter_generator = FilterGenerator(filter_model)
2381
+ if filter_generator.is_sort_by_field(field):
2333
2382
  return (
2334
2383
  "[STRING] Example: --sort_by='desc:name' to sort by name in "
2335
2384
  "descending order. "
2336
2385
  )
2337
- if filter_model.is_datetime_field(field):
2386
+ if filter_generator.is_datetime_field(field):
2338
2387
  return (
2339
2388
  f"[DATETIME] The following datetime format is supported: "
2340
2389
  f"'{FILTERING_DATETIME_FORMAT}'. Make sure to keep it in "
@@ -2343,23 +2392,23 @@ def create_filter_help_text(filter_model: Type[BaseFilter], field: str) -> str:
2343
2392
  f"'{GenericFilterOps.GTE}:{FILTERING_DATETIME_FORMAT}' to "
2344
2393
  f"filter for everything created on or after the given date."
2345
2394
  )
2346
- elif filter_model.is_uuid_field(field):
2395
+ elif filter_generator.is_uuid_field(field):
2347
2396
  return (
2348
2397
  f"[UUID] Example: --{field}='{GenericFilterOps.STARTSWITH}:ab53ca' "
2349
2398
  f"to filter for all UUIDs starting with that prefix."
2350
2399
  )
2351
- elif filter_model.is_int_field(field):
2400
+ elif filter_generator.is_int_field(field):
2352
2401
  return (
2353
2402
  f"[INTEGER] Example: --{field}='{GenericFilterOps.GTE}:25' to "
2354
2403
  f"filter for all entities where this field has a value greater than "
2355
2404
  f"or equal to the value."
2356
2405
  )
2357
- elif filter_model.is_bool_field(field):
2406
+ elif filter_generator.is_bool_field(field):
2358
2407
  return (
2359
2408
  f"[BOOL] Example: --{field}='True' to "
2360
2409
  f"filter for all instances where this field is true."
2361
2410
  )
2362
- elif filter_model.is_str_field(field):
2411
+ elif filter_generator.is_str_field(field):
2363
2412
  return (
2364
2413
  f"[STRING] Example: --{field}='{GenericFilterOps.CONTAINS}:example' "
2365
2414
  f"to filter everything that contains the query string somewhere in "
@@ -2381,27 +2430,28 @@ def create_data_type_help_text(
2381
2430
  Returns:
2382
2431
  The help text.
2383
2432
  """
2384
- if filter_model.is_datetime_field(field):
2433
+ filter_generator = FilterGenerator(filter_model)
2434
+ if filter_generator.is_datetime_field(field):
2385
2435
  return (
2386
2436
  f"[DATETIME] supported filter operators: "
2387
2437
  f"{[str(op) for op in NumericFilter.ALLOWED_OPS]}"
2388
2438
  )
2389
- elif filter_model.is_uuid_field(field):
2439
+ elif filter_generator.is_uuid_field(field):
2390
2440
  return (
2391
2441
  f"[UUID] supported filter operators: "
2392
2442
  f"{[str(op) for op in UUIDFilter.ALLOWED_OPS]}"
2393
2443
  )
2394
- elif filter_model.is_int_field(field):
2444
+ elif filter_generator.is_int_field(field):
2395
2445
  return (
2396
2446
  f"[INTEGER] supported filter operators: "
2397
2447
  f"{[str(op) for op in NumericFilter.ALLOWED_OPS]}"
2398
2448
  )
2399
- elif filter_model.is_bool_field(field):
2449
+ elif filter_generator.is_bool_field(field):
2400
2450
  return (
2401
2451
  f"[BOOL] supported filter operators: "
2402
2452
  f"{[str(op) for op in BoolFilter.ALLOWED_OPS]}"
2403
2453
  )
2404
- elif filter_model.is_str_field(field):
2454
+ elif filter_generator.is_str_field(field):
2405
2455
  return (
2406
2456
  f"[STRING] supported filter operators: "
2407
2457
  f"{[str(op) for op in StrFilter.ALLOWED_OPS]}"
@@ -2430,7 +2480,7 @@ def list_options(filter_model: Type[BaseFilter]) -> Callable[[F], F]:
2430
2480
  def inner_decorator(func: F) -> F:
2431
2481
  options = []
2432
2482
  data_type_descriptors = set()
2433
- for k, v in filter_model.__fields__.items():
2483
+ for k, v in filter_model.model_fields.items():
2434
2484
  if k not in filter_model.CLI_EXCLUDE_FIELDS:
2435
2485
  options.append(
2436
2486
  click.option(
@@ -2610,29 +2660,100 @@ def print_model_url(url: Optional[str]) -> None:
2610
2660
  warning(
2611
2661
  "You can display various ZenML entities including pipelines, "
2612
2662
  "runs, stacks and much more on the ZenML Dashboard. "
2613
- "You can try it locally, by running `zenml up`, or remotely, "
2614
- "by deploying ZenML on the infrastructure of your choice."
2663
+ "You can try it locally, by running `zenml local --local`, or "
2664
+ "remotely, by deploying ZenML on the infrastructure of your choice."
2615
2665
  )
2616
2666
 
2617
2667
 
2618
- def warn_deprecated_example_subcommand() -> None:
2619
- """Warning for deprecating example subcommand."""
2620
- warning(
2621
- "The `example` CLI subcommand has been deprecated and will be removed "
2622
- "in a future release."
2623
- )
2624
-
2668
+ def is_jupyter_installed() -> bool:
2669
+ """Checks if Jupyter notebook is installed.
2625
2670
 
2626
- def verify_mlstacks_prerequisites_installation() -> None:
2627
- """Checks if the `mlstacks` package is installed."""
2671
+ Returns:
2672
+ bool: True if Jupyter notebook is installed, False otherwise.
2673
+ """
2628
2674
  try:
2629
- import mlstacks # noqa: F401
2630
- import python_terraform # noqa: F401
2675
+ pkg_resources.get_distribution("notebook")
2676
+ return True
2677
+ except pkg_resources.DistributionNotFound:
2678
+ return False
2679
+
2680
+
2681
+ def multi_choice_prompt(
2682
+ object_type: str,
2683
+ choices: List[List[Any]],
2684
+ headers: List[str],
2685
+ prompt_text: str,
2686
+ allow_zero_be_a_new_object: bool = False,
2687
+ default_choice: Optional[str] = None,
2688
+ ) -> Optional[int]:
2689
+ """Prompts the user to select a choice from a list of choices.
2690
+
2691
+ Args:
2692
+ object_type: The type of the object
2693
+ choices: The list of choices
2694
+ prompt_text: The prompt text
2695
+ headers: The list of headers.
2696
+ allow_zero_be_a_new_object: Whether to allow zero as a new object
2697
+ default_choice: The default choice
2631
2698
 
2632
- subprocess.check_output(
2633
- ["terraform", "--version"], universal_newlines=True
2699
+ Returns:
2700
+ The selected choice index or None for new object
2701
+
2702
+ Raises:
2703
+ RuntimeError: If no choice is made.
2704
+ """
2705
+ table = Table(
2706
+ title=f"Available {object_type}",
2707
+ show_header=True,
2708
+ border_style=None,
2709
+ expand=True,
2710
+ show_lines=True,
2711
+ )
2712
+ table.add_column("Choice", justify="left", width=1)
2713
+ for h in headers:
2714
+ table.add_column(
2715
+ h.replace("_", " ").capitalize(), justify="left", width=10
2634
2716
  )
2635
- except ImportError:
2636
- error(NOT_INSTALLED_MESSAGE)
2637
- except subprocess.CalledProcessError:
2638
- error(TERRAFORM_NOT_INSTALLED_MESSAGE)
2717
+
2718
+ i_shift = 0
2719
+ if allow_zero_be_a_new_object:
2720
+ i_shift = 1
2721
+ table.add_row(
2722
+ "[0]",
2723
+ *([f"Create a new {object_type}"] * len(headers)),
2724
+ )
2725
+ for i, one_choice in enumerate(choices):
2726
+ table.add_row(f"[{i + i_shift}]", *[str(x) for x in one_choice])
2727
+ Console().print(table)
2728
+
2729
+ selected = Prompt.ask(
2730
+ prompt_text,
2731
+ choices=[str(i) for i in range(0, len(choices) + 1)],
2732
+ default=default_choice,
2733
+ show_choices=False,
2734
+ )
2735
+ if selected is None:
2736
+ raise RuntimeError(f"No {object_type} was selected")
2737
+
2738
+ if selected == "0" and allow_zero_be_a_new_object:
2739
+ return None
2740
+ else:
2741
+ return int(selected) - i_shift
2742
+
2743
+
2744
+ def requires_mac_env_var_warning() -> bool:
2745
+ """Checks if a warning needs to be shown for a local Mac server.
2746
+
2747
+ This is for the case where a user is on a macOS system, trying to run a
2748
+ local server but is missing the `OBJC_DISABLE_INITIALIZE_FORK_SAFETY`
2749
+ environment variable.
2750
+
2751
+ Returns:
2752
+ bool: True if a warning needs to be shown, False otherwise.
2753
+ """
2754
+ if sys.platform == "darwin":
2755
+ mac_version_tuple = tuple(map(int, platform.release().split(".")[:2]))
2756
+ return not os.getenv(
2757
+ "OBJC_DISABLE_INITIALIZE_FORK_SAFETY"
2758
+ ) and mac_version_tuple >= (10, 13)
2759
+ return False