zenml-nightly 0.58.2.dev20240618__py3-none-any.whl → 0.58.2.dev20240620__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 (300) hide show
  1. zenml/VERSION +1 -1
  2. zenml/_hub/client.py +8 -5
  3. zenml/actions/base_action.py +8 -10
  4. zenml/artifact_stores/base_artifact_store.py +20 -15
  5. zenml/artifact_stores/local_artifact_store.py +3 -2
  6. zenml/artifacts/artifact_config.py +34 -19
  7. zenml/artifacts/external_artifact.py +18 -8
  8. zenml/artifacts/external_artifact_config.py +14 -6
  9. zenml/artifacts/unmaterialized_artifact.py +2 -11
  10. zenml/cli/__init__.py +6 -0
  11. zenml/cli/artifact.py +20 -2
  12. zenml/cli/served_model.py +0 -1
  13. zenml/cli/server.py +3 -3
  14. zenml/cli/utils.py +36 -40
  15. zenml/cli/web_login.py +2 -2
  16. zenml/client.py +198 -24
  17. zenml/client_lazy_loader.py +20 -14
  18. zenml/config/base_settings.py +5 -6
  19. zenml/config/build_configuration.py +1 -1
  20. zenml/config/compiler.py +3 -3
  21. zenml/config/docker_settings.py +27 -28
  22. zenml/config/global_config.py +33 -37
  23. zenml/config/pipeline_configurations.py +8 -11
  24. zenml/config/pipeline_run_configuration.py +6 -2
  25. zenml/config/pipeline_spec.py +3 -4
  26. zenml/config/resource_settings.py +8 -9
  27. zenml/config/schedule.py +16 -20
  28. zenml/config/secret_reference_mixin.py +6 -3
  29. zenml/config/secrets_store_config.py +16 -23
  30. zenml/config/server_config.py +50 -46
  31. zenml/config/settings_resolver.py +1 -1
  32. zenml/config/source.py +45 -35
  33. zenml/config/step_configurations.py +53 -31
  34. zenml/config/store_config.py +20 -19
  35. zenml/config/strict_base_model.py +2 -6
  36. zenml/constants.py +26 -2
  37. zenml/container_registries/base_container_registry.py +3 -2
  38. zenml/container_registries/default_container_registry.py +3 -3
  39. zenml/event_hub/base_event_hub.py +1 -1
  40. zenml/event_sources/base_event_source.py +11 -16
  41. zenml/exceptions.py +4 -0
  42. zenml/integrations/airflow/__init__.py +2 -10
  43. zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py +6 -7
  44. zenml/integrations/airflow/orchestrators/airflow_orchestrator.py +13 -249
  45. zenml/integrations/airflow/orchestrators/dag_generator.py +5 -3
  46. zenml/integrations/argilla/flavors/argilla_annotator_flavor.py +5 -4
  47. zenml/integrations/aws/__init__.py +1 -1
  48. zenml/integrations/aws/flavors/aws_container_registry_flavor.py +3 -2
  49. zenml/integrations/aws/flavors/sagemaker_orchestrator_flavor.py +11 -5
  50. zenml/integrations/aws/flavors/sagemaker_step_operator_flavor.py +6 -2
  51. zenml/integrations/aws/service_connectors/aws_service_connector.py +5 -4
  52. zenml/integrations/azure/flavors/azureml_step_operator_flavor.py +4 -4
  53. zenml/integrations/azure/service_connectors/azure_service_connector.py +4 -3
  54. zenml/integrations/azure/step_operators/azureml_step_operator.py +1 -1
  55. zenml/integrations/bentoml/steps/bentoml_deployer.py +1 -1
  56. zenml/integrations/bitbucket/plugins/event_sources/bitbucket_webhook_event_source.py +8 -12
  57. zenml/integrations/comet/flavors/comet_experiment_tracker_flavor.py +1 -1
  58. zenml/integrations/evidently/__init__.py +3 -4
  59. zenml/integrations/evidently/column_mapping.py +11 -3
  60. zenml/integrations/evidently/data_validators/evidently_data_validator.py +21 -3
  61. zenml/integrations/evidently/metrics.py +5 -6
  62. zenml/integrations/evidently/tests.py +5 -6
  63. zenml/integrations/facets/models.py +2 -6
  64. zenml/integrations/feast/__init__.py +3 -1
  65. zenml/integrations/feast/feature_stores/feast_feature_store.py +0 -23
  66. zenml/integrations/gcp/__init__.py +1 -1
  67. zenml/integrations/gcp/flavors/vertex_orchestrator_flavor.py +1 -1
  68. zenml/integrations/gcp/flavors/vertex_step_operator_flavor.py +1 -1
  69. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +234 -103
  70. zenml/integrations/gcp/service_connectors/gcp_service_connector.py +57 -42
  71. zenml/integrations/github/code_repositories/github_code_repository.py +1 -1
  72. zenml/integrations/github/plugins/event_sources/github_webhook_event_source.py +9 -13
  73. zenml/integrations/great_expectations/__init__.py +1 -1
  74. zenml/integrations/great_expectations/data_validators/ge_data_validator.py +44 -44
  75. zenml/integrations/great_expectations/flavors/great_expectations_data_validator_flavor.py +35 -2
  76. zenml/integrations/great_expectations/ge_store_backend.py +24 -11
  77. zenml/integrations/great_expectations/materializers/ge_materializer.py +3 -3
  78. zenml/integrations/great_expectations/utils.py +5 -5
  79. zenml/integrations/huggingface/__init__.py +3 -0
  80. zenml/integrations/huggingface/flavors/huggingface_model_deployer_flavor.py +1 -1
  81. zenml/integrations/huggingface/steps/__init__.py +3 -0
  82. zenml/integrations/huggingface/steps/accelerate_runner.py +149 -0
  83. zenml/integrations/huggingface/steps/huggingface_deployer.py +2 -2
  84. zenml/integrations/hyperai/flavors/hyperai_orchestrator_flavor.py +1 -1
  85. zenml/integrations/hyperai/service_connectors/hyperai_service_connector.py +4 -3
  86. zenml/integrations/kubeflow/__init__.py +1 -1
  87. zenml/integrations/kubeflow/flavors/kubeflow_orchestrator_flavor.py +48 -81
  88. zenml/integrations/kubeflow/orchestrators/kubeflow_orchestrator.py +295 -245
  89. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +1 -1
  90. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +11 -2
  91. zenml/integrations/kubernetes/pod_settings.py +17 -31
  92. zenml/integrations/kubernetes/service_connectors/kubernetes_service_connector.py +8 -7
  93. zenml/integrations/label_studio/__init__.py +1 -3
  94. zenml/integrations/label_studio/annotators/label_studio_annotator.py +3 -4
  95. zenml/integrations/label_studio/flavors/label_studio_annotator_flavor.py +2 -2
  96. zenml/integrations/langchain/materializers/document_materializer.py +44 -8
  97. zenml/integrations/mlflow/__init__.py +9 -3
  98. zenml/integrations/mlflow/experiment_trackers/mlflow_experiment_tracker.py +1 -1
  99. zenml/integrations/mlflow/flavors/mlflow_experiment_tracker_flavor.py +29 -37
  100. zenml/integrations/mlflow/model_registries/mlflow_model_registry.py +4 -4
  101. zenml/integrations/mlflow/steps/mlflow_deployer.py +1 -1
  102. zenml/integrations/neptune/flavors/neptune_experiment_tracker_flavor.py +1 -1
  103. zenml/integrations/pigeon/flavors/pigeon_annotator_flavor.py +1 -1
  104. zenml/integrations/s3/flavors/s3_artifact_store_flavor.py +9 -8
  105. zenml/integrations/seldon/seldon_client.py +52 -67
  106. zenml/integrations/seldon/services/seldon_deployment.py +3 -3
  107. zenml/integrations/seldon/steps/seldon_deployer.py +4 -4
  108. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +15 -5
  109. zenml/integrations/skypilot_aws/__init__.py +1 -1
  110. zenml/integrations/skypilot_aws/flavors/skypilot_orchestrator_aws_vm_flavor.py +1 -1
  111. zenml/integrations/skypilot_azure/__init__.py +1 -1
  112. zenml/integrations/skypilot_azure/flavors/skypilot_orchestrator_azure_vm_flavor.py +1 -1
  113. zenml/integrations/skypilot_gcp/__init__.py +2 -1
  114. zenml/integrations/skypilot_gcp/flavors/skypilot_orchestrator_gcp_vm_flavor.py +1 -1
  115. zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py +2 -2
  116. zenml/integrations/spark/flavors/spark_step_operator_flavor.py +1 -1
  117. zenml/integrations/tekton/__init__.py +1 -1
  118. zenml/integrations/tekton/flavors/tekton_orchestrator_flavor.py +66 -23
  119. zenml/integrations/tekton/orchestrators/tekton_orchestrator.py +547 -233
  120. zenml/integrations/tensorboard/__init__.py +1 -12
  121. zenml/integrations/tensorboard/services/tensorboard_service.py +3 -5
  122. zenml/integrations/tensorboard/visualizers/tensorboard_visualizer.py +6 -6
  123. zenml/integrations/tensorflow/__init__.py +2 -10
  124. zenml/integrations/tensorflow/materializers/keras_materializer.py +17 -9
  125. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +9 -14
  126. zenml/integrations/whylogs/flavors/whylogs_data_validator_flavor.py +1 -1
  127. zenml/lineage_graph/lineage_graph.py +1 -1
  128. zenml/materializers/built_in_materializer.py +3 -3
  129. zenml/materializers/pydantic_materializer.py +2 -2
  130. zenml/metadata/lazy_load.py +4 -4
  131. zenml/metadata/metadata_types.py +64 -4
  132. zenml/model/model.py +79 -54
  133. zenml/model_deployers/base_model_deployer.py +14 -12
  134. zenml/model_registries/base_model_registry.py +17 -15
  135. zenml/models/__init__.py +79 -206
  136. zenml/models/v2/base/base.py +54 -41
  137. zenml/models/v2/base/base_plugin_flavor.py +2 -6
  138. zenml/models/v2/base/filter.py +91 -76
  139. zenml/models/v2/base/page.py +2 -12
  140. zenml/models/v2/base/scoped.py +4 -7
  141. zenml/models/v2/core/api_key.py +22 -8
  142. zenml/models/v2/core/artifact.py +2 -2
  143. zenml/models/v2/core/artifact_version.py +74 -40
  144. zenml/models/v2/core/code_repository.py +37 -10
  145. zenml/models/v2/core/component.py +65 -16
  146. zenml/models/v2/core/device.py +14 -4
  147. zenml/models/v2/core/event_source.py +1 -2
  148. zenml/models/v2/core/flavor.py +74 -8
  149. zenml/models/v2/core/logs.py +68 -8
  150. zenml/models/v2/core/model.py +8 -4
  151. zenml/models/v2/core/model_version.py +25 -6
  152. zenml/models/v2/core/model_version_artifact.py +51 -21
  153. zenml/models/v2/core/model_version_pipeline_run.py +45 -13
  154. zenml/models/v2/core/pipeline.py +37 -72
  155. zenml/models/v2/core/pipeline_build.py +29 -17
  156. zenml/models/v2/core/pipeline_deployment.py +18 -6
  157. zenml/models/v2/core/pipeline_namespace.py +113 -0
  158. zenml/models/v2/core/pipeline_run.py +50 -22
  159. zenml/models/v2/core/run_metadata.py +59 -36
  160. zenml/models/v2/core/schedule.py +37 -24
  161. zenml/models/v2/core/secret.py +31 -12
  162. zenml/models/v2/core/service.py +64 -36
  163. zenml/models/v2/core/service_account.py +24 -11
  164. zenml/models/v2/core/service_connector.py +219 -44
  165. zenml/models/v2/core/stack.py +45 -17
  166. zenml/models/v2/core/step_run.py +28 -8
  167. zenml/models/v2/core/tag.py +8 -4
  168. zenml/models/v2/core/trigger.py +2 -2
  169. zenml/models/v2/core/trigger_execution.py +1 -0
  170. zenml/models/v2/core/user.py +18 -21
  171. zenml/models/v2/core/workspace.py +13 -3
  172. zenml/models/v2/misc/build_item.py +3 -3
  173. zenml/models/v2/misc/external_user.py +2 -6
  174. zenml/models/v2/misc/hub_plugin_models.py +9 -9
  175. zenml/models/v2/misc/loaded_visualization.py +2 -2
  176. zenml/models/v2/misc/service_connector_type.py +8 -17
  177. zenml/models/v2/misc/user_auth.py +7 -2
  178. zenml/new/pipelines/build_utils.py +3 -3
  179. zenml/new/pipelines/pipeline.py +17 -13
  180. zenml/new/pipelines/run_utils.py +103 -1
  181. zenml/orchestrators/base_orchestrator.py +10 -7
  182. zenml/orchestrators/local_docker/local_docker_orchestrator.py +1 -1
  183. zenml/orchestrators/step_runner.py +3 -6
  184. zenml/orchestrators/utils.py +1 -1
  185. zenml/plugins/base_plugin_flavor.py +6 -10
  186. zenml/plugins/plugin_flavor_registry.py +3 -7
  187. zenml/secret/base_secret.py +7 -8
  188. zenml/service_connectors/docker_service_connector.py +4 -3
  189. zenml/service_connectors/service_connector.py +5 -12
  190. zenml/service_connectors/service_connector_registry.py +2 -4
  191. zenml/services/container/container_service.py +1 -1
  192. zenml/services/container/container_service_endpoint.py +1 -1
  193. zenml/services/local/local_service.py +1 -1
  194. zenml/services/local/local_service_endpoint.py +1 -1
  195. zenml/services/service.py +16 -10
  196. zenml/services/service_type.py +4 -5
  197. zenml/services/terraform/terraform_service.py +1 -1
  198. zenml/stack/flavor.py +1 -5
  199. zenml/stack/flavor_registry.py +4 -4
  200. zenml/stack/stack.py +4 -1
  201. zenml/stack/stack_component.py +55 -31
  202. zenml/steps/base_step.py +34 -28
  203. zenml/steps/entrypoint_function_utils.py +3 -5
  204. zenml/steps/utils.py +12 -14
  205. zenml/utils/cuda_utils.py +50 -0
  206. zenml/utils/deprecation_utils.py +18 -20
  207. zenml/utils/dict_utils.py +1 -1
  208. zenml/utils/filesync_model.py +65 -28
  209. zenml/utils/function_utils.py +260 -0
  210. zenml/utils/json_utils.py +131 -0
  211. zenml/utils/mlstacks_utils.py +2 -2
  212. zenml/utils/pydantic_utils.py +270 -62
  213. zenml/utils/secret_utils.py +65 -12
  214. zenml/utils/source_utils.py +2 -2
  215. zenml/utils/typed_model.py +5 -3
  216. zenml/utils/typing_utils.py +243 -0
  217. zenml/utils/yaml_utils.py +1 -1
  218. zenml/zen_server/auth.py +2 -2
  219. zenml/zen_server/cloud_utils.py +6 -6
  220. zenml/zen_server/deploy/base_provider.py +1 -1
  221. zenml/zen_server/deploy/deployment.py +6 -8
  222. zenml/zen_server/deploy/docker/docker_zen_server.py +3 -4
  223. zenml/zen_server/deploy/local/local_provider.py +0 -1
  224. zenml/zen_server/deploy/local/local_zen_server.py +6 -6
  225. zenml/zen_server/deploy/terraform/terraform_zen_server.py +4 -6
  226. zenml/zen_server/exceptions.py +4 -1
  227. zenml/zen_server/feature_gate/zenml_cloud_feature_gate.py +1 -1
  228. zenml/zen_server/pipeline_deployment/utils.py +48 -68
  229. zenml/zen_server/rbac/models.py +2 -5
  230. zenml/zen_server/rbac/utils.py +11 -14
  231. zenml/zen_server/routers/auth_endpoints.py +2 -2
  232. zenml/zen_server/routers/pipeline_builds_endpoints.py +1 -1
  233. zenml/zen_server/routers/runs_endpoints.py +1 -1
  234. zenml/zen_server/routers/secrets_endpoints.py +3 -2
  235. zenml/zen_server/routers/server_endpoints.py +1 -1
  236. zenml/zen_server/routers/steps_endpoints.py +1 -1
  237. zenml/zen_server/routers/workspaces_endpoints.py +1 -1
  238. zenml/zen_stores/base_zen_store.py +46 -9
  239. zenml/zen_stores/migrations/utils.py +42 -46
  240. zenml/zen_stores/migrations/versions/0701da9951a0_added_service_table.py +1 -1
  241. zenml/zen_stores/migrations/versions/1041bc644e0d_remove_secrets_manager.py +5 -3
  242. zenml/zen_stores/migrations/versions/10a907dad202_delete_mlmd_tables.py +1 -1
  243. zenml/zen_stores/migrations/versions/26b776ad583e_redesign_artifacts.py +8 -10
  244. zenml/zen_stores/migrations/versions/37835ce041d2_optimizing_database.py +3 -3
  245. zenml/zen_stores/migrations/versions/46506f72f0ed_add_server_settings.py +10 -12
  246. zenml/zen_stores/migrations/versions/5994f9ad0489_introduce_role_permissions.py +3 -2
  247. zenml/zen_stores/migrations/versions/6917bce75069_add_pipeline_run_unique_constraint.py +4 -4
  248. zenml/zen_stores/migrations/versions/728c6369cfaa_add_name_column_to_input_artifact_pk.py +3 -2
  249. zenml/zen_stores/migrations/versions/743ec82b1b3c_update_size_of_build_images.py +2 -2
  250. zenml/zen_stores/migrations/versions/7500f434b71c_remove_shared_columns.py +3 -2
  251. zenml/zen_stores/migrations/versions/7834208cc3f6_artifact_project_scoping.py +8 -7
  252. zenml/zen_stores/migrations/versions/7b651bf6822e_track_secrets_in_db.py +6 -4
  253. zenml/zen_stores/migrations/versions/7e4a481d17f7_add_identity_table.py +2 -2
  254. zenml/zen_stores/migrations/versions/7f603e583dd7_fixed_migration.py +1 -1
  255. zenml/zen_stores/migrations/versions/a39c4184c8ce_remove_secrets_manager_flavors.py +2 -2
  256. zenml/zen_stores/migrations/versions/a91762e6be36_artifact_version_table.py +4 -4
  257. zenml/zen_stores/migrations/versions/alembic_start.py +1 -1
  258. zenml/zen_stores/migrations/versions/fbd7f18ced1e_increase_step_run_field_lengths.py +4 -4
  259. zenml/zen_stores/rest_zen_store.py +109 -49
  260. zenml/zen_stores/schemas/api_key_schemas.py +1 -1
  261. zenml/zen_stores/schemas/artifact_schemas.py +8 -8
  262. zenml/zen_stores/schemas/artifact_visualization_schemas.py +3 -3
  263. zenml/zen_stores/schemas/code_repository_schemas.py +1 -1
  264. zenml/zen_stores/schemas/component_schemas.py +8 -3
  265. zenml/zen_stores/schemas/device_schemas.py +8 -6
  266. zenml/zen_stores/schemas/event_source_schemas.py +3 -4
  267. zenml/zen_stores/schemas/flavor_schemas.py +5 -3
  268. zenml/zen_stores/schemas/model_schemas.py +26 -1
  269. zenml/zen_stores/schemas/pipeline_build_schemas.py +1 -1
  270. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +4 -4
  271. zenml/zen_stores/schemas/pipeline_run_schemas.py +6 -6
  272. zenml/zen_stores/schemas/pipeline_schemas.py +5 -2
  273. zenml/zen_stores/schemas/run_metadata_schemas.py +2 -2
  274. zenml/zen_stores/schemas/secret_schemas.py +8 -5
  275. zenml/zen_stores/schemas/server_settings_schemas.py +3 -1
  276. zenml/zen_stores/schemas/service_connector_schemas.py +1 -1
  277. zenml/zen_stores/schemas/service_schemas.py +11 -2
  278. zenml/zen_stores/schemas/stack_schemas.py +1 -1
  279. zenml/zen_stores/schemas/step_run_schemas.py +11 -11
  280. zenml/zen_stores/schemas/tag_schemas.py +6 -2
  281. zenml/zen_stores/schemas/trigger_schemas.py +2 -2
  282. zenml/zen_stores/schemas/user_schemas.py +2 -2
  283. zenml/zen_stores/schemas/workspace_schemas.py +3 -1
  284. zenml/zen_stores/secrets_stores/aws_secrets_store.py +19 -20
  285. zenml/zen_stores/secrets_stores/azure_secrets_store.py +17 -20
  286. zenml/zen_stores/secrets_stores/base_secrets_store.py +79 -12
  287. zenml/zen_stores/secrets_stores/gcp_secrets_store.py +17 -20
  288. zenml/zen_stores/secrets_stores/hashicorp_secrets_store.py +4 -8
  289. zenml/zen_stores/secrets_stores/service_connector_secrets_store.py +10 -7
  290. zenml/zen_stores/secrets_stores/sql_secrets_store.py +5 -6
  291. zenml/zen_stores/sql_zen_store.py +196 -120
  292. zenml/zen_stores/zen_store_interface.py +33 -0
  293. {zenml_nightly-0.58.2.dev20240618.dist-info → zenml_nightly-0.58.2.dev20240620.dist-info}/METADATA +8 -7
  294. {zenml_nightly-0.58.2.dev20240618.dist-info → zenml_nightly-0.58.2.dev20240620.dist-info}/RECORD +297 -294
  295. zenml/integrations/kubeflow/utils.py +0 -95
  296. zenml/models/v2/base/internal.py +0 -37
  297. zenml/models/v2/base/update.py +0 -44
  298. {zenml_nightly-0.58.2.dev20240618.dist-info → zenml_nightly-0.58.2.dev20240620.dist-info}/LICENSE +0 -0
  299. {zenml_nightly-0.58.2.dev20240618.dist-info → zenml_nightly-0.58.2.dev20240620.dist-info}/WHEEL +0 -0
  300. {zenml_nightly-0.58.2.dev20240618.dist-info → zenml_nightly-0.58.2.dev20240620.dist-info}/entry_points.txt +0 -0
@@ -58,7 +58,7 @@ class KubernetesOrchestratorSettings(BaseSettings):
58
58
  orchestrator_pod_settings: Optional[KubernetesPodSettings] = None
59
59
 
60
60
 
61
- class KubernetesOrchestratorConfig( # type: ignore[misc] # https://github.com/pydantic/pydantic/issues/4173
61
+ class KubernetesOrchestratorConfig(
62
62
  BaseOrchestratorConfig, KubernetesOrchestratorSettings
63
63
  ):
64
64
  """Configuration for the Kubernetes orchestrator.
@@ -100,8 +100,17 @@ def main() -> None:
100
100
  )
101
101
 
102
102
  step_config = deployment_config.step_configurations[step_name].config
103
- settings = KubernetesOrchestratorSettings.parse_obj(
104
- step_config.settings.get("orchestrator.kubernetes", {})
103
+
104
+ kubernetes_settings = step_config.settings.get(
105
+ "orchestrator.kubernetes", None
106
+ )
107
+
108
+ orchestrator_settings = {}
109
+ if kubernetes_settings is not None:
110
+ orchestrator_settings = kubernetes_settings.model_dump()
111
+
112
+ settings = KubernetesOrchestratorSettings.model_validate(
113
+ orchestrator_settings
105
114
  )
106
115
 
107
116
  env = get_config_environment_vars()
@@ -13,22 +13,13 @@
13
13
  # permissions and limitations under the License.
14
14
  """Kubernetes pod settings."""
15
15
 
16
- from typing import TYPE_CHECKING, Any, Dict, List, Union
16
+ from typing import Any, Dict, List
17
17
 
18
- from pydantic import validator
18
+ from pydantic import field_validator
19
19
 
20
20
  from zenml.config.base_settings import BaseSettings
21
21
  from zenml.integrations.kubernetes import serialization_utils
22
22
 
23
- if TYPE_CHECKING:
24
- from kubernetes.client.models import (
25
- V1Affinity,
26
- V1ResourceRequirements,
27
- V1Toleration,
28
- V1Volume,
29
- V1VolumeMount,
30
- )
31
-
32
23
 
33
24
  class KubernetesPodSettings(BaseSettings):
34
25
  """Kubernetes Pod settings.
@@ -53,10 +44,9 @@ class KubernetesPodSettings(BaseSettings):
53
44
  volume_mounts: List[Dict[str, Any]] = []
54
45
  host_ipc: bool = False
55
46
 
56
- @validator("volumes", pre=True)
57
- def _convert_volumes(
58
- cls, value: List[Union[Dict[str, Any], "V1Volume"]]
59
- ) -> List[Dict[str, Any]]:
47
+ @field_validator("volumes", mode="before")
48
+ @classmethod
49
+ def _convert_volumes(cls, value: Any) -> Any:
60
50
  """Converts Kubernetes volumes to dicts.
61
51
 
62
52
  Args:
@@ -78,10 +68,9 @@ class KubernetesPodSettings(BaseSettings):
78
68
 
79
69
  return result
80
70
 
81
- @validator("volume_mounts", pre=True)
82
- def _convert_volume_mounts(
83
- cls, value: List[Union[Dict[str, Any], "V1VolumeMount"]]
84
- ) -> List[Dict[str, Any]]:
71
+ @field_validator("volume_mounts", mode="before")
72
+ @classmethod
73
+ def _convert_volume_mounts(cls, value: Any) -> Any:
85
74
  """Converts Kubernetes volume mounts to dicts.
86
75
 
87
76
  Args:
@@ -103,10 +92,9 @@ class KubernetesPodSettings(BaseSettings):
103
92
 
104
93
  return result
105
94
 
106
- @validator("affinity", pre=True)
107
- def _convert_affinity(
108
- cls, value: Union[Dict[str, Any], "V1Affinity"]
109
- ) -> Dict[str, Any]:
95
+ @field_validator("affinity", mode="before")
96
+ @classmethod
97
+ def _convert_affinity(cls, value: Any) -> Any:
110
98
  """Converts Kubernetes affinity to a dict.
111
99
 
112
100
  Args:
@@ -122,10 +110,9 @@ class KubernetesPodSettings(BaseSettings):
122
110
  else:
123
111
  return value
124
112
 
125
- @validator("tolerations", pre=True)
126
- def _convert_tolerations(
127
- cls, value: List[Union[Dict[str, Any], "V1Toleration"]]
128
- ) -> List[Dict[str, Any]]:
113
+ @field_validator("tolerations", mode="before")
114
+ @classmethod
115
+ def _convert_tolerations(cls, value: Any) -> Any:
129
116
  """Converts Kubernetes tolerations to dicts.
130
117
 
131
118
  Args:
@@ -147,10 +134,9 @@ class KubernetesPodSettings(BaseSettings):
147
134
 
148
135
  return result
149
136
 
150
- @validator("resources", pre=True)
151
- def _convert_resources(
152
- cls, value: Union[Dict[str, Any], "V1ResourceRequirements"]
153
- ) -> Dict[str, Any]:
137
+ @field_validator("resources", mode="before")
138
+ @classmethod
139
+ def _convert_resources(cls, value: Any) -> Any:
154
140
  """Converts Kubernetes resource requirements to a dict.
155
141
 
156
142
  Args:
@@ -25,7 +25,7 @@ from typing import Any, List, Optional
25
25
 
26
26
  from kubernetes import client as k8s_client
27
27
  from kubernetes import config as k8s_config
28
- from pydantic import Field, SecretStr
28
+ from pydantic import Field
29
29
 
30
30
  from zenml.constants import KUBERNETES_CLUSTER_RESOURCE_TYPE
31
31
  from zenml.exceptions import AuthorizationException
@@ -40,6 +40,7 @@ from zenml.service_connectors.service_connector import (
40
40
  ServiceConnector,
41
41
  )
42
42
  from zenml.utils.enum_utils import StrEnum
43
+ from zenml.utils.secret_utils import PlainSerializedSecretStr
43
44
 
44
45
  logger = get_logger(__name__)
45
46
 
@@ -47,7 +48,7 @@ logger = get_logger(__name__)
47
48
  class KubernetesServerCredentials(AuthenticationConfig):
48
49
  """Kubernetes server authentication config."""
49
50
 
50
- certificate_authority: Optional[SecretStr] = Field(
51
+ certificate_authority: Optional[PlainSerializedSecretStr] = Field(
51
52
  default=None,
52
53
  title="Kubernetes CA Certificate (base64 encoded)",
53
54
  )
@@ -68,10 +69,10 @@ class KubernetesServerConfig(KubernetesServerCredentials):
68
69
  class KubernetesUserPasswordCredentials(AuthenticationConfig):
69
70
  """Kubernetes user/pass authentication config."""
70
71
 
71
- username: SecretStr = Field(
72
+ username: PlainSerializedSecretStr = Field(
72
73
  title="Kubernetes Username",
73
74
  )
74
- password: SecretStr = Field(
75
+ password: PlainSerializedSecretStr = Field(
75
76
  title="Kubernetes Password",
76
77
  )
77
78
 
@@ -94,15 +95,15 @@ class KubernetesUserPasswordConfig(
94
95
  class KubernetesTokenCredentials(AuthenticationConfig):
95
96
  """Kubernetes token authentication config."""
96
97
 
97
- client_certificate: Optional[SecretStr] = Field(
98
+ client_certificate: Optional[PlainSerializedSecretStr] = Field(
98
99
  default=None,
99
100
  title="Kubernetes Client Certificate (base64 encoded)",
100
101
  )
101
- client_key: Optional[SecretStr] = Field(
102
+ client_key: Optional[PlainSerializedSecretStr] = Field(
102
103
  default=None,
103
104
  title="Kubernetes Client Key (base64 encoded)",
104
105
  )
105
- token: Optional[SecretStr] = Field(
106
+ token: Optional[PlainSerializedSecretStr] = Field(
106
107
  default=None,
107
108
  title="Kubernetes Token",
108
109
  )
@@ -14,7 +14,6 @@
14
14
  """Initialization of the Label Studio integration."""
15
15
  from typing import List, Type
16
16
 
17
- from zenml.enums import StackComponentType
18
17
  from zenml.integrations.constants import LABEL_STUDIO
19
18
  from zenml.integrations.integration import Integration
20
19
  from zenml.stack import Flavor
@@ -27,8 +26,7 @@ class LabelStudioIntegration(Integration):
27
26
 
28
27
  NAME = LABEL_STUDIO
29
28
  REQUIREMENTS = [
30
- "label-studio>=1.6.0,<=1.9.1",
31
- "label-studio-sdk>=0.0.17,<=0.0.32",
29
+ "label-studio-sdk>=1.0.0",
32
30
  ]
33
31
 
34
32
  @classmethod
@@ -178,13 +178,12 @@ class LabelStudioAnnotator(BaseAnnotator, AuthenticationMixin):
178
178
  else:
179
179
  api_key = settings.api_key
180
180
  except RuntimeError:
181
- # Try to get from secret
182
- secret = self.get_authentication_secret()
183
- if not secret:
181
+ if secret := self.get_authentication_secret():
182
+ api_key = secret.secret_values.get("api_key", "")
183
+ else:
184
184
  raise ValueError(
185
185
  "Unable to access predefined secret to access Label Studio API key."
186
186
  )
187
- api_key = secret.secret_values.get("api_key", "")
188
187
  if not api_key:
189
188
  raise ValueError(
190
189
  "Unable to access Label Studio API key from secret."
@@ -43,10 +43,10 @@ class LabelStudioAnnotatorSettings(BaseSettings):
43
43
 
44
44
  instance_url: str = DEFAULT_LOCAL_INSTANCE_URL
45
45
  port: Optional[int] = DEFAULT_LOCAL_LABEL_STUDIO_PORT
46
- api_key: Optional[str] = SecretField()
46
+ api_key: Optional[str] = SecretField(default=None)
47
47
 
48
48
 
49
- class LabelStudioAnnotatorConfig( # type: ignore[misc] # https://github.com/pydantic/pydantic/issues/4173
49
+ class LabelStudioAnnotatorConfig(
50
50
  BaseAnnotatorConfig,
51
51
  LabelStudioAnnotatorSettings,
52
52
  AuthenticationConfigMixin,
@@ -13,20 +13,56 @@
13
13
  # permissions and limitations under the License.
14
14
  """Implementation of ZenML's Langchain Document materializer."""
15
15
 
16
- import sys
17
- from typing import TYPE_CHECKING, Any, ClassVar, Tuple, Type
16
+ import os
17
+ from typing import TYPE_CHECKING, Any, ClassVar, Dict, Tuple, Type
18
+
19
+ from langchain.docstore.document import Document
18
20
 
19
21
  from zenml.enums import ArtifactType
20
- from zenml.materializers.pydantic_materializer import PydanticMaterializer
22
+ from zenml.materializers.base_materializer import BaseMaterializer
23
+ from zenml.utils import yaml_utils
24
+
25
+ if TYPE_CHECKING:
26
+ from zenml.metadata.metadata_types import MetadataType
21
27
 
22
- if TYPE_CHECKING and sys.version_info < (3, 8):
23
- Document = Any
24
- else:
25
- from langchain.docstore.document import Document
28
+ DEFAULT_FILENAME = "data.json"
26
29
 
27
30
 
28
- class LangchainDocumentMaterializer(PydanticMaterializer):
31
+ class LangchainDocumentMaterializer(BaseMaterializer):
29
32
  """Handle Langchain Document objects."""
30
33
 
31
34
  ASSOCIATED_ARTIFACT_TYPE: ClassVar[ArtifactType] = ArtifactType.DATA
32
35
  ASSOCIATED_TYPES: ClassVar[Tuple[Type[Any], ...]] = (Document,)
36
+
37
+ def load(self, data_type: Type["Document"]) -> Any:
38
+ """Reads BaseModel from JSON.
39
+
40
+ Args:
41
+ data_type: The type of the data to read.
42
+
43
+ Returns:
44
+ The data read.
45
+ """
46
+ data_path = os.path.join(self.uri, DEFAULT_FILENAME)
47
+ contents = yaml_utils.read_json(data_path)
48
+ return data_type.parse_raw(contents)
49
+
50
+ def save(self, data: "Document") -> None:
51
+ """Serialize a BaseModel to JSON.
52
+
53
+ Args:
54
+ data: The data to store.
55
+ """
56
+ data_path = os.path.join(self.uri, DEFAULT_FILENAME)
57
+ yaml_utils.write_json(data_path, data.json())
58
+
59
+ def extract_metadata(self, data: Document) -> Dict[str, "MetadataType"]:
60
+ """Extract metadata from the given BaseModel object.
61
+
62
+ Args:
63
+ data: The BaseModel object to extract metadata from.
64
+
65
+ Returns:
66
+ The extracted metadata as a dictionary.
67
+ """
68
+ return {"schema": data.schema()}
@@ -31,15 +31,21 @@ class MlflowIntegration(Integration):
31
31
  """Definition of MLflow integration for ZenML."""
32
32
 
33
33
  NAME = MLFLOW
34
- # We need to pin protobuf to a version <=4 here, as this mlflow release
35
- # does not pin it. They fixed this in a later version, so we can probably
36
- # remove this once we update the mlflow version.
34
+
37
35
  REQUIREMENTS = [
38
36
  "mlflow>=2.1.1,<=2.12.2",
39
37
  "mlserver>=1.3.3",
40
38
  "mlserver-mlflow>=1.3.3",
41
39
  # TODO: remove this requirement once rapidjson is fixed
42
40
  "python-rapidjson<1.15",
41
+ # When you do:
42
+ # pip install zenml
43
+ # You get all our required dependencies. However, if you follow it with:
44
+ # zenml integration install mlflow
45
+ # This downgrades pydantic to v1 even though mlflow does not have
46
+ # any issues with v2. This is why we have to pin it here so a downgrade
47
+ # will not happen.
48
+ "pydantic>=2.7.0,<2.8.0"
43
49
  ]
44
50
 
45
51
  @classmethod
@@ -173,7 +173,7 @@ class MLFlowExperimentTracker(BaseExperimentTracker):
173
173
  if as_plain_text:
174
174
  tracking_uri = self.config.tracking_uri
175
175
  else:
176
- tracking_uri = self.config.dict()["tracking_uri"]
176
+ tracking_uri = self.config.model_dump()["tracking_uri"]
177
177
  return tracking_uri or self._local_mlflow_backend()
178
178
 
179
179
  def prepare_step_run(self, info: "StepRunInfo") -> None:
@@ -15,7 +15,7 @@
15
15
 
16
16
  from typing import TYPE_CHECKING, Any, Dict, Optional, Type
17
17
 
18
- from pydantic import root_validator
18
+ from pydantic import model_validator
19
19
 
20
20
  from zenml.config.base_settings import BaseSettings
21
21
  from zenml.experiment_trackers.base_experiment_tracker import (
@@ -72,7 +72,7 @@ class MLFlowExperimentTrackerSettings(BaseSettings):
72
72
  tags: Dict[str, Any] = {}
73
73
 
74
74
 
75
- class MLFlowExperimentTrackerConfig( # type: ignore[misc] # https://github.com/pydantic/pydantic/issues/4173
75
+ class MLFlowExperimentTrackerConfig(
76
76
  BaseExperimentTrackerConfig, MLFlowExperimentTrackerSettings
77
77
  ):
78
78
  """Config for the MLflow experiment tracker.
@@ -101,69 +101,61 @@ class MLFlowExperimentTrackerConfig( # type: ignore[misc] # https://github.com/
101
101
  """
102
102
 
103
103
  tracking_uri: Optional[str] = None
104
- tracking_username: Optional[str] = SecretField()
105
- tracking_password: Optional[str] = SecretField()
106
- tracking_token: Optional[str] = SecretField()
104
+ tracking_username: Optional[str] = SecretField(default=None)
105
+ tracking_password: Optional[str] = SecretField(default=None)
106
+ tracking_token: Optional[str] = SecretField(default=None)
107
107
  tracking_insecure_tls: bool = False
108
108
  databricks_host: Optional[str] = None
109
109
 
110
- @root_validator(skip_on_failure=True)
110
+ @model_validator(mode="after")
111
111
  def _ensure_authentication_if_necessary(
112
- cls, values: Dict[str, Any]
113
- ) -> Dict[str, Any]:
112
+ self,
113
+ ) -> "MLFlowExperimentTrackerConfig":
114
114
  """Ensures that credentials or a token for authentication exist.
115
115
 
116
116
  We make this check when running MLflow tracking with a remote backend.
117
117
 
118
- Args:
119
- values: The values to validate.
120
-
121
118
  Returns:
122
119
  The validated values.
123
120
 
124
121
  Raises:
125
- ValueError: If neither credentials nor a token are provided.
122
+ ValueError: If neither credentials nor a token are provided.
126
123
  """
127
- tracking_uri = values.get("tracking_uri")
128
-
129
- if tracking_uri:
130
- if is_databricks_tracking_uri(tracking_uri):
131
- # If the tracking uri is "databricks", then we need the databricks
132
- # host to be set.
133
- databricks_host = values.get("databricks_host")
134
-
135
- if not databricks_host:
124
+ if self.tracking_uri:
125
+ if is_databricks_tracking_uri(self.tracking_uri):
126
+ # If the tracking uri is "databricks", then we need the
127
+ # databricks host to be set.
128
+ if not self.databricks_host:
136
129
  raise ValueError(
137
130
  "MLflow experiment tracking with a Databricks MLflow "
138
- "managed tracking server requires the `databricks_host` "
139
- "to be set in your stack component. To update your "
140
- "component, run `zenml experiment-tracker update "
131
+ "managed tracking server requires the "
132
+ "`databricks_host` to be set in your stack component. "
133
+ "To update your component, run "
134
+ "`zenml experiment-tracker update "
141
135
  "<NAME> --databricks_host=DATABRICKS_HOST` "
142
136
  "and specify the hostname of your Databricks workspace."
143
137
  )
144
138
 
145
- if is_remote_mlflow_tracking_uri(tracking_uri):
146
- # we need either username + password or a token to authenticate to
147
- # the remote backend
148
- basic_auth = values.get("tracking_username") and values.get(
149
- "tracking_password"
150
- )
151
- token_auth = values.get("tracking_token")
139
+ if is_remote_mlflow_tracking_uri(self.tracking_uri):
140
+ # we need either username + password or a token to authenticate
141
+ # to the remote backend
142
+ basic_auth = self.tracking_username and self.tracking_password
152
143
 
153
- if not (basic_auth or token_auth):
144
+ if not (basic_auth or self.tracking_token):
154
145
  raise ValueError(
155
146
  f"MLflow experiment tracking with a remote backend "
156
- f"{tracking_uri} is only possible when specifying either "
157
- f"username and password or an authentication token in your "
158
- f"stack component. To update your component, run the "
159
- f"following command: `zenml experiment-tracker update "
147
+ f"{self.tracking_uri} is only possible when specifying "
148
+ f"either username and password or an authentication "
149
+ f"token in your stack component. To update your "
150
+ f"component, run the following command: "
151
+ f"`zenml experiment-tracker update "
160
152
  f"<NAME> --tracking_username=MY_USERNAME "
161
153
  f"--tracking_password=MY_PASSWORD "
162
154
  f"--tracking_token=MY_TOKEN` and specify either your "
163
155
  f"username and password or token."
164
156
  )
165
157
 
166
- return values
158
+ return self
167
159
 
168
160
  @property
169
161
  def is_local(self) -> bool:
@@ -385,7 +385,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
385
385
  f"Registering a new version for the model `'{name}'` "
386
386
  f"a version will be assigned automatically."
387
387
  )
388
- metadata_dict = metadata.dict() if metadata else {}
388
+ metadata_dict = metadata.model_dump() if metadata else {}
389
389
  # Set the run ID and link.
390
390
  run_id = metadata_dict.get("mlflow_run_id", None)
391
391
  run_link = metadata_dict.get("mlflow_run_link", None)
@@ -477,7 +477,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
477
477
  # Update the model tags.
478
478
  if metadata:
479
479
  try:
480
- for key, value in metadata.dict().items():
480
+ for key, value in metadata.model_dump().items():
481
481
  self.mlflow_client.set_model_version_tag(
482
482
  name=name,
483
483
  version=version,
@@ -593,7 +593,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
593
593
  filter_string += " AND "
594
594
  filter_string += f"run_id='{kwargs['mlflow_run_id']}'"
595
595
  if metadata:
596
- for tag, value in metadata.dict().items():
596
+ for tag, value in metadata.model_dump().items():
597
597
  if value:
598
598
  if filter_string:
599
599
  filter_string += " AND "
@@ -737,7 +737,7 @@ class MLFlowModelRegistry(BaseModelRegistry):
737
737
  registered_model=RegisteredModel(name=mlflow_model_version.name),
738
738
  model_format=MLFLOW_MODEL_FORMAT,
739
739
  model_library=model_library,
740
- version=mlflow_model_version.version,
740
+ version=str(mlflow_model_version.version),
741
741
  created_at=datetime.fromtimestamp(
742
742
  int(mlflow_model_version.creation_timestamp) / 1e3
743
743
  ),
@@ -130,7 +130,7 @@ def mlflow_model_deployer_step(
130
130
 
131
131
  # Fetch existing services with same pipeline name, step name and model name
132
132
  existing_services = model_deployer.find_model_server(
133
- config=predictor_cfg.dict(),
133
+ config=predictor_cfg.model_dump(),
134
134
  )
135
135
 
136
136
  # Check whether to deploy a new service
@@ -47,7 +47,7 @@ class NeptuneExperimentTrackerConfig(BaseExperimentTrackerConfig):
47
47
  """
48
48
 
49
49
  project: Optional[str] = None
50
- api_token: Optional[str] = SecretField()
50
+ api_token: Optional[str] = SecretField(default=None)
51
51
 
52
52
 
53
53
  class NeptuneExperimentTrackerSettings(BaseSettings):
@@ -31,7 +31,7 @@ class PigeonAnnotatorSettings(BaseSettings):
31
31
  """Settings for the Pigeon annotator."""
32
32
 
33
33
 
34
- class PigeonAnnotatorConfig( # type: ignore[misc] # https://github.com/pydantic/pydantic/issues/4173
34
+ class PigeonAnnotatorConfig(
35
35
  BaseAnnotatorConfig, PigeonAnnotatorSettings, AuthenticationConfigMixin
36
36
  ):
37
37
  """Config for the Pigeon annotator.
@@ -24,7 +24,7 @@ from typing import (
24
24
  Type,
25
25
  )
26
26
 
27
- from pydantic import validator
27
+ from pydantic import field_validator
28
28
 
29
29
  from zenml.artifact_stores import (
30
30
  BaseArtifactStoreConfig,
@@ -63,14 +63,15 @@ class S3ArtifactStoreConfig(
63
63
 
64
64
  SUPPORTED_SCHEMES: ClassVar[Set[str]] = {"s3://"}
65
65
 
66
- key: Optional[str] = SecretField()
67
- secret: Optional[str] = SecretField()
68
- token: Optional[str] = SecretField()
66
+ key: Optional[str] = SecretField(default=None)
67
+ secret: Optional[str] = SecretField(default=None)
68
+ token: Optional[str] = SecretField(default=None)
69
69
  client_kwargs: Optional[Dict[str, Any]] = None
70
70
  config_kwargs: Optional[Dict[str, Any]] = None
71
71
  s3_additional_kwargs: Optional[Dict[str, Any]] = None
72
72
 
73
- @validator("client_kwargs")
73
+ @field_validator("client_kwargs")
74
+ @classmethod
74
75
  def _validate_client_kwargs(
75
76
  cls, value: Optional[Dict[str, Any]]
76
77
  ) -> Optional[Dict[str, Any]]:
@@ -138,7 +139,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
138
139
 
139
140
  @property
140
141
  def docs_url(self) -> Optional[str]:
141
- """A url to point at docs explaining this flavor.
142
+ """A URL to point at docs explaining this flavor.
142
143
 
143
144
  Returns:
144
145
  A flavor docs url.
@@ -147,7 +148,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
147
148
 
148
149
  @property
149
150
  def sdk_docs_url(self) -> Optional[str]:
150
- """A url to point at SDK docs explaining this flavor.
151
+ """A URL to point at SDK docs explaining this flavor.
151
152
 
152
153
  Returns:
153
154
  A flavor SDK docs url.
@@ -156,7 +157,7 @@ class S3ArtifactStoreFlavor(BaseArtifactStoreFlavor):
156
157
 
157
158
  @property
158
159
  def logo_url(self) -> str:
159
- """A url to represent the flavor in the dashboard.
160
+ """A URL to represent the flavor in the dashboard.
160
161
 
161
162
  Returns:
162
163
  The flavor logo.