skypilot-nightly 1.0.0.dev20250909__py3-none-any.whl → 1.0.0.dev20250910__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 skypilot-nightly might be problematic. Click here for more details.

Files changed (67) hide show
  1. sky/__init__.py +2 -2
  2. sky/authentication.py +19 -4
  3. sky/backends/backend_utils.py +35 -1
  4. sky/backends/cloud_vm_ray_backend.py +2 -2
  5. sky/client/sdk.py +20 -0
  6. sky/client/sdk_async.py +18 -16
  7. sky/clouds/aws.py +3 -1
  8. sky/dashboard/out/404.html +1 -1
  9. sky/dashboard/out/_next/static/chunks/{webpack-d4fabc08788e14af.js → webpack-1d7e11230da3ca89.js} +1 -1
  10. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  11. sky/dashboard/out/clusters/[cluster].html +1 -1
  12. sky/dashboard/out/clusters.html +1 -1
  13. sky/dashboard/out/config.html +1 -1
  14. sky/dashboard/out/index.html +1 -1
  15. sky/dashboard/out/infra/[context].html +1 -1
  16. sky/dashboard/out/infra.html +1 -1
  17. sky/dashboard/out/jobs/[job].html +1 -1
  18. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  19. sky/dashboard/out/jobs.html +1 -1
  20. sky/dashboard/out/users.html +1 -1
  21. sky/dashboard/out/volumes.html +1 -1
  22. sky/dashboard/out/workspace/new.html +1 -1
  23. sky/dashboard/out/workspaces/[name].html +1 -1
  24. sky/dashboard/out/workspaces.html +1 -1
  25. sky/data/storage.py +5 -1
  26. sky/execution.py +21 -14
  27. sky/jobs/constants.py +3 -0
  28. sky/jobs/controller.py +732 -310
  29. sky/jobs/recovery_strategy.py +251 -129
  30. sky/jobs/scheduler.py +247 -174
  31. sky/jobs/server/core.py +20 -4
  32. sky/jobs/server/utils.py +2 -2
  33. sky/jobs/state.py +702 -511
  34. sky/jobs/utils.py +94 -39
  35. sky/provision/aws/config.py +4 -1
  36. sky/provision/gcp/config.py +6 -1
  37. sky/provision/kubernetes/utils.py +17 -8
  38. sky/provision/provisioner.py +1 -0
  39. sky/serve/replica_managers.py +0 -7
  40. sky/serve/serve_utils.py +5 -0
  41. sky/serve/server/impl.py +1 -2
  42. sky/serve/service.py +0 -2
  43. sky/server/common.py +8 -3
  44. sky/server/config.py +43 -24
  45. sky/server/constants.py +1 -0
  46. sky/server/daemons.py +7 -11
  47. sky/server/requests/serializers/encoders.py +1 -1
  48. sky/server/server.py +8 -1
  49. sky/setup_files/dependencies.py +4 -2
  50. sky/skylet/attempt_skylet.py +1 -0
  51. sky/skylet/constants.py +3 -1
  52. sky/skylet/events.py +2 -10
  53. sky/utils/command_runner.pyi +3 -3
  54. sky/utils/common_utils.py +11 -1
  55. sky/utils/controller_utils.py +5 -0
  56. sky/utils/db/db_utils.py +31 -2
  57. sky/utils/rich_utils.py +3 -1
  58. sky/utils/subprocess_utils.py +9 -0
  59. sky/volumes/volume.py +2 -0
  60. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/METADATA +39 -37
  61. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/RECORD +67 -67
  62. /sky/dashboard/out/_next/static/{eWytLgin5zvayQw3Xk46m → 3SYxqNGnvvPS8h3gdD2T7}/_buildManifest.js +0 -0
  63. /sky/dashboard/out/_next/static/{eWytLgin5zvayQw3Xk46m → 3SYxqNGnvvPS8h3gdD2T7}/_ssgManifest.js +0 -0
  64. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/WHEEL +0 -0
  65. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/entry_points.txt +0 -0
  66. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/licenses/LICENSE +0 -0
  67. {skypilot_nightly-1.0.0.dev20250909.dist-info → skypilot_nightly-1.0.0.dev20250910.dist-info}/top_level.txt +0 -0
sky/server/daemons.py CHANGED
@@ -11,6 +11,7 @@ from sky.utils import annotations
11
11
  from sky.utils import common
12
12
  from sky.utils import common_utils
13
13
  from sky.utils import env_options
14
+ from sky.utils import subprocess_utils
14
15
  from sky.utils import timeline
15
16
  from sky.utils import ux_utils
16
17
 
@@ -74,6 +75,10 @@ class InternalRequestDaemon:
74
75
  # using too much memory.
75
76
  annotations.clear_request_level_cache()
76
77
  timeline.save_timeline()
78
+ # Kill all children processes related to this request.
79
+ # Each executor handles a single request, so we can safely
80
+ # kill all children processes related to this request.
81
+ subprocess_utils.kill_children_processes()
77
82
  common_utils.release_memory()
78
83
  except Exception: # pylint: disable=broad-except
79
84
  # It is OK to fail to run the event, as the event is not
@@ -123,21 +128,16 @@ def managed_job_status_refresh_event():
123
128
  """Refresh the managed job status for controller consolidation mode."""
124
129
  # pylint: disable=import-outside-toplevel
125
130
  from sky.jobs import utils as managed_job_utils
126
- from sky.utils import controller_utils
127
131
 
128
132
  # We run the recovery logic before starting the event loop as those two are
129
133
  # conflicting. Check PERSISTENT_RUN_RESTARTING_SIGNAL_FILE for details.
130
- if controller_utils.high_availability_specified(
131
- controller_utils.Controllers.JOBS_CONTROLLER.value.cluster_name):
132
- managed_job_utils.ha_recovery_for_consolidation_mode()
134
+ managed_job_utils.ha_recovery_for_consolidation_mode()
133
135
 
134
136
  # After recovery, we start the event loop.
135
137
  from sky.skylet import events
136
138
  refresh_event = events.ManagedJobEvent()
137
- scheduling_event = events.ManagedJobSchedulingEvent()
138
139
  logger.info('=== Running managed job event ===')
139
140
  refresh_event.run()
140
- scheduling_event.run()
141
141
  time.sleep(events.EVENT_CHECKING_INTERVAL_SECONDS)
142
142
 
143
143
 
@@ -152,14 +152,10 @@ def _serve_status_refresh_event(pool: bool):
152
152
  """Refresh the sky serve status for controller consolidation mode."""
153
153
  # pylint: disable=import-outside-toplevel
154
154
  from sky.serve import serve_utils
155
- from sky.utils import controller_utils
156
155
 
157
156
  # We run the recovery logic before starting the event loop as those two are
158
157
  # conflicting. Check PERSISTENT_RUN_RESTARTING_SIGNAL_FILE for details.
159
- controller = controller_utils.get_controller_for_pool(pool)
160
- if controller_utils.high_availability_specified(
161
- controller.value.cluster_name):
162
- serve_utils.ha_recovery_for_consolidation_mode(pool=pool)
158
+ serve_utils.ha_recovery_for_consolidation_mode(pool=pool)
163
159
 
164
160
  # After recovery, we start the event loop.
165
161
  from sky.skylet import events
@@ -131,7 +131,7 @@ def encode_jobs_queue(jobs: List[dict],) -> List[Dict[str, Any]]:
131
131
  def encode_jobs_queue_v2(
132
132
  jobs_or_tuple) -> Union[List[Dict[str, Any]], Dict[str, Any]]:
133
133
  # Support returning either a plain jobs list or a (jobs, total) tuple
134
- status_counts = {}
134
+ status_counts: Dict[str, int] = {}
135
135
  if isinstance(jobs_or_tuple, tuple):
136
136
  if len(jobs_or_tuple) == 2:
137
137
  jobs, total = jobs_or_tuple
sky/server/server.py CHANGED
@@ -625,6 +625,9 @@ app.include_router(volumes_rest.router, prefix='/volumes', tags=['volumes'])
625
625
  app.include_router(ssh_node_pools_rest.router,
626
626
  prefix='/ssh_node_pools',
627
627
  tags=['ssh_node_pools'])
628
+ # increase the resource limit for the server
629
+ soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
630
+ resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard))
628
631
 
629
632
  # Increase the limit of files we can open to our hard limit. This fixes bugs
630
633
  # where we can not aquire file locks or open enough logs and the API server
@@ -1826,7 +1829,7 @@ async def all_contexts(request: fastapi.Request) -> None:
1826
1829
  async def gpu_metrics() -> fastapi.Response:
1827
1830
  """Gets the GPU metrics from multiple external k8s clusters"""
1828
1831
  contexts = core.get_all_contexts()
1829
- all_metrics = []
1832
+ all_metrics: List[str] = []
1830
1833
  successful_contexts = 0
1831
1834
 
1832
1835
  tasks = [
@@ -1841,6 +1844,10 @@ async def gpu_metrics() -> fastapi.Response:
1841
1844
  if isinstance(result, Exception):
1842
1845
  logger.error(
1843
1846
  f'Failed to get metrics for context {contexts[i]}: {result}')
1847
+ elif isinstance(result, BaseException):
1848
+ # Avoid changing behavior for non-Exception BaseExceptions
1849
+ # like KeyboardInterrupt/SystemExit: re-raise them.
1850
+ raise result
1844
1851
  else:
1845
1852
  metrics_text = result
1846
1853
  all_metrics.append(metrics_text)
@@ -63,6 +63,8 @@ install_requires = [
63
63
  'setproctitle',
64
64
  'sqlalchemy',
65
65
  'psycopg2-binary',
66
+ 'aiosqlite',
67
+ 'asyncpg',
66
68
  # TODO(hailong): These three dependencies should be removed after we make
67
69
  # the client-side actually not importing them.
68
70
  'casbin',
@@ -108,9 +110,9 @@ server_dependencies = [
108
110
  local_ray = [
109
111
  # Lower version of ray will cause dependency conflict for
110
112
  # click/grpcio/protobuf.
111
- # Excluded 2.6.0 as it has a bug in the cluster launcher:
113
+ # Ray 2.6.1+ resolved cluster launcher bugs and grpcio issues on Apple Silicon.
112
114
  # https://github.com/ray-project/ray/releases/tag/ray-2.6.1
113
- 'ray[default] >= 2.2.0, != 2.6.0',
115
+ 'ray[default] >= 2.6.1',
114
116
  ]
115
117
 
116
118
  remote = [
@@ -12,6 +12,7 @@ def restart_skylet():
12
12
  # Kills old skylet if it is running.
13
13
  # TODO(zhwu): make the killing graceful, e.g., use a signal to tell
14
14
  # skylet to exit, instead of directly killing it.
15
+
15
16
  subprocess.run(
16
17
  # We use -m to grep instead of {constants.SKY_PYTHON_CMD} -m to grep
17
18
  # because need to handle the backward compatibility of the old skylet
sky/skylet/constants.py CHANGED
@@ -91,7 +91,7 @@ TASK_ID_LIST_ENV_VAR = f'{SKYPILOT_ENV_VAR_PREFIX}TASK_IDS'
91
91
  # cluster yaml is updated.
92
92
  #
93
93
  # TODO(zongheng,zhanghao): make the upgrading of skylet automatic?
94
- SKYLET_VERSION = '17'
94
+ SKYLET_VERSION = '18'
95
95
  # The version of the lib files that skylet/jobs use. Whenever there is an API
96
96
  # change for the job_lib or log_lib, we need to bump this version, so that the
97
97
  # user can be notified to update their SkyPilot version on the remote cluster.
@@ -374,6 +374,7 @@ OVERRIDEABLE_CONFIG_KEYS_IN_TASK: List[Tuple[str, ...]] = [
374
374
  ('ssh', 'pod_config'),
375
375
  ('kubernetes', 'custom_metadata'),
376
376
  ('kubernetes', 'pod_config'),
377
+ ('kubernetes', 'context_configs'),
377
378
  ('kubernetes', 'provision_timeout'),
378
379
  ('kubernetes', 'dws'),
379
380
  ('kubernetes', 'kueue'),
@@ -421,6 +422,7 @@ SKY_USER_FILE_PATH = '~/.sky/generated'
421
422
  # TODO(cooperc): Update all env vars to begin with SKYPILOT_ or SKYPILOT_SERVER_
422
423
  # Environment variable that is set to 'true' if this is a skypilot server.
423
424
  ENV_VAR_IS_SKYPILOT_SERVER = 'IS_SKYPILOT_SERVER'
425
+ OVERRIDE_CONSOLIDATION_MODE = 'IS_SKYPILOT_JOB_CONTROLLER'
424
426
 
425
427
  # Environment variable that is set to 'true' if metrics are enabled.
426
428
  ENV_VAR_SERVER_METRICS_ENABLED = 'SKY_API_SERVER_METRICS_ENABLED'
sky/skylet/events.py CHANGED
@@ -11,7 +11,7 @@ import psutil
11
11
  from sky import clouds
12
12
  from sky import sky_logging
13
13
  from sky.backends import cloud_vm_ray_backend
14
- from sky.jobs import scheduler as managed_job_scheduler
14
+ from sky.jobs import scheduler
15
15
  from sky.jobs import state as managed_job_state
16
16
  from sky.jobs import utils as managed_job_utils
17
17
  from sky.serve import serve_utils
@@ -76,15 +76,7 @@ class ManagedJobEvent(SkyletEvent):
76
76
  def _run(self):
77
77
  logger.info('=== Updating managed job status ===')
78
78
  managed_job_utils.update_managed_jobs_statuses()
79
-
80
-
81
- class ManagedJobSchedulingEvent(SkyletEvent):
82
- """Skylet event for scheduling managed jobs."""
83
- EVENT_INTERVAL_SECONDS = 20
84
-
85
- def _run(self):
86
- logger.info('=== Scheduling next jobs ===')
87
- managed_job_scheduler.maybe_schedule_next_jobs()
79
+ scheduler.maybe_start_controllers()
88
80
 
89
81
 
90
82
  class ServiceUpdateEvent(SkyletEvent):
@@ -36,9 +36,9 @@ def ssh_options_list(
36
36
 
37
37
 
38
38
  class SshMode(enum.Enum):
39
- NON_INTERACTIVE: int
40
- INTERACTIVE: int
41
- LOGIN: int
39
+ NON_INTERACTIVE = ...
40
+ INTERACTIVE = ...
41
+ LOGIN = ...
42
42
 
43
43
 
44
44
  class CommandRunner:
sky/utils/common_utils.py CHANGED
@@ -996,7 +996,17 @@ def get_mem_size_gb() -> float:
996
996
  except ValueError as e:
997
997
  with ux_utils.print_exception_no_traceback():
998
998
  raise ValueError(
999
- f'Failed to parse the memory size from {mem_size}') from e
999
+ f'Failed to parse the memory size from {mem_size} (GB)'
1000
+ ) from e
1001
+ mem_size = os.getenv('SKYPILOT_POD_MEMORY_BYTES_LIMIT')
1002
+ if mem_size is not None:
1003
+ try:
1004
+ return float(mem_size) / (1024**3)
1005
+ except ValueError as e:
1006
+ with ux_utils.print_exception_no_traceback():
1007
+ raise ValueError(
1008
+ f'Failed to parse the memory size from {mem_size} (bytes)'
1009
+ ) from e
1000
1010
  return _mem_size_gb()
1001
1011
 
1002
1012
 
@@ -228,6 +228,11 @@ def get_controller_for_pool(pool: bool) -> Controllers:
228
228
  def high_availability_specified(cluster_name: Optional[str]) -> bool:
229
229
  """Check if the controller high availability is specified in user config.
230
230
  """
231
+ # pylint: disable=import-outside-toplevel
232
+ from sky.jobs import utils as managed_job_utils
233
+ if managed_job_utils.is_consolidation_mode():
234
+ return True
235
+
231
236
  controller = Controllers.from_name(cluster_name)
232
237
  if controller is None:
233
238
  return False
sky/utils/db/db_utils.py CHANGED
@@ -7,12 +7,13 @@ import pathlib
7
7
  import sqlite3
8
8
  import threading
9
9
  import typing
10
- from typing import Any, Callable, Dict, Iterable, Optional
10
+ from typing import Any, Callable, Dict, Iterable, Literal, Optional, Union
11
11
 
12
12
  import aiosqlite
13
13
  import aiosqlite.context
14
14
  import sqlalchemy
15
15
  from sqlalchemy import exc as sqlalchemy_exc
16
+ from sqlalchemy.ext import asyncio as sqlalchemy_async
16
17
 
17
18
  from sky import sky_logging
18
19
  from sky.skylet import constants
@@ -375,11 +376,34 @@ def get_max_connections():
375
376
  return _max_connections
376
377
 
377
378
 
378
- def get_engine(db_name: str):
379
+ @typing.overload
380
+ def get_engine(
381
+ db_name: str,
382
+ async_engine: Literal[False] = False) -> sqlalchemy.engine.Engine:
383
+ ...
384
+
385
+
386
+ @typing.overload
387
+ def get_engine(db_name: str,
388
+ async_engine: Literal[True]) -> sqlalchemy_async.AsyncEngine:
389
+ ...
390
+
391
+
392
+ def get_engine(
393
+ db_name: str,
394
+ async_engine: bool = False
395
+ ) -> Union[sqlalchemy.engine.Engine, sqlalchemy_async.AsyncEngine]:
379
396
  conn_string = None
380
397
  if os.environ.get(constants.ENV_VAR_IS_SKYPILOT_SERVER) is not None:
381
398
  conn_string = os.environ.get(constants.ENV_VAR_DB_CONNECTION_URI)
382
399
  if conn_string:
400
+ if async_engine:
401
+ conn_string = conn_string.replace('postgresql://',
402
+ 'postgresql+asyncpg://')
403
+ # This is an AsyncEngine, instead of a (normal, synchronous) Engine,
404
+ # so we should not put it in the cache. Instead, just return.
405
+ return sqlalchemy_async.create_async_engine(
406
+ conn_string, poolclass=sqlalchemy.NullPool)
383
407
  with _db_creation_lock:
384
408
  if conn_string not in _postgres_engine_cache:
385
409
  if _max_connections == 0:
@@ -401,6 +425,11 @@ def get_engine(db_name: str):
401
425
  else:
402
426
  db_path = os.path.expanduser(f'~/.sky/{db_name}.db')
403
427
  pathlib.Path(db_path).parents[0].mkdir(parents=True, exist_ok=True)
428
+ if async_engine:
429
+ # This is an AsyncEngine, instead of a (normal, synchronous) Engine,
430
+ # so we should not put it in the cache. Instead, just return.
431
+ return sqlalchemy_async.create_async_engine(
432
+ 'sqlite+aiosqlite:///' + db_path, connect_args={'timeout': 30})
404
433
  if db_path not in _sqlite_engine_cache:
405
434
  _sqlite_engine_cache[db_path] = sqlalchemy.create_engine(
406
435
  'sqlite:///' + db_path)
sky/utils/rich_utils.py CHANGED
@@ -421,7 +421,7 @@ async def decode_rich_status_async(
421
421
  undecoded_buffer = b''
422
422
 
423
423
  # Iterate over the response content in chunks
424
- async for chunk in response.content.iter_chunked(8192):
424
+ async for chunk, _ in response.content.iter_chunks():
425
425
  if chunk is None:
426
426
  return
427
427
 
@@ -481,6 +481,8 @@ async def decode_rich_status_async(
481
481
  line = line[:-2] + '\n'
482
482
  is_payload, line = message_utils.decode_payload(
483
483
  line, raise_for_mismatch=False)
484
+ if line is None:
485
+ continue
484
486
  control = None
485
487
  if is_payload:
486
488
  control, encoded_status = Control.decode(line)
@@ -437,3 +437,12 @@ def slow_start_processes(processes: List[Startable],
437
437
  break
438
438
  batch_size = min(batch_size * 2, max_batch_size)
439
439
  time.sleep(delay)
440
+
441
+
442
+ def is_process_alive(pid: int) -> bool:
443
+ """Check if a process is alive."""
444
+ try:
445
+ process = psutil.Process(pid)
446
+ return process.is_running()
447
+ except psutil.NoSuchProcess:
448
+ return False
sky/volumes/volume.py CHANGED
@@ -150,6 +150,8 @@ class Volume:
150
150
  self.region, self.zone = cloud_obj.validate_region_zone(
151
151
  self.region, self.zone)
152
152
 
153
+ # Name must be set by factory before validation.
154
+ assert self.name is not None
153
155
  valid, err_msg = cloud_obj.is_volume_name_valid(self.name)
154
156
  if not valid:
155
157
  raise ValueError(f'Invalid volume name: {err_msg}')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250909
3
+ Version: 1.0.0.dev20250910
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -53,6 +53,8 @@ Requires-Dist: httpx
53
53
  Requires-Dist: setproctitle
54
54
  Requires-Dist: sqlalchemy
55
55
  Requires-Dist: psycopg2-binary
56
+ Requires-Dist: aiosqlite
57
+ Requires-Dist: asyncpg
56
58
  Requires-Dist: casbin
57
59
  Requires-Dist: sqlalchemy_adapter
58
60
  Requires-Dist: prometheus_client>=0.8.0
@@ -88,10 +90,10 @@ Requires-Dist: ibm-cloud-sdk-core; extra == "ibm"
88
90
  Requires-Dist: ibm-vpc; extra == "ibm"
89
91
  Requires-Dist: ibm-platform-services>=0.48.0; extra == "ibm"
90
92
  Requires-Dist: ibm-cos-sdk; extra == "ibm"
91
- Requires-Dist: ray[default]!=2.6.0,>=2.2.0; extra == "ibm"
93
+ Requires-Dist: ray[default]>=2.6.1; extra == "ibm"
92
94
  Provides-Extra: docker
93
95
  Requires-Dist: docker; extra == "docker"
94
- Requires-Dist: ray[default]!=2.6.0,>=2.2.0; extra == "docker"
96
+ Requires-Dist: ray[default]>=2.6.1; extra == "docker"
95
97
  Provides-Extra: lambda
96
98
  Provides-Extra: cloudflare
97
99
  Requires-Dist: awscli>=1.27.10; extra == "cloudflare"
@@ -99,7 +101,7 @@ Requires-Dist: botocore>=1.29.10; extra == "cloudflare"
99
101
  Requires-Dist: boto3>=1.26.1; extra == "cloudflare"
100
102
  Requires-Dist: colorama<0.4.5; extra == "cloudflare"
101
103
  Provides-Extra: scp
102
- Requires-Dist: ray[default]!=2.6.0,>=2.2.0; extra == "scp"
104
+ Requires-Dist: ray[default]>=2.6.1; extra == "scp"
103
105
  Provides-Extra: oci
104
106
  Requires-Dist: oci; extra == "oci"
105
107
  Provides-Extra: kubernetes
@@ -145,48 +147,48 @@ Requires-Dist: grpcio>=1.63.0; extra == "server"
145
147
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
146
148
  Requires-Dist: aiosqlite; extra == "server"
147
149
  Provides-Extra: all
148
- Requires-Dist: passlib; extra == "all"
149
- Requires-Dist: boto3>=1.26.1; extra == "all"
150
- Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
151
- Requires-Dist: awscli>=1.27.10; extra == "all"
152
- Requires-Dist: runpod>=1.6.1; extra == "all"
153
- Requires-Dist: python-dateutil; extra == "all"
154
- Requires-Dist: anyio; extra == "all"
155
- Requires-Dist: oci; extra == "all"
156
- Requires-Dist: ibm-vpc; extra == "all"
157
150
  Requires-Dist: pyjwt; extra == "all"
158
- Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
159
151
  Requires-Dist: casbin; extra == "all"
160
- Requires-Dist: nebius>=0.2.47; extra == "all"
161
- Requires-Dist: azure-common; extra == "all"
152
+ Requires-Dist: colorama<0.4.5; extra == "all"
153
+ Requires-Dist: cudo-compute>=0.1.10; extra == "all"
154
+ Requires-Dist: python-dateutil; extra == "all"
155
+ Requires-Dist: ray[default]>=2.6.1; extra == "all"
156
+ Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
157
+ Requires-Dist: docker; extra == "all"
158
+ Requires-Dist: websockets; extra == "all"
159
+ Requires-Dist: awscli>=1.27.10; extra == "all"
160
+ Requires-Dist: aiosqlite; extra == "all"
161
+ Requires-Dist: ibm-vpc; extra == "all"
162
+ Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
162
163
  Requires-Dist: azure-core>=1.31.0; extra == "all"
164
+ Requires-Dist: passlib; extra == "all"
165
+ Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
166
+ Requires-Dist: oci; extra == "all"
167
+ Requires-Dist: boto3>=1.26.1; extra == "all"
168
+ Requires-Dist: azure-core>=1.24.0; extra == "all"
163
169
  Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
164
- Requires-Dist: pydo>=0.3.0; extra == "all"
165
- Requires-Dist: aiosqlite; extra == "all"
170
+ Requires-Dist: nebius>=0.2.47; extra == "all"
171
+ Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
166
172
  Requires-Dist: google-cloud-storage; extra == "all"
167
- Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
168
- Requires-Dist: colorama<0.4.5; extra == "all"
169
- Requires-Dist: azure-cli>=2.65.0; extra == "all"
170
- Requires-Dist: grpcio>=1.63.0; extra == "all"
171
- Requires-Dist: ibm-cloud-sdk-core; extra == "all"
172
- Requires-Dist: msrestazure; extra == "all"
173
- Requires-Dist: azure-identity>=1.19.0; extra == "all"
174
- Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
175
173
  Requires-Dist: msgraph-sdk; extra == "all"
176
174
  Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
177
- Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
178
- Requires-Dist: docker; extra == "all"
179
- Requires-Dist: ibm-cos-sdk; extra == "all"
180
- Requires-Dist: aiohttp; extra == "all"
175
+ Requires-Dist: azure-common; extra == "all"
176
+ Requires-Dist: pydo>=0.3.0; extra == "all"
177
+ Requires-Dist: msrestazure; extra == "all"
178
+ Requires-Dist: anyio; extra == "all"
179
+ Requires-Dist: sqlalchemy_adapter; extra == "all"
181
180
  Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
182
- Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
183
- Requires-Dist: websockets; extra == "all"
184
181
  Requires-Dist: botocore>=1.29.10; extra == "all"
185
- Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
186
- Requires-Dist: ray[default]!=2.6.0,>=2.2.0; extra == "all"
187
- Requires-Dist: sqlalchemy_adapter; extra == "all"
188
- Requires-Dist: azure-core>=1.24.0; extra == "all"
189
- Requires-Dist: cudo-compute>=0.1.10; extra == "all"
182
+ Requires-Dist: ibm-cloud-sdk-core; extra == "all"
183
+ Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
184
+ Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
185
+ Requires-Dist: ibm-cos-sdk; extra == "all"
186
+ Requires-Dist: runpod>=1.6.1; extra == "all"
187
+ Requires-Dist: grpcio>=1.63.0; extra == "all"
188
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
189
+ Requires-Dist: azure-identity>=1.19.0; extra == "all"
190
+ Requires-Dist: azure-cli>=2.65.0; extra == "all"
191
+ Requires-Dist: aiohttp; extra == "all"
190
192
  Dynamic: author
191
193
  Dynamic: classifier
192
194
  Dynamic: description