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
@@ -12,9 +12,11 @@
12
12
  # or implied. See the License for the specific language governing
13
13
  # permissions and limitations under the License.
14
14
  """REST Zen Store implementation."""
15
+
15
16
  import os
16
17
  import re
17
- from pathlib import Path, PurePath
18
+ from datetime import datetime
19
+ from pathlib import Path
18
20
  from typing import (
19
21
  Any,
20
22
  ClassVar,
@@ -31,14 +33,23 @@ from uuid import UUID
31
33
 
32
34
  import requests
33
35
  import urllib3
34
- from pydantic import BaseModel, root_validator, validator
36
+ from pydantic import (
37
+ BaseModel,
38
+ ConfigDict,
39
+ Field,
40
+ ValidationError,
41
+ field_validator,
42
+ model_validator,
43
+ )
35
44
  from requests.adapters import HTTPAdapter, Retry
36
45
 
37
46
  import zenml
38
47
  from zenml.analytics import source_context
39
48
  from zenml.config.global_config import GlobalConfiguration
49
+ from zenml.config.pipeline_run_configuration import PipelineRunConfiguration
40
50
  from zenml.config.store_config import StoreConfiguration
41
51
  from zenml.constants import (
52
+ ACTIONS,
42
53
  API,
43
54
  API_KEY_ROTATE,
44
55
  API_KEYS,
@@ -46,13 +57,17 @@ from zenml.constants import (
46
57
  ARTIFACT_VERSIONS,
47
58
  ARTIFACT_VISUALIZATIONS,
48
59
  ARTIFACTS,
60
+ BATCH,
49
61
  CODE_REFERENCES,
50
62
  CODE_REPOSITORIES,
63
+ CONFIG,
51
64
  CURRENT_USER,
65
+ DEACTIVATE,
52
66
  DEFAULT_HTTP_TIMEOUT,
53
67
  DEVICES,
54
68
  DISABLE_CLIENT_SERVER_MISMATCH_WARNING,
55
69
  ENV_ZENML_DISABLE_CLIENT_SERVER_MISMATCH_WARNING,
70
+ EVENT_SOURCES,
56
71
  FLAVORS,
57
72
  GET_OR_CREATE,
58
73
  INFO,
@@ -66,36 +81,58 @@ from zenml.constants import (
66
81
  PIPELINE_DEPLOYMENTS,
67
82
  PIPELINES,
68
83
  RUN_METADATA,
84
+ RUN_TEMPLATES,
69
85
  RUNS,
70
86
  SCHEDULES,
71
87
  SECRETS,
72
88
  SECRETS_BACKUP,
73
89
  SECRETS_OPERATIONS,
74
90
  SECRETS_RESTORE,
91
+ SERVER_SETTINGS,
75
92
  SERVICE_ACCOUNTS,
76
93
  SERVICE_CONNECTOR_CLIENT,
77
94
  SERVICE_CONNECTOR_RESOURCES,
78
95
  SERVICE_CONNECTOR_TYPES,
79
96
  SERVICE_CONNECTOR_VERIFY,
97
+ SERVICE_CONNECTOR_VERIFY_REQUEST_TIMEOUT,
80
98
  SERVICE_CONNECTORS,
99
+ SERVICES,
100
+ STACK,
81
101
  STACK_COMPONENTS,
102
+ STACK_DEPLOYMENT,
82
103
  STACKS,
83
104
  STEPS,
84
105
  TAGS,
106
+ TRIGGER_EXECUTIONS,
107
+ TRIGGERS,
85
108
  USERS,
86
109
  VERSION_1,
87
110
  WORKSPACES,
88
111
  )
89
112
  from zenml.enums import (
113
+ APITokenType,
90
114
  OAuthGrantTypes,
115
+ StackDeploymentProvider,
91
116
  StoreType,
92
117
  )
93
118
  from zenml.exceptions import (
94
119
  AuthorizationException,
120
+ CredentialsNotValid,
121
+ MethodNotAllowedError,
95
122
  )
96
123
  from zenml.io import fileio
97
124
  from zenml.logger import get_logger
125
+ from zenml.login.credentials import APIToken
126
+ from zenml.login.credentials_store import get_credentials_store
127
+ from zenml.login.pro.constants import ZENML_PRO_API_URL
128
+ from zenml.login.pro.utils import (
129
+ get_troubleshooting_instructions,
130
+ )
98
131
  from zenml.models import (
132
+ ActionFilter,
133
+ ActionRequest,
134
+ ActionResponse,
135
+ ActionUpdate,
99
136
  APIKeyFilter,
100
137
  APIKeyRequest,
101
138
  APIKeyResponse,
@@ -111,8 +148,8 @@ from zenml.models import (
111
148
  ArtifactVersionUpdate,
112
149
  ArtifactVisualizationResponse,
113
150
  BaseFilter,
151
+ BaseIdentifiedResponse,
114
152
  BaseRequest,
115
- BaseResponse,
116
153
  CodeReferenceResponse,
117
154
  CodeRepositoryFilter,
118
155
  CodeRepositoryRequest,
@@ -122,6 +159,11 @@ from zenml.models import (
122
159
  ComponentRequest,
123
160
  ComponentResponse,
124
161
  ComponentUpdate,
162
+ DeployedStack,
163
+ EventSourceFilter,
164
+ EventSourceRequest,
165
+ EventSourceResponse,
166
+ EventSourceUpdate,
125
167
  FlavorFilter,
126
168
  FlavorRequest,
127
169
  FlavorResponse,
@@ -144,6 +186,7 @@ from zenml.models import (
144
186
  OAuthDeviceFilter,
145
187
  OAuthDeviceResponse,
146
188
  OAuthDeviceUpdate,
189
+ OAuthTokenResponse,
147
190
  Page,
148
191
  PipelineBuildFilter,
149
192
  PipelineBuildRequest,
@@ -159,9 +202,11 @@ from zenml.models import (
159
202
  PipelineRunResponse,
160
203
  PipelineRunUpdate,
161
204
  PipelineUpdate,
162
- RunMetadataFilter,
163
205
  RunMetadataRequest,
164
- RunMetadataResponse,
206
+ RunTemplateFilter,
207
+ RunTemplateRequest,
208
+ RunTemplateResponse,
209
+ RunTemplateUpdate,
165
210
  ScheduleFilter,
166
211
  ScheduleRequest,
167
212
  ScheduleResponse,
@@ -171,6 +216,8 @@ from zenml.models import (
171
216
  SecretResponse,
172
217
  SecretUpdate,
173
218
  ServerModel,
219
+ ServerSettingsResponse,
220
+ ServerSettingsUpdate,
174
221
  ServiceAccountFilter,
175
222
  ServiceAccountRequest,
176
223
  ServiceAccountResponse,
@@ -181,6 +228,12 @@ from zenml.models import (
181
228
  ServiceConnectorResponse,
182
229
  ServiceConnectorTypeModel,
183
230
  ServiceConnectorUpdate,
231
+ ServiceFilter,
232
+ ServiceRequest,
233
+ ServiceResponse,
234
+ ServiceUpdate,
235
+ StackDeploymentConfig,
236
+ StackDeploymentInfo,
184
237
  StackFilter,
185
238
  StackRequest,
186
239
  StackResponse,
@@ -193,6 +246,12 @@ from zenml.models import (
193
246
  TagRequest,
194
247
  TagResponse,
195
248
  TagUpdate,
249
+ TriggerExecutionFilter,
250
+ TriggerExecutionResponse,
251
+ TriggerFilter,
252
+ TriggerRequest,
253
+ TriggerResponse,
254
+ TriggerUpdate,
196
255
  UserFilter,
197
256
  UserRequest,
198
257
  UserResponse,
@@ -209,6 +268,7 @@ from zenml.service_connectors.service_connector_registry import (
209
268
  from zenml.utils.networking_utils import (
210
269
  replace_localhost_with_internal_hostname,
211
270
  )
271
+ from zenml.utils.pydantic_utils import before_validator_handler
212
272
  from zenml.zen_server.exceptions import exception_from_response
213
273
  from zenml.zen_stores.base_zen_store import BaseZenStore
214
274
 
@@ -219,7 +279,7 @@ Json = Union[Dict[str, Any], List[Any], str, int, float, bool, None]
219
279
 
220
280
 
221
281
  AnyRequest = TypeVar("AnyRequest", bound=BaseRequest)
222
- AnyResponse = TypeVar("AnyResponse", bound=BaseResponse) # type: ignore[type-arg]
282
+ AnyResponse = TypeVar("AnyResponse", bound=BaseIdentifiedResponse) # type: ignore[type-arg]
223
283
  AnyWorkspaceScopedRequest = TypeVar(
224
284
  "AnyWorkspaceScopedRequest",
225
285
  bound=WorkspaceScopedRequest,
@@ -234,10 +294,10 @@ class RestZenStoreConfiguration(StoreConfiguration):
234
294
  username: The username to use to connect to the Zen server.
235
295
  password: The password to use to connect to the Zen server.
236
296
  api_key: The service account API key to use to connect to the Zen
237
- server.
238
- api_token: The API token to use to connect to the Zen server. Generated
239
- by the client and stored in the configuration file on the first
240
- login and every time the API key is refreshed.
297
+ server. This is only set if the API key is configured explicitly via
298
+ environment variables or the ZenML global configuration file. API
299
+ keys configured via the CLI are stored in the credentials store
300
+ instead.
241
301
  verify_ssl: Either a boolean, in which case it controls whether we
242
302
  verify the server's TLS certificate, or a string, in which case it
243
303
  must be a path to a CA bundle to use or the CA bundle value itself.
@@ -247,40 +307,13 @@ class RestZenStoreConfiguration(StoreConfiguration):
247
307
 
248
308
  type: StoreType = StoreType.REST
249
309
 
250
- username: Optional[str] = None
251
- password: Optional[str] = None
252
- api_key: Optional[str] = None
253
- api_token: Optional[str] = None
254
- verify_ssl: Union[bool, str] = True
310
+ verify_ssl: Union[bool, str] = Field(
311
+ default=True, union_mode="left_to_right"
312
+ )
255
313
  http_timeout: int = DEFAULT_HTTP_TIMEOUT
256
314
 
257
- @root_validator
258
- def validate_credentials(cls, values: Dict[str, Any]) -> Dict[str, Any]:
259
- """Validates the credentials provided in the values dictionary.
260
-
261
- Args:
262
- values: A dictionary containing the values to be validated.
263
-
264
- Raises:
265
- ValueError: If neither api_token nor username nor api_key is set.
266
-
267
- Returns:
268
- The values dictionary.
269
- """
270
- # Check if the values dictionary contains either an API token, an API
271
- # key or a username as non-empty strings.
272
- if (
273
- values.get("api_token")
274
- or values.get("username")
275
- or values.get("api_key")
276
- ):
277
- return values
278
- raise ValueError(
279
- "Neither api_token nor username nor api_key is set in the "
280
- "store config."
281
- )
282
-
283
- @validator("url")
315
+ @field_validator("url")
316
+ @classmethod
284
317
  def validate_url(cls, url: str) -> str:
285
318
  """Validates that the URL is a well-formed REST store URL.
286
319
 
@@ -308,7 +341,8 @@ class RestZenStoreConfiguration(StoreConfiguration):
308
341
 
309
342
  return url
310
343
 
311
- @validator("verify_ssl")
344
+ @field_validator("verify_ssl")
345
+ @classmethod
312
346
  def validate_verify_ssl(
313
347
  cls, verify_ssl: Union[bool, str]
314
348
  ) -> Union[bool, str]:
@@ -335,9 +369,10 @@ class RestZenStoreConfiguration(StoreConfiguration):
335
369
 
336
370
  fileio.makedirs(str(secret_folder))
337
371
  file_path = Path(secret_folder, "ca_bundle.pem")
338
- with open(file_path, "w") as f:
372
+ with os.fdopen(
373
+ os.open(file_path, flags=os.O_RDWR | os.O_CREAT, mode=0o600), "w"
374
+ ) as f:
339
375
  f.write(verify_ssl)
340
- file_path.chmod(0o600)
341
376
  verify_ssl = str(file_path)
342
377
 
343
378
  return verify_ssl
@@ -363,54 +398,48 @@ class RestZenStoreConfiguration(StoreConfiguration):
363
398
  with open(self.verify_ssl, "r") as f:
364
399
  self.verify_ssl = f.read()
365
400
 
401
+ @model_validator(mode="before")
366
402
  @classmethod
367
- def copy_configuration(
368
- cls,
369
- config: "StoreConfiguration",
370
- config_path: str,
371
- load_config_path: Optional[PurePath] = None,
372
- ) -> "StoreConfiguration":
373
- """Create a copy of the store config using a different path.
374
-
375
- This method is used to create a copy of the store configuration that can
376
- be loaded using a different configuration path or in the context of a
377
- new environment, such as a container image.
378
-
379
- The configuration files accompanying the store configuration are also
380
- copied to the new configuration path (e.g. certificates etc.).
381
-
382
- Args:
383
- config: The store configuration to copy.
384
- config_path: new path where the configuration copy will be loaded
385
- from.
386
- load_config_path: absolute path that will be used to load the copied
387
- configuration. This can be set to a value different from
388
- `config_path` if the configuration copy will be loaded from
389
- a different environment, e.g. when the configuration is copied
390
- to a container image and loaded using a different absolute path.
391
- This will be reflected in the paths and URLs encoded in the
392
- copied configuration.
393
-
394
- Returns:
395
- A new store configuration object that reflects the new configuration
396
- path.
397
- """
398
- assert isinstance(config, RestZenStoreConfiguration)
399
- assert config.api_token is not None or config.api_key is not None
400
- config = config.copy(exclude={"username", "password"}, deep=True)
401
- # Load the certificate values back into the configuration
402
- config.expand_certificates()
403
- return config
403
+ @before_validator_handler
404
+ def _move_credentials(cls, data: Dict[str, Any]) -> Dict[str, Any]:
405
+ """Moves credentials (API keys, API tokens, passwords) from the config to the credentials store.
406
+
407
+ Args:
408
+ data: The values dict used to instantiate the model.
404
409
 
405
- class Config:
406
- """Pydantic configuration class."""
410
+ Returns:
411
+ The values dict without credentials.
412
+ """
413
+ url = data.get("url")
414
+ if not url:
415
+ return data
416
+
417
+ url = replace_localhost_with_internal_hostname(url)
418
+
419
+ if api_token := data.pop("api_token", None):
420
+ credentials_store = get_credentials_store()
421
+ credentials_store.set_bare_token(url, api_token)
407
422
 
423
+ username = data.pop("username", None)
424
+ password = data.pop("password", None)
425
+ if username is not None and password is not None:
426
+ credentials_store = get_credentials_store()
427
+ credentials_store.set_password(url, username, password)
428
+
429
+ if api_key := data.pop("api_key", None):
430
+ credentials_store = get_credentials_store()
431
+ credentials_store.set_api_key(url, api_key)
432
+
433
+ return data
434
+
435
+ model_config = ConfigDict(
408
436
  # Don't validate attributes when assigning them. This is necessary
409
437
  # because the `verify_ssl` attribute can be expanded to the contents
410
438
  # of the certificate file.
411
- validate_assignment = False
412
- # Forbid extra attributes set in the class.
413
- extra = "forbid"
439
+ validate_assignment=False,
440
+ # Ignore extra attributes set in the class.
441
+ extra="ignore",
442
+ )
414
443
 
415
444
 
416
445
  class RestZenStore(BaseZenStore):
@@ -419,8 +448,9 @@ class RestZenStore(BaseZenStore):
419
448
  config: RestZenStoreConfiguration
420
449
  TYPE: ClassVar[StoreType] = StoreType.REST
421
450
  CONFIG_TYPE: ClassVar[Type[StoreConfiguration]] = RestZenStoreConfiguration
422
- _api_token: Optional[str] = None
451
+ _api_token: Optional[APIToken] = None
423
452
  _session: Optional[requests.Session] = None
453
+ _server_info: Optional[ServerModel] = None
424
454
 
425
455
  # ====================================
426
456
  # ZenML Store interface implementation
@@ -431,9 +461,54 @@ class RestZenStore(BaseZenStore):
431
461
  # --------------------------------
432
462
 
433
463
  def _initialize(self) -> None:
434
- """Initialize the REST store."""
435
- client_version = zenml.__version__
436
- server_version = self.get_store_info().version
464
+ """Initialize the REST store.
465
+
466
+ Raises:
467
+ RuntimeError: If the store cannot be initialized.
468
+ AuthorizationException: If the store cannot be initialized due to
469
+ authentication errors.
470
+ """
471
+ try:
472
+ client_version = zenml.__version__
473
+ server_version = self.server_info.version
474
+
475
+ # Handle cases where the ZenML server is not available
476
+ except ConnectionError as e:
477
+ error_message = (
478
+ f"Cannot connect to the ZenML server at {self.url}."
479
+ )
480
+ if urlparse(self.url).hostname in [
481
+ "localhost",
482
+ "127.0.0.1",
483
+ "host.docker.internal",
484
+ ]:
485
+ recommendation = (
486
+ "Please run `zenml login --local --restart` to restart the "
487
+ "server."
488
+ )
489
+ else:
490
+ recommendation = (
491
+ f"Please run `zenml login {self.url}` to reconnect to the "
492
+ "server."
493
+ )
494
+ raise RuntimeError(f"{error_message}\n{recommendation}") from e
495
+
496
+ except AuthorizationException as e:
497
+ raise AuthorizationException(
498
+ f"Authorization failed for store at '{self.url}'. Please check "
499
+ f"your credentials: {str(e)}"
500
+ )
501
+
502
+ except Exception as e:
503
+ zenml_pro_extra = ""
504
+ if ".zenml.io" in self.url:
505
+ zenml_pro_extra = (
506
+ "\nHINT: " + get_troubleshooting_instructions(self.url)
507
+ )
508
+ raise RuntimeError(
509
+ f"Error connecting to URL "
510
+ f"'{self.url}': {str(e)}" + zenml_pro_extra
511
+ ) from e
437
512
 
438
513
  if not DISABLE_CLIENT_SERVER_MISMATCH_WARNING and (
439
514
  server_version != client_version
@@ -448,6 +523,17 @@ class RestZenStore(BaseZenStore):
448
523
  ENV_ZENML_DISABLE_CLIENT_SERVER_MISMATCH_WARNING,
449
524
  )
450
525
 
526
+ @property
527
+ def server_info(self) -> ServerModel:
528
+ """Get cached information about the server.
529
+
530
+ Returns:
531
+ Cached information about the server.
532
+ """
533
+ if self._server_info is None:
534
+ return self.get_store_info()
535
+ return self._server_info
536
+
451
537
  def get_store_info(self) -> ServerModel:
452
538
  """Get information about the server.
453
539
 
@@ -455,7 +541,8 @@ class RestZenStore(BaseZenStore):
455
541
  Information about the server.
456
542
  """
457
543
  body = self.get(INFO)
458
- return ServerModel.parse_obj(body)
544
+ self._server_info = ServerModel.model_validate(body)
545
+ return self._server_info
459
546
 
460
547
  def get_deployment_id(self) -> UUID:
461
548
  """Get the ID of the deployment.
@@ -463,7 +550,132 @@ class RestZenStore(BaseZenStore):
463
550
  Returns:
464
551
  The ID of the deployment.
465
552
  """
466
- return self.get_store_info().id
553
+ return self.server_info.id
554
+
555
+ # -------------------- Server Settings --------------------
556
+
557
+ def get_server_settings(
558
+ self, hydrate: bool = True
559
+ ) -> ServerSettingsResponse:
560
+ """Get the server settings.
561
+
562
+ Args:
563
+ hydrate: Flag deciding whether to hydrate the output model(s)
564
+ by including metadata fields in the response.
565
+
566
+ Returns:
567
+ The server settings.
568
+ """
569
+ response_body = self.get(SERVER_SETTINGS, params={"hydrate": hydrate})
570
+ return ServerSettingsResponse.model_validate(response_body)
571
+
572
+ def update_server_settings(
573
+ self, settings_update: ServerSettingsUpdate
574
+ ) -> ServerSettingsResponse:
575
+ """Update the server settings.
576
+
577
+ Args:
578
+ settings_update: The server settings update.
579
+
580
+ Returns:
581
+ The updated server settings.
582
+ """
583
+ response_body = self.put(SERVER_SETTINGS, body=settings_update)
584
+ return ServerSettingsResponse.model_validate(response_body)
585
+
586
+ # -------------------- Actions --------------------
587
+
588
+ def create_action(self, action: ActionRequest) -> ActionResponse:
589
+ """Create an action.
590
+
591
+ Args:
592
+ action: The action to create.
593
+
594
+ Returns:
595
+ The created action.
596
+ """
597
+ return self._create_resource(
598
+ resource=action,
599
+ route=ACTIONS,
600
+ response_model=ActionResponse,
601
+ )
602
+
603
+ def get_action(
604
+ self,
605
+ action_id: UUID,
606
+ hydrate: bool = True,
607
+ ) -> ActionResponse:
608
+ """Get an action by ID.
609
+
610
+ Args:
611
+ action_id: The ID of the action to get.
612
+ hydrate: Flag deciding whether to hydrate the output model(s)
613
+ by including metadata fields in the response.
614
+
615
+ Returns:
616
+ The action.
617
+ """
618
+ return self._get_resource(
619
+ resource_id=action_id,
620
+ route=ACTIONS,
621
+ response_model=ActionResponse,
622
+ params={"hydrate": hydrate},
623
+ )
624
+
625
+ def list_actions(
626
+ self,
627
+ action_filter_model: ActionFilter,
628
+ hydrate: bool = False,
629
+ ) -> Page[ActionResponse]:
630
+ """List all actions matching the given filter criteria.
631
+
632
+ Args:
633
+ action_filter_model: All filter parameters including pagination
634
+ params.
635
+ hydrate: Flag deciding whether to hydrate the output model(s)
636
+ by including metadata fields in the response.
637
+
638
+ Returns:
639
+ A list of all actions matching the filter criteria.
640
+ """
641
+ return self._list_paginated_resources(
642
+ route=ACTIONS,
643
+ response_model=ActionResponse,
644
+ filter_model=action_filter_model,
645
+ params={"hydrate": hydrate},
646
+ )
647
+
648
+ def update_action(
649
+ self,
650
+ action_id: UUID,
651
+ action_update: ActionUpdate,
652
+ ) -> ActionResponse:
653
+ """Update an existing action.
654
+
655
+ Args:
656
+ action_id: The ID of the action to update.
657
+ action_update: The update to be applied to the action.
658
+
659
+ Returns:
660
+ The updated action.
661
+ """
662
+ return self._update_resource(
663
+ resource_id=action_id,
664
+ resource_update=action_update,
665
+ route=ACTIONS,
666
+ response_model=ActionResponse,
667
+ )
668
+
669
+ def delete_action(self, action_id: UUID) -> None:
670
+ """Delete an action.
671
+
672
+ Args:
673
+ action_id: The ID of the action to delete.
674
+ """
675
+ self._delete_resource(
676
+ resource_id=action_id,
677
+ route=ACTIONS,
678
+ )
467
679
 
468
680
  # ----------------------------- API Keys -----------------------------
469
681
 
@@ -511,16 +723,6 @@ class RestZenStore(BaseZenStore):
511
723
  params={"hydrate": hydrate},
512
724
  )
513
725
 
514
- def set_api_key(self, api_key: str) -> None:
515
- """Set the API key to use for authentication.
516
-
517
- Args:
518
- api_key: The API key to use for authentication.
519
- """
520
- self.config.api_key = api_key
521
- self.clear_session()
522
- GlobalConfiguration()._write_config()
523
-
524
726
  def list_api_keys(
525
727
  self,
526
728
  service_account_id: UUID,
@@ -592,7 +794,7 @@ class RestZenStore(BaseZenStore):
592
794
  f"{SERVICE_ACCOUNTS}/{str(service_account_id)}{API_KEYS}/{str(api_key_name_or_id)}{API_KEY_ROTATE}",
593
795
  body=rotate_request,
594
796
  )
595
- return APIKeyResponse.parse_obj(response_body)
797
+ return APIKeyResponse.model_validate(response_body)
596
798
 
597
799
  def delete_api_key(
598
800
  self,
@@ -611,6 +813,93 @@ class RestZenStore(BaseZenStore):
611
813
  route=f"{SERVICE_ACCOUNTS}/{str(service_account_id)}{API_KEYS}",
612
814
  )
613
815
 
816
+ # ----------------------------- Services -----------------------------
817
+
818
+ def create_service(
819
+ self, service_request: ServiceRequest
820
+ ) -> ServiceResponse:
821
+ """Create a new service.
822
+
823
+ Args:
824
+ service_request: The service to create.
825
+
826
+ Returns:
827
+ The created service.
828
+ """
829
+ return self._create_resource(
830
+ resource=service_request,
831
+ response_model=ServiceResponse,
832
+ route=SERVICES,
833
+ )
834
+
835
+ def get_service(
836
+ self, service_id: UUID, hydrate: bool = True
837
+ ) -> ServiceResponse:
838
+ """Get a service.
839
+
840
+ Args:
841
+ service_id: The ID of the service to get.
842
+ hydrate: Flag deciding whether to hydrate the output model(s)
843
+ by including metadata fields in the response.
844
+
845
+ Returns:
846
+ The service.
847
+ """
848
+ return self._get_resource(
849
+ resource_id=service_id,
850
+ route=SERVICES,
851
+ response_model=ServiceResponse,
852
+ params={"hydrate": hydrate},
853
+ )
854
+
855
+ def list_services(
856
+ self, filter_model: ServiceFilter, hydrate: bool = False
857
+ ) -> Page[ServiceResponse]:
858
+ """List all services matching the given filter criteria.
859
+
860
+ Args:
861
+ filter_model: All filter parameters including pagination
862
+ params.
863
+ hydrate: Flag deciding whether to hydrate the output model(s)
864
+ by including metadata fields in the response.
865
+
866
+ Returns:
867
+ A list of all services matching the filter criteria.
868
+ """
869
+ return self._list_paginated_resources(
870
+ route=SERVICES,
871
+ response_model=ServiceResponse,
872
+ filter_model=filter_model,
873
+ params={"hydrate": hydrate},
874
+ )
875
+
876
+ def update_service(
877
+ self, service_id: UUID, update: ServiceUpdate
878
+ ) -> ServiceResponse:
879
+ """Update a service.
880
+
881
+ Args:
882
+ service_id: The ID of the service to update.
883
+ update: The update to be applied to the service.
884
+
885
+ Returns:
886
+ The updated service.
887
+ """
888
+ return self._update_resource(
889
+ resource_id=service_id,
890
+ resource_update=update,
891
+ response_model=ServiceResponse,
892
+ route=SERVICES,
893
+ )
894
+
895
+ def delete_service(self, service_id: UUID) -> None:
896
+ """Delete a service.
897
+
898
+ Args:
899
+ service_id: The ID of the service to delete.
900
+ """
901
+ self._delete_resource(resource_id=service_id, route=SERVICES)
902
+
614
903
  # ----------------------------- Artifacts -----------------------------
615
904
 
616
905
  def create_artifact(self, artifact: ArtifactRequest) -> ArtifactResponse:
@@ -715,6 +1004,23 @@ class RestZenStore(BaseZenStore):
715
1004
  route=ARTIFACT_VERSIONS,
716
1005
  )
717
1006
 
1007
+ def batch_create_artifact_versions(
1008
+ self, artifact_versions: List[ArtifactVersionRequest]
1009
+ ) -> List[ArtifactVersionResponse]:
1010
+ """Creates a batch of artifact versions.
1011
+
1012
+ Args:
1013
+ artifact_versions: The artifact versions to create.
1014
+
1015
+ Returns:
1016
+ The created artifact versions.
1017
+ """
1018
+ return self._batch_create_resources(
1019
+ resources=artifact_versions,
1020
+ response_model=ArtifactVersionResponse,
1021
+ route=ARTIFACT_VERSIONS,
1022
+ )
1023
+
718
1024
  def get_artifact_version(
719
1025
  self, artifact_version_id: UUID, hydrate: bool = True
720
1026
  ) -> ArtifactVersionResponse:
@@ -1308,10 +1614,6 @@ class RestZenStore(BaseZenStore):
1308
1614
  route=PIPELINE_BUILDS,
1309
1615
  )
1310
1616
 
1311
- # ----------------------
1312
- # Pipeline Deployments
1313
- # ----------------------
1314
-
1315
1617
  # -------------------------- Pipeline Deployments --------------------------
1316
1618
 
1317
1619
  def create_deployment(
@@ -1386,6 +1688,228 @@ class RestZenStore(BaseZenStore):
1386
1688
  route=PIPELINE_DEPLOYMENTS,
1387
1689
  )
1388
1690
 
1691
+ # -------------------- Run templates --------------------
1692
+
1693
+ def create_run_template(
1694
+ self,
1695
+ template: RunTemplateRequest,
1696
+ ) -> RunTemplateResponse:
1697
+ """Create a new run template.
1698
+
1699
+ Args:
1700
+ template: The template to create.
1701
+
1702
+ Returns:
1703
+ The newly created template.
1704
+ """
1705
+ return self._create_workspace_scoped_resource(
1706
+ resource=template,
1707
+ route=RUN_TEMPLATES,
1708
+ response_model=RunTemplateResponse,
1709
+ )
1710
+
1711
+ def get_run_template(
1712
+ self, template_id: UUID, hydrate: bool = True
1713
+ ) -> RunTemplateResponse:
1714
+ """Get a run template with a given ID.
1715
+
1716
+ Args:
1717
+ template_id: ID of the template.
1718
+ hydrate: Flag deciding whether to hydrate the output model(s)
1719
+ by including metadata fields in the response.
1720
+
1721
+ Returns:
1722
+ The template.
1723
+ """
1724
+ return self._get_resource(
1725
+ resource_id=template_id,
1726
+ route=RUN_TEMPLATES,
1727
+ response_model=RunTemplateResponse,
1728
+ params={"hydrate": hydrate},
1729
+ )
1730
+
1731
+ def list_run_templates(
1732
+ self,
1733
+ template_filter_model: RunTemplateFilter,
1734
+ hydrate: bool = False,
1735
+ ) -> Page[RunTemplateResponse]:
1736
+ """List all run templates matching the given filter criteria.
1737
+
1738
+ Args:
1739
+ template_filter_model: All filter parameters including pagination
1740
+ params.
1741
+ hydrate: Flag deciding whether to hydrate the output model(s)
1742
+ by including metadata fields in the response.
1743
+
1744
+ Returns:
1745
+ A list of all templates matching the filter criteria.
1746
+ """
1747
+ return self._list_paginated_resources(
1748
+ route=RUN_TEMPLATES,
1749
+ response_model=RunTemplateResponse,
1750
+ filter_model=template_filter_model,
1751
+ params={"hydrate": hydrate},
1752
+ )
1753
+
1754
+ def update_run_template(
1755
+ self,
1756
+ template_id: UUID,
1757
+ template_update: RunTemplateUpdate,
1758
+ ) -> RunTemplateResponse:
1759
+ """Updates a run template.
1760
+
1761
+ Args:
1762
+ template_id: The ID of the template to update.
1763
+ template_update: The update to apply.
1764
+
1765
+ Returns:
1766
+ The updated template.
1767
+ """
1768
+ return self._update_resource(
1769
+ resource_id=template_id,
1770
+ resource_update=template_update,
1771
+ route=RUN_TEMPLATES,
1772
+ response_model=RunTemplateResponse,
1773
+ )
1774
+
1775
+ def delete_run_template(self, template_id: UUID) -> None:
1776
+ """Delete a run template.
1777
+
1778
+ Args:
1779
+ template_id: The ID of the template to delete.
1780
+ """
1781
+ self._delete_resource(
1782
+ resource_id=template_id,
1783
+ route=RUN_TEMPLATES,
1784
+ )
1785
+
1786
+ def run_template(
1787
+ self,
1788
+ template_id: UUID,
1789
+ run_configuration: Optional[PipelineRunConfiguration] = None,
1790
+ ) -> PipelineRunResponse:
1791
+ """Run a template.
1792
+
1793
+ Args:
1794
+ template_id: The ID of the template to run.
1795
+ run_configuration: Configuration for the run.
1796
+
1797
+ Raises:
1798
+ RuntimeError: If the server does not support running a template.
1799
+
1800
+ Returns:
1801
+ Model of the pipeline run.
1802
+ """
1803
+ run_configuration = run_configuration or PipelineRunConfiguration()
1804
+
1805
+ try:
1806
+ response_body = self.post(
1807
+ f"{RUN_TEMPLATES}/{template_id}/runs",
1808
+ body=run_configuration,
1809
+ )
1810
+ except MethodNotAllowedError as e:
1811
+ raise RuntimeError(
1812
+ "Running a template is not supported for this server."
1813
+ ) from e
1814
+
1815
+ return PipelineRunResponse.model_validate(response_body)
1816
+
1817
+ # -------------------- Event Sources --------------------
1818
+
1819
+ def create_event_source(
1820
+ self, event_source: EventSourceRequest
1821
+ ) -> EventSourceResponse:
1822
+ """Create an event_source.
1823
+
1824
+ Args:
1825
+ event_source: The event_source to create.
1826
+
1827
+ Returns:
1828
+ The created event_source.
1829
+ """
1830
+ return self._create_resource(
1831
+ resource=event_source,
1832
+ route=EVENT_SOURCES,
1833
+ response_model=EventSourceResponse,
1834
+ )
1835
+
1836
+ def get_event_source(
1837
+ self,
1838
+ event_source_id: UUID,
1839
+ hydrate: bool = True,
1840
+ ) -> EventSourceResponse:
1841
+ """Get an event_source by ID.
1842
+
1843
+ Args:
1844
+ event_source_id: The ID of the event_source to get.
1845
+ hydrate: Flag deciding whether to hydrate the output model(s)
1846
+ by including metadata fields in the response.
1847
+
1848
+ Returns:
1849
+ The event_source.
1850
+ """
1851
+ return self._get_resource(
1852
+ resource_id=event_source_id,
1853
+ route=EVENT_SOURCES,
1854
+ response_model=EventSourceResponse,
1855
+ params={"hydrate": hydrate},
1856
+ )
1857
+
1858
+ def list_event_sources(
1859
+ self,
1860
+ event_source_filter_model: EventSourceFilter,
1861
+ hydrate: bool = False,
1862
+ ) -> Page[EventSourceResponse]:
1863
+ """List all event_sources matching the given filter criteria.
1864
+
1865
+ Args:
1866
+ event_source_filter_model: All filter parameters including pagination
1867
+ params.
1868
+ hydrate: Flag deciding whether to hydrate the output model(s)
1869
+ by including metadata fields in the response.
1870
+
1871
+ Returns:
1872
+ A list of all event_sources matching the filter criteria.
1873
+ """
1874
+ return self._list_paginated_resources(
1875
+ route=EVENT_SOURCES,
1876
+ response_model=EventSourceResponse,
1877
+ filter_model=event_source_filter_model,
1878
+ params={"hydrate": hydrate},
1879
+ )
1880
+
1881
+ def update_event_source(
1882
+ self,
1883
+ event_source_id: UUID,
1884
+ event_source_update: EventSourceUpdate,
1885
+ ) -> EventSourceResponse:
1886
+ """Update an existing event_source.
1887
+
1888
+ Args:
1889
+ event_source_id: The ID of the event_source to update.
1890
+ event_source_update: The update to be applied to the event_source.
1891
+
1892
+ Returns:
1893
+ The updated event_source.
1894
+ """
1895
+ return self._update_resource(
1896
+ resource_id=event_source_id,
1897
+ resource_update=event_source_update,
1898
+ route=EVENT_SOURCES,
1899
+ response_model=EventSourceResponse,
1900
+ )
1901
+
1902
+ def delete_event_source(self, event_source_id: UUID) -> None:
1903
+ """Delete an event_source.
1904
+
1905
+ Args:
1906
+ event_source_id: The ID of the event_source to delete.
1907
+ """
1908
+ self._delete_resource(
1909
+ resource_id=event_source_id,
1910
+ route=EVENT_SOURCES,
1911
+ )
1912
+
1389
1913
  # ----------------------------- Pipeline runs -----------------------------
1390
1914
 
1391
1915
  def create_run(
@@ -1502,9 +2026,7 @@ class RestZenStore(BaseZenStore):
1502
2026
 
1503
2027
  # ----------------------------- Run Metadata -----------------------------
1504
2028
 
1505
- def create_run_metadata(
1506
- self, run_metadata: RunMetadataRequest
1507
- ) -> List[RunMetadataResponse]:
2029
+ def create_run_metadata(self, run_metadata: RunMetadataRequest) -> None:
1508
2030
  """Creates run metadata.
1509
2031
 
1510
2032
  Args:
@@ -1514,55 +2036,8 @@ class RestZenStore(BaseZenStore):
1514
2036
  The created run metadata.
1515
2037
  """
1516
2038
  route = f"{WORKSPACES}/{str(run_metadata.workspace)}{RUN_METADATA}"
1517
- response_body = self.post(f"{route}", body=run_metadata)
1518
- result: List[RunMetadataResponse] = []
1519
- if isinstance(response_body, list):
1520
- for metadata in response_body or []:
1521
- result.append(RunMetadataResponse.parse_obj(metadata))
1522
- return result
1523
-
1524
- def get_run_metadata(
1525
- self, run_metadata_id: UUID, hydrate: bool = True
1526
- ) -> RunMetadataResponse:
1527
- """Gets run metadata with the given ID.
1528
-
1529
- Args:
1530
- run_metadata_id: The ID of the run metadata to get.
1531
- hydrate: Flag deciding whether to hydrate the output model(s)
1532
- by including metadata fields in the response.
1533
-
1534
- Returns:
1535
- The run metadata.
1536
- """
1537
- return self._get_resource(
1538
- resource_id=run_metadata_id,
1539
- route=RUN_METADATA,
1540
- response_model=RunMetadataResponse,
1541
- params={"hydrate": hydrate},
1542
- )
1543
-
1544
- def list_run_metadata(
1545
- self,
1546
- run_metadata_filter_model: RunMetadataFilter,
1547
- hydrate: bool = False,
1548
- ) -> Page[RunMetadataResponse]:
1549
- """List run metadata.
1550
-
1551
- Args:
1552
- run_metadata_filter_model: All filter parameters including
1553
- pagination params.
1554
- hydrate: Flag deciding whether to hydrate the output model(s)
1555
- by including metadata fields in the response.
1556
-
1557
- Returns:
1558
- The run metadata.
1559
- """
1560
- return self._list_paginated_resources(
1561
- route=RUN_METADATA,
1562
- response_model=RunMetadataResponse,
1563
- filter_model=run_metadata_filter_model,
1564
- params={"hydrate": hydrate},
1565
- )
2039
+ self.post(f"{route}", body=run_metadata)
2040
+ return None
1566
2041
 
1567
2042
  # ----------------------------- Schedules -----------------------------
1568
2043
 
@@ -2110,9 +2585,15 @@ class RestZenStore(BaseZenStore):
2110
2585
  f"{SERVICE_CONNECTORS}{SERVICE_CONNECTOR_VERIFY}",
2111
2586
  body=service_connector,
2112
2587
  params={"list_resources": list_resources},
2588
+ timeout=max(
2589
+ self.config.http_timeout,
2590
+ SERVICE_CONNECTOR_VERIFY_REQUEST_TIMEOUT,
2591
+ ),
2113
2592
  )
2114
2593
 
2115
- resources = ServiceConnectorResourcesModel.parse_obj(response_body)
2594
+ resources = ServiceConnectorResourcesModel.model_validate(
2595
+ response_body
2596
+ )
2116
2597
  self._populate_connector_type(resources)
2117
2598
  return resources
2118
2599
 
@@ -2145,9 +2626,15 @@ class RestZenStore(BaseZenStore):
2145
2626
  response_body = self.put(
2146
2627
  f"{SERVICE_CONNECTORS}/{str(service_connector_id)}{SERVICE_CONNECTOR_VERIFY}",
2147
2628
  params=params,
2629
+ timeout=max(
2630
+ self.config.http_timeout,
2631
+ SERVICE_CONNECTOR_VERIFY_REQUEST_TIMEOUT,
2632
+ ),
2148
2633
  )
2149
2634
 
2150
- resources = ServiceConnectorResourcesModel.parse_obj(response_body)
2635
+ resources = ServiceConnectorResourcesModel.model_validate(
2636
+ response_body
2637
+ )
2151
2638
  self._populate_connector_type(resources)
2152
2639
  return resources
2153
2640
 
@@ -2178,7 +2665,7 @@ class RestZenStore(BaseZenStore):
2178
2665
  params=params,
2179
2666
  )
2180
2667
 
2181
- connector = ServiceConnectorResponse.parse_obj(response_body)
2668
+ connector = ServiceConnectorResponse.model_validate(response_body)
2182
2669
  self._populate_connector_type(connector)
2183
2670
  return connector
2184
2671
 
@@ -2211,11 +2698,15 @@ class RestZenStore(BaseZenStore):
2211
2698
  response_body = self.get(
2212
2699
  f"{WORKSPACES}/{workspace_name_or_id}{SERVICE_CONNECTORS}{SERVICE_CONNECTOR_RESOURCES}",
2213
2700
  params=params,
2701
+ timeout=max(
2702
+ self.config.http_timeout,
2703
+ SERVICE_CONNECTOR_VERIFY_REQUEST_TIMEOUT,
2704
+ ),
2214
2705
  )
2215
2706
 
2216
2707
  assert isinstance(response_body, list)
2217
2708
  resource_list = [
2218
- ServiceConnectorResourcesModel.parse_obj(item)
2709
+ ServiceConnectorResourcesModel.model_validate(item)
2219
2710
  for item in response_body
2220
2711
  ]
2221
2712
 
@@ -2248,7 +2739,7 @@ class RestZenStore(BaseZenStore):
2248
2739
  )
2249
2740
  except (ValueError, AuthorizationException) as e:
2250
2741
  logger.error(
2251
- f'Failed to fetch {resource_type or "available"} '
2742
+ f"Failed to fetch {resource_type or 'available'} "
2252
2743
  f"resources from service connector {connector.name}/"
2253
2744
  f"{connector.id}: {e}"
2254
2745
  )
@@ -2288,7 +2779,8 @@ class RestZenStore(BaseZenStore):
2288
2779
 
2289
2780
  assert isinstance(response_body, list)
2290
2781
  remote_connector_types = [
2291
- ServiceConnectorTypeModel.parse_obj(item) for item in response_body
2782
+ ServiceConnectorTypeModel.model_validate(item)
2783
+ for item in response_body
2292
2784
  ]
2293
2785
 
2294
2786
  # Mark the remote connector types as being only remotely available
@@ -2344,7 +2836,7 @@ class RestZenStore(BaseZenStore):
2344
2836
  response_body = self.get(
2345
2837
  f"{SERVICE_CONNECTOR_TYPES}/{connector_type}",
2346
2838
  )
2347
- remote_connector_type = ServiceConnectorTypeModel.parse_obj(
2839
+ remote_connector_type = ServiceConnectorTypeModel.model_validate(
2348
2840
  response_body
2349
2841
  )
2350
2842
  if local_connector_type:
@@ -2376,10 +2868,12 @@ class RestZenStore(BaseZenStore):
2376
2868
  Returns:
2377
2869
  The registered stack.
2378
2870
  """
2379
- return self._create_workspace_scoped_resource(
2871
+ assert stack.workspace is not None
2872
+
2873
+ return self._create_resource(
2380
2874
  resource=stack,
2381
- route=STACKS,
2382
2875
  response_model=StackResponse,
2876
+ route=f"{WORKSPACES}/{str(stack.workspace)}{STACKS}",
2383
2877
  )
2384
2878
 
2385
2879
  def get_stack(self, stack_id: UUID, hydrate: bool = True) -> StackResponse:
@@ -2451,6 +2945,88 @@ class RestZenStore(BaseZenStore):
2451
2945
  route=STACKS,
2452
2946
  )
2453
2947
 
2948
+ # ---------------- Stack deployments-----------------
2949
+
2950
+ def get_stack_deployment_info(
2951
+ self,
2952
+ provider: StackDeploymentProvider,
2953
+ ) -> StackDeploymentInfo:
2954
+ """Get information about a stack deployment provider.
2955
+
2956
+ Args:
2957
+ provider: The stack deployment provider.
2958
+
2959
+ Returns:
2960
+ Information about the stack deployment provider.
2961
+ """
2962
+ body = self.get(
2963
+ f"{STACK_DEPLOYMENT}{INFO}",
2964
+ params={"provider": provider.value},
2965
+ )
2966
+ return StackDeploymentInfo.model_validate(body)
2967
+
2968
+ def get_stack_deployment_config(
2969
+ self,
2970
+ provider: StackDeploymentProvider,
2971
+ stack_name: str,
2972
+ location: Optional[str] = None,
2973
+ ) -> StackDeploymentConfig:
2974
+ """Return the cloud provider console URL and configuration needed to deploy the ZenML stack.
2975
+
2976
+ Args:
2977
+ provider: The stack deployment provider.
2978
+ stack_name: The name of the stack.
2979
+ location: The location where the stack should be deployed.
2980
+
2981
+ Returns:
2982
+ The cloud provider console URL and configuration needed to deploy
2983
+ the ZenML stack to the specified cloud provider.
2984
+ """
2985
+ params = {
2986
+ "provider": provider.value,
2987
+ "stack_name": stack_name,
2988
+ }
2989
+ if location:
2990
+ params["location"] = location
2991
+ body = self.get(f"{STACK_DEPLOYMENT}{CONFIG}", params=params)
2992
+ return StackDeploymentConfig.model_validate(body)
2993
+
2994
+ def get_stack_deployment_stack(
2995
+ self,
2996
+ provider: StackDeploymentProvider,
2997
+ stack_name: str,
2998
+ location: Optional[str] = None,
2999
+ date_start: Optional[datetime] = None,
3000
+ ) -> Optional[DeployedStack]:
3001
+ """Return a matching ZenML stack that was deployed and registered.
3002
+
3003
+ Args:
3004
+ provider: The stack deployment provider.
3005
+ stack_name: The name of the stack.
3006
+ location: The location where the stack should be deployed.
3007
+ date_start: The date when the deployment started.
3008
+
3009
+ Returns:
3010
+ The ZenML stack that was deployed and registered or None if the
3011
+ stack was not found.
3012
+ """
3013
+ params = {
3014
+ "provider": provider.value,
3015
+ "stack_name": stack_name,
3016
+ }
3017
+ if location:
3018
+ params["location"] = location
3019
+ if date_start:
3020
+ params["date_start"] = str(date_start)
3021
+ body = self.get(
3022
+ f"{STACK_DEPLOYMENT}{STACK}",
3023
+ params=params,
3024
+ )
3025
+ if body:
3026
+ return DeployedStack.model_validate(body)
3027
+
3028
+ return None
3029
+
2454
3030
  # ----------------------------- Step runs -----------------------------
2455
3031
 
2456
3032
  def create_run_step(self, step_run: StepRunRequest) -> StepRunResponse:
@@ -2532,6 +3108,158 @@ class RestZenStore(BaseZenStore):
2532
3108
  route=STEPS,
2533
3109
  )
2534
3110
 
3111
+ # -------------------- Triggers --------------------
3112
+
3113
+ def create_trigger(self, trigger: TriggerRequest) -> TriggerResponse:
3114
+ """Create an trigger.
3115
+
3116
+ Args:
3117
+ trigger: The trigger to create.
3118
+
3119
+ Returns:
3120
+ The created trigger.
3121
+ """
3122
+ return self._create_resource(
3123
+ resource=trigger,
3124
+ route=TRIGGERS,
3125
+ response_model=TriggerResponse,
3126
+ )
3127
+
3128
+ def get_trigger(
3129
+ self,
3130
+ trigger_id: UUID,
3131
+ hydrate: bool = True,
3132
+ ) -> TriggerResponse:
3133
+ """Get a trigger by ID.
3134
+
3135
+ Args:
3136
+ trigger_id: The ID of the trigger to get.
3137
+ hydrate: Flag deciding whether to hydrate the output model(s)
3138
+ by including metadata fields in the response.
3139
+
3140
+ Returns:
3141
+ The trigger.
3142
+ """
3143
+ return self._get_resource(
3144
+ resource_id=trigger_id,
3145
+ route=TRIGGERS,
3146
+ response_model=TriggerResponse,
3147
+ params={"hydrate": hydrate},
3148
+ )
3149
+
3150
+ def list_triggers(
3151
+ self,
3152
+ trigger_filter_model: TriggerFilter,
3153
+ hydrate: bool = False,
3154
+ ) -> Page[TriggerResponse]:
3155
+ """List all triggers matching the given filter criteria.
3156
+
3157
+ Args:
3158
+ trigger_filter_model: All filter parameters including pagination
3159
+ params.
3160
+ hydrate: Flag deciding whether to hydrate the output model(s)
3161
+ by including metadata fields in the response.
3162
+
3163
+ Returns:
3164
+ A list of all triggers matching the filter criteria.
3165
+ """
3166
+ return self._list_paginated_resources(
3167
+ route=TRIGGERS,
3168
+ response_model=TriggerResponse,
3169
+ filter_model=trigger_filter_model,
3170
+ params={"hydrate": hydrate},
3171
+ )
3172
+
3173
+ def update_trigger(
3174
+ self,
3175
+ trigger_id: UUID,
3176
+ trigger_update: TriggerUpdate,
3177
+ ) -> TriggerResponse:
3178
+ """Update an existing trigger.
3179
+
3180
+ Args:
3181
+ trigger_id: The ID of the trigger to update.
3182
+ trigger_update: The update to be applied to the trigger.
3183
+
3184
+ Returns:
3185
+ The updated trigger.
3186
+ """
3187
+ return self._update_resource(
3188
+ resource_id=trigger_id,
3189
+ resource_update=trigger_update,
3190
+ route=TRIGGERS,
3191
+ response_model=TriggerResponse,
3192
+ )
3193
+
3194
+ def delete_trigger(self, trigger_id: UUID) -> None:
3195
+ """Delete an trigger.
3196
+
3197
+ Args:
3198
+ trigger_id: The ID of the trigger to delete.
3199
+ """
3200
+ self._delete_resource(
3201
+ resource_id=trigger_id,
3202
+ route=TRIGGERS,
3203
+ )
3204
+
3205
+ # -------------------- Trigger Executions --------------------
3206
+
3207
+ def get_trigger_execution(
3208
+ self,
3209
+ trigger_execution_id: UUID,
3210
+ hydrate: bool = True,
3211
+ ) -> TriggerExecutionResponse:
3212
+ """Get an trigger execution by ID.
3213
+
3214
+ Args:
3215
+ trigger_execution_id: The ID of the trigger execution to get.
3216
+ hydrate: Flag deciding whether to hydrate the output model(s)
3217
+ by including metadata fields in the response.
3218
+
3219
+ Returns:
3220
+ The trigger execution.
3221
+ """
3222
+ return self._get_resource(
3223
+ resource_id=trigger_execution_id,
3224
+ route=TRIGGER_EXECUTIONS,
3225
+ response_model=TriggerExecutionResponse,
3226
+ params={"hydrate": hydrate},
3227
+ )
3228
+
3229
+ def list_trigger_executions(
3230
+ self,
3231
+ trigger_execution_filter_model: TriggerExecutionFilter,
3232
+ hydrate: bool = False,
3233
+ ) -> Page[TriggerExecutionResponse]:
3234
+ """List all trigger executions matching the given filter criteria.
3235
+
3236
+ Args:
3237
+ trigger_execution_filter_model: All filter parameters including
3238
+ pagination params.
3239
+ hydrate: Flag deciding whether to hydrate the output model(s)
3240
+ by including metadata fields in the response.
3241
+
3242
+ Returns:
3243
+ A list of all trigger executions matching the filter criteria.
3244
+ """
3245
+ return self._list_paginated_resources(
3246
+ route=TRIGGER_EXECUTIONS,
3247
+ response_model=TriggerExecutionResponse,
3248
+ filter_model=trigger_execution_filter_model,
3249
+ params={"hydrate": hydrate},
3250
+ )
3251
+
3252
+ def delete_trigger_execution(self, trigger_execution_id: UUID) -> None:
3253
+ """Delete a trigger execution.
3254
+
3255
+ Args:
3256
+ trigger_execution_id: The ID of the trigger execution to delete.
3257
+ """
3258
+ self._delete_resource(
3259
+ resource_id=trigger_execution_id,
3260
+ route=TRIGGER_EXECUTIONS,
3261
+ )
3262
+
2535
3263
  # ----------------------------- Users -----------------------------
2536
3264
 
2537
3265
  def create_user(self, user: UserRequest) -> UserResponse:
@@ -2580,7 +3308,7 @@ class RestZenStore(BaseZenStore):
2580
3308
  )
2581
3309
  else:
2582
3310
  body = self.get(CURRENT_USER, params={"hydrate": hydrate})
2583
- return UserResponse.parse_obj(body)
3311
+ return UserResponse.model_validate(body)
2584
3312
 
2585
3313
  def list_users(
2586
3314
  self,
@@ -2624,6 +3352,23 @@ class RestZenStore(BaseZenStore):
2624
3352
  response_model=UserResponse,
2625
3353
  )
2626
3354
 
3355
+ def deactivate_user(
3356
+ self, user_name_or_id: Union[str, UUID]
3357
+ ) -> UserResponse:
3358
+ """Deactivates a user.
3359
+
3360
+ Args:
3361
+ user_name_or_id: The name or ID of the user to delete.
3362
+
3363
+ Returns:
3364
+ The deactivated user containing the activation token.
3365
+ """
3366
+ response_body = self.put(
3367
+ f"{USERS}/{str(user_name_or_id)}{DEACTIVATE}",
3368
+ )
3369
+
3370
+ return UserResponse.model_validate(response_body)
3371
+
2627
3372
  def delete_user(self, user_name_or_id: Union[str, UUID]) -> None:
2628
3373
  """Deletes a user.
2629
3374
 
@@ -2940,10 +3685,10 @@ class RestZenStore(BaseZenStore):
2940
3685
  Returns:
2941
3686
  The newly created model version to artifact link.
2942
3687
  """
2943
- return self._create_workspace_scoped_resource(
3688
+ return self._create_resource(
2944
3689
  resource=model_version_artifact_link,
2945
3690
  response_model=ModelVersionArtifactResponse,
2946
- route=f"{MODEL_VERSIONS}/{model_version_artifact_link.model_version}{ARTIFACTS}",
3691
+ route=MODEL_VERSION_ARTIFACTS,
2947
3692
  )
2948
3693
 
2949
3694
  def list_model_version_artifact_links(
@@ -3020,10 +3765,10 @@ class RestZenStore(BaseZenStore):
3020
3765
  - Otherwise, returns the newly created model version to pipeline
3021
3766
  run link.
3022
3767
  """
3023
- return self._create_workspace_scoped_resource(
3768
+ return self._create_resource(
3024
3769
  resource=model_version_pipeline_run_link,
3025
3770
  response_model=ModelVersionPipelineRunResponse,
3026
- route=f"{MODEL_VERSIONS}/{model_version_pipeline_run_link.model_version}{RUNS}",
3771
+ route=MODEL_VERSION_PIPELINE_RUNS,
3027
3772
  )
3028
3773
 
3029
3774
  def list_model_version_pipeline_run_links(
@@ -3141,17 +3886,20 @@ class RestZenStore(BaseZenStore):
3141
3886
 
3142
3887
  def get_api_token(
3143
3888
  self,
3144
- pipeline_id: Optional[UUID] = None,
3889
+ token_type: APITokenType = APITokenType.WORKLOAD,
3890
+ expires_in: Optional[int] = None,
3145
3891
  schedule_id: Optional[UUID] = None,
3146
- expires_minutes: Optional[int] = None,
3892
+ pipeline_run_id: Optional[UUID] = None,
3893
+ step_run_id: Optional[UUID] = None,
3147
3894
  ) -> str:
3148
- """Get an API token for a workload.
3895
+ """Get an API token.
3149
3896
 
3150
3897
  Args:
3151
- pipeline_id: The ID of the pipeline to get a token for.
3898
+ token_type: The type of the token to get.
3899
+ expires_in: The time in seconds until the token expires.
3152
3900
  schedule_id: The ID of the schedule to get a token for.
3153
- expires_minutes: The number of minutes for which the token should
3154
- be valid. If not provided, the token will be valid indefinitely.
3901
+ pipeline_run_id: The ID of the pipeline run to get a token for.
3902
+ step_run_id: The ID of the step run to get a token for.
3155
3903
 
3156
3904
  Returns:
3157
3905
  The API token.
@@ -3159,13 +3907,17 @@ class RestZenStore(BaseZenStore):
3159
3907
  Raises:
3160
3908
  ValueError: if the server response is not valid.
3161
3909
  """
3162
- params: Dict[str, Any] = {}
3163
- if pipeline_id:
3164
- params["pipeline_id"] = pipeline_id
3910
+ params: Dict[str, Any] = {
3911
+ "token_type": token_type.value,
3912
+ }
3913
+ if expires_in:
3914
+ params["expires_in"] = expires_in
3165
3915
  if schedule_id:
3166
3916
  params["schedule_id"] = schedule_id
3167
- if expires_minutes:
3168
- params["expires_minutes"] = expires_minutes
3917
+ if pipeline_run_id:
3918
+ params["pipeline_run_id"] = pipeline_run_id
3919
+ if step_run_id:
3920
+ params["step_run_id"] = step_run_id
3169
3921
  response_body = self.get(API_TOKEN, params=params)
3170
3922
  if not isinstance(response_body, str):
3171
3923
  raise ValueError(
@@ -3272,104 +4024,279 @@ class RestZenStore(BaseZenStore):
3272
4024
  # Internal helper methods
3273
4025
  # =======================
3274
4026
 
3275
- def _get_auth_token(self) -> str:
3276
- """Get the authentication token for the REST store.
4027
+ def get_or_generate_api_token(self) -> str:
4028
+ """Get or generate an API token.
3277
4029
 
3278
4030
  Returns:
3279
- The authentication token.
4031
+ The API token.
3280
4032
 
3281
4033
  Raises:
3282
- ValueError: if the response from the server isn't in the right
3283
- format.
3284
- """
3285
- if self._api_token is None:
3286
- # Check if the API token is already stored in the config
3287
- if self.config.api_token:
3288
- self._api_token = self.config.api_token
3289
- # Check if the username and password are provided in the config
3290
- elif (
3291
- self.config.username is not None
3292
- and self.config.password is not None
3293
- or self.config.api_key is not None
3294
- ):
3295
- data: Optional[Dict[str, str]] = None
3296
- if self.config.api_key is not None:
3297
- data = {
3298
- "grant_type": OAuthGrantTypes.ZENML_API_KEY.value,
3299
- "password": self.config.api_key,
3300
- }
3301
- elif (
3302
- self.config.username is not None
3303
- and self.config.password is not None
3304
- ):
3305
- data = {
3306
- "grant_type": OAuthGrantTypes.OAUTH_PASSWORD.value,
3307
- "username": self.config.username,
3308
- "password": self.config.password,
3309
- }
3310
-
3311
- response = self._handle_response(
3312
- requests.post(
3313
- self.url + API + VERSION_1 + LOGIN,
3314
- data=data,
3315
- verify=self.config.verify_ssl,
3316
- timeout=self.config.http_timeout,
3317
- )
4034
+ CredentialsNotValid: if an API token cannot be fetched or
4035
+ generated because the client credentials are not valid.
4036
+ """
4037
+ if self._api_token is None or self._api_token.expired:
4038
+ # Check if a valid API token is already in the cache
4039
+ credentials_store = get_credentials_store()
4040
+ credentials = credentials_store.get_credentials(self.url)
4041
+ token = credentials.api_token if credentials else None
4042
+ if credentials and token and not token.expired:
4043
+ self._api_token = token
4044
+ return self._api_token.access_token
4045
+
4046
+ # Token is expired or not found in the cache. Time to get a new one.
4047
+
4048
+ if not token:
4049
+ logger.debug(f"Authenticating to {self.url}")
4050
+ else:
4051
+ logger.debug(
4052
+ f"Authentication token for {self.url} expired; refreshing..."
4053
+ )
4054
+
4055
+ data: Optional[Dict[str, str]] = None
4056
+
4057
+ # Use a custom user agent to identify the ZenML client in the server
4058
+ # logs.
4059
+ headers: Dict[str, str] = {
4060
+ "User-Agent": "zenml/" + zenml.__version__,
4061
+ }
4062
+
4063
+ # Check if an API key is configured
4064
+ api_key = credentials_store.get_api_key(self.url)
4065
+
4066
+ # Check if username and password are configured
4067
+ username, password = credentials_store.get_password(self.url)
4068
+
4069
+ api_key_hint = (
4070
+ "\nHint: If you're getting this error in an automated, "
4071
+ "non-interactive workload like a pipeline run or a CI/CD job, "
4072
+ "you should use a service account API key to authenticate to "
4073
+ "the server instead of temporary CLI login credentials. For "
4074
+ "more information, see "
4075
+ "https://docs.zenml.io/how-to/project-setup-and-management/connecting-to-zenml/connect-with-a-service-account"
4076
+ )
4077
+
4078
+ if api_key is not None:
4079
+ # An API key is configured. Use it as a password to
4080
+ # authenticate.
4081
+ data = {
4082
+ "grant_type": OAuthGrantTypes.ZENML_API_KEY.value,
4083
+ "password": api_key,
4084
+ }
4085
+ elif username is not None and password is not None:
4086
+ # Username and password are configured. Use them to authenticate.
4087
+ data = {
4088
+ "grant_type": OAuthGrantTypes.OAUTH_PASSWORD.value,
4089
+ "username": username,
4090
+ "password": password,
4091
+ }
4092
+ elif self.server_info.is_pro_server():
4093
+ # ZenML Pro tenants use a proprietary authorization grant
4094
+ # where the ZenML Pro API session token is exchanged for a
4095
+ # regular ZenML server access token.
4096
+
4097
+ # Get the ZenML Pro API session token, if cached and valid
4098
+
4099
+ # We need to determine the right ZenML Pro API URL to use
4100
+ pro_api_url = self.server_info.pro_api_url
4101
+ if not pro_api_url and credentials and credentials.pro_api_url:
4102
+ pro_api_url = credentials.pro_api_url
4103
+ if not pro_api_url:
4104
+ pro_api_url = ZENML_PRO_API_URL
4105
+
4106
+ pro_token = credentials_store.get_pro_token(
4107
+ pro_api_url, allow_expired=True
3318
4108
  )
3319
- if (
3320
- not isinstance(response, dict)
3321
- or "access_token" not in response
3322
- ):
3323
- raise ValueError(
3324
- f"Bad API Response. Expected access token dict, got "
3325
- f"{type(response)}"
4109
+ if not pro_token:
4110
+ raise CredentialsNotValid(
4111
+ "You need to be logged in to ZenML Pro in order to "
4112
+ f"access the ZenML Pro server '{self.url}'. Please run "
4113
+ "'zenml login' to log in or choose a different server."
4114
+ + api_key_hint
4115
+ )
4116
+
4117
+ elif pro_token.expired:
4118
+ raise CredentialsNotValid(
4119
+ "Your ZenML Pro login session has expired. "
4120
+ "Please log in again using 'zenml login'."
4121
+ + api_key_hint
3326
4122
  )
3327
- self._api_token = response["access_token"]
3328
- self.config.api_token = self._api_token
4123
+
4124
+ data = {
4125
+ "grant_type": OAuthGrantTypes.ZENML_EXTERNAL.value,
4126
+ }
4127
+ headers.update(
4128
+ {"Authorization": "Bearer " + pro_token.access_token}
4129
+ )
3329
4130
  else:
3330
- raise ValueError(
3331
- "No API token, API key or username/password provided. "
3332
- "Please provide either an API token, an API key or a "
3333
- "username and password in the ZenML config."
4131
+ if not token:
4132
+ raise CredentialsNotValid(
4133
+ "No valid credentials found. Please run 'zenml login "
4134
+ f"--url {self.url}' to connect to the current server."
4135
+ + api_key_hint
4136
+ )
4137
+ elif token.expired:
4138
+ raise CredentialsNotValid(
4139
+ "Your authentication to the current server has expired. "
4140
+ "Please log in again using 'zenml login --url "
4141
+ f"{self.url}'." + api_key_hint
4142
+ )
4143
+
4144
+ response = self._handle_response(
4145
+ requests.post(
4146
+ self.url + API + VERSION_1 + LOGIN,
4147
+ data=data,
4148
+ verify=self.config.verify_ssl,
4149
+ timeout=self.config.http_timeout,
4150
+ headers=headers,
3334
4151
  )
3335
- return self._api_token
4152
+ )
4153
+ try:
4154
+ token_response = OAuthTokenResponse.model_validate(response)
4155
+ except ValidationError as e:
4156
+ raise CredentialsNotValid(
4157
+ "Unexpected response received while authenticating to "
4158
+ f"the server {e}"
4159
+ ) from e
4160
+
4161
+ # Cache the token
4162
+ self._api_token = credentials_store.set_token(
4163
+ self.url, token_response
4164
+ )
4165
+
4166
+ # Update the server info in the credentials store with the latest
4167
+ # information from the server.
4168
+ # NOTE: this is the best place to do this because we know that
4169
+ # the token is valid and the server is reachable.
4170
+ try:
4171
+ server_info = self.get_store_info()
4172
+ except Exception as e:
4173
+ logger.warning(f"Failed to get server info: {e}.")
4174
+ else:
4175
+ credentials_store.update_server_info(self.url, server_info)
4176
+
4177
+ return self._api_token.access_token
3336
4178
 
3337
4179
  @property
3338
4180
  def session(self) -> requests.Session:
3339
- """Authenticate to the ZenML server.
4181
+ """Initialize and return a requests session.
3340
4182
 
3341
4183
  Returns:
3342
- A requests session with the authentication token.
4184
+ A requests session.
3343
4185
  """
3344
4186
  if self._session is None:
4187
+ # We only need to initialize the session once over the lifetime
4188
+ # of the client. We can swap the token out when it expires.
3345
4189
  if self.config.verify_ssl is False:
3346
4190
  urllib3.disable_warnings(
3347
4191
  urllib3.exceptions.InsecureRequestWarning
3348
4192
  )
3349
4193
 
3350
4194
  self._session = requests.Session()
3351
- retries = Retry(backoff_factor=0.1, connect=5)
4195
+ # Retries are triggered for idempotent HTTP methods (GET, HEAD, PUT,
4196
+ # OPTIONS and DELETE) on specific HTTP status codes:
4197
+ #
4198
+ # 500: Internal Server Error.
4199
+ # 502: Bad Gateway.
4200
+ # 503: Service Unavailable.
4201
+ # 504: Gateway Timeout.
4202
+ #
4203
+ # This also handles connection level errors, if a connection attempt
4204
+ # fails due to transient issues like:
4205
+ #
4206
+ # DNS resolution errors.
4207
+ # Connection timeouts.
4208
+ # Network disruptions.
4209
+ #
4210
+ # Additional errors retried:
4211
+ #
4212
+ # Read Timeouts: If the server does not send a response within
4213
+ # the timeout period.
4214
+ # Connection Refused: If the server refuses the connection.
4215
+ #
4216
+ retries = Retry(
4217
+ connect=5,
4218
+ read=8,
4219
+ redirect=3,
4220
+ status=10,
4221
+ allowed_methods=["HEAD", "GET", "PUT", "DELETE", "OPTIONS"],
4222
+ status_forcelist=[
4223
+ 408, # Request Timeout
4224
+ 429, # Too Many Requests
4225
+ 500, # Internal Server Error
4226
+ 502, # Bad Gateway
4227
+ 503, # Service Unavailable
4228
+ 504, # Gateway Timeout
4229
+ ],
4230
+ other=3,
4231
+ backoff_factor=0.5,
4232
+ )
3352
4233
  self._session.mount("https://", HTTPAdapter(max_retries=retries))
3353
4234
  self._session.mount("http://", HTTPAdapter(max_retries=retries))
3354
4235
  self._session.verify = self.config.verify_ssl
3355
- token = self._get_auth_token()
3356
- self._session.headers.update({"Authorization": "Bearer " + token})
3357
- logger.debug("Authenticated to ZenML server.")
4236
+ # Use a custom user agent to identify the ZenML client in the server
4237
+ # logs.
4238
+ self._session.headers.update(
4239
+ {"User-Agent": "zenml/" + zenml.__version__}
4240
+ )
4241
+
4242
+ # Note that we return an unauthenticated session here. An API token
4243
+ # is only fetched and set in the authorization header when and if it is
4244
+ # needed.
3358
4245
  return self._session
3359
4246
 
3360
- def clear_session(self) -> None:
3361
- """Clear the authentication session and any cached API tokens."""
3362
- self._session = None
4247
+ def authenticate(self, force: bool = False) -> None:
4248
+ """Authenticate or re-authenticate to the ZenML server.
4249
+
4250
+ Args:
4251
+ force: If True, force a re-authentication even if a valid API token
4252
+ is currently cached. This is useful when the current API token
4253
+ is known to be invalid or expired.
4254
+ """
4255
+ # This is called to trigger an authentication flow, either because
4256
+ # the current API token is expired or no longer valid, or because
4257
+ # a configuration change has happened or merely because an
4258
+ # authentication was never attempted before.
4259
+ #
4260
+ # 1. Drop the API token currently being used, if any.
4261
+ # 2. If force=True, clear the current API token from the credentials
4262
+ # store, if any, otherwise it will just be re-used on the next call.
4263
+ # 3. Get a new API token
4264
+
4265
+ # The authentication token could have expired or invalidated through
4266
+ # other means; refresh it and try again. This will clear any cached
4267
+ # token and trigger a new authentication flow.
4268
+ if self._api_token and not force:
4269
+ if self._api_token.expired:
4270
+ logger.info(
4271
+ "Authentication session expired; attempting to "
4272
+ "re-authenticate."
4273
+ )
4274
+ else:
4275
+ logger.info(
4276
+ "Authentication session was invalidated by the server; "
4277
+ "This can happen for example if the user's permissions "
4278
+ "have been revoked or if the server has been restarted "
4279
+ "and lost its session state. Attempting to "
4280
+ "re-authenticate."
4281
+ )
4282
+ else:
4283
+ if force:
4284
+ # Clear the current API token from the credentials store, if
4285
+ # any, to force a new authentication flow.
4286
+ get_credentials_store().clear_token(self.url)
4287
+ # Never authenticated since the client was created or the API token
4288
+ # was explicitly cleared.
4289
+ logger.debug(f"Authenticating to {self.url}...")
4290
+
3363
4291
  self._api_token = None
3364
- # Clear the configured API token only if it's possible to fetch a new
3365
- # one from the server using other credentials (username/password or
3366
- # service account API key).
3367
- if (
3368
- self.config.username is not None
3369
- and self.config.password is not None
3370
- or self.config.api_key is not None
3371
- ):
3372
- self.config.api_token = None
4292
+
4293
+ new_api_token = self.get_or_generate_api_token()
4294
+
4295
+ # Set or refresh the authentication token
4296
+ self.session.headers.update(
4297
+ {"Authorization": "Bearer " + new_api_token}
4298
+ )
4299
+ logger.debug(f"Authenticated to {self.url}")
3373
4300
 
3374
4301
  @staticmethod
3375
4302
  def _handle_response(response: requests.Response) -> Json:
@@ -3417,6 +4344,7 @@ class RestZenStore(BaseZenStore):
3417
4344
  method: str,
3418
4345
  url: str,
3419
4346
  params: Optional[Dict[str, Any]] = None,
4347
+ timeout: Optional[int] = None,
3420
4348
  **kwargs: Any,
3421
4349
  ) -> Json:
3422
4350
  """Make a request to the REST API.
@@ -3425,14 +4353,15 @@ class RestZenStore(BaseZenStore):
3425
4353
  method: The HTTP method to use.
3426
4354
  url: The URL to request.
3427
4355
  params: The query parameters to pass to the endpoint.
4356
+ timeout: The request timeout in seconds.
3428
4357
  kwargs: Additional keyword arguments to pass to the request.
3429
4358
 
3430
4359
  Returns:
3431
4360
  The parsed response.
3432
4361
 
3433
4362
  Raises:
3434
- AuthorizationException: if the request fails due to an expired
3435
- authentication token.
4363
+ CredentialsNotValid: if the request fails due to invalid
4364
+ client credentials.
3436
4365
  """
3437
4366
  params = {k: str(v) for k, v in params.items()} if params else {}
3438
4367
 
@@ -3440,49 +4369,88 @@ class RestZenStore(BaseZenStore):
3440
4369
  {source_context.name: source_context.get().value}
3441
4370
  )
3442
4371
 
3443
- try:
3444
- return self._handle_response(
3445
- self.session.request(
3446
- method,
3447
- url,
3448
- params=params,
3449
- verify=self.config.verify_ssl,
3450
- timeout=self.config.http_timeout,
3451
- **kwargs,
3452
- )
3453
- )
3454
- except AuthorizationException:
3455
- # The authentication token could have expired; refresh it and try
3456
- # again. This will clear any cached token and trigger a new
3457
- # authentication flow.
3458
- self.clear_session()
3459
- logger.info("Authentication token expired; refreshing...")
3460
-
3461
- try:
3462
- return self._handle_response(
3463
- self.session.request(
3464
- method,
3465
- url,
3466
- params=params,
3467
- verify=self.config.verify_ssl,
3468
- timeout=self.config.http_timeout,
3469
- **kwargs,
4372
+ # If the server replies with a credentials validation (401 Unauthorized)
4373
+ # error, we (re-)authenticate and retry the request here in the
4374
+ # following cases:
4375
+ #
4376
+ # 1. initial authentication: the last request was not authenticated
4377
+ # with an API token.
4378
+ # 2. re-authentication: the last request was authenticated with an API
4379
+ # token that was rejected by the server. This is to cover the case
4380
+ # of expired tokens that can be refreshed by the client automatically
4381
+ # without user intervention from other sources (e.g. API keys).
4382
+ #
4383
+ # NOTE: it can happen that the same request is retried here for up to
4384
+ # two times: once after initial authentication and once after
4385
+ # re-authentication.
4386
+ re_authenticated = False
4387
+ while True:
4388
+ try:
4389
+ return self._handle_response(
4390
+ self.session.request(
4391
+ method,
4392
+ url,
4393
+ params=params,
4394
+ verify=self.config.verify_ssl,
4395
+ timeout=timeout or self.config.http_timeout,
4396
+ **kwargs,
4397
+ )
3470
4398
  )
3471
- )
3472
- except AuthorizationException:
3473
- logger.info(
3474
- "Your authentication token has expired. Please re-authenticate."
3475
- )
3476
- raise
4399
+ except CredentialsNotValid as e:
4400
+ # NOTE: CredentialsNotValid is raised only when the server
4401
+ # explicitly indicates that the credentials are not valid and
4402
+ # they can be thrown away or when the request is not
4403
+ # authenticated at all.
4404
+
4405
+ if self._api_token is None:
4406
+ # The last request was not authenticated with an API
4407
+ # token at all. We authenticate here and then try the
4408
+ # request again, this time with a valid API token in the
4409
+ # header.
4410
+ logger.debug(
4411
+ f"The last request was not authenticated: {e}\n"
4412
+ "Re-authenticating and retrying..."
4413
+ )
4414
+ self.authenticate()
4415
+ elif not re_authenticated:
4416
+ # The last request was authenticated with an API token
4417
+ # that was rejected by the server. We attempt a
4418
+ # re-authentication here and then retry the request.
4419
+ logger.debug(
4420
+ "The last request was authenticated with an API token "
4421
+ f"that was rejected by the server: {e}\n"
4422
+ "Re-authenticating and retrying..."
4423
+ )
4424
+ re_authenticated = True
4425
+ self.authenticate(
4426
+ # Ignore the current token and force a re-authentication
4427
+ force=True
4428
+ )
4429
+ else:
4430
+ # The last request was made after re-authenticating but
4431
+ # still failed. Bailing out.
4432
+ logger.debug(
4433
+ f"The last request failed after re-authenticating: {e}\n"
4434
+ "Bailing out..."
4435
+ )
4436
+ raise CredentialsNotValid(
4437
+ "The current credentials are no longer valid. Please "
4438
+ "log in again using 'zenml login'."
4439
+ ) from e
3477
4440
 
3478
4441
  def get(
3479
- self, path: str, params: Optional[Dict[str, Any]] = None, **kwargs: Any
4442
+ self,
4443
+ path: str,
4444
+ params: Optional[Dict[str, Any]] = None,
4445
+ timeout: Optional[int] = None,
4446
+ **kwargs: Any,
3480
4447
  ) -> Json:
3481
4448
  """Make a GET request to the given endpoint path.
3482
4449
 
3483
4450
  Args:
3484
4451
  path: The path to the endpoint.
3485
4452
  params: The query parameters to pass to the endpoint.
4453
+ timeout: The request timeout in seconds.
3486
4454
  kwargs: Additional keyword arguments to pass to the request.
3487
4455
 
3488
4456
  Returns:
@@ -3490,17 +4458,26 @@ class RestZenStore(BaseZenStore):
3490
4458
  """
3491
4459
  logger.debug(f"Sending GET request to {path}...")
3492
4460
  return self._request(
3493
- "GET", self.url + API + VERSION_1 + path, params=params, **kwargs
4461
+ "GET",
4462
+ self.url + API + VERSION_1 + path,
4463
+ params=params,
4464
+ timeout=timeout,
4465
+ **kwargs,
3494
4466
  )
3495
4467
 
3496
4468
  def delete(
3497
- self, path: str, params: Optional[Dict[str, Any]] = None, **kwargs: Any
4469
+ self,
4470
+ path: str,
4471
+ params: Optional[Dict[str, Any]] = None,
4472
+ timeout: Optional[int] = None,
4473
+ **kwargs: Any,
3498
4474
  ) -> Json:
3499
4475
  """Make a DELETE request to the given endpoint path.
3500
4476
 
3501
4477
  Args:
3502
4478
  path: The path to the endpoint.
3503
4479
  params: The query parameters to pass to the endpoint.
4480
+ timeout: The request timeout in seconds.
3504
4481
  kwargs: Additional keyword arguments to pass to the request.
3505
4482
 
3506
4483
  Returns:
@@ -3511,6 +4488,7 @@ class RestZenStore(BaseZenStore):
3511
4488
  "DELETE",
3512
4489
  self.url + API + VERSION_1 + path,
3513
4490
  params=params,
4491
+ timeout=timeout,
3514
4492
  **kwargs,
3515
4493
  )
3516
4494
 
@@ -3519,6 +4497,7 @@ class RestZenStore(BaseZenStore):
3519
4497
  path: str,
3520
4498
  body: BaseModel,
3521
4499
  params: Optional[Dict[str, Any]] = None,
4500
+ timeout: Optional[int] = None,
3522
4501
  **kwargs: Any,
3523
4502
  ) -> Json:
3524
4503
  """Make a POST request to the given endpoint path.
@@ -3527,6 +4506,7 @@ class RestZenStore(BaseZenStore):
3527
4506
  path: The path to the endpoint.
3528
4507
  body: The body to send.
3529
4508
  params: The query parameters to pass to the endpoint.
4509
+ timeout: The request timeout in seconds.
3530
4510
  kwargs: Additional keyword arguments to pass to the request.
3531
4511
 
3532
4512
  Returns:
@@ -3536,8 +4516,9 @@ class RestZenStore(BaseZenStore):
3536
4516
  return self._request(
3537
4517
  "POST",
3538
4518
  self.url + API + VERSION_1 + path,
3539
- data=body.json(),
4519
+ json=body.model_dump(mode="json"),
3540
4520
  params=params,
4521
+ timeout=timeout,
3541
4522
  **kwargs,
3542
4523
  )
3543
4524
 
@@ -3546,6 +4527,7 @@ class RestZenStore(BaseZenStore):
3546
4527
  path: str,
3547
4528
  body: Optional[BaseModel] = None,
3548
4529
  params: Optional[Dict[str, Any]] = None,
4530
+ timeout: Optional[int] = None,
3549
4531
  **kwargs: Any,
3550
4532
  ) -> Json:
3551
4533
  """Make a PUT request to the given endpoint path.
@@ -3554,18 +4536,22 @@ class RestZenStore(BaseZenStore):
3554
4536
  path: The path to the endpoint.
3555
4537
  body: The body to send.
3556
4538
  params: The query parameters to pass to the endpoint.
4539
+ timeout: The request timeout in seconds.
3557
4540
  kwargs: Additional keyword arguments to pass to the request.
3558
4541
 
3559
4542
  Returns:
3560
4543
  The response body.
3561
4544
  """
3562
4545
  logger.debug(f"Sending PUT request to {path}...")
3563
- data = body.json(exclude_unset=True) if body else None
4546
+ json = (
4547
+ body.model_dump(mode="json", exclude_unset=True) if body else None
4548
+ )
3564
4549
  return self._request(
3565
4550
  "PUT",
3566
4551
  self.url + API + VERSION_1 + path,
3567
- data=data,
4552
+ json=json,
3568
4553
  params=params,
4554
+ timeout=timeout,
3569
4555
  **kwargs,
3570
4556
  )
3571
4557
 
@@ -3589,7 +4575,42 @@ class RestZenStore(BaseZenStore):
3589
4575
  The created resource.
3590
4576
  """
3591
4577
  response_body = self.post(f"{route}", body=resource, params=params)
3592
- return response_model.parse_obj(response_body)
4578
+
4579
+ return response_model.model_validate(response_body)
4580
+
4581
+ def _batch_create_resources(
4582
+ self,
4583
+ resources: List[AnyRequest],
4584
+ response_model: Type[AnyResponse],
4585
+ route: str,
4586
+ params: Optional[Dict[str, Any]] = None,
4587
+ ) -> List[AnyResponse]:
4588
+ """Create a new batch of resources.
4589
+
4590
+ Args:
4591
+ resources: The resources to create.
4592
+ response_model: The response model of an individual resource.
4593
+ route: The resource REST route to use.
4594
+ params: Optional query parameters to pass to the endpoint.
4595
+
4596
+ Returns:
4597
+ List of response models.
4598
+ """
4599
+ json_data = [
4600
+ resource.model_dump(mode="json") for resource in resources
4601
+ ]
4602
+ response = self._request(
4603
+ "POST",
4604
+ self.url + API + VERSION_1 + route + BATCH,
4605
+ json=json_data,
4606
+ params=params,
4607
+ )
4608
+ assert isinstance(response, list)
4609
+
4610
+ return [
4611
+ response_model.model_validate(model_data)
4612
+ for model_data in response
4613
+ ]
3593
4614
 
3594
4615
  def _create_workspace_scoped_resource(
3595
4616
  self,
@@ -3665,7 +4686,7 @@ class RestZenStore(BaseZenStore):
3665
4686
  f"response from the {route}{GET_OR_CREATE} endpoint but got "
3666
4687
  f"{type(was_created)} instead."
3667
4688
  )
3668
- return response_model.parse_obj(model_json), was_created
4689
+ return response_model.model_validate(model_json), was_created
3669
4690
 
3670
4691
  def _get_or_create_workspace_scoped_resource(
3671
4692
  self,
@@ -3713,7 +4734,7 @@ class RestZenStore(BaseZenStore):
3713
4734
  The retrieved resource.
3714
4735
  """
3715
4736
  body = self.get(f"{route}/{str(resource_id)}", params=params)
3716
- return response_model.parse_obj(body)
4737
+ return response_model.model_validate(body)
3717
4738
 
3718
4739
  def _list_paginated_resources(
3719
4740
  self,
@@ -3738,17 +4759,17 @@ class RestZenStore(BaseZenStore):
3738
4759
  """
3739
4760
  # leave out filter params that are not supplied
3740
4761
  params = params or {}
3741
- params.update(filter_model.dict(exclude_none=True))
4762
+ params.update(filter_model.model_dump(exclude_none=True))
3742
4763
  body = self.get(f"{route}", params=params)
3743
4764
  if not isinstance(body, dict):
3744
4765
  raise ValueError(
3745
4766
  f"Bad API Response. Expected list, got {type(body)}"
3746
4767
  )
3747
4768
  # The initial page of items will be of type BaseResponseModel
3748
- page_of_items: Page[AnyResponse] = Page.parse_obj(body)
4769
+ page_of_items: Page[AnyResponse] = Page.model_validate(body)
3749
4770
  # So these items will be parsed into their correct types like here
3750
4771
  page_of_items.items = [
3751
- response_model.parse_obj(generic_item)
4772
+ response_model.model_validate(generic_item)
3752
4773
  for generic_item in body["items"]
3753
4774
  ]
3754
4775
  return page_of_items
@@ -3779,7 +4800,7 @@ class RestZenStore(BaseZenStore):
3779
4800
  raise ValueError(
3780
4801
  f"Bad API Response. Expected list, got {type(body)}"
3781
4802
  )
3782
- return [response_model.parse_obj(entry) for entry in body]
4803
+ return [response_model.model_validate(entry) for entry in body]
3783
4804
 
3784
4805
  def _update_resource(
3785
4806
  self,
@@ -3806,7 +4827,7 @@ class RestZenStore(BaseZenStore):
3806
4827
  f"{route}/{str(resource_id)}", body=resource_update, params=params
3807
4828
  )
3808
4829
 
3809
- return response_model.parse_obj(response_body)
4830
+ return response_model.model_validate(response_body)
3810
4831
 
3811
4832
  def _delete_resource(
3812
4833
  self, resource_id: Union[str, UUID], route: str