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
zenml/model/model.py CHANGED
@@ -24,12 +24,13 @@ from typing import (
24
24
  )
25
25
  from uuid import UUID
26
26
 
27
- from pydantic import BaseModel, PrivateAttr, root_validator
27
+ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr, model_validator
28
28
 
29
29
  from zenml.constants import MAX_RETRIES_FOR_VERSIONED_ENTITY_CREATION
30
30
  from zenml.enums import MetadataResourceTypes, ModelStages
31
31
  from zenml.exceptions import EntityExistsError
32
32
  from zenml.logger import get_logger
33
+ from zenml.utils.pydantic_utils import before_validator_handler
33
34
 
34
35
  if TYPE_CHECKING:
35
36
  from zenml.metadata.metadata_types import MetadataType
@@ -73,7 +74,9 @@ class Model(BaseModel):
73
74
  trade_offs: Optional[str] = None
74
75
  ethics: Optional[str] = None
75
76
  tags: Optional[List[str]] = None
76
- version: Optional[Union[ModelStages, int, str]] = None
77
+ version: Optional[Union[ModelStages, int, str]] = Field(
78
+ default=None, union_mode="smart"
79
+ )
77
80
  save_models_to_registry: bool = True
78
81
  model_version_id: Optional[UUID] = None
79
82
 
@@ -83,6 +86,14 @@ class Model(BaseModel):
83
86
  _model_id: UUID = PrivateAttr(None)
84
87
  _number: int = PrivateAttr(None)
85
88
 
89
+ # TODO: In Pydantic v2, the `model_` is a protected namespaces for all
90
+ # fields defined under base models. If not handled, this raises a warning.
91
+ # It is possible to suppress this warning message with the following
92
+ # configuration, however the ultimate solution is to rename these fields.
93
+ # Even though they do not cause any problems right now, if we are not
94
+ # careful we might overwrite some fields protected by pydantic.
95
+ model_config = ConfigDict(protected_namespaces=())
96
+
86
97
  #########################
87
98
  # Public methods #
88
99
  #########################
@@ -106,8 +117,8 @@ class Model(BaseModel):
106
117
  self.model_version_id = mv.id
107
118
  except RuntimeError as e:
108
119
  raise RuntimeError(
109
- f"Version `{self.version}` of `{self.name}` model doesn't exist "
110
- "and cannot be fetched from the Model Control Plane."
120
+ f"Version `{self.version}` of `{self.name}` model doesn't "
121
+ "exist and cannot be fetched from the Model Control Plane."
111
122
  ) from e
112
123
  return self.model_version_id
113
124
 
@@ -137,8 +148,8 @@ class Model(BaseModel):
137
148
  self._get_or_create_model_version()
138
149
  except RuntimeError:
139
150
  logger.info(
140
- f"Version `{self.version}` of `{self.name}` model doesn't exist "
141
- "and cannot be fetched from the Model Control Plane."
151
+ f"Version `{self.version}` of `{self.name}` model doesn't "
152
+ "exist and cannot be fetched from the Model Control Plane."
142
153
  )
143
154
  return self._number
144
155
 
@@ -158,8 +169,8 @@ class Model(BaseModel):
158
169
  return ModelStages(stage)
159
170
  except RuntimeError:
160
171
  logger.info(
161
- f"Version `{self.version}` of `{self.name}` model doesn't exist "
162
- "and cannot be fetched from the Model Control Plane."
172
+ f"Version `{self.version}` of `{self.name}` model doesn't "
173
+ "exist and cannot be fetched from the Model Control Plane."
163
174
  )
164
175
  return None
165
176
 
@@ -199,10 +210,12 @@ class Model(BaseModel):
199
210
 
200
211
  Args:
201
212
  name: The name of the artifact to retrieve.
202
- version: The version of the artifact to retrieve (None for latest/non-versioned)
213
+ version: The version of the artifact to retrieve (None for
214
+ latest/non-versioned)
203
215
 
204
216
  Returns:
205
- Specific version of the artifact or placeholder in the design time of the pipeline.
217
+ Specific version of the artifact or placeholder in the design time
218
+ of the pipeline.
206
219
  """
207
220
  if lazy := self._lazy_artifact_get(name, version):
208
221
  return lazy
@@ -221,10 +234,12 @@ class Model(BaseModel):
221
234
 
222
235
  Args:
223
236
  name: The name of the model artifact to retrieve.
224
- version: The version of the model artifact to retrieve (None for latest/non-versioned)
237
+ version: The version of the model artifact to retrieve (None for
238
+ latest/non-versioned)
225
239
 
226
240
  Returns:
227
- Specific version of the model artifact or placeholder in the design time of the pipeline.
241
+ Specific version of the model artifact or placeholder in the design
242
+ time of the pipeline.
228
243
  """
229
244
  if lazy := self._lazy_artifact_get(name, version):
230
245
  return lazy
@@ -243,10 +258,12 @@ class Model(BaseModel):
243
258
 
244
259
  Args:
245
260
  name: The name of the data artifact to retrieve.
246
- version: The version of the data artifact to retrieve (None for latest/non-versioned)
261
+ version: The version of the data artifact to retrieve (None for
262
+ latest/non-versioned)
247
263
 
248
264
  Returns:
249
- Specific version of the data artifact or placeholder in the design time of the pipeline.
265
+ Specific version of the data artifact or placeholder in the design
266
+ time of the pipeline.
250
267
  """
251
268
  if lazy := self._lazy_artifact_get(name, version):
252
269
  return lazy
@@ -265,10 +282,12 @@ class Model(BaseModel):
265
282
 
266
283
  Args:
267
284
  name: The name of the deployment artifact to retrieve.
268
- version: The version of the deployment artifact to retrieve (None for latest/non-versioned)
285
+ version: The version of the deployment artifact to retrieve (None
286
+ for latest/non-versioned)
269
287
 
270
288
  Returns:
271
- Specific version of the deployment artifact or placeholder in the design time of the pipeline.
289
+ Specific version of the deployment artifact or placeholder in the
290
+ design time of the pipeline.
272
291
  """
273
292
  if lazy := self._lazy_artifact_get(name, version):
274
293
  return lazy
@@ -296,7 +315,8 @@ class Model(BaseModel):
296
315
 
297
316
  Args:
298
317
  stage: the target stage for model version.
299
- force: whether to force archiving of current model version in target stage or raise.
318
+ force: whether to force archiving of current model version in
319
+ target stage or raise.
300
320
  """
301
321
  self._get_or_create_model_version().set_stage(stage=stage, force=force)
302
322
 
@@ -362,7 +382,8 @@ class Model(BaseModel):
362
382
  The model version run metadata.
363
383
  """
364
384
  logger.warning(
365
- "Model `metadata` property is deprecated. Please use `run_metadata` instead."
385
+ "Model `metadata` property is deprecated. Please use "
386
+ "`run_metadata` instead."
366
387
  )
367
388
  return {k: v.value for k, v in self.run_metadata.items()}
368
389
 
@@ -378,10 +399,12 @@ class Model(BaseModel):
378
399
 
379
400
  Args:
380
401
  name: The name of the artifact to delete.
381
- version: The version of the artifact to delete (None for latest/non-versioned)
402
+ version: The version of the artifact to delete (None for
403
+ latest/non-versioned)
382
404
  only_link: Whether to only delete the link to the artifact.
383
405
  delete_metadata: Whether to delete the metadata of the artifact.
384
- delete_from_artifact_store: Whether to delete the artifact from the artifact store.
406
+ delete_from_artifact_store: Whether to delete the artifact from the
407
+ artifact store.
385
408
  """
386
409
  from zenml.client import Client
387
410
  from zenml.models import ArtifactVersionResponse
@@ -409,7 +432,8 @@ class Model(BaseModel):
409
432
 
410
433
  Args:
411
434
  only_link: Whether to only delete the link to the artifact.
412
- delete_from_artifact_store: Whether to delete the artifact from the artifact store.
435
+ delete_from_artifact_store: Whether to delete the artifact from
436
+ the artifact store.
413
437
  """
414
438
  from zenml.client import Client
415
439
 
@@ -429,15 +453,6 @@ class Model(BaseModel):
429
453
 
430
454
  client.delete_all_model_version_artifact_links(self.id, only_link)
431
455
 
432
- #########################
433
- # Internal methods #
434
- #########################
435
-
436
- class Config:
437
- """Config class."""
438
-
439
- smart_union = True
440
-
441
456
  def _lazy_artifact_get(
442
457
  self,
443
458
  name: str,
@@ -451,9 +466,9 @@ class Model(BaseModel):
451
466
  try:
452
467
  get_pipeline_context()
453
468
  return LazyArtifactVersionResponse(
454
- _lazy_load_name=name,
455
- _lazy_load_version=version,
456
- _lazy_load_model=Model(
469
+ lazy_load_name=name,
470
+ lazy_load_version=version,
471
+ lazy_load_model=Model(
457
472
  name=self.name, version=self.version or self.number
458
473
  ),
459
474
  )
@@ -481,34 +496,38 @@ class Model(BaseModel):
481
496
  other_mv = other._get_or_create_model_version()
482
497
  return self_mv.id == other_mv.id
483
498
 
484
- @root_validator(pre=True)
485
- def _root_validator(cls, values: Dict[str, Any]) -> Dict[str, Any]:
499
+ @model_validator(mode="before")
500
+ @classmethod
501
+ @before_validator_handler
502
+ def _root_validator(cls, data: Dict[str, Any]) -> Dict[str, Any]:
486
503
  """Validate all in one.
487
504
 
488
505
  Args:
489
- values: Dict of values.
506
+ data: Dict of values.
490
507
 
491
508
  Returns:
492
509
  Dict of validated values.
493
510
  """
494
- suppress_class_validation_warnings = values.get(
511
+ suppress_class_validation_warnings = data.get(
495
512
  "suppress_class_validation_warnings", False
496
513
  )
497
- version = values.get("version", None)
514
+ version = data.get("version", None)
498
515
 
499
516
  if (
500
517
  version in [stage.value for stage in ModelStages]
501
518
  and not suppress_class_validation_warnings
502
519
  ):
503
520
  logger.info(
504
- f"`version` `{version}` matches one of the possible `ModelStages` and will be fetched using stage."
521
+ f"`version` `{version}` matches one of the possible "
522
+ "`ModelStages` and will be fetched using stage."
505
523
  )
506
524
  if str(version).isnumeric() and not suppress_class_validation_warnings:
507
525
  logger.info(
508
- f"`version` `{version}` is numeric and will be fetched using version number."
526
+ f"`version` `{version}` is numeric and will be fetched "
527
+ "using version number."
509
528
  )
510
- values["suppress_class_validation_warnings"] = True
511
- return values
529
+ data["suppress_class_validation_warnings"] = True
530
+ return data
512
531
 
513
532
  def _validate_config_in_runtime(self) -> "ModelVersionResponse":
514
533
  """Validate that config doesn't conflict with runtime environment.
@@ -555,7 +574,7 @@ class Model(BaseModel):
555
574
  workspace=zenml_client.active_workspace.id,
556
575
  save_models_to_registry=self.save_models_to_registry,
557
576
  )
558
- model_request = ModelRequest.parse_obj(model_request)
577
+ model_request = ModelRequest.model_validate(model_request)
559
578
  try:
560
579
  model = zenml_client.zen_store.create_model(
561
580
  model=model_request
@@ -627,15 +646,20 @@ class Model(BaseModel):
627
646
  ) -> "ModelVersionResponse":
628
647
  """This method should get or create a model and a model version from Model Control Plane.
629
648
 
630
- A new model is created implicitly if missing, otherwise existing model is fetched. Model
631
- name is controlled by the `name` parameter.
649
+ A new model is created implicitly if missing, otherwise existing model
650
+ is fetched. Model name is controlled by the `name` parameter.
632
651
 
633
652
  Model Version returned by this method is resolved based on model version:
634
- - If `version` is None, a new model version is created, if not created by other steps in same run.
635
- - If `version` is not None a model version will be fetched based on the version:
636
- - If `version` is set to an integer or digit string, the model version with the matching number will be fetched.
637
- - If `version` is set to a string, the model version with the matching version will be fetched.
638
- - If `version` is set to a `ModelStage`, the model version with the matching stage will be fetched.
653
+ - If `version` is None, a new model version is created, if not created
654
+ by other steps in same run.
655
+ - If `version` is not None a model version will be fetched based on the
656
+ version:
657
+ - If `version` is set to an integer or digit string, the model
658
+ version with the matching number will be fetched.
659
+ - If `version` is set to a string, the model version with the
660
+ matching version will be fetched.
661
+ - If `version` is set to a `ModelStage`, the model version with the
662
+ matching stage will be fetched.
639
663
 
640
664
  Args:
641
665
  hydrate: Whether to return a hydrated version of the model version.
@@ -644,8 +668,9 @@ class Model(BaseModel):
644
668
  The model version based on configuration.
645
669
 
646
670
  Raises:
647
- RuntimeError: if the model version needs to be created, but provided name is reserved
648
- RuntimeError: if the model version cannot be created
671
+ RuntimeError: if the model version needs to be created, but
672
+ provided name is reserved.
673
+ RuntimeError: if the model version cannot be created.
649
674
  """
650
675
  from zenml.client import Client
651
676
  from zenml.models import ModelVersionRequest
@@ -656,12 +681,12 @@ class Model(BaseModel):
656
681
  model_version_request = ModelVersionRequest(
657
682
  user=zenml_client.active_user.id,
658
683
  workspace=zenml_client.active_workspace.id,
659
- name=self.version,
684
+ name=str(self.version) if self.version else None,
660
685
  description=self.description,
661
686
  model=model.id,
662
687
  tags=self.tags,
663
688
  )
664
- mv_request = ModelVersionRequest.parse_obj(model_version_request)
689
+ mv_request = ModelVersionRequest.model_validate(model_version_request)
665
690
  try:
666
691
  if not self.version:
667
692
  try:
@@ -173,7 +173,7 @@ class BaseModelDeployer(StackComponent, ABC):
173
173
  if not continuous_deployment_mode:
174
174
  # Find existing model server
175
175
  services = self.find_model_server(
176
- config=config.dict(),
176
+ config=config.model_dump(),
177
177
  service_type=service_type,
178
178
  )
179
179
  if len(services) > 0:
@@ -196,7 +196,7 @@ class BaseModelDeployer(StackComponent, ABC):
196
196
  service = services[0]
197
197
  self.delete_model_server(service.uuid)
198
198
  logger.info(
199
- f"Deploying model server for {config.model_name} with the following configuration: {config.dict()}"
199
+ f"Deploying model server for {config.model_name} with the following configuration: {config.model_dump()}"
200
200
  )
201
201
  service_response = client.create_service(
202
202
  config=config,
@@ -220,10 +220,12 @@ class BaseModelDeployer(StackComponent, ABC):
220
220
  client.update_service(
221
221
  id=service.uuid,
222
222
  name=service.config.service_name,
223
- service_source=service.dict().get("type"),
223
+ service_source=service.model_dump().get("type"),
224
224
  admin_state=service.admin_state,
225
- status=service.status.dict(),
226
- endpoint=service.endpoint.dict() if service.endpoint else None,
225
+ status=service.status.model_dump(),
226
+ endpoint=service.endpoint.model_dump()
227
+ if service.endpoint
228
+ else None,
227
229
  # labels=service.config.get_service_labels() # TODO: fix labels in services and config
228
230
  prediction_url=service.get_prediction_url(),
229
231
  health_check_url=service.get_healthcheck_url(),
@@ -343,12 +345,12 @@ class BaseModelDeployer(StackComponent, ABC):
343
345
  continue
344
346
  service = BaseDeploymentService.from_model(service_response)
345
347
  service.update_status()
346
- if service.status.dict() != service_response.status:
348
+ if service.status.model_dump() != service_response.status:
347
349
  client.update_service(
348
350
  id=service.uuid,
349
351
  admin_state=service.admin_state,
350
- status=service.status.dict(),
351
- endpoint=service.endpoint.dict()
352
+ status=service.status.model_dump(),
353
+ endpoint=service.endpoint.model_dump()
352
354
  if service.endpoint
353
355
  else None,
354
356
  )
@@ -411,8 +413,8 @@ class BaseModelDeployer(StackComponent, ABC):
411
413
  client.update_service(
412
414
  id=updated_service.uuid,
413
415
  admin_state=updated_service.admin_state,
414
- status=updated_service.status.dict(),
415
- endpoint=updated_service.endpoint.dict()
416
+ status=updated_service.status.model_dump(),
417
+ endpoint=updated_service.endpoint.model_dump()
416
418
  if updated_service.endpoint
417
419
  else None,
418
420
  )
@@ -461,8 +463,8 @@ class BaseModelDeployer(StackComponent, ABC):
461
463
  client.update_service(
462
464
  id=updated_service.uuid,
463
465
  admin_state=updated_service.admin_state,
464
- status=updated_service.status.dict(),
465
- endpoint=updated_service.endpoint.dict()
466
+ status=updated_service.status.model_dump(),
467
+ endpoint=updated_service.endpoint.model_dump()
466
468
  if updated_service.endpoint
467
469
  else None,
468
470
  )
@@ -18,7 +18,7 @@ from datetime import datetime
18
18
  from enum import Enum
19
19
  from typing import Any, Dict, List, Optional, Type, cast
20
20
 
21
- from pydantic import BaseModel
21
+ from pydantic import BaseModel, ConfigDict
22
22
 
23
23
  from zenml.enums import StackComponentType
24
24
  from zenml.stack import Flavor, StackComponent
@@ -79,13 +79,11 @@ class ModelRegistryModelMetadata(BaseModel):
79
79
  """
80
80
  # Return all attributes that are not explicitly defined as Pydantic
81
81
  # fields in this class
82
- return {
83
- k: str(v)
84
- for k, v in self.__dict__.items()
85
- if k not in self.__fields__.keys()
86
- }
82
+ if self.model_extra:
83
+ return {k: str(v) for k, v in self.model_extra.items()}
84
+ return {}
87
85
 
88
- def dict(
86
+ def model_dump(
89
87
  self,
90
88
  *,
91
89
  exclude_unset: bool = False,
@@ -94,7 +92,7 @@ class ModelRegistryModelMetadata(BaseModel):
94
92
  ) -> Dict[str, str]:
95
93
  """Returns a dictionary representation of the metadata.
96
94
 
97
- This method overrides the default Pydantic `dict` method to allow
95
+ This method overrides the default Pydantic `model_dump` method to allow
98
96
  for the exclusion of fields with a value of None.
99
97
 
100
98
  Args:
@@ -109,18 +107,14 @@ class ModelRegistryModelMetadata(BaseModel):
109
107
  return {
110
108
  k: v
111
109
  for k, v in super()
112
- .dict(exclude_unset=exclude_unset, **kwargs)
110
+ .model_dump(exclude_unset=exclude_unset, **kwargs)
113
111
  .items()
114
112
  if v is not None
115
113
  }
116
114
  else:
117
- return super().dict(exclude_unset=exclude_unset, **kwargs)
115
+ return super().model_dump(exclude_unset=exclude_unset, **kwargs)
118
116
 
119
- class Config:
120
- """Pydantic configuration class."""
121
-
122
- # Allow extra attributes to be set in the metadata
123
- extra = "allow"
117
+ model_config = ConfigDict(extra="allow")
124
118
 
125
119
 
126
120
  class RegistryModelVersion(BaseModel):
@@ -165,6 +159,14 @@ class RegistryModelVersion(BaseModel):
165
159
  stage: ModelVersionStage = ModelVersionStage.NONE
166
160
  metadata: Optional[ModelRegistryModelMetadata] = None
167
161
 
162
+ # TODO: In Pydantic v2, the `model_` is a protected namespaces for all
163
+ # fields defined under base models. If not handled, this raises a warning.
164
+ # It is possible to suppress this warning message with the following
165
+ # configuration, however the ultimate solution is to rename these fields.
166
+ # Even though they do not cause any problems right now, if we are not
167
+ # careful we might overwrite some fields protected by pydantic.
168
+ model_config = ConfigDict(protected_namespaces=())
169
+
168
170
 
169
171
  class BaseModelRegistryConfig(StackComponentConfig):
170
172
  """Base config for model registries."""