zenml-nightly 0.72.0.dev20250120__py3-none-any.whl → 0.72.0.dev20250121__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.
zenml/VERSION CHANGED
@@ -1 +1 @@
1
- 0.72.0.dev20250120
1
+ 0.72.0.dev20250121
zenml/constants.py CHANGED
@@ -174,6 +174,11 @@ ENV_ZENML_PIPELINE_RUN_API_TOKEN_EXPIRATION = (
174
174
  "ZENML_PIPELINE_API_TOKEN_EXPIRATION"
175
175
  )
176
176
 
177
+ # Materializer environment variables
178
+ ENV_ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS = (
179
+ "ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS"
180
+ )
181
+
177
182
  # ZenML Server environment variables
178
183
  ENV_ZENML_SERVER_PREFIX = "ZENML_SERVER_"
179
184
  ENV_ZENML_SERVER_PRO_PREFIX = "ZENML_SERVER_PRO_"
@@ -119,6 +119,22 @@ def get_operator_init_kwargs(
119
119
  except ImportError:
120
120
  pass
121
121
 
122
+ try:
123
+ # Support for apache-airflow-providers-cncf-kubernetes>=10.0.0 where
124
+ # the import changed
125
+ from airflow.providers.cncf.kubernetes.operators.pod import (
126
+ KubernetesPodOperator,
127
+ )
128
+
129
+ if issubclass(operator_class, KubernetesPodOperator):
130
+ init_kwargs.update(
131
+ get_kubernetes_pod_operator_init_kwargs(
132
+ dag_config=dag_config, task_config=task_config
133
+ )
134
+ )
135
+ except ImportError:
136
+ pass
137
+
122
138
  init_kwargs.update(task_config.operator_args)
123
139
  return init_kwargs
124
140
 
@@ -30,8 +30,7 @@ class SlackIntegration(Integration):
30
30
  """
31
31
 
32
32
  NAME = SLACK
33
- REQUIREMENTS = ["slack-sdk>=3.16.1", "aiohttp>=3.8.1"]
34
- REQUIREMENTS_IGNORED_ON_UNINSTALL = ["aiohttp"]
33
+ REQUIREMENTS = ["slack-sdk==3.30.0"]
35
34
 
36
35
  @classmethod
37
36
  def flavors(cls) -> List[Type[Flavor]]:
@@ -14,12 +14,12 @@
14
14
  # or implied. See the License for the specific language governing
15
15
  # permissions and limitations under the License.
16
16
 
17
- from typing import Any, Dict, List, Optional, Type, cast
17
+ import time
18
+ from typing import Dict, List, Optional, Type, cast
18
19
 
19
20
  from pydantic import BaseModel
20
21
  from slack_sdk import WebClient
21
22
  from slack_sdk.errors import SlackApiError
22
- from slack_sdk.rtm import RTMClient
23
23
 
24
24
  from zenml import get_step_context
25
25
  from zenml.alerter.base_alerter import BaseAlerter, BaseAlerterStepParameters
@@ -58,7 +58,7 @@ class SlackAlerterParameters(BaseAlerterStepParameters):
58
58
  payload: Optional[SlackAlerterPayload] = None
59
59
  include_format_blocks: Optional[bool] = True
60
60
 
61
- # Allowing user to use their own custom blocks in the slack post message
61
+ # Allowing user to use their own custom blocks in the Slack post message
62
62
  blocks: Optional[List[Dict]] = None # type: ignore
63
63
 
64
64
 
@@ -96,7 +96,7 @@ class SlackAlerter(BaseAlerter):
96
96
 
97
97
  Raises:
98
98
  RuntimeError: if config is not of type `BaseAlerterStepConfig`.
99
- ValueError: if a slack channel was neither defined in the config
99
+ ValueError: if a Slack channel was neither defined in the config
100
100
  nor in the slack alerter component.
101
101
  """
102
102
  if params and not isinstance(params, BaseAlerterStepParameters):
@@ -111,24 +111,48 @@ class SlackAlerter(BaseAlerter):
111
111
  ):
112
112
  return params.slack_channel_id
113
113
 
114
- settings = cast(
115
- SlackAlerterSettings,
116
- self.get_settings(get_step_context().step_run),
117
- )
118
- if settings.slack_channel_id is not None:
114
+ try:
115
+ settings = cast(
116
+ SlackAlerterSettings,
117
+ self.get_settings(get_step_context().step_run),
118
+ )
119
+ except RuntimeError:
120
+ settings = None
121
+
122
+ if settings is not None and settings.slack_channel_id is not None:
119
123
  return settings.slack_channel_id
120
124
 
121
- if self.config.default_slack_channel_id is not None:
122
- return self.config.default_slack_channel_id
125
+ if self.config.slack_channel_id is not None:
126
+ return self.config.slack_channel_id
123
127
 
124
128
  raise ValueError(
125
- "Neither the `slack_channel_id` in the runtime "
126
- "configuration, nor the `default_slack_channel_id` in the alerter "
127
- "stack component is specified. Please specify at least one."
129
+ "The `slack_channel_id` is not set either in the runtime settings, "
130
+ "or the component configuration of the alerter. Please specify at "
131
+ "least one."
128
132
  )
129
133
 
134
+ def _get_timeout_duration(self) -> int:
135
+ """Gets the timeout duration used by the ask method .
136
+
137
+ Returns:
138
+ number of seconds for the timeout to happen.
139
+ """
140
+ try:
141
+ settings = cast(
142
+ SlackAlerterSettings,
143
+ self.get_settings(get_step_context().step_run),
144
+ )
145
+ except RuntimeError:
146
+ settings = None
147
+
148
+ if settings is not None:
149
+ return settings.timeout
150
+
151
+ return self.config.timeout
152
+
153
+ @staticmethod
130
154
  def _get_approve_msg_options(
131
- self, params: Optional[BaseAlerterStepParameters]
155
+ params: Optional[BaseAlerterStepParameters],
132
156
  ) -> List[str]:
133
157
  """Define which messages will lead to approval during ask().
134
158
 
@@ -146,8 +170,9 @@ class SlackAlerter(BaseAlerter):
146
170
  return params.approve_msg_options
147
171
  return DEFAULT_APPROVE_MSG_OPTIONS
148
172
 
173
+ @staticmethod
149
174
  def _get_disapprove_msg_options(
150
- self, params: Optional[BaseAlerterStepParameters]
175
+ params: Optional[BaseAlerterStepParameters],
151
176
  ) -> List[str]:
152
177
  """Define which messages will lead to disapproval during ask().
153
178
 
@@ -165,8 +190,8 @@ class SlackAlerter(BaseAlerter):
165
190
  return params.disapprove_msg_options
166
191
  return DEFAULT_DISAPPROVE_MSG_OPTIONS
167
192
 
193
+ @staticmethod
168
194
  def _create_blocks(
169
- self,
170
195
  message: Optional[str],
171
196
  params: Optional[BaseAlerterStepParameters],
172
197
  ) -> List[Dict]: # type: ignore
@@ -185,7 +210,8 @@ class SlackAlerter(BaseAlerter):
185
210
  return params.blocks
186
211
  elif hasattr(params, "payload") and params.payload is not None:
187
212
  logger.info(
188
- "No custom blocks set. Using default blocks for Slack alerter"
213
+ "No custom blocks set. Using default blocks for Slack "
214
+ "alerter."
189
215
  )
190
216
  payload = params.payload
191
217
  return [
@@ -228,7 +254,8 @@ class SlackAlerter(BaseAlerter):
228
254
  return []
229
255
  else:
230
256
  logger.info(
231
- "params is not of type SlackAlerterParameters. Returning empty blocks."
257
+ "params is not of type SlackAlerterParameters. Returning empty "
258
+ "blocks."
232
259
  )
233
260
  return []
234
261
 
@@ -253,64 +280,95 @@ class SlackAlerter(BaseAlerter):
253
280
  response = client.chat_postMessage(
254
281
  channel=slack_channel_id, text=message, blocks=blocks
255
282
  )
283
+ if not response.get("ok", False):
284
+ error_details = response.get("error", "Unknown error")
285
+ logger.error(
286
+ f"Failed to send message to Slack channel. "
287
+ f"Error: {error_details}. Full response: {response}"
288
+ )
289
+ return False
256
290
  return True
257
291
  except SlackApiError as error:
258
- response = error.response["error"]
259
- logger.error(f"SlackAlerter.post() failed: {response}")
292
+ error_message = error.response.get("error", "Unknown error")
293
+ logger.error(
294
+ "SlackAlerter.post() failed with Slack API error: "
295
+ f"{error_message}. Full response: {error.response}"
296
+ )
297
+ return False
298
+ except Exception as e:
299
+ logger.error(f"Unexpected error in SlackAlerter.post(): {str(e)}")
260
300
  return False
261
301
 
262
302
  def ask(
263
- self, message: str, params: Optional[BaseAlerterStepParameters] = None
303
+ self, question: str, params: Optional[BaseAlerterStepParameters] = None
264
304
  ) -> bool:
265
305
  """Post a message to a Slack channel and wait for approval.
266
306
 
267
307
  Args:
268
- message: Initial message to be posted.
308
+ question: Initial message to be posted.
269
309
  params: Optional parameters.
270
310
 
271
311
  Returns:
272
312
  True if a user approved the operation, else False
273
313
  """
274
- rtm = RTMClient(token=self.config.slack_token)
275
314
  slack_channel_id = self._get_channel_id(params=params)
276
315
 
277
- approved = False # will be modified by handle()
278
-
279
- @RTMClient.run_on(event="hello") # type: ignore
280
- def post_initial_message(**payload: Any) -> None:
281
- """Post an initial message in a channel and start listening.
316
+ client = WebClient(token=self.config.slack_token)
317
+ approve_options = self._get_approve_msg_options(params)
318
+ disapprove_options = self._get_disapprove_msg_options(params)
282
319
 
283
- Args:
284
- payload: payload of the received Slack event.
285
- """
286
- web_client = payload["web_client"]
287
- blocks = self._create_blocks(message, params)
288
- web_client.chat_postMessage(
289
- channel=slack_channel_id, text=message, blocks=blocks
320
+ try:
321
+ # Send message to the Slack channel
322
+ response = client.chat_postMessage(
323
+ channel=slack_channel_id,
324
+ text=question,
325
+ blocks=self._create_blocks(question, params),
290
326
  )
291
327
 
292
- @RTMClient.run_on(event="message") # type: ignore
293
- def handle(**payload: Any) -> None:
294
- """Listen / handle messages posted in the channel.
295
-
296
- Args:
297
- payload: payload of the received Slack event.
298
- """
299
- event = payload["data"]
300
- if event["channel"] == slack_channel_id:
301
- # approve request (return True)
302
- if event["text"] in self._get_approve_msg_options(params):
303
- print(f"User {event['user']} approved on slack.")
304
- nonlocal approved
305
- approved = True
306
- rtm.stop() # type: ignore[no-untyped-call]
307
-
308
- # disapprove request (return False)
309
- elif event["text"] in self._get_disapprove_msg_options(params):
310
- print(f"User {event['user']} disapproved on slack.")
311
- rtm.stop() # type: ignore[no-untyped-call]
312
-
313
- # start another thread until `rtm.stop()` is called in handle()
314
- rtm.start()
315
-
316
- return approved
328
+ if not response.get("ok", False):
329
+ error_details = response.get("error", "Unknown error")
330
+ logger.error(
331
+ f"Failed to send the initial message to the Slack channel. "
332
+ f"Error: {error_details}. Full response: {response}"
333
+ )
334
+ return False
335
+
336
+ # Retrieve timestamp of sent message
337
+ timestamp = response["ts"]
338
+
339
+ # Wait for a response
340
+ start_time = time.time()
341
+
342
+ while time.time() - start_time < self._get_timeout_duration():
343
+ history = client.conversations_history(
344
+ channel=slack_channel_id, oldest=timestamp
345
+ )
346
+ for msg in history["messages"]:
347
+ if "ts" in msg and "user" in msg:
348
+ user_message = msg["text"].strip().lower()
349
+ if user_message in [
350
+ opt.lower() for opt in approve_options
351
+ ]:
352
+ logger.info("User approved the operation.")
353
+ return True
354
+ elif user_message in [
355
+ opt.lower() for opt in disapprove_options
356
+ ]:
357
+ logger.info("User disapproved the operation.")
358
+ return False
359
+
360
+ time.sleep(1) # Polling interval
361
+
362
+ logger.warning("No response received within the timeout period.")
363
+ return False
364
+
365
+ except SlackApiError as error:
366
+ error_message = error.response.get("error", "Unknown error")
367
+ logger.error(
368
+ f"SlackAlerter.ask() failed with Slack API error: "
369
+ f"{error_message}. Full response: {error.response}"
370
+ )
371
+ return False
372
+ except Exception as e:
373
+ logger.error(f"Unexpected error in SlackAlerter.ask(): {str(e)}")
374
+ return False
@@ -19,6 +19,7 @@ from zenml.alerter.base_alerter import BaseAlerterConfig, BaseAlerterFlavor
19
19
  from zenml.config.base_settings import BaseSettings
20
20
  from zenml.integrations.slack import SLACK_ALERTER_FLAVOR
21
21
  from zenml.logger import get_logger
22
+ from zenml.utils.deprecation_utils import deprecate_pydantic_attributes
22
23
  from zenml.utils.secret_utils import SecretField
23
24
 
24
25
  logger = get_logger(__name__)
@@ -32,21 +33,28 @@ class SlackAlerterSettings(BaseSettings):
32
33
 
33
34
  Attributes:
34
35
  slack_channel_id: The ID of the Slack channel to use for communication.
36
+ timeout: The amount of seconds to wait for the ask method.
35
37
  """
36
38
 
37
39
  slack_channel_id: Optional[str] = None
40
+ timeout: int = 300
38
41
 
39
42
 
40
- class SlackAlerterConfig(BaseAlerterConfig):
43
+ class SlackAlerterConfig(BaseAlerterConfig, SlackAlerterSettings):
41
44
  """Slack alerter config.
42
45
 
43
46
  Attributes:
44
47
  slack_token: The Slack token tied to the Slack account to be used.
45
- default_slack_channel_id: The ID of the default Slack channel to use for communication.
48
+ default_slack_channel_id: (deprecated) The ID of the default Slack
49
+ channel to use for communication.
46
50
  """
47
51
 
48
52
  slack_token: str = SecretField()
53
+
49
54
  default_slack_channel_id: Optional[str] = None
55
+ _deprecation_validator = deprecate_pydantic_attributes(
56
+ ("default_slack_channel_id", "slack_channel_id")
57
+ )
50
58
 
51
59
  @property
52
60
  def is_valid(self) -> bool:
@@ -60,9 +68,11 @@ class SlackAlerterConfig(BaseAlerterConfig):
60
68
  from slack_sdk.errors import SlackApiError
61
69
  except ImportError:
62
70
  logger.warning(
63
- "Unable to validate Slack alerter credentials because the Slack integration is not installed."
71
+ "Unable to validate the slack alerter, because the Slack "
72
+ "integration is not installed."
64
73
  )
65
74
  return True
75
+
66
76
  client = WebClient(token=self.slack_token)
67
77
  try:
68
78
  # Check slack token validity
@@ -70,10 +80,10 @@ class SlackAlerterConfig(BaseAlerterConfig):
70
80
  if not response["ok"]:
71
81
  return False
72
82
 
73
- if self.default_slack_channel_id:
83
+ if self.slack_channel_id:
74
84
  # Check channel validity
75
85
  response = client.conversations_info(
76
- channel=self.default_slack_channel_id
86
+ channel=self.slack_channel_id
77
87
  )
78
88
  valid: bool = response["ok"]
79
89
  return valid
@@ -97,7 +107,7 @@ class SlackAlerterFlavor(BaseAlerterFlavor):
97
107
 
98
108
  @property
99
109
  def docs_url(self) -> Optional[str]:
100
- """A url to point at docs explaining this flavor.
110
+ """A URL to point at docs explaining this flavor.
101
111
 
102
112
  Returns:
103
113
  A flavor docs url.
@@ -106,7 +116,7 @@ class SlackAlerterFlavor(BaseAlerterFlavor):
106
116
 
107
117
  @property
108
118
  def sdk_docs_url(self) -> Optional[str]:
109
- """A url to point at SDK docs explaining this flavor.
119
+ """A URL to point at SDK docs explaining this flavor.
110
120
 
111
121
  Returns:
112
122
  A flavor SDK docs url.
@@ -115,7 +125,7 @@ class SlackAlerterFlavor(BaseAlerterFlavor):
115
125
 
116
126
  @property
117
127
  def logo_url(self) -> str:
118
- """A url to represent the flavor in the dashboard.
128
+ """A URL to represent the flavor in the dashboard.
119
129
 
120
130
  Returns:
121
131
  The flavor logo.
@@ -28,6 +28,10 @@ from typing import (
28
28
  )
29
29
 
30
30
  from zenml.artifact_stores.base_artifact_store import BaseArtifactStore
31
+ from zenml.constants import (
32
+ ENV_ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS,
33
+ handle_bool_env_var,
34
+ )
31
35
  from zenml.enums import ArtifactType, VisualizationType
32
36
  from zenml.logger import get_logger
33
37
  from zenml.materializers.base_materializer import BaseMaterializer
@@ -48,6 +52,9 @@ BASIC_TYPES = (
48
52
  str,
49
53
  type(None),
50
54
  ) # complex/bytes are not JSON serializable
55
+ ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS = handle_bool_env_var(
56
+ ENV_ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS, False
57
+ )
51
58
 
52
59
 
53
60
  class BuiltInMaterializer(BaseMaterializer):
@@ -94,7 +101,11 @@ class BuiltInMaterializer(BaseMaterializer):
94
101
  Args:
95
102
  data: The data to store.
96
103
  """
97
- yaml_utils.write_json(self.data_path, data)
104
+ yaml_utils.write_json(
105
+ self.data_path,
106
+ data,
107
+ ensure_ascii=not ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS,
108
+ )
98
109
 
99
110
  def extract_metadata(
100
111
  self, data: Union[bool, float, int, str]
@@ -371,7 +382,11 @@ class BuiltInContainerMaterializer(BaseMaterializer):
371
382
 
372
383
  # If the data is serializable, just write it into a single JSON file.
373
384
  if _is_serializable(data):
374
- yaml_utils.write_json(self.data_path, data)
385
+ yaml_utils.write_json(
386
+ self.data_path,
387
+ data,
388
+ ensure_ascii=not ZENML_MATERIALIZER_ALLOW_NON_ASCII_JSON_DUMPS,
389
+ )
375
390
  return
376
391
 
377
392
  # non-serializable dict: Handle as non-serializable list of lists.
@@ -474,7 +474,7 @@ def pipeline_(param_name: str):
474
474
  step_name()
475
475
 
476
476
  if __name__=="__main__":
477
- pipeline_.with_options(config_file="config.yaml")(param_name="value2")
477
+ pipeline_.with_options(config_path="config.yaml")(param_name="value2")
478
478
  ```
479
479
  To avoid this consider setting pipeline parameters only in one place (config or code).
480
480
  """
zenml/utils/yaml_utils.py CHANGED
@@ -122,6 +122,7 @@ def write_json(
122
122
  file_path: str,
123
123
  contents: Any,
124
124
  encoder: Optional[Type[json.JSONEncoder]] = None,
125
+ **json_dump_args: Any,
125
126
  ) -> None:
126
127
  """Write contents as JSON format to file_path.
127
128
 
@@ -129,6 +130,7 @@ def write_json(
129
130
  file_path: Path to JSON file.
130
131
  contents: Contents of JSON file.
131
132
  encoder: Custom JSON encoder to use when saving json.
133
+ **json_dump_args: Extra arguments to pass to json.dumps.
132
134
 
133
135
  Raises:
134
136
  FileNotFoundError: if directory does not exist.
@@ -140,10 +142,7 @@ def write_json(
140
142
  raise FileNotFoundError(f"Directory {dir_} does not exist.")
141
143
  io_utils.write_file_contents_as_string(
142
144
  file_path,
143
- json.dumps(
144
- contents,
145
- cls=encoder,
146
- ),
145
+ json.dumps(contents, cls=encoder, **json_dump_args),
147
146
  )
148
147
 
149
148
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: zenml-nightly
3
- Version: 0.72.0.dev20250120
3
+ Version: 0.72.0.dev20250121
4
4
  Summary: ZenML: Write production-ready ML code.
5
5
  License: Apache-2.0
6
6
  Keywords: machine learning,production,pipeline,mlops,devops
@@ -1,5 +1,5 @@
1
1
  zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
2
- zenml/VERSION,sha256=XQ3F7egdQRpBeHtbOm4vYzgTIbdyuNyUrtanSFMoM2c,19
2
+ zenml/VERSION,sha256=hoLPejHlgKwSc8ZXN10Ej4lKjBInKSP2jVTd1klSUTc,19
3
3
  zenml/__init__.py,sha256=SkMObQA41ajqdZqGErN00S1Vf3KAxpLvbZ-OBy5uYoo,2130
4
4
  zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
5
5
  zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
@@ -85,7 +85,7 @@ zenml/config/step_run_info.py,sha256=KiVRSTtKmZ1GbvseDTap2imr7XwMHD3jSFVpyLNEK1I
85
85
  zenml/config/store_config.py,sha256=Cla5p5dTB6nNlo8_OZDs9hod5hspi64vxwtZj882XgU,3559
86
86
  zenml/config/strict_base_model.py,sha256=iHnO9qOmLUP_eiy9IjRr3JjIs1l1I_CsRQ76EyAneYU,860
87
87
  zenml/console.py,sha256=hj_KerPQKwnyKACj0ehSqUQX0mGVCJBKE1QvCt6ik3A,1160
88
- zenml/constants.py,sha256=92ve54aAeSzoUdYEEAWhUpV5E_b54gnsVZo0PbsTlAk,15493
88
+ zenml/constants.py,sha256=kCdTTDV5r48dUSD1AVCPH1DL7GqUjhFSErh4Zdp7LCE,15639
89
89
  zenml/container_registries/__init__.py,sha256=ZSPbBIOnzhg88kQSpYgKe_POLuru14m629665-kAVAA,2200
90
90
  zenml/container_registries/azure_container_registry.py,sha256=t1sfDa94Vzbyqtb1iPFNutJ2EXV5_p9CUNITasoiQ70,2667
91
91
  zenml/container_registries/base_container_registry.py,sha256=6c2e32wuqxYHJXm5OV2LY1MtX9yopB7WZtes9fmTAz0,7625
@@ -129,7 +129,7 @@ zenml/integrations/airflow/flavors/__init__.py,sha256=Y48mn5OxERPPaXDBd5CFAIn6yh
129
129
  zenml/integrations/airflow/flavors/airflow_orchestrator_flavor.py,sha256=VfZQD2H-WwIgVD1Fi7uewdnkvRoSykY0YCfROFDadXg,6189
130
130
  zenml/integrations/airflow/orchestrators/__init__.py,sha256=UPly5wqlFdzLSiCeEtIExRXjTNdO0ys2tHSEbEv1Dks,845
131
131
  zenml/integrations/airflow/orchestrators/airflow_orchestrator.py,sha256=8JwNhrvCJi9jgtQPQpNXWFJqE_CGkVtO5t-Rp_eyDVo,15305
132
- zenml/integrations/airflow/orchestrators/dag_generator.py,sha256=6-scld5Ztgy-nvT_q849Zz147uy2itAyCNAFDCKVGpE,6826
132
+ zenml/integrations/airflow/orchestrators/dag_generator.py,sha256=H5OWZte6q1mXR-joXCbpKJ2KGPIhSOCL0ok-RIiZ1OQ,7345
133
133
  zenml/integrations/argilla/__init__.py,sha256=YeF9Vhv-hIk8k8vnfNuJXzkieLi0TwRZlghefv96KZ4,1455
134
134
  zenml/integrations/argilla/annotators/__init__.py,sha256=QjRMxIQ-skulcLN94GuHuukrmZH27e8lke_tXUp8MOg,798
135
135
  zenml/integrations/argilla/annotators/argilla_annotator.py,sha256=aIA5rcwfOYLnUVp2c_aaTAUnVW8GV9gP8myze_jY_qY,15586
@@ -504,11 +504,11 @@ zenml/integrations/skypilot_lambda/flavors/__init__.py,sha256=2Chuv2ViYTppU4Gltv
504
504
  zenml/integrations/skypilot_lambda/flavors/skypilot_orchestrator_lambda_vm_flavor.py,sha256=INsSw8yP48v9TvTp_lRNV1TwXvK-fPhkLAlmUb6971o,4063
505
505
  zenml/integrations/skypilot_lambda/orchestrators/__init__.py,sha256=3S2SmBfCp-ID78dRXh1QoI1uSxpG0M63Ul8lhDOC3AU,1021
506
506
  zenml/integrations/skypilot_lambda/orchestrators/skypilot_lambda_vm_orchestrator.py,sha256=G7vq0l4U0EsIIOc2AeEMCa8BBy94MscgfBpfpy_p6BY,3050
507
- zenml/integrations/slack/__init__.py,sha256=wNxPfbCM6zUCocpvqiWaH-4ccEPlS5KnBg0n370dCak,1583
507
+ zenml/integrations/slack/__init__.py,sha256=7H4CzJzDJKsAYj_eqr8Omlx7zCu3tUP_K5EzhM_K6hs,1513
508
508
  zenml/integrations/slack/alerters/__init__.py,sha256=Jc28JIUWq-k4b6-UkmdIs4WYTuWR2Pvg8Hw7zyoqYN0,733
509
- zenml/integrations/slack/alerters/slack_alerter.py,sha256=G2qmXlsC2VkuG8bWqwJbecBRnQrTGW0hwmMW0z293Jw,11141
509
+ zenml/integrations/slack/alerters/slack_alerter.py,sha256=QjlZK5lDbeuaFcoysZerACFo7J7r-XAw2vy5kDEyTdM,13128
510
510
  zenml/integrations/slack/flavors/__init__.py,sha256=JOmt7i06JHgW36vYcHwHk1qSC3xOgPCK26Ij73CNtww,886
511
- zenml/integrations/slack/flavors/slack_alerter_flavor.py,sha256=EsRuN6nBTFsuM_nze9d66_Z-XRU9qcJ6lDISjdpNUxA,4286
511
+ zenml/integrations/slack/flavors/slack_alerter_flavor.py,sha256=6hRaC-TByBO2tlFZB3pOTPLkwVvffktegzX0U9vxZNg,4616
512
512
  zenml/integrations/slack/steps/__init__.py,sha256=46AYxvMjeqDJvkrzktWwqLj0H1ecfzKOaq4LKTin_ek,661
513
513
  zenml/integrations/slack/steps/slack_alerter_ask_step.py,sha256=bS-4qCjeqEHWjKOmSBw6mcjjt9u6tNy8NaZ3KQyMtso,2521
514
514
  zenml/integrations/slack/steps/slack_alerter_post_step.py,sha256=o4jPh7oQ_rKC1GzJ2UfH1ov9LFxGVcHXHy6HWpmjPNY,2268
@@ -592,7 +592,7 @@ zenml/login/server_info.py,sha256=-_sK2L-curHdzUv1JDOwF6GoEeAXT5vFZN0J-5Ug4wU,16
592
592
  zenml/login/web_login.py,sha256=Kq_fA9UQEravB2DtAkMmNvDttk8xppnxV617tCYUl6U,9186
593
593
  zenml/materializers/__init__.py,sha256=maME5CxKcgOkIFwG_iARt1-tuW8u8ZhTzfw50uyv_BA,1667
594
594
  zenml/materializers/base_materializer.py,sha256=M4hwkw7PB0LskCE92r-S35011l7DlFemit-EuUCW3Nc,14002
595
- zenml/materializers/built_in_materializer.py,sha256=AFrCW_LErey2ws6vfLTbBP5gx3IFi05YPEmT4BA-CzY,15668
595
+ zenml/materializers/built_in_materializer.py,sha256=cRbuNNvYpvHXYOXysd26HSFo3GNtOlrpmo2cX84Gi-A,16150
596
596
  zenml/materializers/cloudpickle_materializer.py,sha256=x8a6jEMTky6N2YVHiwrnGWSfVJUpiy-4kQsD2Aqj_E0,4837
597
597
  zenml/materializers/materializer_registry.py,sha256=ic-aWhJ2Ex9F_rml2dDVAxhRfW3nd71QMxzfTPP6BIM,4002
598
598
  zenml/materializers/numpy_materializer.py,sha256=OLcHF9Z0tAqQ_U8TraA0vGmZjHoT7eT_XevncIutt0M,1715
@@ -692,7 +692,7 @@ zenml/pipelines/__init__.py,sha256=hpIX7hN8jsQRHT5R-xSXZL88qrHwkmrvGLQeu1rWt4o,8
692
692
  zenml/pipelines/build_utils.py,sha256=Jas5D8QnjXzizMtcCrJY4dcddeix7QFXbhoY25R47M4,26133
693
693
  zenml/pipelines/pipeline_context.py,sha256=V_p-F9W7cBIlTjS0iv5-uJYMzaOj8bAUkc_uNhQgBms,3579
694
694
  zenml/pipelines/pipeline_decorator.py,sha256=FIbflYOMavbuyGmqsx3F5zZgg0oXMTi1eAcGXciljOs,4293
695
- zenml/pipelines/pipeline_definition.py,sha256=nSnW6_swZy3aAp0FSInjzyqphYgnFq2_dRw_U4e_IV4,55924
695
+ zenml/pipelines/pipeline_definition.py,sha256=ByHnPiQWUdyy6UTMcKPXsbClTyFFO_geOGfOMTsRnt8,55924
696
696
  zenml/pipelines/run_utils.py,sha256=KFR2sAvBNiQfw7QFb6-lqwn-ssJWOuw51B3zi3wwCdA,11618
697
697
  zenml/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
698
698
  zenml/plugins/base_plugin_flavor.py,sha256=88IxFW91UB_rQ8xPlfRnIhIJh7A308NEq2epMMdlOng,2530
@@ -790,7 +790,7 @@ zenml/utils/typed_model.py,sha256=00EAo1I1VnOBHG4-ce8dPkyHRPpgi67SRIU-KdewRWs,47
790
790
  zenml/utils/typing_utils.py,sha256=jP7JKrlLsuMIStXhwKFNWykE6SMOR72tJIJ_qEbQSNc,6555
791
791
  zenml/utils/uuid_utils.py,sha256=aOGQ2SdREexcVQICPU2jUAgjvAJxTmh4ESdM52PEhck,2045
792
792
  zenml/utils/visualization_utils.py,sha256=bRhgho_c8oKSBGtT4ptWj0PsXsKTKs64L3qZty3sBTM,4702
793
- zenml/utils/yaml_utils.py,sha256=DsbvKcJ_HYXDnNT2uSF1oKsPgP9xGpZ6G-qTFg6nQn4,5759
793
+ zenml/utils/yaml_utils.py,sha256=747M_BTf3lcHFgJDF8RJxnnGIbCU8e9YxBBMmoQ5O_U,5834
794
794
  zenml/zen_server/__init__.py,sha256=WyltI9TzFW2mEHZVOs6alLWMCQrrZaFALtrQXs83STA,1355
795
795
  zenml/zen_server/auth.py,sha256=oP5dN9pyBDbwPlQyjGKZptmmzMAfsefLMz9_Av7qLAQ,39131
796
796
  zenml/zen_server/cache.py,sha256=Tc4TSugmsU1bhThxlYfE8rv0KmltIX1CcVHgzrJ0Eus,6633
@@ -1287,8 +1287,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=Bq1djrUP9saoD7vECjS7
1287
1287
  zenml/zen_stores/sql_zen_store.py,sha256=uE5Rk-Fh_vsAaO0UjDY4hKZp7745R_RbkDAW9C-b5gY,416468
1288
1288
  zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
1289
1289
  zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
1290
- zenml_nightly-0.72.0.dev20250120.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1291
- zenml_nightly-0.72.0.dev20250120.dist-info/METADATA,sha256=NYC6lQO_TCp5TtnBeecfi-i47WnKubUIH1bzFTR5uig,21355
1292
- zenml_nightly-0.72.0.dev20250120.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1293
- zenml_nightly-0.72.0.dev20250120.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1294
- zenml_nightly-0.72.0.dev20250120.dist-info/RECORD,,
1290
+ zenml_nightly-0.72.0.dev20250121.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
1291
+ zenml_nightly-0.72.0.dev20250121.dist-info/METADATA,sha256=brWIMEOeCfOB7g4Y5RyggwjwZ3c6sIxwJqwxvRIRzts,21355
1292
+ zenml_nightly-0.72.0.dev20250121.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
1293
+ zenml_nightly-0.72.0.dev20250121.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
1294
+ zenml_nightly-0.72.0.dev20250121.dist-info/RECORD,,