mlrun 1.10.0rc25__py3-none-any.whl → 1.10.0rc27__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.

Potentially problematic release.


This version of mlrun might be problematic. Click here for more details.

Files changed (44) hide show
  1. mlrun/artifacts/llm_prompt.py +8 -1
  2. mlrun/common/model_monitoring/helpers.py +86 -0
  3. mlrun/common/schemas/hub.py +11 -18
  4. mlrun/config.py +2 -3
  5. mlrun/datastore/__init__.py +2 -2
  6. mlrun/datastore/datastore_profile.py +27 -3
  7. mlrun/datastore/model_provider/huggingface_provider.py +5 -1
  8. mlrun/datastore/model_provider/model_provider.py +1 -1
  9. mlrun/datastore/s3.py +24 -2
  10. mlrun/datastore/storeytargets.py +2 -3
  11. mlrun/db/base.py +14 -0
  12. mlrun/db/httpdb.py +11 -2
  13. mlrun/db/nopdb.py +13 -0
  14. mlrun/k8s_utils.py +0 -14
  15. mlrun/model_monitoring/applications/base.py +20 -3
  16. mlrun/model_monitoring/controller.py +5 -3
  17. mlrun/model_monitoring/db/tsdb/tdengine/tdengine_connector.py +3 -1
  18. mlrun/model_monitoring/db/tsdb/v3io/stream_graph_steps.py +17 -4
  19. mlrun/model_monitoring/db/tsdb/v3io/v3io_connector.py +3 -0
  20. mlrun/model_monitoring/helpers.py +5 -5
  21. mlrun/projects/pipelines.py +2 -2
  22. mlrun/projects/project.py +5 -5
  23. mlrun/run.py +12 -1
  24. mlrun/runtimes/base.py +0 -3
  25. mlrun/runtimes/mounts.py +15 -2
  26. mlrun/runtimes/nuclio/function.py +35 -26
  27. mlrun/runtimes/pod.py +153 -11
  28. mlrun/serving/routers.py +23 -41
  29. mlrun/serving/server.py +1 -0
  30. mlrun/serving/states.py +3 -3
  31. mlrun/serving/system_steps.py +52 -29
  32. mlrun/serving/v2_serving.py +9 -10
  33. mlrun/utils/helpers.py +10 -13
  34. mlrun/utils/notifications/notification/base.py +18 -0
  35. mlrun/utils/notifications/notification/git.py +2 -4
  36. mlrun/utils/notifications/notification/slack.py +2 -4
  37. mlrun/utils/notifications/notification/webhook.py +2 -5
  38. mlrun/utils/version/version.json +2 -2
  39. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/METADATA +22 -26
  40. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/RECORD +44 -44
  41. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/WHEEL +0 -0
  42. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/entry_points.txt +0 -0
  43. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/licenses/LICENSE +0 -0
  44. {mlrun-1.10.0rc25.dist-info → mlrun-1.10.0rc27.dist-info}/top_level.txt +0 -0
@@ -11,7 +11,6 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
-
15
14
  import random
16
15
  from copy import copy
17
16
  from datetime import timedelta
@@ -25,10 +24,27 @@ import mlrun.artifacts
25
24
  import mlrun.common.schemas.model_monitoring as mm_schemas
26
25
  import mlrun.feature_store
27
26
  import mlrun.serving
27
+ from mlrun.common.model_monitoring.helpers import (
28
+ get_model_endpoints_creation_task_status,
29
+ )
28
30
  from mlrun.common.schemas import MonitoringData
29
31
  from mlrun.utils import get_data_from_path, logger
30
32
 
31
33
 
34
+ class MatchingEndpointsState(mlrun.common.types.StrEnum):
35
+ all_matched = "all_matched"
36
+ not_all_matched = "not_all_matched"
37
+ no_check_needed = "no_check_needed"
38
+ not_yet_checked = "not_yet_matched"
39
+
40
+ @staticmethod
41
+ def success_states() -> list[str]:
42
+ return [
43
+ MatchingEndpointsState.all_matched,
44
+ MatchingEndpointsState.no_check_needed,
45
+ ]
46
+
47
+
32
48
  class MonitoringPreProcessor(storey.MapClass):
33
49
  """preprocess step, reconstructs the serving output event body to StreamProcessingEvent schema"""
34
50
 
@@ -317,6 +333,9 @@ class BackgroundTaskStatus(storey.MapClass):
317
333
 
318
334
  def __init__(self, **kwargs):
319
335
  super().__init__(**kwargs)
336
+ self.matching_endpoints = MatchingEndpointsState.not_yet_checked
337
+ self.graph_model_endpoint_uids: set = set()
338
+ self.listed_model_endpoint_uids: set = set()
320
339
  self.server: mlrun.serving.GraphServer = (
321
340
  getattr(self.context, "server", None) if self.context else None
322
341
  )
@@ -337,43 +356,47 @@ class BackgroundTaskStatus(storey.MapClass):
337
356
  )
338
357
  )
339
358
  ):
340
- background_task = mlrun.get_run_db().get_project_background_task(
341
- self.server.project, self.server.model_endpoint_creation_task_name
342
- )
343
- self._background_task_check_timestamp = mlrun.utils.now_date()
344
- self._log_background_task_state(background_task.status.state)
345
- self._background_task_state = background_task.status.state
359
+ (
360
+ self._background_task_state,
361
+ self._background_task_check_timestamp,
362
+ self.listed_model_endpoint_uids,
363
+ ) = get_model_endpoints_creation_task_status(self.server)
364
+ if (
365
+ self.listed_model_endpoint_uids
366
+ and self.matching_endpoints == MatchingEndpointsState.not_yet_checked
367
+ ):
368
+ if not self.graph_model_endpoint_uids:
369
+ self.graph_model_endpoint_uids = collect_model_endpoint_uids(
370
+ self.server
371
+ )
372
+
373
+ if self.graph_model_endpoint_uids.issubset(self.listed_model_endpoint_uids):
374
+ self.matching_endpoints = MatchingEndpointsState.all_matched
375
+ elif self.listed_model_endpoint_uids is None:
376
+ self.matching_endpoints = MatchingEndpointsState.no_check_needed
346
377
 
347
378
  if (
348
379
  self._background_task_state
349
380
  == mlrun.common.schemas.BackgroundTaskState.succeeded
381
+ and self.matching_endpoints in MatchingEndpointsState.success_states()
350
382
  ):
351
383
  return event
352
384
  else:
353
385
  return None
354
386
 
355
- def _log_background_task_state(
356
- self, background_task_state: mlrun.common.schemas.BackgroundTaskState
357
- ):
358
- logger.info(
359
- "Checking model endpoint creation task status",
360
- task_name=self.server.model_endpoint_creation_task_name,
361
- )
362
- if (
363
- background_task_state
364
- in mlrun.common.schemas.BackgroundTaskState.terminal_states()
365
- ):
366
- logger.info(
367
- f"Model endpoint creation task completed with state {background_task_state}"
368
- )
369
- else: # in progress
370
- logger.info(
371
- f"Model endpoint creation task is still in progress with the current state: "
372
- f"{background_task_state}. Events will not be monitored for the next "
373
- f"{mlrun.mlconf.model_endpoint_monitoring.model_endpoint_creation_check_period} seconds",
374
- name=self.name,
375
- background_task_check_timestamp=self._background_task_check_timestamp.isoformat(),
376
- )
387
+
388
+ def collect_model_endpoint_uids(server: mlrun.serving.GraphServer) -> set[str]:
389
+ """Collects all model endpoint UIDs from the server's graph steps."""
390
+ model_endpoint_uids = set()
391
+ for step in server.graph.steps.values():
392
+ if hasattr(step, "monitoring_data"):
393
+ for model in step.monitoring_data.keys():
394
+ uid = step.monitoring_data[model].get(
395
+ mlrun.common.schemas.MonitoringData.MODEL_ENDPOINT_UID
396
+ )
397
+ if uid:
398
+ model_endpoint_uids.add(uid)
399
+ return model_endpoint_uids
377
400
 
378
401
 
379
402
  class SamplingStep(storey.MapClass):
@@ -24,6 +24,9 @@ import mlrun.common.schemas.model_monitoring
24
24
  import mlrun.model_monitoring
25
25
  from mlrun.utils import logger, now_date
26
26
 
27
+ from ..common.model_monitoring.helpers import (
28
+ get_model_endpoints_creation_task_status,
29
+ )
27
30
  from .utils import StepToDict, _extract_input_data, _update_result_body
28
31
 
29
32
 
@@ -474,22 +477,18 @@ class V2ModelServer(StepToDict):
474
477
  ) or getattr(self.context, "server", None)
475
478
  if not self.context.is_mock or self.context.monitoring_mock:
476
479
  if server.model_endpoint_creation_task_name:
477
- background_task = mlrun.get_run_db().get_project_background_task(
478
- server.project, server.model_endpoint_creation_task_name
479
- )
480
- logger.debug(
481
- "Checking model endpoint creation task status",
482
- task_name=server.model_endpoint_creation_task_name,
480
+ background_task_state, _, _ = get_model_endpoints_creation_task_status(
481
+ server
483
482
  )
484
483
  if (
485
- background_task.status.state
484
+ background_task_state
486
485
  in mlrun.common.schemas.BackgroundTaskState.terminal_states()
487
486
  ):
488
487
  logger.debug(
489
- f"Model endpoint creation task completed with state {background_task.status.state}"
488
+ f"Model endpoint creation task completed with state {background_task_state}"
490
489
  )
491
490
  if (
492
- background_task.status.state
491
+ background_task_state
493
492
  == mlrun.common.schemas.BackgroundTaskState.succeeded
494
493
  ):
495
494
  self._model_logger = (
@@ -504,7 +503,7 @@ class V2ModelServer(StepToDict):
504
503
  else: # in progress
505
504
  logger.debug(
506
505
  f"Model endpoint creation task is still in progress with the current state: "
507
- f"{background_task.status.state}.",
506
+ f"{background_task_state}.",
508
507
  name=self.name,
509
508
  )
510
509
  else:
mlrun/utils/helpers.py CHANGED
@@ -15,7 +15,6 @@
15
15
  import asyncio
16
16
  import base64
17
17
  import enum
18
- import functools
19
18
  import gzip
20
19
  import hashlib
21
20
  import inspect
@@ -804,7 +803,7 @@ def remove_tag_from_artifact_uri(uri: str) -> Optional[str]:
804
803
 
805
804
  def extend_hub_uri_if_needed(uri) -> tuple[str, bool]:
806
805
  """
807
- Retrieve the full uri of the item's yaml in the hub.
806
+ Retrieve the full uri of the function's yaml in the hub.
808
807
 
809
808
  :param uri: structure: "hub://[<source>/]<item-name>[:<tag>]"
810
809
 
@@ -845,7 +844,10 @@ def extend_hub_uri_if_needed(uri) -> tuple[str, bool]:
845
844
  # hub function directory name are with underscores instead of hyphens
846
845
  name = name.replace("-", "_")
847
846
  function_suffix = f"{name}/{tag}/src/function.yaml"
848
- return indexed_source.source.get_full_uri(function_suffix), is_hub_uri
847
+ function_type = mlrun.common.schemas.hub.HubSourceType.functions
848
+ return indexed_source.source.get_full_uri(
849
+ function_suffix, function_type
850
+ ), is_hub_uri
849
851
 
850
852
 
851
853
  def gen_md_table(header, rows=None):
@@ -912,12 +914,10 @@ def enrich_image_url(
912
914
  )
913
915
  mlrun_version = config.images_tag or client_version or server_version
914
916
  tag = mlrun_version or ""
915
-
916
- # TODO: Remove condition when mlrun/mlrun-kfp image is also supported
917
- if "mlrun-kfp" not in image_url:
918
- tag += resolve_image_tag_suffix(
919
- mlrun_version=mlrun_version, python_version=client_python_version
920
- )
917
+ tag += resolve_image_tag_suffix(
918
+ mlrun_version=mlrun_version,
919
+ python_version=client_python_version,
920
+ )
921
921
 
922
922
  # it's an mlrun image if the repository is mlrun
923
923
  is_mlrun_image = image_url.startswith("mlrun/") or "/mlrun/" in image_url
@@ -1859,10 +1859,7 @@ async def run_in_threadpool(func, *args, **kwargs):
1859
1859
  Run a sync-function in the loop default thread pool executor pool and await its result.
1860
1860
  Note that this function is not suitable for CPU-bound tasks, as it will block the event loop.
1861
1861
  """
1862
- loop = asyncio.get_running_loop()
1863
- if kwargs:
1864
- func = functools.partial(func, **kwargs)
1865
- return await loop.run_in_executor(None, func, *args)
1862
+ return await asyncio.to_thread(func, *args, **kwargs)
1866
1863
 
1867
1864
 
1868
1865
  def is_explicit_ack_supported(context):
@@ -15,11 +15,29 @@
15
15
  import asyncio
16
16
  import typing
17
17
  from copy import deepcopy
18
+ from typing import Optional
19
+
20
+ import aiohttp
18
21
 
19
22
  import mlrun.common.schemas
20
23
  import mlrun.lists
21
24
 
22
25
 
26
+ class TimedHTTPClient:
27
+ def __init__(self, timeout: Optional[float] = 30.0):
28
+ """
29
+ HTTP client wrapper with built-in timeout.
30
+
31
+ Args:
32
+ timeout: Request timeout in seconds (default: 30.0)
33
+ """
34
+ self.timeout = aiohttp.ClientTimeout(total=timeout)
35
+
36
+ def session(self, **kwargs) -> aiohttp.ClientSession:
37
+ """Create a new ClientSession with the configured timeout and additional parameters."""
38
+ return aiohttp.ClientSession(timeout=self.timeout, **kwargs)
39
+
40
+
23
41
  class NotificationBase:
24
42
  def __init__(
25
43
  self,
@@ -16,13 +16,11 @@ import json
16
16
  import os
17
17
  import typing
18
18
 
19
- import aiohttp
20
-
21
19
  import mlrun.common.schemas
22
20
  import mlrun.errors
23
21
  import mlrun.lists
24
22
 
25
- from .base import NotificationBase
23
+ from .base import NotificationBase, TimedHTTPClient
26
24
 
27
25
 
28
26
  class GitNotification(NotificationBase):
@@ -148,7 +146,7 @@ class GitNotification(NotificationBase):
148
146
  }
149
147
  url = f"https://{server}/repos/{repo}/issues/{issue}/comments"
150
148
 
151
- async with aiohttp.ClientSession() as session:
149
+ async with TimedHTTPClient().session() as session:
152
150
  resp = await session.post(url, headers=headers, json={"body": message})
153
151
  if not resp.ok:
154
152
  resp_text = await resp.text()
@@ -14,14 +14,12 @@
14
14
 
15
15
  import typing
16
16
 
17
- import aiohttp
18
-
19
17
  import mlrun.common.runtimes.constants as runtimes_constants
20
18
  import mlrun.common.schemas
21
19
  import mlrun.lists
22
20
  import mlrun.utils.helpers
23
21
 
24
- from .base import NotificationBase
22
+ from .base import NotificationBase, TimedHTTPClient
25
23
 
26
24
 
27
25
  class SlackNotification(NotificationBase):
@@ -67,7 +65,7 @@ class SlackNotification(NotificationBase):
67
65
 
68
66
  data = self._generate_slack_data(message, severity, runs, alert, event_data)
69
67
 
70
- async with aiohttp.ClientSession() as session:
68
+ async with TimedHTTPClient().session() as session:
71
69
  async with session.post(webhook, json=data) as response:
72
70
  response.raise_for_status()
73
71
 
@@ -15,14 +15,13 @@
15
15
  import re
16
16
  import typing
17
17
 
18
- import aiohttp
19
18
  import orjson
20
19
 
21
20
  import mlrun.common.schemas
22
21
  import mlrun.lists
23
22
  import mlrun.utils.helpers
24
23
 
25
- from .base import NotificationBase
24
+ from .base import NotificationBase, TimedHTTPClient
26
25
 
27
26
 
28
27
  class WebhookNotification(NotificationBase):
@@ -87,9 +86,7 @@ class WebhookNotification(NotificationBase):
87
86
  # we automatically handle it as `ssl=None` for their convenience.
88
87
  verify_ssl = verify_ssl and None if url.startswith("https") else None
89
88
 
90
- async with aiohttp.ClientSession(
91
- json_serialize=self._encoder,
92
- ) as session:
89
+ async with TimedHTTPClient().session(json_serialize=self._encoder) as session:
93
90
  response = await getattr(session, method)(
94
91
  url,
95
92
  headers=headers,
@@ -1,4 +1,4 @@
1
1
  {
2
- "git_commit": "93eae062e788304f5adff8f128f49db8f1f346af",
3
- "version": "1.10.0-rc25"
2
+ "git_commit": "8b5d7492c858f675bcf8fce28d536c9af13a8d86",
3
+ "version": "1.10.0-rc27"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mlrun
3
- Version: 1.10.0rc25
3
+ Version: 1.10.0rc27
4
4
  Summary: Tracking and config of machine learning runs
5
5
  Home-page: https://github.com/mlrun/mlrun
6
6
  Author: Yaron Haviv
@@ -21,8 +21,8 @@ Classifier: Topic :: Software Development :: Libraries
21
21
  Requires-Python: >=3.9, <3.12
22
22
  Description-Content-Type: text/markdown
23
23
  License-File: LICENSE
24
- Requires-Dist: urllib3>=1.26.20; python_version < "3.11"
25
- Requires-Dist: urllib3>=2.5.0; python_version >= "3.11"
24
+ Requires-Dist: urllib3>=1.26.20
25
+ Requires-Dist: v3io-frames>=0.10.15
26
26
  Requires-Dist: GitPython>=3.1.41,~=3.1
27
27
  Requires-Dist: aiohttp~=3.11
28
28
  Requires-Dist: aiohttp-retry~=2.9
@@ -39,13 +39,11 @@ Requires-Dist: tabulate~=0.8.6
39
39
  Requires-Dist: v3io~=0.7.0
40
40
  Requires-Dist: pydantic>=1.10.15
41
41
  Requires-Dist: mergedeep~=1.3
42
- Requires-Dist: v3io-frames~=0.10.15; python_version < "3.11"
43
- Requires-Dist: v3io-frames>=0.13.0; python_version >= "3.11"
44
42
  Requires-Dist: semver~=3.0
45
43
  Requires-Dist: dependency-injector~=4.41
46
44
  Requires-Dist: fsspec<=2025.7.0,>=2025.5.1
47
45
  Requires-Dist: v3iofs~=0.1.17
48
- Requires-Dist: storey~=1.10.11
46
+ Requires-Dist: storey~=1.10.13
49
47
  Requires-Dist: inflection~=0.5.0
50
48
  Requires-Dist: python-dotenv~=1.0
51
49
  Requires-Dist: setuptools>=75.2
@@ -56,7 +54,7 @@ Requires-Dist: mlrun-pipelines-kfp-common~=0.5.8
56
54
  Requires-Dist: mlrun-pipelines-kfp-v1-8~=0.5.7
57
55
  Requires-Dist: docstring_parser~=0.16
58
56
  Requires-Dist: aiosmtplib~=3.0
59
- Requires-Dist: deepdiff~=7.0
57
+ Requires-Dist: deepdiff<9.0.0,>=8.6.1
60
58
  Provides-Extra: s3
61
59
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "s3"
62
60
  Requires-Dist: aiobotocore<2.16,>=2.5.0; extra == "s3"
@@ -92,10 +90,10 @@ Requires-Dist: databricks-sdk~=0.20.0; extra == "databricks-sdk"
92
90
  Provides-Extra: sqlalchemy
93
91
  Requires-Dist: sqlalchemy~=2.0; extra == "sqlalchemy"
94
92
  Provides-Extra: dask
95
- Requires-Dist: dask~=2024.12.1; python_version >= "3.11" and extra == "dask"
96
- Requires-Dist: distributed~=2024.12.1; python_version >= "3.11" and extra == "dask"
97
- Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "dask"
98
- Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "dask"
93
+ Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "dask"
94
+ Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "dask"
95
+ Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "dask"
96
+ Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "dask"
99
97
  Provides-Extra: alibaba-oss
100
98
  Requires-Dist: ossfs==2025.5.0; extra == "alibaba-oss"
101
99
  Requires-Dist: oss2==2.18.4; extra == "alibaba-oss"
@@ -106,7 +104,7 @@ Requires-Dist: snowflake-connector-python~=3.7; extra == "snowflake"
106
104
  Provides-Extra: dev-postgres
107
105
  Requires-Dist: pytest-mock-resources[postgres]~=2.12; extra == "dev-postgres"
108
106
  Provides-Extra: kfp18
109
- Requires-Dist: mlrun_pipelines_kfp_v1_8[kfp]>=0.5.0; python_version < "3.11" and extra == "kfp18"
107
+ Requires-Dist: mlrun_pipelines_kfp_v1_8[kfp]>=0.5.7; extra == "kfp18"
110
108
  Provides-Extra: api
111
109
  Requires-Dist: uvicorn~=0.32.1; extra == "api"
112
110
  Requires-Dist: dask-kubernetes~=0.11.0; extra == "api"
@@ -125,7 +123,6 @@ Requires-Dist: memray~=1.12; sys_platform != "win32" and extra == "api"
125
123
  Requires-Dist: aiosmtplib~=3.0; extra == "api"
126
124
  Requires-Dist: pydantic<2,>=1; extra == "api"
127
125
  Requires-Dist: mlrun-pipelines-kfp-v1-8~=0.5.7; extra == "api"
128
- Requires-Dist: grpcio~=1.70.0; extra == "api"
129
126
  Provides-Extra: all
130
127
  Requires-Dist: adlfs==2024.12.0; extra == "all"
131
128
  Requires-Dist: aiobotocore<2.16,>=2.5.0; extra == "all"
@@ -134,11 +131,11 @@ Requires-Dist: azure-core~=1.24; extra == "all"
134
131
  Requires-Dist: azure-identity~=1.5; extra == "all"
135
132
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "all"
136
133
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "all"
137
- Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "all"
138
- Requires-Dist: dask~=2024.12.1; python_version >= "3.11" and extra == "all"
134
+ Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "all"
135
+ Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "all"
139
136
  Requires-Dist: databricks-sdk~=0.20.0; extra == "all"
140
- Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "all"
141
- Requires-Dist: distributed~=2024.12.1; python_version >= "3.11" and extra == "all"
137
+ Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "all"
138
+ Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "all"
142
139
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "all"
143
140
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "all"
144
141
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas]==3.14.1; extra == "all"
@@ -165,11 +162,11 @@ Requires-Dist: azure-core~=1.24; extra == "complete"
165
162
  Requires-Dist: azure-identity~=1.5; extra == "complete"
166
163
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "complete"
167
164
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "complete"
168
- Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "complete"
169
- Requires-Dist: dask~=2024.12.1; python_version >= "3.11" and extra == "complete"
165
+ Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "complete"
166
+ Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "complete"
170
167
  Requires-Dist: databricks-sdk~=0.20.0; extra == "complete"
171
- Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "complete"
172
- Requires-Dist: distributed~=2024.12.1; python_version >= "3.11" and extra == "complete"
168
+ Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "complete"
169
+ Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "complete"
173
170
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "complete"
174
171
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "complete"
175
172
  Requires-Dist: google-cloud-bigquery[bqstorage,pandas]==3.14.1; extra == "complete"
@@ -200,11 +197,11 @@ Requires-Dist: azure-identity~=1.5; extra == "complete-api"
200
197
  Requires-Dist: azure-keyvault-secrets~=4.2; extra == "complete-api"
201
198
  Requires-Dist: boto3<1.36,>=1.28.0; extra == "complete-api"
202
199
  Requires-Dist: dask-kubernetes~=0.11.0; extra == "complete-api"
203
- Requires-Dist: dask~=2023.12.1; python_version < "3.11" and extra == "complete-api"
204
- Requires-Dist: dask~=2024.12.1; python_version >= "3.11" and extra == "complete-api"
200
+ Requires-Dist: dask>=2023.12.1; python_version < "3.11" and extra == "complete-api"
201
+ Requires-Dist: dask>=2024.8; python_version >= "3.11" and extra == "complete-api"
205
202
  Requires-Dist: databricks-sdk~=0.20.0; extra == "complete-api"
206
- Requires-Dist: distributed~=2023.12.1; python_version < "3.11" and extra == "complete-api"
207
- Requires-Dist: distributed~=2024.12.1; python_version >= "3.11" and extra == "complete-api"
203
+ Requires-Dist: distributed>=2023.12.1; python_version < "3.11" and extra == "complete-api"
204
+ Requires-Dist: distributed>=2024.8; python_version >= "3.11" and extra == "complete-api"
208
205
  Requires-Dist: fastapi~=0.116.0; extra == "complete-api"
209
206
  Requires-Dist: gcsfs<=2025.7.0,>=2025.5.1; extra == "complete-api"
210
207
  Requires-Dist: google-cloud-bigquery-storage~=2.17; extra == "complete-api"
@@ -212,7 +209,6 @@ Requires-Dist: google-cloud-bigquery[bqstorage,pandas]==3.14.1; extra == "comple
212
209
  Requires-Dist: google-cloud-storage==2.14.0; extra == "complete-api"
213
210
  Requires-Dist: google-cloud==0.34; extra == "complete-api"
214
211
  Requires-Dist: graphviz~=0.20.0; extra == "complete-api"
215
- Requires-Dist: grpcio~=1.70.0; extra == "complete-api"
216
212
  Requires-Dist: humanfriendly~=10.0; extra == "complete-api"
217
213
  Requires-Dist: igz-mgmt~=0.4.1; extra == "complete-api"
218
214
  Requires-Dist: kafka-python~=2.1.0; extra == "complete-api"