zenml-nightly 0.70.0.dev20241125__py3-none-any.whl → 0.71.0.dev20241220__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/artifact_stores/base_artifact_store.py +2 -2
  5. zenml/artifacts/artifact_config.py +15 -6
  6. zenml/artifacts/utils.py +59 -32
  7. zenml/cli/__init__.py +22 -4
  8. zenml/cli/base.py +5 -5
  9. zenml/cli/login.py +26 -0
  10. zenml/cli/pipeline.py +111 -62
  11. zenml/cli/server.py +20 -20
  12. zenml/cli/service_connectors.py +3 -3
  13. zenml/cli/stack.py +0 -3
  14. zenml/cli/stack_components.py +0 -1
  15. zenml/cli/utils.py +0 -5
  16. zenml/client.py +62 -20
  17. zenml/config/compiler.py +12 -3
  18. zenml/config/pipeline_configurations.py +20 -0
  19. zenml/config/pipeline_run_configuration.py +1 -0
  20. zenml/config/secret_reference_mixin.py +1 -1
  21. zenml/config/server_config.py +4 -0
  22. zenml/config/step_configurations.py +21 -0
  23. zenml/constants.py +10 -0
  24. zenml/enums.py +1 -0
  25. zenml/image_builders/base_image_builder.py +5 -2
  26. zenml/image_builders/build_context.py +7 -16
  27. zenml/image_builders/local_image_builder.py +13 -3
  28. zenml/integrations/__init__.py +1 -0
  29. zenml/integrations/aws/__init__.py +3 -0
  30. zenml/integrations/aws/flavors/__init__.py +6 -0
  31. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  32. zenml/integrations/aws/image_builders/__init__.py +20 -0
  33. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  34. zenml/integrations/aws/orchestrators/sagemaker_orchestrator.py +14 -6
  35. zenml/integrations/constants.py +1 -0
  36. zenml/integrations/feast/__init__.py +1 -1
  37. zenml/integrations/feast/feature_stores/feast_feature_store.py +13 -9
  38. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  39. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
  40. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
  41. zenml/integrations/kubernetes/orchestrators/kube_utils.py +46 -2
  42. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator.py +13 -2
  43. zenml/integrations/kubernetes/orchestrators/kubernetes_orchestrator_entrypoint.py +3 -1
  44. zenml/integrations/kubernetes/orchestrators/manifest_utils.py +3 -2
  45. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +3 -2
  46. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
  47. zenml/integrations/modal/__init__.py +46 -0
  48. zenml/integrations/modal/flavors/__init__.py +26 -0
  49. zenml/integrations/modal/flavors/modal_step_operator_flavor.py +125 -0
  50. zenml/integrations/modal/step_operators/__init__.py +22 -0
  51. zenml/integrations/modal/step_operators/modal_step_operator.py +242 -0
  52. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  53. zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
  54. zenml/integrations/registry.py +2 -2
  55. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
  56. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  57. zenml/io/filesystem.py +2 -2
  58. zenml/io/local_filesystem.py +3 -3
  59. zenml/materializers/built_in_materializer.py +18 -1
  60. zenml/materializers/structured_string_materializer.py +8 -3
  61. zenml/model/model.py +23 -101
  62. zenml/model/utils.py +21 -17
  63. zenml/models/__init__.py +6 -0
  64. zenml/models/v2/base/filter.py +26 -30
  65. zenml/models/v2/base/scoped.py +258 -5
  66. zenml/models/v2/core/artifact_version.py +21 -29
  67. zenml/models/v2/core/code_repository.py +1 -12
  68. zenml/models/v2/core/component.py +5 -68
  69. zenml/models/v2/core/flavor.py +1 -11
  70. zenml/models/v2/core/model.py +1 -57
  71. zenml/models/v2/core/model_version.py +11 -36
  72. zenml/models/v2/core/model_version_artifact.py +11 -3
  73. zenml/models/v2/core/model_version_pipeline_run.py +14 -3
  74. zenml/models/v2/core/pipeline.py +47 -55
  75. zenml/models/v2/core/pipeline_build.py +67 -12
  76. zenml/models/v2/core/pipeline_deployment.py +0 -10
  77. zenml/models/v2/core/pipeline_run.py +110 -32
  78. zenml/models/v2/core/run_metadata.py +30 -9
  79. zenml/models/v2/core/run_template.py +21 -29
  80. zenml/models/v2/core/schedule.py +0 -10
  81. zenml/models/v2/core/secret.py +0 -14
  82. zenml/models/v2/core/service.py +9 -16
  83. zenml/models/v2/core/service_connector.py +0 -11
  84. zenml/models/v2/core/stack.py +21 -30
  85. zenml/models/v2/core/step_run.py +24 -18
  86. zenml/models/v2/core/trigger.py +19 -3
  87. zenml/models/v2/misc/run_metadata.py +38 -0
  88. zenml/orchestrators/base_orchestrator.py +13 -1
  89. zenml/orchestrators/input_utils.py +19 -6
  90. zenml/orchestrators/output_utils.py +5 -1
  91. zenml/orchestrators/publish_utils.py +12 -5
  92. zenml/orchestrators/step_launcher.py +16 -16
  93. zenml/orchestrators/step_run_utils.py +18 -197
  94. zenml/orchestrators/step_runner.py +40 -3
  95. zenml/orchestrators/utils.py +79 -50
  96. zenml/pipelines/build_utils.py +12 -0
  97. zenml/pipelines/pipeline_decorator.py +4 -0
  98. zenml/pipelines/pipeline_definition.py +26 -8
  99. zenml/pipelines/run_utils.py +9 -5
  100. zenml/service_connectors/service_connector_utils.py +3 -9
  101. zenml/stack/stack_component.py +1 -1
  102. zenml/stack_deployments/aws_stack_deployment.py +22 -0
  103. zenml/steps/base_step.py +11 -1
  104. zenml/steps/entrypoint_function_utils.py +7 -3
  105. zenml/steps/step_decorator.py +4 -0
  106. zenml/steps/utils.py +23 -7
  107. zenml/types.py +4 -0
  108. zenml/utils/archivable.py +65 -36
  109. zenml/utils/code_utils.py +8 -4
  110. zenml/utils/docker_utils.py +9 -0
  111. zenml/utils/metadata_utils.py +186 -153
  112. zenml/utils/string_utils.py +41 -16
  113. zenml/utils/visualization_utils.py +4 -1
  114. zenml/zen_server/auth.py +9 -10
  115. zenml/zen_server/cloud_utils.py +3 -1
  116. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  117. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  118. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  119. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  120. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  124. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  125. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  126. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  127. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  128. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  130. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  131. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  132. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  137. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  138. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  139. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  140. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  143. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  144. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  145. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  147. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  148. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  149. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  150. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  151. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  152. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  153. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  154. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  156. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  157. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  158. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  159. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  160. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  161. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  162. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  163. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  164. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  165. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  166. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  167. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  168. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  169. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  170. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  171. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  172. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  173. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  174. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  175. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  176. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  177. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  178. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  179. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  180. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  181. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  182. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  183. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  184. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  185. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  186. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  187. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  188. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  189. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  190. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  191. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  192. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  193. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  194. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  195. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  196. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  197. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  198. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  199. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  200. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  201. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  202. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  203. zenml/zen_server/dashboard/index.html +4 -4
  204. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  205. zenml/zen_server/deploy/helm/README.md +2 -2
  206. zenml/zen_server/rbac/endpoint_utils.py +6 -4
  207. zenml/zen_server/rbac/models.py +3 -2
  208. zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
  209. zenml/zen_server/rbac/utils.py +4 -7
  210. zenml/zen_server/routers/auth_endpoints.py +22 -11
  211. zenml/zen_server/routers/steps_endpoints.py +7 -1
  212. zenml/zen_server/routers/users_endpoints.py +35 -37
  213. zenml/zen_server/routers/workspaces_endpoints.py +44 -55
  214. zenml/zen_server/template_execution/utils.py +4 -1
  215. zenml/zen_server/utils.py +4 -3
  216. zenml/zen_stores/base_zen_store.py +10 -2
  217. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  218. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  219. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  220. zenml/zen_stores/migrations/versions/b73bc71f1106_remove_component_spec_path.py +36 -0
  221. zenml/zen_stores/migrations/versions/cc269488e5a9_separate_run_metadata.py +135 -0
  222. zenml/zen_stores/migrations/versions/ec6307720f92_simplify_model_version_links.py +7 -6
  223. zenml/zen_stores/rest_zen_store.py +76 -43
  224. zenml/zen_stores/schemas/__init__.py +5 -1
  225. zenml/zen_stores/schemas/artifact_schemas.py +12 -11
  226. zenml/zen_stores/schemas/component_schemas.py +0 -3
  227. zenml/zen_stores/schemas/model_schemas.py +55 -17
  228. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  229. zenml/zen_stores/schemas/pipeline_run_schemas.py +52 -18
  230. zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
  231. zenml/zen_stores/schemas/run_metadata_schemas.py +66 -31
  232. zenml/zen_stores/schemas/step_run_schemas.py +40 -13
  233. zenml/zen_stores/schemas/utils.py +47 -3
  234. zenml/zen_stores/sql_zen_store.py +462 -134
  235. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
  236. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +239 -217
  237. zenml/utils/cloud_utils.py +0 -40
  238. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  239. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  240. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  241. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  242. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  243. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  244. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  245. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  246. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  247. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  248. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  249. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  250. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  251. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  252. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
  253. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
  254. {zenml_nightly-0.70.0.dev20241125.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
zenml/model/model.py CHANGED
@@ -13,14 +13,12 @@
13
13
  # permissions and limitations under the License.
14
14
  """Model user facing interface to pass into pipeline or step."""
15
15
 
16
- import datetime
17
16
  from typing import (
18
17
  TYPE_CHECKING,
19
18
  Any,
20
19
  Dict,
21
20
  List,
22
21
  Optional,
23
- Tuple,
24
22
  Union,
25
23
  )
26
24
  from uuid import UUID
@@ -41,7 +39,6 @@ if TYPE_CHECKING:
41
39
  ModelResponse,
42
40
  ModelVersionResponse,
43
41
  PipelineRunResponse,
44
- StepRunResponse,
45
42
  )
46
43
 
47
44
  logger = get_logger(__name__)
@@ -60,7 +57,9 @@ class Model(BaseModel):
60
57
  ethics: The ethical implications of the model.
61
58
  tags: Tags associated with the model.
62
59
  version: The version name, version number or stage is optional and points model context
63
- to a specific version/stage. If skipped new version will be created.
60
+ to a specific version/stage. If skipped new version will be created. `version`
61
+ also supports placeholders: standard `{date}` and `{time}` and any custom placeholders
62
+ that are passed as substitutions in the pipeline or step decorators.
64
63
  save_models_to_registry: Whether to save all ModelArtifacts to Model Registry,
65
64
  if available in active stack.
66
65
  """
@@ -337,12 +336,16 @@ class Model(BaseModel):
337
336
  metadata: The metadata to log.
338
337
  """
339
338
  from zenml.client import Client
339
+ from zenml.models import RunMetadataResource
340
340
 
341
341
  response = self._get_or_create_model_version()
342
342
  Client().create_run_metadata(
343
343
  metadata=metadata,
344
- resource_id=response.id,
345
- resource_type=MetadataResourceTypes.MODEL_VERSION,
344
+ resources=[
345
+ RunMetadataResource(
346
+ id=response.id, type=MetadataResourceTypes.MODEL_VERSION
347
+ )
348
+ ],
346
349
  )
347
350
 
348
351
  @property
@@ -506,22 +509,6 @@ class Model(BaseModel):
506
509
  raise ValueError(
507
510
  "`model_version_id` field is for internal use only"
508
511
  )
509
-
510
- version = data.get("version", None)
511
-
512
- if (
513
- version in [stage.value for stage in ModelStages]
514
- and not suppress_class_validation_warnings
515
- ):
516
- logger.info(
517
- f"Version `{version}` matches one of the possible "
518
- "`ModelStages` and will be fetched using stage."
519
- )
520
- if str(version).isnumeric() and not suppress_class_validation_warnings:
521
- logger.info(
522
- f"`version` `{version}` is numeric and will be fetched "
523
- "using version number."
524
- )
525
512
  data["suppress_class_validation_warnings"] = True
526
513
  return data
527
514
 
@@ -537,6 +524,8 @@ class Model(BaseModel):
537
524
  from zenml.models import ModelRequest
538
525
 
539
526
  zenml_client = Client()
527
+ # backup logic, if the Model class is used directly from the code
528
+ self.name = format_name_template(self.name)
540
529
  if self.model_version_id:
541
530
  mv = zenml_client.get_model_version(
542
531
  model_version_name_or_number_or_id=self.model_version_id,
@@ -598,6 +587,18 @@ class Model(BaseModel):
598
587
  hydrate=hydrate,
599
588
  )
600
589
  else:
590
+ if self.version in ModelStages.values():
591
+ logger.info(
592
+ f"Version `{self.version}` for model {self.name} matches "
593
+ "one of the possible `ModelStages` and will be fetched "
594
+ "using stage."
595
+ )
596
+ if str(self.version).isnumeric():
597
+ logger.info(
598
+ f"Version `{self.version}` for model {self.name} is "
599
+ "numeric and will be fetched using version number."
600
+ )
601
+
601
602
  mv = zenml_client.get_model_version(
602
603
  model_name_or_id=self.name,
603
604
  model_version_name_or_number_or_id=self.version,
@@ -743,85 +744,6 @@ class Model(BaseModel):
743
744
  )
744
745
  )
745
746
 
746
- def _prepare_model_version_before_step_launch(
747
- self,
748
- pipeline_run: "PipelineRunResponse",
749
- step_run: Optional["StepRunResponse"],
750
- return_logs: bool,
751
- ) -> Tuple[str, "PipelineRunResponse", Optional["StepRunResponse"]]:
752
- """Prepares model version inside pipeline run.
753
-
754
- Args:
755
- pipeline_run: pipeline run
756
- step_run: step run (passed only if model version is defined in a step explicitly)
757
- return_logs: whether to return logs or not
758
-
759
- Returns:
760
- Logs related to the Dashboard URL to show later.
761
- """
762
- from zenml.client import Client
763
- from zenml.models import PipelineRunUpdate, StepRunUpdate
764
-
765
- logs = ""
766
-
767
- # copy Model instance to prevent corrupting configs of the
768
- # subsequent runs, if they share the same config object
769
- self_copy = self.model_copy()
770
-
771
- # in case request is within the step and no self-configuration is provided
772
- # try reuse what's in the pipeline run first
773
- if step_run is None and pipeline_run.model_version is not None:
774
- self_copy.version = pipeline_run.model_version.name
775
- self_copy.model_version_id = pipeline_run.model_version.id
776
- # otherwise try to fill the templated name, if needed
777
- elif isinstance(self_copy.version, str):
778
- if pipeline_run.start_time:
779
- start_time = pipeline_run.start_time
780
- else:
781
- start_time = datetime.datetime.now(datetime.timezone.utc)
782
- self_copy.version = format_name_template(
783
- self_copy.version,
784
- date=start_time.strftime("%Y_%m_%d"),
785
- time=start_time.strftime("%H_%M_%S_%f"),
786
- )
787
-
788
- # if exact model not yet defined - try to get/create and update it
789
- # back to the run accordingly
790
- if self_copy.model_version_id is None:
791
- model_version_response = self_copy._get_or_create_model_version()
792
-
793
- client = Client()
794
- # update the configured model version id in runs accordingly
795
- if step_run:
796
- step_run = client.zen_store.update_run_step(
797
- step_run_id=step_run.id,
798
- step_run_update=StepRunUpdate(
799
- model_version_id=model_version_response.id
800
- ),
801
- )
802
- else:
803
- pipeline_run = client.zen_store.update_run(
804
- run_id=pipeline_run.id,
805
- run_update=PipelineRunUpdate(
806
- model_version_id=model_version_response.id
807
- ),
808
- )
809
-
810
- if return_logs:
811
- from zenml.utils.cloud_utils import try_get_model_version_url
812
-
813
- if logs_to_show := try_get_model_version_url(
814
- model_version_response
815
- ):
816
- logs = logs_to_show
817
- else:
818
- logs = (
819
- "Models can be viewed in the dashboard using ZenML Pro. Sign up "
820
- "for a free trial at https://www.zenml.io/pro/"
821
- )
822
- self.model_version_id = self_copy.model_version_id
823
- return logs, pipeline_run, step_run
824
-
825
747
  @property
826
748
  def _lazy_version(self) -> Optional[str]:
827
749
  """Get version name for lazy loader.
zenml/model/utils.py CHANGED
@@ -52,29 +52,33 @@ def log_model_metadata(
52
52
  `model` in decorator.
53
53
 
54
54
  Raises:
55
- ValueError: If no model name/version is provided and the function is not
56
- called inside a step with configured `model` in decorator.
55
+ ValueError: If the function is not called with proper input.
57
56
  """
58
57
  logger.warning(
59
58
  "The `log_model_metadata` function is deprecated and will soon be "
60
- "removed. Please use `log_metadata` instead."
59
+ "removed. Instead, you can consider using: "
60
+ "`log_metadata(metadata={...}, infer_model=True)` instead. For more "
61
+ "info: https://docs.zenml.io/how-to/model-management-metrics/track-metrics-metadata/attach-metadata-to-a-model"
61
62
  )
62
63
 
63
- if model_name and model_version:
64
- from zenml import Model
64
+ from zenml import log_metadata
65
65
 
66
- mv = Model(name=model_name, version=model_version)
66
+ if model_name and model_version:
67
+ log_metadata(
68
+ metadata=metadata,
69
+ model_version=model_version,
70
+ model_name=model_name,
71
+ )
72
+ elif model_name is None and model_version is None:
73
+ log_metadata(
74
+ metadata=metadata,
75
+ infer_model=True,
76
+ )
67
77
  else:
68
- try:
69
- step_context = get_step_context()
70
- except RuntimeError:
71
- raise ValueError(
72
- "Model name and version must be provided unless the function is "
73
- "called inside a step with configured `model` in decorator."
74
- )
75
- mv = step_context.model
76
-
77
- mv.log_metadata(metadata)
78
+ raise ValueError(
79
+ "You can call `log_model_metadata` by either providing both "
80
+ "`model_name` and `model_version` or keeping both of them None."
81
+ )
78
82
 
79
83
 
80
84
  def link_artifact_version_to_model_version(
@@ -107,7 +111,7 @@ def link_artifact_to_model(
107
111
  model: The model to link to.
108
112
 
109
113
  Raises:
110
- RuntimeError: If called outside of a step.
114
+ RuntimeError: If called outside a step.
111
115
  """
112
116
  if not model:
113
117
  is_issue = False
zenml/models/__init__.py CHANGED
@@ -372,6 +372,10 @@ from zenml.models.v2.misc.auth_models import (
372
372
  OAuthRedirectResponse,
373
373
  OAuthTokenResponse,
374
374
  )
375
+ from zenml.models.v2.misc.run_metadata import (
376
+ RunMetadataEntry,
377
+ RunMetadataResource,
378
+ )
375
379
  from zenml.models.v2.misc.server_models import (
376
380
  ServerModel,
377
381
  ServerDatabaseType,
@@ -752,4 +756,6 @@ __all__ = [
752
756
  "ServiceConnectorInfo",
753
757
  "ServiceConnectorResourcesInfo",
754
758
  "ResourcesInfo",
759
+ "RunMetadataEntry",
760
+ "RunMetadataResource",
755
761
  ]
@@ -113,7 +113,7 @@ class Filter(BaseModel, ABC):
113
113
  def generate_query_conditions(
114
114
  self,
115
115
  table: Type[SQLModel],
116
- ) -> Union["ColumnElement[bool]"]:
116
+ ) -> "ColumnElement[bool]":
117
117
  """Generate the query conditions for the database.
118
118
 
119
119
  This method converts the Filter class into an appropriate SQLModel
@@ -291,11 +291,19 @@ class UUIDFilter(StrFilter):
291
291
  import sqlalchemy
292
292
  from sqlalchemy_utils.functions import cast_if
293
293
 
294
+ from zenml.utils import uuid_utils
295
+
294
296
  # For equality checks, compare the UUID directly
295
297
  if self.operation == GenericFilterOps.EQUALS:
298
+ if not uuid_utils.is_valid_uuid(self.value):
299
+ return False
300
+
296
301
  return column == self.value
297
302
 
298
303
  if self.operation == GenericFilterOps.NOT_EQUALS:
304
+ if not uuid_utils.is_valid_uuid(self.value):
305
+ return True
306
+
299
307
  return column != self.value
300
308
 
301
309
  # For all other operations, cast and handle the column as string
@@ -436,7 +444,6 @@ class BaseFilter(BaseModel):
436
444
  le=PAGE_SIZE_MAXIMUM,
437
445
  description="Page size",
438
446
  )
439
-
440
447
  id: Optional[Union[UUID, str]] = Field(
441
448
  default=None,
442
449
  description="Id for this resource",
@@ -491,13 +498,13 @@ class BaseFilter(BaseModel):
491
498
  )
492
499
  value = column
493
500
 
494
- if column in cls.FILTER_EXCLUDE_FIELDS:
501
+ if column in cls.CUSTOM_SORTING_OPTIONS:
502
+ return value
503
+ elif column in cls.FILTER_EXCLUDE_FIELDS:
495
504
  raise ValueError(
496
505
  f"This resource can not be sorted by this field: '{value}'"
497
506
  )
498
- elif column in cls.model_fields:
499
- return value
500
- elif column in cls.CUSTOM_SORTING_OPTIONS:
507
+ if column in cls.model_fields:
501
508
  return value
502
509
  else:
503
510
  raise ValueError(
@@ -703,16 +710,10 @@ class BaseFilter(BaseModel):
703
710
 
704
711
  conditions = []
705
712
 
706
- try:
707
- filter_ = FilterGenerator(table).define_filter(
708
- column="id", value=value, operator=operator
709
- )
710
- conditions.append(filter_.generate_query_conditions(table=table))
711
- except ValueError:
712
- # UUID filter with equal operators and no full UUID fail with
713
- # a ValueError. In this case, we already know that the filter
714
- # will not produce any result and can simply ignore it.
715
- pass
713
+ filter_ = FilterGenerator(table).define_filter(
714
+ column="id", value=value, operator=operator
715
+ )
716
+ conditions.append(filter_.generate_query_conditions(table=table))
716
717
 
717
718
  filter_ = FilterGenerator(table).define_filter(
718
719
  column="name", value=value, operator=operator
@@ -759,7 +760,7 @@ class BaseFilter(BaseModel):
759
760
  return self.size * (self.page - 1)
760
761
 
761
762
  def generate_filter(
762
- self, table: Type[SQLModel]
763
+ self, table: Type["AnySchema"]
763
764
  ) -> Union["ColumnElement[bool]"]:
764
765
  """Generate the filter for the query.
765
766
 
@@ -779,7 +780,7 @@ class BaseFilter(BaseModel):
779
780
  filters.append(
780
781
  column_filter.generate_query_conditions(table=table)
781
782
  )
782
- for custom_filter in self.get_custom_filters():
783
+ for custom_filter in self.get_custom_filters(table):
783
784
  filters.append(custom_filter)
784
785
  if self.logical_operator == LogicalOperators.OR:
785
786
  return or_(False, *filters)
@@ -788,12 +789,17 @@ class BaseFilter(BaseModel):
788
789
  else:
789
790
  raise RuntimeError("No valid logical operator was supplied.")
790
791
 
791
- def get_custom_filters(self) -> List["ColumnElement[bool]"]:
792
+ def get_custom_filters(
793
+ self, table: Type["AnySchema"]
794
+ ) -> List["ColumnElement[bool]"]:
792
795
  """Get custom filters.
793
796
 
794
797
  This can be overridden by subclasses to define custom filters that are
795
798
  not based on the columns of the underlying table.
796
799
 
800
+ Args:
801
+ table: The query table.
802
+
797
803
  Returns:
798
804
  A list of custom filters.
799
805
  """
@@ -1101,18 +1107,8 @@ class FilterGenerator:
1101
1107
  A Filter object.
1102
1108
 
1103
1109
  Raises:
1104
- ValueError: If the value is not a valid UUID.
1110
+ ValueError: If the value for a oneof filter is not a list.
1105
1111
  """
1106
- # For equality checks, ensure that the value is a valid UUID.
1107
- if operator == GenericFilterOps.EQUALS and not isinstance(value, UUID):
1108
- try:
1109
- UUID(value)
1110
- except ValueError as e:
1111
- raise ValueError(
1112
- "Invalid value passed as UUID query parameter."
1113
- ) from e
1114
-
1115
- # For equality checks, ensure that the value is a valid UUID.
1116
1112
  if operator == GenericFilterOps.ONEOF and not isinstance(value, list):
1117
1113
  raise ValueError(ONEOF_ERROR)
1118
1114