zenml-nightly 0.70.0.dev20241201__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 (193) hide show
  1. README.md +4 -4
  2. RELEASE_NOTES.md +112 -0
  3. zenml/VERSION +1 -1
  4. zenml/artifacts/artifact_config.py +8 -5
  5. zenml/artifacts/utils.py +3 -1
  6. zenml/cli/__init__.py +4 -4
  7. zenml/cli/base.py +1 -1
  8. zenml/cli/pipeline.py +48 -79
  9. zenml/cli/server.py +19 -19
  10. zenml/client.py +54 -2
  11. zenml/config/secret_reference_mixin.py +1 -1
  12. zenml/config/server_config.py +4 -0
  13. zenml/constants.py +10 -0
  14. zenml/image_builders/base_image_builder.py +5 -2
  15. zenml/image_builders/build_context.py +7 -16
  16. zenml/integrations/aws/__init__.py +3 -0
  17. zenml/integrations/aws/flavors/__init__.py +6 -0
  18. zenml/integrations/aws/flavors/aws_image_builder_flavor.py +146 -0
  19. zenml/integrations/aws/image_builders/__init__.py +20 -0
  20. zenml/integrations/aws/image_builders/aws_image_builder.py +307 -0
  21. zenml/integrations/gcp/orchestrators/vertex_orchestrator.py +1 -1
  22. zenml/integrations/kaniko/image_builders/kaniko_image_builder.py +2 -1
  23. zenml/integrations/kubernetes/flavors/kubernetes_orchestrator_flavor.py +11 -0
  24. zenml/integrations/kubernetes/step_operators/kubernetes_step_operator.py +0 -1
  25. zenml/integrations/lightning/flavors/lightning_orchestrator_flavor.py +11 -0
  26. zenml/integrations/neptune/experiment_trackers/neptune_experiment_tracker.py +7 -5
  27. zenml/integrations/neptune/experiment_trackers/run_state.py +69 -53
  28. zenml/integrations/registry.py +2 -2
  29. zenml/integrations/skypilot/flavors/skypilot_orchestrator_base_vm_config.py +12 -0
  30. zenml/integrations/wandb/flavors/wandb_experiment_tracker_flavor.py +13 -5
  31. zenml/materializers/built_in_materializer.py +1 -1
  32. zenml/model/model.py +12 -16
  33. zenml/model/utils.py +3 -1
  34. zenml/models/v2/base/filter.py +26 -30
  35. zenml/models/v2/base/scoped.py +258 -5
  36. zenml/models/v2/core/artifact_version.py +15 -26
  37. zenml/models/v2/core/code_repository.py +1 -12
  38. zenml/models/v2/core/component.py +5 -46
  39. zenml/models/v2/core/flavor.py +1 -11
  40. zenml/models/v2/core/model.py +1 -57
  41. zenml/models/v2/core/model_version.py +5 -33
  42. zenml/models/v2/core/model_version_artifact.py +11 -3
  43. zenml/models/v2/core/model_version_pipeline_run.py +14 -3
  44. zenml/models/v2/core/pipeline.py +47 -55
  45. zenml/models/v2/core/pipeline_build.py +67 -12
  46. zenml/models/v2/core/pipeline_deployment.py +0 -10
  47. zenml/models/v2/core/pipeline_run.py +91 -29
  48. zenml/models/v2/core/run_template.py +21 -29
  49. zenml/models/v2/core/schedule.py +0 -10
  50. zenml/models/v2/core/secret.py +0 -14
  51. zenml/models/v2/core/service.py +9 -16
  52. zenml/models/v2/core/service_connector.py +0 -11
  53. zenml/models/v2/core/stack.py +21 -30
  54. zenml/models/v2/core/step_run.py +18 -14
  55. zenml/models/v2/core/trigger.py +19 -3
  56. zenml/orchestrators/base_orchestrator.py +13 -1
  57. zenml/orchestrators/output_utils.py +5 -1
  58. zenml/orchestrators/step_launcher.py +9 -13
  59. zenml/orchestrators/step_run_utils.py +8 -204
  60. zenml/orchestrators/utils.py +55 -27
  61. zenml/pipelines/build_utils.py +12 -0
  62. zenml/service_connectors/service_connector_utils.py +3 -9
  63. zenml/stack/stack_component.py +1 -1
  64. zenml/stack_deployments/aws_stack_deployment.py +22 -0
  65. zenml/utils/archivable.py +65 -36
  66. zenml/utils/code_utils.py +8 -4
  67. zenml/utils/docker_utils.py +9 -0
  68. zenml/zen_server/auth.py +9 -10
  69. zenml/zen_server/dashboard/assets/{404-NVXKFp-x.js → 404-Cqu3EDCm.js} +1 -1
  70. zenml/zen_server/dashboard/assets/{@reactflow-CK0KJUen.js → @reactflow-D2Y7BWwz.js} +1 -1
  71. zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-DezXKmDf.js → AlertDialogDropdownItem-BHd71pVS.js} +1 -1
  72. zenml/zen_server/dashboard/assets/{CodeSnippet-JzR8CEtw.js → CodeSnippet-DIonwetW.js} +1 -1
  73. zenml/zen_server/dashboard/assets/{CollapsibleCard-DQW_ktMO.js → CollapsibleCard-CDnC97pB.js} +1 -1
  74. zenml/zen_server/dashboard/assets/{Commands-DL2kwkRd.js → Commands-BVEXKAOj.js} +1 -1
  75. zenml/zen_server/dashboard/assets/{ComponentBadge-D_g62Wv8.js → ComponentBadge-CrRvovox.js} +1 -1
  76. zenml/zen_server/dashboard/assets/{CopyButton-LNcWaa14.js → CopyButton-B6wGAhQv.js} +1 -1
  77. zenml/zen_server/dashboard/assets/{CsvVizualization-DknpE5ej.js → CsvVizualization-CjcT7LMm.js} +5 -5
  78. zenml/zen_server/dashboard/assets/DeleteAlertDialog-D2ELtM2W.js +1 -0
  79. zenml/zen_server/dashboard/assets/{DialogItem-Bxf8FuAT.js → DialogItem-DXIMhBgU.js} +1 -1
  80. zenml/zen_server/dashboard/assets/{Error-DYflYyps.js → Error-B8uUfTpL.js} +1 -1
  81. zenml/zen_server/dashboard/assets/{ExecutionStatus-C7zyIQKZ.js → ExecutionStatus-ibAdY-dG.js} +1 -1
  82. zenml/zen_server/dashboard/assets/{Helpbox-oYSGpLqd.js → Helpbox-BfAfhKHw.js} +1 -1
  83. zenml/zen_server/dashboard/assets/{Infobox-Cx4xGoXR.js → Infobox-M_SMOu96.js} +1 -1
  84. zenml/zen_server/dashboard/assets/{InlineAvatar-DiGOWNKF.js → InlineAvatar-DBA0a0-a.js} +1 -1
  85. zenml/zen_server/dashboard/assets/{NestedCollapsible-DYbgyKxK.js → NestedCollapsible-DpgmEFKw.js} +1 -1
  86. zenml/zen_server/dashboard/assets/{Partials-03iZf8-N.js → Partials-D_ldD9if.js} +1 -1
  87. zenml/zen_server/dashboard/assets/{ProBadge-D_EB8HNo.js → ProBadge-DQbfFotM.js} +1 -1
  88. zenml/zen_server/dashboard/assets/{ProCta-DqNS4v3x.js → ProCta-Bcpb4rcY.js} +1 -1
  89. zenml/zen_server/dashboard/assets/{ProviderIcon-Bki2aw8w.js → ProviderIcon-BZpgPigN.js} +1 -1
  90. zenml/zen_server/dashboard/assets/{ProviderRadio-8f43sPD4.js → ProviderRadio-DWPnMuQ1.js} +1 -1
  91. zenml/zen_server/dashboard/assets/RunSelector-DgRGaAc6.js +1 -0
  92. zenml/zen_server/dashboard/assets/{RunsBody-07YEO7qI.js → RunsBody-KecfSkjY.js} +1 -1
  93. zenml/zen_server/dashboard/assets/{SearchField-lp1KgU4e.js → SearchField-n-ILHnaP.js} +1 -1
  94. zenml/zen_server/dashboard/assets/{SecretTooltip-CgnbyeOx.js → SecretTooltip-B8MrX5yu.js} +1 -1
  95. zenml/zen_server/dashboard/assets/{SetPassword-CpP418A2.js → SetPassword-B_IVq_wg.js} +1 -1
  96. zenml/zen_server/dashboard/assets/StackList-TWPBYnkF.js +1 -0
  97. zenml/zen_server/dashboard/assets/{Tabs-BktHkCJJ.js → Tabs-Rg857zmd.js} +1 -1
  98. zenml/zen_server/dashboard/assets/{Tick-BlMoIlJT.js → Tick-COg4A-xo.js} +1 -1
  99. zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-Sc0A0pP-.js → UpdatePasswordSchemas-C6Aj3hm6.js} +1 -1
  100. zenml/zen_server/dashboard/assets/{UsageReason-YYduL4fj.js → UsageReason-BTLbx7w4.js} +1 -1
  101. zenml/zen_server/dashboard/assets/{WizardFooter-dgmizSJC.js → WizardFooter-BCAj69Vj.js} +1 -1
  102. zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D-c2G6lV.js → all-pipeline-runs-query-DMXkDrV2.js} +1 -1
  103. zenml/zen_server/dashboard/assets/code-snippets-CqONne41.js +13 -0
  104. zenml/zen_server/dashboard/assets/{create-stack-DM_JPgef.js → create-stack-HfdbhLs4.js} +1 -1
  105. zenml/zen_server/dashboard/assets/dates-3pMLCNrD.js +1 -0
  106. zenml/zen_server/dashboard/assets/delete-run-DZ4hIXff.js +1 -0
  107. zenml/zen_server/dashboard/assets/{form-schemas-K6FYKjwa.js → form-schemas-B0AVEd9b.js} +1 -1
  108. zenml/zen_server/dashboard/assets/{index-BAkC7FXi.js → index-DPqSWjug.js} +1 -1
  109. zenml/zen_server/dashboard/assets/{index-CEV4Cvaf.js → index-DScjfBRb.js} +1 -1
  110. zenml/zen_server/dashboard/assets/index-DXvT1_Um.css +1 -0
  111. zenml/zen_server/dashboard/assets/{index-CCOPpudF.js → index-FO-p0GU7.js} +5 -5
  112. zenml/zen_server/dashboard/assets/{index-B1mVPYxf.js → index-I3bKUGUj.js} +1 -1
  113. zenml/zen_server/dashboard/assets/key-icon-aH-QIa5R.js +1 -0
  114. zenml/zen_server/dashboard/assets/login-command-CkqxPtV3.js +1 -0
  115. zenml/zen_server/dashboard/assets/{login-mutation-hf-lK87O.js → login-mutation-BQeo4wTY.js} +1 -1
  116. zenml/zen_server/dashboard/assets/{not-found-BGirLjU-.js → not-found-gAJ5aDdR.js} +1 -1
  117. zenml/zen_server/dashboard/assets/page-9Y9-gig0.js +1 -0
  118. zenml/zen_server/dashboard/assets/{page-DjRJCGb3.js → page-AUwiQ14W.js} +1 -1
  119. zenml/zen_server/dashboard/assets/page-B6XU7yYT.js +2 -0
  120. zenml/zen_server/dashboard/assets/{page-C00YAkaB.js → page-BKZYc2Zv.js} +1 -1
  121. zenml/zen_server/dashboard/assets/{page-CdMWnQak.js → page-BU9FG4sR.js} +1 -1
  122. zenml/zen_server/dashboard/assets/{page-D7S3aCbF.js → page-B_Apk3xg.js} +1 -1
  123. zenml/zen_server/dashboard/assets/{page-Djikxq_S.js → page-BdowiCbr.js} +1 -1
  124. zenml/zen_server/dashboard/assets/page-Bg8OjTRe.js +1 -0
  125. zenml/zen_server/dashboard/assets/page-BxL4qD4_.js +1 -0
  126. zenml/zen_server/dashboard/assets/{page-DakHVWXF.js → page-CWxT5K5J.js} +1 -1
  127. zenml/zen_server/dashboard/assets/page-CXuQufSe.js +1 -0
  128. zenml/zen_server/dashboard/assets/{page-DLC-bNBP.js → page-CcQr8CPP.js} +1 -1
  129. zenml/zen_server/dashboard/assets/{page-CD-DcWoy.js → page-Ce4Hrjnr.js} +1 -1
  130. zenml/zen_server/dashboard/assets/page-CiYxgZP_.js +1 -0
  131. zenml/zen_server/dashboard/assets/page-Cldq1mpe.js +1 -0
  132. zenml/zen_server/dashboard/assets/{page-BDigxVpo.js → page-D4wdonLm.js} +1 -1
  133. zenml/zen_server/dashboard/assets/{page-D6uU2ax4.js → page-D8ObrbH8.js} +1 -1
  134. zenml/zen_server/dashboard/assets/{page-DXSTpqRD.js → page-DFuAUGt4.js} +1 -1
  135. zenml/zen_server/dashboard/assets/{page-CbpvrsDL.js → page-DGazBpuP.js} +1 -1
  136. zenml/zen_server/dashboard/assets/{page-COXXJj1k.js → page-DO1UcqPX.js} +1 -1
  137. zenml/zen_server/dashboard/assets/page-DRYXdL5o.js +1 -0
  138. zenml/zen_server/dashboard/assets/{page-Df-Fw0aq.js → page-DYEquBC2.js} +1 -1
  139. zenml/zen_server/dashboard/assets/page-Dk32IeZm.js +1 -0
  140. zenml/zen_server/dashboard/assets/{page-yYC9OI-E.js → page-I3nKFGie.js} +1 -1
  141. zenml/zen_server/dashboard/assets/{page-6m6yHHlE.js → page-M0w-n6vn.js} +1 -1
  142. zenml/zen_server/dashboard/assets/{page-Vcxara9U.js → page-R5dx3xGF.js} +1 -1
  143. zenml/zen_server/dashboard/assets/{page-BR68V0V1.js → page-bT5pOvcB.js} +1 -1
  144. zenml/zen_server/dashboard/assets/page-hUqK889I.js +6 -0
  145. zenml/zen_server/dashboard/assets/{page-CjGdWY13.js → page-h_Stveon.js} +1 -1
  146. zenml/zen_server/dashboard/assets/{page-D01JhjQB.js → page-r8XK5vR7.js} +1 -1
  147. zenml/zen_server/dashboard/assets/page-u_-ZXBKb.js +1 -0
  148. zenml/zen_server/dashboard/assets/page-zaMqB_ao.js +1 -0
  149. zenml/zen_server/dashboard/assets/{persist-GjC8PZoC.js → persist-AppN1B0J.js} +1 -1
  150. zenml/zen_server/dashboard/assets/{persist-Coz7ZWvz.js → persist-DAUi_3za.js} +1 -1
  151. zenml/zen_server/dashboard/assets/service-BqqeXLEe.js +2 -0
  152. zenml/zen_server/dashboard/assets/{sharedSchema-CQb14VSr.js → sharedSchema-uXN9FLLk.js} +1 -1
  153. zenml/zen_server/dashboard/assets/{stack-detail-query-OPEW-cDJ.js → stack-detail-query-XfZBiBP2.js} +1 -1
  154. zenml/zen_server/dashboard/assets/{update-server-settings-mutation-LwuQfHYn.js → update-server-settings-mutation-BWmgVJwA.js} +1 -1
  155. zenml/zen_server/dashboard/assets/{url-CkvKAnwF.js → url-BLwMbzES.js} +1 -1
  156. zenml/zen_server/dashboard/index.html +4 -4
  157. zenml/zen_server/deploy/helm/Chart.yaml +1 -1
  158. zenml/zen_server/deploy/helm/README.md +2 -2
  159. zenml/zen_server/rbac/rbac_sql_zen_store.py +173 -0
  160. zenml/zen_server/routers/auth_endpoints.py +22 -11
  161. zenml/zen_server/routers/steps_endpoints.py +7 -1
  162. zenml/zen_server/template_execution/utils.py +3 -1
  163. zenml/zen_server/utils.py +4 -3
  164. zenml/zen_stores/base_zen_store.py +10 -2
  165. zenml/zen_stores/migrations/versions/0.71.0_release.py +23 -0
  166. zenml/zen_stores/migrations/versions/26351d482b9e_add_step_run_unique_constraint.py +37 -0
  167. zenml/zen_stores/migrations/versions/a1237ba94fd8_add_model_version_producer_run_unique_.py +68 -0
  168. zenml/zen_stores/rest_zen_store.py +76 -43
  169. zenml/zen_stores/schemas/model_schemas.py +42 -6
  170. zenml/zen_stores/schemas/pipeline_deployment_schemas.py +7 -7
  171. zenml/zen_stores/schemas/pipeline_run_schemas.py +12 -6
  172. zenml/zen_stores/schemas/pipeline_schemas.py +5 -0
  173. zenml/zen_stores/schemas/step_run_schemas.py +8 -1
  174. zenml/zen_stores/sql_zen_store.py +332 -100
  175. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/METADATA +5 -5
  176. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/RECORD +179 -164
  177. zenml/zen_server/dashboard/assets/RunSelector-DkPiIiNr.js +0 -1
  178. zenml/zen_server/dashboard/assets/StackList-WvuKQusZ.js +0 -1
  179. zenml/zen_server/dashboard/assets/delete-run-CJdh1P_h.js +0 -1
  180. zenml/zen_server/dashboard/assets/index-DlGvJQPn.css +0 -1
  181. zenml/zen_server/dashboard/assets/page-0JE_-Ec1.js +0 -1
  182. zenml/zen_server/dashboard/assets/page-BRLpxOt0.js +0 -1
  183. zenml/zen_server/dashboard/assets/page-BU7huvKw.js +0 -6
  184. zenml/zen_server/dashboard/assets/page-BvqLv2Ky.js +0 -1
  185. zenml/zen_server/dashboard/assets/page-CwxrFarU.js +0 -1
  186. zenml/zen_server/dashboard/assets/page-DfbXf_8s.js +0 -1
  187. zenml/zen_server/dashboard/assets/page-Dnovpa0i.js +0 -3
  188. zenml/zen_server/dashboard/assets/page-Dot3LPmL.js +0 -1
  189. zenml/zen_server/dashboard/assets/page-Xynx4btY.js +0 -14
  190. zenml/zen_server/dashboard/assets/page-YpKAqVSa.js +0 -1
  191. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/LICENSE +0 -0
  192. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/WHEEL +0 -0
  193. {zenml_nightly-0.70.0.dev20241201.dist-info → zenml_nightly-0.71.0.dev20241220.dist-info}/entry_points.txt +0 -0
@@ -20,7 +20,6 @@ import neptune
20
20
 
21
21
  import zenml
22
22
  from zenml.client import Client
23
- from zenml.integrations.constants import NEPTUNE
24
23
  from zenml.utils.singleton import SingletonMetaClass
25
24
 
26
25
  if TYPE_CHECKING:
@@ -29,20 +28,38 @@ if TYPE_CHECKING:
29
28
  _INTEGRATION_VERSION_KEY = "source_code/integrations/zenml"
30
29
 
31
30
 
32
- class InvalidExperimentTrackerSelected(Exception):
33
- """Raised if a Neptune run is fetched while using a different experiment tracker."""
34
-
35
-
36
31
  class RunProvider(metaclass=SingletonMetaClass):
37
32
  """Singleton object used to store and persist a Neptune run state across the pipeline."""
38
33
 
39
34
  def __init__(self) -> None:
40
35
  """Initialize RunProvider. Called with no arguments."""
41
36
  self._active_run: Optional["Run"] = None
42
- self._project: Optional[str]
43
- self._run_name: Optional[str]
44
- self._token: Optional[str]
45
- self._tags: Optional[List[str]]
37
+ self._project: Optional[str] = None
38
+ self._run_name: Optional[str] = None
39
+ self._token: Optional[str] = None
40
+ self._tags: Optional[List[str]] = None
41
+ self._initialized = False
42
+
43
+ def initialize(
44
+ self,
45
+ project: Optional[str] = None,
46
+ token: Optional[str] = None,
47
+ run_name: Optional[str] = None,
48
+ tags: Optional[List[str]] = None,
49
+ ) -> None:
50
+ """Initialize the run state.
51
+
52
+ Args:
53
+ project: The neptune project.
54
+ token: The neptune token.
55
+ run_name: The neptune run name.
56
+ tags: Tags for the neptune run.
57
+ """
58
+ self._project = project
59
+ self._token = token
60
+ self._run_name = run_name
61
+ self._tags = tags
62
+ self._initialized = True
46
63
 
47
64
  @property
48
65
  def project(self) -> Optional[Any]:
@@ -53,15 +70,6 @@ class RunProvider(metaclass=SingletonMetaClass):
53
70
  """
54
71
  return self._project
55
72
 
56
- @project.setter
57
- def project(self, project: str) -> None:
58
- """Setter for project name.
59
-
60
- Args:
61
- project: Neptune project name
62
- """
63
- self._project = project
64
-
65
73
  @property
66
74
  def token(self) -> Optional[Any]:
67
75
  """Getter for API token.
@@ -71,15 +79,6 @@ class RunProvider(metaclass=SingletonMetaClass):
71
79
  """
72
80
  return self._token
73
81
 
74
- @token.setter
75
- def token(self, token: str) -> None:
76
- """Setter for API token.
77
-
78
- Args:
79
- token: Neptune API token
80
- """
81
- self._token = token
82
-
83
82
  @property
84
83
  def run_name(self) -> Optional[Any]:
85
84
  """Getter for run name.
@@ -89,15 +88,6 @@ class RunProvider(metaclass=SingletonMetaClass):
89
88
  """
90
89
  return self._run_name
91
90
 
92
- @run_name.setter
93
- def run_name(self, run_name: str) -> None:
94
- """Setter for run name.
95
-
96
- Args:
97
- run_name: name of the pipeline run
98
- """
99
- self._run_name = run_name
100
-
101
91
  @property
102
92
  def tags(self) -> Optional[Any]:
103
93
  """Getter for run tags.
@@ -107,14 +97,14 @@ class RunProvider(metaclass=SingletonMetaClass):
107
97
  """
108
98
  return self._tags
109
99
 
110
- @tags.setter
111
- def tags(self, tags: List[str]) -> None:
112
- """Setter for run tags.
100
+ @property
101
+ def initialized(self) -> bool:
102
+ """If the run state is initialized.
113
103
 
114
- Args:
115
- tags: list of tags associated with a Neptune run
104
+ Returns:
105
+ If the run state is initialized.
116
106
  """
117
- self._tags = tags
107
+ return self._initialized
118
108
 
119
109
  @property
120
110
  def active_run(self) -> "Run":
@@ -137,9 +127,14 @@ class RunProvider(metaclass=SingletonMetaClass):
137
127
  self._active_run = run
138
128
  return self._active_run
139
129
 
140
- def reset_active_run(self) -> None:
141
- """Resets the active run state to None."""
130
+ def reset(self) -> None:
131
+ """Reset the run state."""
142
132
  self._active_run = None
133
+ self._project = None
134
+ self._run_name = None
135
+ self._token = None
136
+ self._tags = None
137
+ self._initialized = False
143
138
 
144
139
 
145
140
  def get_neptune_run() -> "Run":
@@ -149,14 +144,35 @@ def get_neptune_run() -> "Run":
149
144
  Neptune run object
150
145
 
151
146
  Raises:
152
- InvalidExperimentTrackerSelected: when called while using an experiment tracker other than Neptune
147
+ RuntimeError: When unable to fetch the active neptune run.
153
148
  """
154
- client = Client()
155
- experiment_tracker = client.active_stack.experiment_tracker
156
- if experiment_tracker.flavor == NEPTUNE: # type: ignore
157
- return experiment_tracker.run_state.active_run # type: ignore
158
- raise InvalidExperimentTrackerSelected(
159
- "Fetching a Neptune run works only with the 'neptune' flavor of "
160
- "the experiment tracker. The flavor currently selected is %s"
161
- % experiment_tracker.flavor # type: ignore
149
+ from zenml.integrations.neptune.experiment_trackers import (
150
+ NeptuneExperimentTracker,
162
151
  )
152
+
153
+ experiment_tracker = Client().active_stack.experiment_tracker
154
+
155
+ if not experiment_tracker:
156
+ raise RuntimeError(
157
+ "Unable to get neptune run: Missing experiment tracker in the "
158
+ "active stack."
159
+ )
160
+
161
+ if not isinstance(experiment_tracker, NeptuneExperimentTracker):
162
+ raise RuntimeError(
163
+ "Unable to get neptune run: Experiment tracker in the active "
164
+ f"stack ({experiment_tracker.flavor}) is not a neptune experiment "
165
+ "tracker."
166
+ )
167
+
168
+ run_state = experiment_tracker.run_state
169
+ if not run_state.initialized:
170
+ raise RuntimeError(
171
+ "Unable to get neptune run: The experiment tracker has not been "
172
+ "initialized. To solve this, make sure you use the experiment "
173
+ "tracker in your step. See "
174
+ "https://docs.zenml.io/stack-components/experiment-trackers/neptune#how-do-you-use-it "
175
+ "for more information."
176
+ )
177
+
178
+ return experiment_tracker.run_state.active_run
@@ -111,7 +111,7 @@ class IntegrationRegistry(object):
111
111
  )
112
112
  else:
113
113
  raise KeyError(
114
- f"Version {integration_name} does not exist. "
114
+ f"Integration {integration_name} does not exist. "
115
115
  f"Currently the following integrations are implemented. "
116
116
  f"{self.list_integration_names}"
117
117
  )
@@ -148,7 +148,7 @@ class IntegrationRegistry(object):
148
148
  ].get_uninstall_requirements(target_os=target_os)
149
149
  else:
150
150
  raise KeyError(
151
- f"Version {integration_name} does not exist. "
151
+ f"Integration {integration_name} does not exist. "
152
152
  f"Currently the following integrations are implemented. "
153
153
  f"{self.list_integration_names}"
154
154
  )
@@ -144,3 +144,15 @@ class SkypilotBaseOrchestratorConfig(
144
144
  True if this config is for a local component, False otherwise.
145
145
  """
146
146
  return False
147
+
148
+ @property
149
+ def supports_client_side_caching(self) -> bool:
150
+ """Whether the orchestrator supports client side caching.
151
+
152
+ Returns:
153
+ Whether the orchestrator supports client side caching.
154
+ """
155
+ # The Skypilot orchestrator runs the entire pipeline in a single VM, or
156
+ # starts additional VMs from the root VM. Both of those cases are
157
+ # currently not supported when using client-side caching.
158
+ return False
@@ -23,7 +23,7 @@ from typing import (
23
23
  cast,
24
24
  )
25
25
 
26
- from pydantic import field_validator
26
+ from pydantic import field_validator, BaseModel
27
27
 
28
28
  from zenml.config.base_settings import BaseSettings
29
29
  from zenml.experiment_trackers.base_experiment_tracker import (
@@ -60,18 +60,26 @@ class WandbExperimentTrackerSettings(BaseSettings):
60
60
  Args:
61
61
  value: The settings.
62
62
 
63
+ Raises:
64
+ ValueError: If converting the settings failed.
65
+
63
66
  Returns:
64
67
  Dict representation of the settings.
65
68
  """
66
69
  import wandb
67
70
 
68
71
  if isinstance(value, wandb.Settings):
69
- # Depending on the wandb version, either `make_static` or `to_dict`
70
- # is available to convert the settings to a dictionary
71
- if hasattr(value, "make_static"):
72
+ # Depending on the wandb version, either `model_dump`,
73
+ # `make_static` or `to_dict` is available to convert the settings
74
+ # to a dictionary
75
+ if isinstance(value, BaseModel):
76
+ return value.model_dump()
77
+ elif hasattr(value, "make_static"):
72
78
  return cast(Dict[str, Any], value.make_static())
73
- else:
79
+ elif hasattr(value, "to_dict"):
74
80
  return value.to_dict()
81
+ else:
82
+ raise ValueError("Unable to convert wandb settings to dict.")
75
83
  else:
76
84
  return value
77
85
 
@@ -429,7 +429,7 @@ class BuiltInContainerMaterializer(BaseMaterializer):
429
429
  # doesn't work for non-serializable types as they
430
430
  # are saved as list of lists in different files
431
431
  if _is_serializable(data):
432
- return {self.data_path: VisualizationType.JSON}
432
+ return {self.data_path.replace("\\", "/"): VisualizationType.JSON}
433
433
  return {}
434
434
 
435
435
  def extract_metadata(self, data: Any) -> Dict[str, "MetadataType"]:
zenml/model/model.py CHANGED
@@ -509,22 +509,6 @@ class Model(BaseModel):
509
509
  raise ValueError(
510
510
  "`model_version_id` field is for internal use only"
511
511
  )
512
-
513
- version = data.get("version", None)
514
-
515
- if (
516
- version in [stage.value for stage in ModelStages]
517
- and not suppress_class_validation_warnings
518
- ):
519
- logger.info(
520
- f"Version `{version}` matches one of the possible "
521
- "`ModelStages` and will be fetched using stage."
522
- )
523
- if str(version).isnumeric() and not suppress_class_validation_warnings:
524
- logger.info(
525
- f"`version` `{version}` is numeric and will be fetched "
526
- "using version number."
527
- )
528
512
  data["suppress_class_validation_warnings"] = True
529
513
  return data
530
514
 
@@ -603,6 +587,18 @@ class Model(BaseModel):
603
587
  hydrate=hydrate,
604
588
  )
605
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
+
606
602
  mv = zenml_client.get_model_version(
607
603
  model_name_or_id=self.name,
608
604
  model_version_name_or_number_or_id=self.version,
zenml/model/utils.py CHANGED
@@ -56,7 +56,9 @@ def log_model_metadata(
56
56
  """
57
57
  logger.warning(
58
58
  "The `log_model_metadata` function is deprecated and will soon be "
59
- "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"
60
62
  )
61
63
 
62
64
  from zenml import log_metadata
@@ -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