skypilot-nightly 1.0.0.dev20251015__py3-none-any.whl → 1.0.0.dev20251017__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 (58) hide show
  1. sky/__init__.py +2 -2
  2. sky/authentication.py +17 -157
  3. sky/backends/backend_utils.py +6 -5
  4. sky/backends/cloud_vm_ray_backend.py +25 -12
  5. sky/catalog/kubernetes_catalog.py +5 -3
  6. sky/client/cli/command.py +0 -1
  7. sky/dashboard/out/404.html +1 -1
  8. sky/dashboard/out/_next/static/chunks/{webpack-ac3a34c8f9fef041.js → webpack-3c431f6c9086e487.js} +1 -1
  9. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  10. sky/dashboard/out/clusters/[cluster].html +1 -1
  11. sky/dashboard/out/clusters.html +1 -1
  12. sky/dashboard/out/config.html +1 -1
  13. sky/dashboard/out/index.html +1 -1
  14. sky/dashboard/out/infra/[context].html +1 -1
  15. sky/dashboard/out/infra.html +1 -1
  16. sky/dashboard/out/jobs/[job].html +1 -1
  17. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  18. sky/dashboard/out/jobs.html +1 -1
  19. sky/dashboard/out/users.html +1 -1
  20. sky/dashboard/out/volumes.html +1 -1
  21. sky/dashboard/out/workspace/new.html +1 -1
  22. sky/dashboard/out/workspaces/[name].html +1 -1
  23. sky/dashboard/out/workspaces.html +1 -1
  24. sky/exceptions.py +13 -1
  25. sky/jobs/constants.py +1 -1
  26. sky/jobs/scheduler.py +2 -4
  27. sky/jobs/server/core.py +2 -1
  28. sky/jobs/server/server.py +5 -3
  29. sky/jobs/state.py +12 -6
  30. sky/jobs/utils.py +8 -2
  31. sky/provision/fluidstack/instance.py +2 -2
  32. sky/provision/seeweb/instance.py +3 -3
  33. sky/schemas/generated/jobsv1_pb2.py +52 -52
  34. sky/schemas/generated/jobsv1_pb2.pyi +4 -2
  35. sky/serve/server/server.py +1 -0
  36. sky/serve/service.py +2 -2
  37. sky/server/requests/executor.py +51 -15
  38. sky/server/requests/preconditions.py +2 -2
  39. sky/server/requests/requests.py +33 -24
  40. sky/server/requests/threads.py +106 -0
  41. sky/server/rest.py +36 -18
  42. sky/server/server.py +26 -4
  43. sky/server/stream_utils.py +10 -3
  44. sky/setup_files/dependencies.py +19 -8
  45. sky/skylet/constants.py +1 -1
  46. sky/skylet/services.py +3 -1
  47. sky/utils/auth_utils.py +153 -0
  48. sky/utils/command_runner.py +3 -0
  49. sky/utils/context_utils.py +2 -0
  50. sky/utils/locks.py +5 -2
  51. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/METADATA +281 -52
  52. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/RECORD +58 -56
  53. /sky/dashboard/out/_next/static/{-bih7JVStsXyeasac-dvQ → 3xvBA5BSGbiQ87tVmfbpY}/_buildManifest.js +0 -0
  54. /sky/dashboard/out/_next/static/{-bih7JVStsXyeasac-dvQ → 3xvBA5BSGbiQ87tVmfbpY}/_ssgManifest.js +0 -0
  55. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/WHEEL +0 -0
  56. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/entry_points.txt +0 -0
  57. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/licenses/LICENSE +0 -0
  58. {skypilot_nightly-1.0.0.dev20251015.dist-info → skypilot_nightly-1.0.0.dev20251017.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,153 @@
1
+ """Utils for managing SkyPilot SSH key pairs."""
2
+
3
+ import functools
4
+ import os
5
+ from typing import Tuple
6
+
7
+ import filelock
8
+
9
+ from sky import global_user_state
10
+ from sky import sky_logging
11
+ from sky.utils import common_utils
12
+
13
+ logger = sky_logging.init_logger(__name__)
14
+
15
+ MAX_TRIALS = 64
16
+ # TODO(zhwu): Support user specified key pair.
17
+ # We intentionally not have the ssh key pair to be stored in
18
+ # ~/.sky/api_server/clients, i.e. sky.server.common.API_SERVER_CLIENT_DIR,
19
+ # because ssh key pair need to persist across API server restarts, while
20
+ # the former dir is empheral.
21
+ _SSH_KEY_PATH_PREFIX = '~/.sky/clients/{user_hash}/ssh'
22
+
23
+
24
+ def get_ssh_key_and_lock_path(user_hash: str) -> Tuple[str, str, str]:
25
+ user_ssh_key_prefix = _SSH_KEY_PATH_PREFIX.format(user_hash=user_hash)
26
+
27
+ os.makedirs(os.path.expanduser(user_ssh_key_prefix),
28
+ exist_ok=True,
29
+ mode=0o700)
30
+ private_key_path = os.path.join(user_ssh_key_prefix, 'sky-key')
31
+ public_key_path = os.path.join(user_ssh_key_prefix, 'sky-key.pub')
32
+ lock_path = os.path.join(user_ssh_key_prefix, '.__internal-sky-key.lock')
33
+ return private_key_path, public_key_path, lock_path
34
+
35
+
36
+ def _generate_rsa_key_pair() -> Tuple[str, str]:
37
+ # Keep the import of the cryptography local to avoid expensive
38
+ # third-party imports when not needed.
39
+ # pylint: disable=import-outside-toplevel
40
+ from cryptography.hazmat.backends import default_backend
41
+ from cryptography.hazmat.primitives import serialization
42
+ from cryptography.hazmat.primitives.asymmetric import rsa
43
+
44
+ key = rsa.generate_private_key(backend=default_backend(),
45
+ public_exponent=65537,
46
+ key_size=2048)
47
+
48
+ private_key = key.private_bytes(
49
+ encoding=serialization.Encoding.PEM,
50
+ format=serialization.PrivateFormat.TraditionalOpenSSL,
51
+ encryption_algorithm=serialization.NoEncryption()).decode(
52
+ 'utf-8').strip()
53
+
54
+ public_key = key.public_key().public_bytes(
55
+ serialization.Encoding.OpenSSH,
56
+ serialization.PublicFormat.OpenSSH).decode('utf-8').strip()
57
+
58
+ return public_key, private_key
59
+
60
+
61
+ def _save_key_pair(private_key_path: str, public_key_path: str,
62
+ private_key: str, public_key: str) -> None:
63
+ key_dir = os.path.dirname(private_key_path)
64
+ os.makedirs(key_dir, exist_ok=True, mode=0o700)
65
+
66
+ with open(
67
+ private_key_path,
68
+ 'w',
69
+ encoding='utf-8',
70
+ opener=functools.partial(os.open, mode=0o600),
71
+ ) as f:
72
+ f.write(private_key)
73
+
74
+ with open(public_key_path,
75
+ 'w',
76
+ encoding='utf-8',
77
+ opener=functools.partial(os.open, mode=0o644)) as f:
78
+ f.write(public_key)
79
+
80
+
81
+ def get_or_generate_keys() -> Tuple[str, str]:
82
+ """Returns the absolute private and public key paths."""
83
+ user_hash = common_utils.get_user_hash()
84
+ private_key_path, public_key_path, lock_path = get_ssh_key_and_lock_path(
85
+ user_hash)
86
+ private_key_path = os.path.expanduser(private_key_path)
87
+ public_key_path = os.path.expanduser(public_key_path)
88
+ lock_path = os.path.expanduser(lock_path)
89
+
90
+ lock_dir = os.path.dirname(lock_path)
91
+ # We should have the folder ~/.sky/generated/ssh to have 0o700 permission,
92
+ # as the ssh configs will be written to this folder as well in
93
+ # backend_utils.SSHConfigHelper
94
+ os.makedirs(lock_dir, exist_ok=True, mode=0o700)
95
+ with filelock.FileLock(lock_path, timeout=10):
96
+ if not os.path.exists(private_key_path):
97
+ ssh_public_key, ssh_private_key, exists = (
98
+ global_user_state.get_ssh_keys(user_hash))
99
+ if not exists:
100
+ ssh_public_key, ssh_private_key = _generate_rsa_key_pair()
101
+ global_user_state.set_ssh_keys(user_hash, ssh_public_key,
102
+ ssh_private_key)
103
+ _save_key_pair(private_key_path, public_key_path, ssh_private_key,
104
+ ssh_public_key)
105
+ assert os.path.exists(public_key_path), (
106
+ 'Private key found, but associated public key '
107
+ f'{public_key_path} does not exist.')
108
+ return private_key_path, public_key_path
109
+
110
+
111
+ def create_ssh_key_files_from_db(private_key_path: str) -> bool:
112
+ """Creates the ssh key files from the database.
113
+
114
+ Returns:
115
+ True if the ssh key files are created successfully, False otherwise.
116
+ """
117
+ # Assume private key path is in the format of
118
+ # ~/.sky/clients/<user_hash>/ssh/sky-key
119
+ separated_path = os.path.normpath(private_key_path).split(os.path.sep)
120
+ assert separated_path[-1] == 'sky-key'
121
+ assert separated_path[-2] == 'ssh'
122
+ user_hash = separated_path[-3]
123
+
124
+ private_key_path_generated, public_key_path, lock_path = (
125
+ get_ssh_key_and_lock_path(user_hash))
126
+ assert private_key_path == os.path.expanduser(private_key_path_generated), (
127
+ f'Private key path {private_key_path} does not '
128
+ 'match the generated path '
129
+ f'{os.path.expanduser(private_key_path_generated)}')
130
+ private_key_path = os.path.expanduser(private_key_path)
131
+ public_key_path = os.path.expanduser(public_key_path)
132
+ lock_path = os.path.expanduser(lock_path)
133
+ lock_dir = os.path.dirname(lock_path)
134
+
135
+ if os.path.exists(private_key_path) and os.path.exists(public_key_path):
136
+ return True
137
+ # We should have the folder ~/.sky/generated/ssh to have 0o700 permission,
138
+ # as the ssh configs will be written to this folder as well in
139
+ # backend_utils.SSHConfigHelper
140
+ os.makedirs(lock_dir, exist_ok=True, mode=0o700)
141
+ with filelock.FileLock(lock_path, timeout=10):
142
+ if not os.path.exists(private_key_path):
143
+ ssh_public_key, ssh_private_key, exists = (
144
+ global_user_state.get_ssh_keys(user_hash))
145
+ if not exists:
146
+ logger.debug(f'SSH keys not found for user {user_hash}')
147
+ return False
148
+ _save_key_pair(private_key_path, public_key_path, ssh_private_key,
149
+ ssh_public_key)
150
+ assert os.path.exists(public_key_path), (
151
+ 'Private key found, but associated public key '
152
+ f'{public_key_path} does not exist.')
153
+ return True
@@ -14,6 +14,7 @@ from sky import exceptions
14
14
  from sky import sky_logging
15
15
  from sky.skylet import constants
16
16
  from sky.skylet import log_lib
17
+ from sky.utils import auth_utils
17
18
  from sky.utils import common_utils
18
19
  from sky.utils import context_utils
19
20
  from sky.utils import control_master_utils
@@ -649,6 +650,8 @@ class SSHCommandRunner(CommandRunner):
649
650
  self.disable_control_master = (
650
651
  disable_control_master or
651
652
  control_master_utils.should_disable_control_master())
653
+ # ensure the ssh key files are created from the database
654
+ auth_utils.create_ssh_key_files_from_db(ssh_private_key)
652
655
  if docker_user is not None:
653
656
  assert port is None or port == 22, (
654
657
  f'port must be None or 22 for docker_user, got {port}.')
@@ -19,6 +19,8 @@ from sky.utils import subprocess_utils
19
19
 
20
20
  StreamHandler = Callable[[IO[Any], IO[Any]], str]
21
21
 
22
+ logger = sky_logging.init_logger(__name__)
23
+
22
24
 
23
25
  # TODO(aylei): call hijack_sys_attrs() proactivly in module init at server-side
24
26
  # once we have context widely adopted.
sky/utils/locks.py CHANGED
@@ -312,8 +312,11 @@ class PostgresLock(DistributedLock):
312
312
  else:
313
313
  self._connection.close()
314
314
  except Exception as e: # pylint: disable=broad-except
315
- logger.debug(
316
- f'Failed to invalidate or close postgres connection: {e}')
315
+ if invalidate:
316
+ logger.debug(
317
+ f'Failed to invalidate postgres connection: {e}')
318
+ else:
319
+ logger.debug(f'Failed to close postgres connection: {e}')
317
320
  self._connection = None
318
321
 
319
322
  def is_locked(self) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20251015
3
+ Version: 1.0.0.dev20251017
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -66,13 +66,22 @@ Requires-Dist: gitpython
66
66
  Requires-Dist: types-paramiko
67
67
  Requires-Dist: alembic
68
68
  Requires-Dist: aiohttp
69
- Requires-Dist: aiosqlite
70
69
  Requires-Dist: anyio
71
70
  Provides-Extra: aws
72
71
  Requires-Dist: awscli>=1.27.10; extra == "aws"
73
72
  Requires-Dist: botocore>=1.29.10; extra == "aws"
74
73
  Requires-Dist: boto3>=1.26.1; extra == "aws"
75
74
  Requires-Dist: colorama<0.4.5; extra == "aws"
75
+ Requires-Dist: casbin; extra == "aws"
76
+ Requires-Dist: sqlalchemy_adapter; extra == "aws"
77
+ Requires-Dist: passlib; extra == "aws"
78
+ Requires-Dist: pyjwt; extra == "aws"
79
+ Requires-Dist: aiohttp; extra == "aws"
80
+ Requires-Dist: anyio; extra == "aws"
81
+ Requires-Dist: grpcio>=1.63.0; extra == "aws"
82
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "aws"
83
+ Requires-Dist: aiosqlite; extra == "aws"
84
+ Requires-Dist: greenlet; extra == "aws"
76
85
  Provides-Extra: azure
77
86
  Requires-Dist: azure-cli>=2.65.0; extra == "azure"
78
87
  Requires-Dist: azure-core>=1.31.0; extra == "azure"
@@ -82,56 +91,233 @@ Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "azure"
82
91
  Requires-Dist: azure-storage-blob>=12.23.1; extra == "azure"
83
92
  Requires-Dist: msgraph-sdk; extra == "azure"
84
93
  Requires-Dist: msrestazure; extra == "azure"
94
+ Requires-Dist: casbin; extra == "azure"
95
+ Requires-Dist: sqlalchemy_adapter; extra == "azure"
96
+ Requires-Dist: passlib; extra == "azure"
97
+ Requires-Dist: pyjwt; extra == "azure"
98
+ Requires-Dist: aiohttp; extra == "azure"
99
+ Requires-Dist: anyio; extra == "azure"
100
+ Requires-Dist: grpcio>=1.63.0; extra == "azure"
101
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "azure"
102
+ Requires-Dist: aiosqlite; extra == "azure"
103
+ Requires-Dist: greenlet; extra == "azure"
85
104
  Provides-Extra: gcp
86
105
  Requires-Dist: google-api-python-client>=2.69.0; extra == "gcp"
87
106
  Requires-Dist: google-cloud-storage; extra == "gcp"
88
107
  Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "gcp"
108
+ Requires-Dist: casbin; extra == "gcp"
109
+ Requires-Dist: sqlalchemy_adapter; extra == "gcp"
110
+ Requires-Dist: passlib; extra == "gcp"
111
+ Requires-Dist: pyjwt; extra == "gcp"
112
+ Requires-Dist: aiohttp; extra == "gcp"
113
+ Requires-Dist: anyio; extra == "gcp"
114
+ Requires-Dist: grpcio>=1.63.0; extra == "gcp"
115
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "gcp"
116
+ Requires-Dist: aiosqlite; extra == "gcp"
117
+ Requires-Dist: greenlet; extra == "gcp"
89
118
  Provides-Extra: ibm
90
119
  Requires-Dist: ibm-cloud-sdk-core; extra == "ibm"
91
120
  Requires-Dist: ibm-vpc; extra == "ibm"
92
121
  Requires-Dist: ibm-platform-services>=0.48.0; extra == "ibm"
93
122
  Requires-Dist: ibm-cos-sdk; extra == "ibm"
94
123
  Requires-Dist: ray[default]>=2.6.1; extra == "ibm"
124
+ Requires-Dist: casbin; extra == "ibm"
125
+ Requires-Dist: sqlalchemy_adapter; extra == "ibm"
126
+ Requires-Dist: passlib; extra == "ibm"
127
+ Requires-Dist: pyjwt; extra == "ibm"
128
+ Requires-Dist: aiohttp; extra == "ibm"
129
+ Requires-Dist: anyio; extra == "ibm"
130
+ Requires-Dist: grpcio>=1.63.0; extra == "ibm"
131
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "ibm"
132
+ Requires-Dist: aiosqlite; extra == "ibm"
133
+ Requires-Dist: greenlet; extra == "ibm"
95
134
  Provides-Extra: docker
96
135
  Requires-Dist: docker; extra == "docker"
97
136
  Requires-Dist: ray[default]>=2.6.1; extra == "docker"
137
+ Requires-Dist: casbin; extra == "docker"
138
+ Requires-Dist: sqlalchemy_adapter; extra == "docker"
139
+ Requires-Dist: passlib; extra == "docker"
140
+ Requires-Dist: pyjwt; extra == "docker"
141
+ Requires-Dist: aiohttp; extra == "docker"
142
+ Requires-Dist: anyio; extra == "docker"
143
+ Requires-Dist: grpcio>=1.63.0; extra == "docker"
144
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "docker"
145
+ Requires-Dist: aiosqlite; extra == "docker"
146
+ Requires-Dist: greenlet; extra == "docker"
98
147
  Provides-Extra: lambda
148
+ Requires-Dist: casbin; extra == "lambda"
149
+ Requires-Dist: sqlalchemy_adapter; extra == "lambda"
150
+ Requires-Dist: passlib; extra == "lambda"
151
+ Requires-Dist: pyjwt; extra == "lambda"
152
+ Requires-Dist: aiohttp; extra == "lambda"
153
+ Requires-Dist: anyio; extra == "lambda"
154
+ Requires-Dist: grpcio>=1.63.0; extra == "lambda"
155
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "lambda"
156
+ Requires-Dist: aiosqlite; extra == "lambda"
157
+ Requires-Dist: greenlet; extra == "lambda"
99
158
  Provides-Extra: cloudflare
100
159
  Requires-Dist: awscli>=1.27.10; extra == "cloudflare"
101
160
  Requires-Dist: botocore>=1.29.10; extra == "cloudflare"
102
161
  Requires-Dist: boto3>=1.26.1; extra == "cloudflare"
103
162
  Requires-Dist: colorama<0.4.5; extra == "cloudflare"
163
+ Requires-Dist: casbin; extra == "cloudflare"
164
+ Requires-Dist: sqlalchemy_adapter; extra == "cloudflare"
165
+ Requires-Dist: passlib; extra == "cloudflare"
166
+ Requires-Dist: pyjwt; extra == "cloudflare"
167
+ Requires-Dist: aiohttp; extra == "cloudflare"
168
+ Requires-Dist: anyio; extra == "cloudflare"
169
+ Requires-Dist: grpcio>=1.63.0; extra == "cloudflare"
170
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "cloudflare"
171
+ Requires-Dist: aiosqlite; extra == "cloudflare"
172
+ Requires-Dist: greenlet; extra == "cloudflare"
104
173
  Provides-Extra: scp
105
174
  Requires-Dist: ray[default]>=2.6.1; extra == "scp"
175
+ Requires-Dist: casbin; extra == "scp"
176
+ Requires-Dist: sqlalchemy_adapter; extra == "scp"
177
+ Requires-Dist: passlib; extra == "scp"
178
+ Requires-Dist: pyjwt; extra == "scp"
179
+ Requires-Dist: aiohttp; extra == "scp"
180
+ Requires-Dist: anyio; extra == "scp"
181
+ Requires-Dist: grpcio>=1.63.0; extra == "scp"
182
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "scp"
183
+ Requires-Dist: aiosqlite; extra == "scp"
184
+ Requires-Dist: greenlet; extra == "scp"
106
185
  Provides-Extra: oci
107
186
  Requires-Dist: oci; extra == "oci"
187
+ Requires-Dist: casbin; extra == "oci"
188
+ Requires-Dist: sqlalchemy_adapter; extra == "oci"
189
+ Requires-Dist: passlib; extra == "oci"
190
+ Requires-Dist: pyjwt; extra == "oci"
191
+ Requires-Dist: aiohttp; extra == "oci"
192
+ Requires-Dist: anyio; extra == "oci"
193
+ Requires-Dist: grpcio>=1.63.0; extra == "oci"
194
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "oci"
195
+ Requires-Dist: aiosqlite; extra == "oci"
196
+ Requires-Dist: greenlet; extra == "oci"
108
197
  Provides-Extra: kubernetes
109
198
  Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "kubernetes"
110
199
  Requires-Dist: websockets; extra == "kubernetes"
111
200
  Requires-Dist: python-dateutil; extra == "kubernetes"
201
+ Requires-Dist: casbin; extra == "kubernetes"
202
+ Requires-Dist: sqlalchemy_adapter; extra == "kubernetes"
203
+ Requires-Dist: passlib; extra == "kubernetes"
204
+ Requires-Dist: pyjwt; extra == "kubernetes"
205
+ Requires-Dist: aiohttp; extra == "kubernetes"
206
+ Requires-Dist: anyio; extra == "kubernetes"
207
+ Requires-Dist: grpcio>=1.63.0; extra == "kubernetes"
208
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "kubernetes"
209
+ Requires-Dist: aiosqlite; extra == "kubernetes"
210
+ Requires-Dist: greenlet; extra == "kubernetes"
112
211
  Provides-Extra: ssh
113
212
  Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "ssh"
114
213
  Requires-Dist: websockets; extra == "ssh"
115
214
  Requires-Dist: python-dateutil; extra == "ssh"
116
- Provides-Extra: remote
117
- Requires-Dist: grpcio>=1.63.0; extra == "remote"
118
- Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "remote"
215
+ Requires-Dist: casbin; extra == "ssh"
216
+ Requires-Dist: sqlalchemy_adapter; extra == "ssh"
217
+ Requires-Dist: passlib; extra == "ssh"
218
+ Requires-Dist: pyjwt; extra == "ssh"
219
+ Requires-Dist: aiohttp; extra == "ssh"
220
+ Requires-Dist: anyio; extra == "ssh"
221
+ Requires-Dist: grpcio>=1.63.0; extra == "ssh"
222
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "ssh"
223
+ Requires-Dist: aiosqlite; extra == "ssh"
224
+ Requires-Dist: greenlet; extra == "ssh"
119
225
  Provides-Extra: runpod
120
226
  Requires-Dist: runpod>=1.6.1; extra == "runpod"
121
227
  Requires-Dist: tomli; python_version < "3.11" and extra == "runpod"
228
+ Requires-Dist: casbin; extra == "runpod"
229
+ Requires-Dist: sqlalchemy_adapter; extra == "runpod"
230
+ Requires-Dist: passlib; extra == "runpod"
231
+ Requires-Dist: pyjwt; extra == "runpod"
232
+ Requires-Dist: aiohttp; extra == "runpod"
233
+ Requires-Dist: anyio; extra == "runpod"
234
+ Requires-Dist: grpcio>=1.63.0; extra == "runpod"
235
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "runpod"
236
+ Requires-Dist: aiosqlite; extra == "runpod"
237
+ Requires-Dist: greenlet; extra == "runpod"
122
238
  Provides-Extra: fluidstack
239
+ Requires-Dist: casbin; extra == "fluidstack"
240
+ Requires-Dist: sqlalchemy_adapter; extra == "fluidstack"
241
+ Requires-Dist: passlib; extra == "fluidstack"
242
+ Requires-Dist: pyjwt; extra == "fluidstack"
243
+ Requires-Dist: aiohttp; extra == "fluidstack"
244
+ Requires-Dist: anyio; extra == "fluidstack"
245
+ Requires-Dist: grpcio>=1.63.0; extra == "fluidstack"
246
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "fluidstack"
247
+ Requires-Dist: aiosqlite; extra == "fluidstack"
248
+ Requires-Dist: greenlet; extra == "fluidstack"
123
249
  Provides-Extra: cudo
124
250
  Requires-Dist: cudo-compute>=0.1.10; extra == "cudo"
251
+ Requires-Dist: casbin; extra == "cudo"
252
+ Requires-Dist: sqlalchemy_adapter; extra == "cudo"
253
+ Requires-Dist: passlib; extra == "cudo"
254
+ Requires-Dist: pyjwt; extra == "cudo"
255
+ Requires-Dist: aiohttp; extra == "cudo"
256
+ Requires-Dist: anyio; extra == "cudo"
257
+ Requires-Dist: grpcio>=1.63.0; extra == "cudo"
258
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "cudo"
259
+ Requires-Dist: aiosqlite; extra == "cudo"
260
+ Requires-Dist: greenlet; extra == "cudo"
125
261
  Provides-Extra: paperspace
262
+ Requires-Dist: casbin; extra == "paperspace"
263
+ Requires-Dist: sqlalchemy_adapter; extra == "paperspace"
264
+ Requires-Dist: passlib; extra == "paperspace"
265
+ Requires-Dist: pyjwt; extra == "paperspace"
266
+ Requires-Dist: aiohttp; extra == "paperspace"
267
+ Requires-Dist: anyio; extra == "paperspace"
268
+ Requires-Dist: grpcio>=1.63.0; extra == "paperspace"
269
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "paperspace"
270
+ Requires-Dist: aiosqlite; extra == "paperspace"
271
+ Requires-Dist: greenlet; extra == "paperspace"
126
272
  Provides-Extra: primeintellect
273
+ Requires-Dist: casbin; extra == "primeintellect"
274
+ Requires-Dist: sqlalchemy_adapter; extra == "primeintellect"
275
+ Requires-Dist: passlib; extra == "primeintellect"
276
+ Requires-Dist: pyjwt; extra == "primeintellect"
277
+ Requires-Dist: aiohttp; extra == "primeintellect"
278
+ Requires-Dist: anyio; extra == "primeintellect"
279
+ Requires-Dist: grpcio>=1.63.0; extra == "primeintellect"
280
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "primeintellect"
281
+ Requires-Dist: aiosqlite; extra == "primeintellect"
282
+ Requires-Dist: greenlet; extra == "primeintellect"
127
283
  Provides-Extra: do
128
284
  Requires-Dist: pydo>=0.3.0; extra == "do"
129
285
  Requires-Dist: azure-core>=1.24.0; extra == "do"
130
286
  Requires-Dist: azure-common; extra == "do"
287
+ Requires-Dist: casbin; extra == "do"
288
+ Requires-Dist: sqlalchemy_adapter; extra == "do"
289
+ Requires-Dist: passlib; extra == "do"
290
+ Requires-Dist: pyjwt; extra == "do"
291
+ Requires-Dist: aiohttp; extra == "do"
292
+ Requires-Dist: anyio; extra == "do"
293
+ Requires-Dist: grpcio>=1.63.0; extra == "do"
294
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "do"
295
+ Requires-Dist: aiosqlite; extra == "do"
296
+ Requires-Dist: greenlet; extra == "do"
131
297
  Provides-Extra: vast
132
298
  Requires-Dist: vastai-sdk>=0.1.12; extra == "vast"
299
+ Requires-Dist: casbin; extra == "vast"
300
+ Requires-Dist: sqlalchemy_adapter; extra == "vast"
301
+ Requires-Dist: passlib; extra == "vast"
302
+ Requires-Dist: pyjwt; extra == "vast"
303
+ Requires-Dist: aiohttp; extra == "vast"
304
+ Requires-Dist: anyio; extra == "vast"
305
+ Requires-Dist: grpcio>=1.63.0; extra == "vast"
306
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "vast"
307
+ Requires-Dist: aiosqlite; extra == "vast"
308
+ Requires-Dist: greenlet; extra == "vast"
133
309
  Provides-Extra: vsphere
134
310
  Requires-Dist: pyvmomi==8.0.1.0.2; extra == "vsphere"
311
+ Requires-Dist: casbin; extra == "vsphere"
312
+ Requires-Dist: sqlalchemy_adapter; extra == "vsphere"
313
+ Requires-Dist: passlib; extra == "vsphere"
314
+ Requires-Dist: pyjwt; extra == "vsphere"
315
+ Requires-Dist: aiohttp; extra == "vsphere"
316
+ Requires-Dist: anyio; extra == "vsphere"
317
+ Requires-Dist: grpcio>=1.63.0; extra == "vsphere"
318
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "vsphere"
319
+ Requires-Dist: aiosqlite; extra == "vsphere"
320
+ Requires-Dist: greenlet; extra == "vsphere"
135
321
  Provides-Extra: nebius
136
322
  Requires-Dist: nebius>=0.2.47; extra == "nebius"
137
323
  Requires-Dist: grpcio>=1.63.0; extra == "nebius"
@@ -140,67 +326,110 @@ Requires-Dist: awscli>=1.27.10; extra == "nebius"
140
326
  Requires-Dist: botocore>=1.29.10; extra == "nebius"
141
327
  Requires-Dist: boto3>=1.26.1; extra == "nebius"
142
328
  Requires-Dist: colorama<0.4.5; extra == "nebius"
329
+ Requires-Dist: casbin; extra == "nebius"
330
+ Requires-Dist: sqlalchemy_adapter; extra == "nebius"
331
+ Requires-Dist: passlib; extra == "nebius"
332
+ Requires-Dist: pyjwt; extra == "nebius"
333
+ Requires-Dist: aiohttp; extra == "nebius"
334
+ Requires-Dist: anyio; extra == "nebius"
335
+ Requires-Dist: grpcio>=1.63.0; extra == "nebius"
336
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "nebius"
337
+ Requires-Dist: aiosqlite; extra == "nebius"
338
+ Requires-Dist: greenlet; extra == "nebius"
143
339
  Provides-Extra: hyperbolic
340
+ Requires-Dist: casbin; extra == "hyperbolic"
341
+ Requires-Dist: sqlalchemy_adapter; extra == "hyperbolic"
342
+ Requires-Dist: passlib; extra == "hyperbolic"
343
+ Requires-Dist: pyjwt; extra == "hyperbolic"
344
+ Requires-Dist: aiohttp; extra == "hyperbolic"
345
+ Requires-Dist: anyio; extra == "hyperbolic"
346
+ Requires-Dist: grpcio>=1.63.0; extra == "hyperbolic"
347
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "hyperbolic"
348
+ Requires-Dist: aiosqlite; extra == "hyperbolic"
349
+ Requires-Dist: greenlet; extra == "hyperbolic"
144
350
  Provides-Extra: seeweb
145
351
  Requires-Dist: ecsapi>=0.2.0; extra == "seeweb"
146
- Provides-Extra: server
147
- Requires-Dist: casbin; extra == "server"
148
- Requires-Dist: sqlalchemy_adapter; extra == "server"
149
- Requires-Dist: passlib; extra == "server"
150
- Requires-Dist: pyjwt; extra == "server"
151
- Requires-Dist: aiohttp; extra == "server"
152
- Requires-Dist: anyio; extra == "server"
153
- Requires-Dist: grpcio>=1.63.0; extra == "server"
154
- Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
155
- Requires-Dist: aiosqlite; extra == "server"
156
- Requires-Dist: greenlet; extra == "server"
352
+ Requires-Dist: casbin; extra == "seeweb"
353
+ Requires-Dist: sqlalchemy_adapter; extra == "seeweb"
354
+ Requires-Dist: passlib; extra == "seeweb"
355
+ Requires-Dist: pyjwt; extra == "seeweb"
356
+ Requires-Dist: aiohttp; extra == "seeweb"
357
+ Requires-Dist: anyio; extra == "seeweb"
358
+ Requires-Dist: grpcio>=1.63.0; extra == "seeweb"
359
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "seeweb"
360
+ Requires-Dist: aiosqlite; extra == "seeweb"
361
+ Requires-Dist: greenlet; extra == "seeweb"
157
362
  Provides-Extra: shadeform
363
+ Requires-Dist: casbin; extra == "shadeform"
364
+ Requires-Dist: sqlalchemy_adapter; extra == "shadeform"
365
+ Requires-Dist: passlib; extra == "shadeform"
366
+ Requires-Dist: pyjwt; extra == "shadeform"
367
+ Requires-Dist: aiohttp; extra == "shadeform"
368
+ Requires-Dist: anyio; extra == "shadeform"
369
+ Requires-Dist: grpcio>=1.63.0; extra == "shadeform"
370
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "shadeform"
371
+ Requires-Dist: aiosqlite; extra == "shadeform"
372
+ Requires-Dist: greenlet; extra == "shadeform"
158
373
  Provides-Extra: all
159
- Requires-Dist: pydo>=0.3.0; extra == "all"
160
- Requires-Dist: tomli; python_version < "3.11" and extra == "all"
161
- Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
162
- Requires-Dist: aiohttp; extra == "all"
374
+ Requires-Dist: ray[default]>=2.6.1; extra == "all"
163
375
  Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
164
- Requires-Dist: google-cloud-storage; extra == "all"
165
- Requires-Dist: pyjwt; extra == "all"
166
- Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
167
- Requires-Dist: websockets; extra == "all"
376
+ Requires-Dist: cudo-compute>=0.1.10; extra == "all"
168
377
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
169
- Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
170
- Requires-Dist: msgraph-sdk; extra == "all"
171
- Requires-Dist: runpod>=1.6.1; extra == "all"
378
+ Requires-Dist: azure-core>=1.24.0; extra == "all"
379
+ Requires-Dist: azure-identity>=1.19.0; extra == "all"
380
+ Requires-Dist: azure-common; extra == "all"
381
+ Requires-Dist: casbin; extra == "all"
382
+ Requires-Dist: aiohttp; extra == "all"
383
+ Requires-Dist: python-dateutil; extra == "all"
172
384
  Requires-Dist: azure-core>=1.31.0; extra == "all"
385
+ Requires-Dist: google-cloud-storage; extra == "all"
386
+ Requires-Dist: msrestazure; extra == "all"
387
+ Requires-Dist: docker; extra == "all"
388
+ Requires-Dist: grpcio>=1.63.0; extra == "all"
389
+ Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
390
+ Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
391
+ Requires-Dist: boto3>=1.26.1; extra == "all"
392
+ Requires-Dist: nebius>=0.2.47; extra == "all"
393
+ Requires-Dist: ibm-cos-sdk; extra == "all"
394
+ Requires-Dist: pydo>=0.3.0; extra == "all"
395
+ Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
396
+ Requires-Dist: anyio; extra == "all"
397
+ Requires-Dist: passlib; extra == "all"
173
398
  Requires-Dist: aiosqlite; extra == "all"
399
+ Requires-Dist: awscli>=1.27.10; extra == "all"
400
+ Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
174
401
  Requires-Dist: ibm-vpc; extra == "all"
402
+ Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
403
+ Requires-Dist: runpod>=1.6.1; extra == "all"
404
+ Requires-Dist: ecsapi>=0.2.0; extra == "all"
405
+ Requires-Dist: tomli; python_version < "3.11" and extra == "all"
406
+ Requires-Dist: websockets; extra == "all"
407
+ Requires-Dist: botocore>=1.29.10; extra == "all"
408
+ Requires-Dist: azure-cli>=2.65.0; extra == "all"
409
+ Requires-Dist: msgraph-sdk; extra == "all"
175
410
  Requires-Dist: ibm-cloud-sdk-core; extra == "all"
411
+ Requires-Dist: colorama<0.4.5; extra == "all"
412
+ Requires-Dist: pyjwt; extra == "all"
413
+ Requires-Dist: oci; extra == "all"
176
414
  Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
415
+ Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
177
416
  Requires-Dist: sqlalchemy_adapter; extra == "all"
178
- Requires-Dist: oci; extra == "all"
179
- Requires-Dist: grpcio>=1.63.0; extra == "all"
180
- Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
181
- Requires-Dist: colorama<0.4.5; extra == "all"
182
- Requires-Dist: python-dateutil; extra == "all"
183
- Requires-Dist: cudo-compute>=0.1.10; extra == "all"
184
- Requires-Dist: botocore>=1.29.10; extra == "all"
185
- Requires-Dist: azure-core>=1.24.0; extra == "all"
186
- Requires-Dist: awscli>=1.27.10; extra == "all"
187
- Requires-Dist: passlib; extra == "all"
188
- Requires-Dist: msrestazure; extra == "all"
189
- Requires-Dist: ray[default]>=2.6.1; extra == "all"
190
417
  Requires-Dist: greenlet; extra == "all"
191
- Requires-Dist: docker; extra == "all"
192
- Requires-Dist: ecsapi>=0.2.0; extra == "all"
193
- Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
194
- Requires-Dist: ibm-cos-sdk; extra == "all"
195
- Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
196
- Requires-Dist: casbin; extra == "all"
197
- Requires-Dist: boto3>=1.26.1; extra == "all"
198
- Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
199
- Requires-Dist: nebius>=0.2.47; extra == "all"
200
- Requires-Dist: azure-identity>=1.19.0; extra == "all"
201
- Requires-Dist: azure-cli>=2.65.0; extra == "all"
202
- Requires-Dist: azure-common; extra == "all"
203
- Requires-Dist: anyio; extra == "all"
418
+ Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
419
+ Provides-Extra: remote
420
+ Requires-Dist: grpcio>=1.63.0; extra == "remote"
421
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "remote"
422
+ Provides-Extra: server
423
+ Requires-Dist: casbin; extra == "server"
424
+ Requires-Dist: sqlalchemy_adapter; extra == "server"
425
+ Requires-Dist: passlib; extra == "server"
426
+ Requires-Dist: pyjwt; extra == "server"
427
+ Requires-Dist: aiohttp; extra == "server"
428
+ Requires-Dist: anyio; extra == "server"
429
+ Requires-Dist: grpcio>=1.63.0; extra == "server"
430
+ Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
431
+ Requires-Dist: aiosqlite; extra == "server"
432
+ Requires-Dist: greenlet; extra == "server"
204
433
  Dynamic: author
205
434
  Dynamic: classifier
206
435
  Dynamic: description