skypilot-nightly 1.0.0.dev20250916__py3-none-any.whl → 1.0.0.dev20250919__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 (81) hide show
  1. sky/__init__.py +4 -2
  2. sky/adaptors/primeintellect.py +1 -0
  3. sky/adaptors/seeweb.py +68 -4
  4. sky/authentication.py +25 -0
  5. sky/backends/__init__.py +3 -2
  6. sky/backends/backend_utils.py +16 -12
  7. sky/backends/cloud_vm_ray_backend.py +57 -0
  8. sky/catalog/primeintellect_catalog.py +95 -0
  9. sky/clouds/__init__.py +2 -0
  10. sky/clouds/primeintellect.py +314 -0
  11. sky/core.py +77 -48
  12. sky/dashboard/out/404.html +1 -1
  13. sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_buildManifest.js +1 -1
  14. sky/dashboard/out/_next/static/chunks/1121-4ff1ec0dbc5792ab.js +1 -0
  15. sky/dashboard/out/_next/static/chunks/3015-88c7c8d69b0b6dba.js +1 -0
  16. sky/dashboard/out/_next/static/chunks/{6856-e0754534b3015377.js → 6856-9a2538f38c004652.js} +1 -1
  17. sky/dashboard/out/_next/static/chunks/8969-a39efbadcd9fde80.js +1 -0
  18. sky/dashboard/out/_next/static/chunks/9037-472ee1222cb1e158.js +6 -0
  19. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1e9248ddbddcd122.js +16 -0
  20. sky/dashboard/out/_next/static/chunks/pages/clusters/{[cluster]-0b4b35dc1dfe046c.js → [cluster]-9525660179df3605.js} +1 -1
  21. sky/dashboard/out/_next/static/chunks/{webpack-05f82d90d6fd7f82.js → webpack-b2a3938c22b6647b.js} +1 -1
  22. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  23. sky/dashboard/out/clusters/[cluster].html +1 -1
  24. sky/dashboard/out/clusters.html +1 -1
  25. sky/dashboard/out/config.html +1 -1
  26. sky/dashboard/out/index.html +1 -1
  27. sky/dashboard/out/infra/[context].html +1 -1
  28. sky/dashboard/out/infra.html +1 -1
  29. sky/dashboard/out/jobs/[job].html +1 -1
  30. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  31. sky/dashboard/out/jobs.html +1 -1
  32. sky/dashboard/out/users.html +1 -1
  33. sky/dashboard/out/volumes.html +1 -1
  34. sky/dashboard/out/workspace/new.html +1 -1
  35. sky/dashboard/out/workspaces/[name].html +1 -1
  36. sky/dashboard/out/workspaces.html +1 -1
  37. sky/global_user_state.py +99 -62
  38. sky/jobs/server/server.py +14 -1
  39. sky/jobs/state.py +26 -1
  40. sky/metrics/utils.py +174 -8
  41. sky/provision/__init__.py +1 -0
  42. sky/provision/docker_utils.py +6 -2
  43. sky/provision/primeintellect/__init__.py +10 -0
  44. sky/provision/primeintellect/config.py +11 -0
  45. sky/provision/primeintellect/instance.py +454 -0
  46. sky/provision/primeintellect/utils.py +398 -0
  47. sky/resources.py +9 -1
  48. sky/schemas/generated/jobsv1_pb2.py +40 -40
  49. sky/schemas/generated/servev1_pb2.py +58 -0
  50. sky/schemas/generated/servev1_pb2.pyi +115 -0
  51. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  52. sky/serve/serve_rpc_utils.py +179 -0
  53. sky/serve/serve_utils.py +29 -12
  54. sky/serve/server/core.py +37 -19
  55. sky/serve/server/impl.py +221 -129
  56. sky/server/metrics.py +52 -158
  57. sky/server/requests/executor.py +12 -8
  58. sky/server/requests/payloads.py +6 -0
  59. sky/server/requests/requests.py +1 -1
  60. sky/server/requests/serializers/encoders.py +3 -2
  61. sky/server/server.py +5 -41
  62. sky/setup_files/dependencies.py +1 -0
  63. sky/skylet/constants.py +10 -5
  64. sky/skylet/job_lib.py +14 -15
  65. sky/skylet/services.py +98 -0
  66. sky/skylet/skylet.py +3 -1
  67. sky/templates/kubernetes-ray.yml.j2 +22 -12
  68. sky/templates/primeintellect-ray.yml.j2 +71 -0
  69. sky/utils/locks.py +41 -10
  70. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/METADATA +36 -35
  71. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/RECORD +76 -64
  72. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  73. sky/dashboard/out/_next/static/chunks/3015-2ea98b57e318bd6e.js +0 -1
  74. sky/dashboard/out/_next/static/chunks/8969-0487dfbf149d9e53.js +0 -1
  75. sky/dashboard/out/_next/static/chunks/9037-f9800e64eb05dd1c.js +0 -6
  76. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  77. /sky/dashboard/out/_next/static/{y8s7LlyyfhMzpzCkxuD2r → VvaUqYDvHOcHZRnvMBmax}/_ssgManifest.js +0 -0
  78. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/WHEEL +0 -0
  79. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/entry_points.txt +0 -0
  80. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/licenses/LICENSE +0 -0
  81. {skypilot_nightly-1.0.0.dev20250916.dist-info → skypilot_nightly-1.0.0.dev20250919.dist-info}/top_level.txt +0 -0
@@ -823,7 +823,8 @@ available_node_types:
823
823
  fi
824
824
  $(prefix_cmd) cp -p "$FUSERMOUNT_PATH" "${FUSERMOUNT_PATH}-original"
825
825
  $(prefix_cmd) ln -sf {{k8s_fusermount_shared_dir}}/fusermount-shim "$FUSERMOUNT_PATH"
826
- FUSERMOUNT3_PATH=$(which fusermount3)
826
+ # "|| true" because fusermount3 is not always available
827
+ FUSERMOUNT3_PATH=$(which fusermount3) || true
827
828
  if [ -z "$FUSERMOUNT3_PATH" ]; then
828
829
  FUSERMOUNT3_PATH="${FUSERMOUNT_PATH}3"
829
830
  fi
@@ -872,11 +873,14 @@ available_node_types:
872
873
 
873
874
  touch /tmp/apt_ssh_setup_complete
874
875
  echo "=== SSH setup completed ==="
875
- ) > /tmp/${STEPS[0]}.log 2>&1 || {
876
- echo "Error: ${STEPS[0]} failed. Continuing anyway..." > /tmp/${STEPS[0]}.failed
876
+ ) > /tmp/${STEPS[0]}.log 2>&1
877
+ if [ "$?" -ne "0" ]; then
878
+ {
879
+ echo "Error: ${STEPS[0]} failed. Continuing anyway..." > /tmp/${STEPS[0]}.failed 2>&1
877
880
  cat /tmp/${STEPS[0]}.log
878
881
  exit 1
879
- }
882
+ }
883
+ fi
880
884
  ) &
881
885
 
882
886
  # STEP 2: Install conda, ray and skypilot (for dependencies); start
@@ -931,11 +935,14 @@ available_node_types:
931
935
  set +e
932
936
  {{ ray_worker_start_command }}
933
937
  fi
934
- ) > /tmp/${STEPS[1]}.log 2>&1 || {
935
- echo "Error: ${STEPS[1]} failed. Continuing anyway..." > /tmp/${STEPS[1]}.failed
938
+ ) > /tmp/${STEPS[1]}.log 2>&1
939
+ if [ "$?" -ne "0" ]; then
940
+ {
941
+ echo "Error: ${STEPS[1]} failed. Continuing anyway..." > /tmp/${STEPS[1]}.failed 2>&1
936
942
  cat /tmp/${STEPS[1]}.log
937
943
  exit 1
938
- }
944
+ }
945
+ fi
939
946
  ) &
940
947
 
941
948
 
@@ -953,11 +960,14 @@ available_node_types:
953
960
  fi;
954
961
  fi;
955
962
  export -p > ~/container_env_var.sh && $(prefix_cmd) mv ~/container_env_var.sh /etc/profile.d/container_env_var.sh
956
- ) > /tmp/${STEPS[2]}.log 2>&1 || {
957
- echo "Error: ${STEPS[2]} failed. Continuing anyway..." > /tmp/${STEPS[2]}.failed
963
+ ) > /tmp/${STEPS[2]}.log 2>&1
964
+ if [ "$?" -ne "0" ]; then
965
+ {
966
+ echo "Error: ${STEPS[2]} failed. Continuing anyway..." > /tmp/${STEPS[2]}.failed 2>&1
958
967
  cat /tmp/${STEPS[2]}.log
959
968
  exit 1
960
- }
969
+ }
970
+ fi
961
971
  ) &
962
972
 
963
973
  function mylsof { p=$(for pid in /proc/{0..9}*; do i=$(basename "$pid"); for file in "$pid"/fd/*; do link=$(readlink -e "$file"); if [ "$link" = "$1" ]; then echo "$i"; fi; done; done); echo "$p"; };
@@ -1324,7 +1334,7 @@ setup_commands:
1324
1334
  if [ -f /tmp/apt_ssh_setup_started ]; then
1325
1335
  echo "=== Logs for asynchronous SSH setup ===";
1326
1336
  [ -f /tmp/apt_ssh_setup_complete ] && cat /tmp/${STEPS[0]}.log ||
1327
- { tail -f -n +1 /tmp/${STEPS[0]}.log & TAIL_PID=$!; echo "Tail PID: $TAIL_PID"; until [ -f /tmp/apt_ssh_setup_complete ]; do sleep 0.5; done; kill $TAIL_PID || true; };
1337
+ { tail -f -n +1 /tmp/${STEPS[0]}.log & TAIL_PID=$!; echo "Tail PID: $TAIL_PID"; until [ -f /tmp/apt_ssh_setup_complete ] || [ -f /tmp/${STEPS[0]}.failed ]; do sleep 0.5; done; kill $TAIL_PID || true; };
1328
1338
  [ -f /tmp/${STEPS[0]}.failed ] && { echo "Error: ${STEPS[0]} failed. Exiting."; exit 1; } || true;
1329
1339
  fi
1330
1340
 
@@ -1332,7 +1342,7 @@ setup_commands:
1332
1342
  if [ -f /tmp/skypilot_is_nimbus ]; then
1333
1343
  echo "=== Logs for asynchronous ray and skypilot installation ===";
1334
1344
  [ -f /tmp/ray_skypilot_installation_complete ] && cat /tmp/${STEPS[1]}.log ||
1335
- { tail -f -n +1 /tmp/${STEPS[1]}.log & TAIL_PID=$!; echo "Tail PID: $TAIL_PID"; until [ -f /tmp/ray_skypilot_installation_complete ]; do sleep 0.5; done; kill $TAIL_PID || true; };
1345
+ { tail -f -n +1 /tmp/${STEPS[1]}.log & TAIL_PID=$!; echo "Tail PID: $TAIL_PID"; until [ -f /tmp/ray_skypilot_installation_complete ] || [ -f /tmp/${STEPS[1]}.failed ]; do sleep 0.5; done; kill $TAIL_PID || true; };
1336
1346
  [ -f /tmp/${STEPS[1]}.failed ] && { echo "Error: ${STEPS[1]} failed. Exiting."; exit 1; } || true;
1337
1347
  fi
1338
1348
  end_epoch=$(date +%s);
@@ -0,0 +1,71 @@
1
+ cluster_name: {{cluster_name_on_cloud}}
2
+
3
+ # The maximum number of workers nodes to launch in addition to the head node.
4
+ max_workers: {{num_nodes - 1}}
5
+ upscaling_speed: {{num_nodes - 1}}
6
+ idle_timeout_minutes: 60
7
+
8
+ provider:
9
+ type: external
10
+ module: sky.provision.primeintellect
11
+ region: "{{region}}"
12
+ zones: "{{zones}}"
13
+
14
+ auth:
15
+ ssh_user: skypilot:ssh_user
16
+ ssh_private_key: {{ssh_private_key}}
17
+
18
+ available_node_types:
19
+ ray_head_default:
20
+ resources: {}
21
+ node_config:
22
+ InstanceType: {{instance_type}}
23
+ DiskSize: {{disk_size}}
24
+ ImageId: {{image_id}}
25
+ PublicKey: |-
26
+ skypilot:ssh_public_key_content
27
+
28
+ head_node_type: ray_head_default
29
+
30
+ # Format: `REMOTE_PATH : LOCAL_PATH`
31
+ file_mounts: {
32
+ "{{sky_ray_yaml_remote_path}}": "{{sky_ray_yaml_local_path}}",
33
+ "{{sky_remote_path}}/{{sky_wheel_hash}}": "{{sky_local_path}}",
34
+ {%- for remote_path, local_path in credentials.items() %}
35
+ "{{remote_path}}": "{{local_path}}",
36
+ "~/.ssh/sky-cluster-key": "{{ssh_private_key}}",
37
+ {%- endfor %}
38
+ }
39
+
40
+ rsync_exclude: []
41
+
42
+ initialization_commands: []
43
+
44
+ # List of shell commands to run to set up nodes.
45
+ # NOTE: these are very performance-sensitive. Each new item opens/closes an SSH
46
+ # connection, which is expensive. Try your best to co-locate commands into fewer
47
+ # items!
48
+ #
49
+ # Increment the following for catching performance bugs easier:
50
+ # current num items (num SSH connections): 1
51
+ setup_commands:
52
+ # Disable unattended-upgrades and handle apt-get locks
53
+ # Install patch utility for Ray
54
+ # Install conda and Ray
55
+ # Set system limits for Ray performance (nofile and TasksMax)
56
+ - {%- for initial_setup_command in initial_setup_commands %}
57
+ {{ initial_setup_command }}
58
+ {%- endfor %}
59
+ sudo systemctl stop unattended-upgrades || true;
60
+ sudo systemctl disable unattended-upgrades || true;
61
+ sudo sed -i 's/Unattended-Upgrade "1"/Unattended-Upgrade "0"/g' /etc/apt/apt.conf.d/20auto-upgrades || true;
62
+ sudo kill -9 `sudo lsof /var/lib/dpkg/lock-frontend | awk '{print $2}' | tail -n 1` || true;
63
+ sudo pkill -9 apt-get;
64
+ sudo pkill -9 dpkg;
65
+ sudo dpkg --configure -a;
66
+ which patch > /dev/null || sudo apt install -y patch;
67
+ {{ conda_installation_commands }}
68
+ {{ ray_skypilot_installation_commands }}
69
+ sudo bash -c 'rm -rf /etc/security/limits.d; echo "* soft nofile 1048576" >> /etc/security/limits.conf; echo "* hard nofile 1048576" >> /etc/security/limits.conf';
70
+ sudo grep -e '^DefaultTasksMax' /etc/systemd/system.conf || (sudo bash -c 'echo "DefaultTasksMax=infinity" >> /etc/systemd/system.conf'); sudo systemctl set-property user-$(id -u $(whoami)).slice TasksMax=infinity; sudo systemctl daemon-reload;
71
+ {{ ssh_max_sessions_config }}
sky/utils/locks.py CHANGED
@@ -11,6 +11,7 @@ import time
11
11
  from typing import Any, Optional
12
12
 
13
13
  import filelock
14
+ import psycopg2
14
15
  import sqlalchemy
15
16
 
16
17
  from sky import global_user_state
@@ -197,6 +198,7 @@ class PostgresLock(DistributedLock):
197
198
  if engine.dialect.name != db_utils.SQLAlchemyDialect.POSTGRESQL.value:
198
199
  raise ValueError('PostgresLock requires PostgreSQL database. '
199
200
  f'Current dialect: {engine.dialect.name}')
201
+ # Borrow a dedicated connection from the pool.
200
202
  return engine.raw_connection()
201
203
 
202
204
  def acquire(self, blocking: bool = True) -> AcquireReturnProxy:
@@ -233,9 +235,7 @@ class PostgresLock(DistributedLock):
233
235
  time.sleep(self.poll_interval)
234
236
 
235
237
  except Exception:
236
- if self._connection:
237
- self._connection.close()
238
- self._connection = None
238
+ self._close_connection()
239
239
  raise
240
240
 
241
241
  def release(self) -> None:
@@ -248,27 +248,58 @@ class PostgresLock(DistributedLock):
248
248
  cursor.execute('SELECT pg_advisory_unlock(%s)', (self._lock_key,))
249
249
  self._connection.commit()
250
250
  self._acquired = False
251
+ except psycopg2.OperationalError as e:
252
+ # Lost connection to the database, likely the lock is force unlocked
253
+ # by other routines.
254
+ logger.debug(f'Failed to release postgres lock {self.lock_id}: {e}')
251
255
  finally:
252
- if self._connection:
253
- self._connection.close()
254
- self._connection = None
256
+ self._close_connection()
255
257
 
256
258
  def force_unlock(self) -> None:
257
259
  """Force unlock the postgres advisory lock."""
258
260
  try:
259
- if not self._connection:
261
+ # The lock is held by current routine, gracefully unlock it
262
+ if self._acquired:
263
+ self.release()
264
+ return
265
+
266
+ # The lock is held by another routine, force unlock it.
267
+ if self._connection is None:
260
268
  self._connection = self._get_connection()
261
269
  cursor = self._connection.cursor()
262
270
  cursor.execute('SELECT pg_advisory_unlock(%s)', (self._lock_key,))
263
- self._connection.commit()
271
+ result = cursor.fetchone()[0]
272
+ if result:
273
+ # The lock is held by current routine and unlock suceed
274
+ self._connection.commit()
275
+ self._acquired = False
276
+ return
277
+ cursor.execute(
278
+ ('SELECT pid FROM pg_locks WHERE locktype = \'advisory\' '
279
+ 'AND ((classid::bigint << 32) | objid::bigint) = %s'),
280
+ (self._lock_key,))
281
+ row = cursor.fetchone()
282
+ if row:
283
+ # The lock is still held by another routine, false unlock it
284
+ # by killing the PG connection of that routine.
285
+ cursor.execute('SELECT pg_terminate_backend(%s)', (row[0],))
286
+ self._connection.commit()
287
+ return
264
288
  except Exception as e:
265
289
  raise RuntimeError(
266
290
  f'Failed to force unlock postgres lock {self.lock_id}: {e}'
267
291
  ) from e
268
292
  finally:
269
- if self._connection:
293
+ self._close_connection()
294
+
295
+ def _close_connection(self) -> None:
296
+ """Close the postgres connection."""
297
+ if self._connection:
298
+ try:
270
299
  self._connection.close()
271
- self._connection = None
300
+ except Exception as e: # pylint: disable=broad-except
301
+ logger.debug(f'Failed to close postgres connection: {e}')
302
+ self._connection = None
272
303
 
273
304
  def is_locked(self) -> bool:
274
305
  """Check if the postgres advisory lock is acquired."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250916
3
+ Version: 1.0.0.dev20250919
4
4
  Summary: SkyPilot: Run AI on Any Infra — Unified, Faster, Cheaper.
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -121,6 +121,7 @@ Provides-Extra: fluidstack
121
121
  Provides-Extra: cudo
122
122
  Requires-Dist: cudo-compute>=0.1.10; extra == "cudo"
123
123
  Provides-Extra: paperspace
124
+ Provides-Extra: primeintellect
124
125
  Provides-Extra: do
125
126
  Requires-Dist: pydo>=0.3.0; extra == "do"
126
127
  Requires-Dist: azure-core>=1.24.0; extra == "do"
@@ -151,49 +152,49 @@ Requires-Dist: grpcio>=1.63.0; extra == "server"
151
152
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "server"
152
153
  Requires-Dist: aiosqlite; extra == "server"
153
154
  Provides-Extra: all
154
- Requires-Dist: boto3>=1.26.1; extra == "all"
155
- Requires-Dist: colorama<0.4.5; extra == "all"
156
- Requires-Dist: msgraph-sdk; extra == "all"
157
- Requires-Dist: pyjwt; extra == "all"
155
+ Requires-Dist: docker; extra == "all"
158
156
  Requires-Dist: google-api-python-client>=2.69.0; extra == "all"
159
- Requires-Dist: passlib; extra == "all"
160
- Requires-Dist: ecsapi>=0.2.0; extra == "all"
161
- Requires-Dist: azure-common; extra == "all"
162
- Requires-Dist: grpcio>=1.63.0; extra == "all"
163
- Requires-Dist: ibm-vpc; extra == "all"
164
- Requires-Dist: cudo-compute>=0.1.10; extra == "all"
165
- Requires-Dist: azure-core>=1.24.0; extra == "all"
166
- Requires-Dist: ibm-cos-sdk; extra == "all"
167
- Requires-Dist: azure-identity>=1.19.0; extra == "all"
157
+ Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
158
+ Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
168
159
  Requires-Dist: kubernetes!=32.0.0,>=20.0.0; extra == "all"
169
160
  Requires-Dist: nebius>=0.2.47; extra == "all"
161
+ Requires-Dist: azure-core>=1.24.0; extra == "all"
162
+ Requires-Dist: ibm-cos-sdk; extra == "all"
163
+ Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
164
+ Requires-Dist: boto3>=1.26.1; extra == "all"
165
+ Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
166
+ Requires-Dist: azure-core>=1.31.0; extra == "all"
167
+ Requires-Dist: passlib; extra == "all"
170
168
  Requires-Dist: protobuf<7.0.0,>=5.26.1; extra == "all"
171
- Requires-Dist: msrestazure; extra == "all"
172
169
  Requires-Dist: oci; extra == "all"
173
- Requires-Dist: azure-core>=1.31.0; extra == "all"
174
- Requires-Dist: ray[default]>=2.6.1; extra == "all"
170
+ Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
175
171
  Requires-Dist: google-cloud-storage; extra == "all"
176
- Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
172
+ Requires-Dist: sqlalchemy_adapter; extra == "all"
173
+ Requires-Dist: runpod>=1.6.1; extra == "all"
174
+ Requires-Dist: azure-common; extra == "all"
177
175
  Requires-Dist: ibm-cloud-sdk-core; extra == "all"
178
176
  Requires-Dist: awscli>=1.27.10; extra == "all"
179
- Requires-Dist: aiosqlite; extra == "all"
180
- Requires-Dist: pyvmomi==8.0.1.0.2; extra == "all"
181
- Requires-Dist: websockets; extra == "all"
182
- Requires-Dist: sqlalchemy_adapter; extra == "all"
183
- Requires-Dist: python-dateutil; extra == "all"
184
- Requires-Dist: azure-cli>=2.65.0; extra == "all"
185
- Requires-Dist: pyopenssl<24.3.0,>=23.2.0; extra == "all"
186
- Requires-Dist: vastai-sdk>=0.1.12; extra == "all"
187
- Requires-Dist: docker; extra == "all"
188
- Requires-Dist: azure-storage-blob>=12.23.1; extra == "all"
189
- Requires-Dist: aiohttp; extra == "all"
190
- Requires-Dist: ibm-platform-services>=0.48.0; extra == "all"
177
+ Requires-Dist: ray[default]>=2.6.1; extra == "all"
178
+ Requires-Dist: msgraph-sdk; extra == "all"
179
+ Requires-Dist: ecsapi>=0.2.0; extra == "all"
191
180
  Requires-Dist: azure-mgmt-compute>=33.0.0; extra == "all"
192
- Requires-Dist: pydo>=0.3.0; extra == "all"
193
- Requires-Dist: runpod>=1.6.1; extra == "all"
194
181
  Requires-Dist: botocore>=1.29.10; extra == "all"
182
+ Requires-Dist: ibm-vpc; extra == "all"
183
+ Requires-Dist: azure-mgmt-network>=27.0.0; extra == "all"
184
+ Requires-Dist: cudo-compute>=0.1.10; extra == "all"
185
+ Requires-Dist: colorama<0.4.5; extra == "all"
186
+ Requires-Dist: azure-cli>=2.65.0; extra == "all"
187
+ Requires-Dist: python-dateutil; extra == "all"
188
+ Requires-Dist: aiohttp; extra == "all"
189
+ Requires-Dist: aiosqlite; extra == "all"
195
190
  Requires-Dist: anyio; extra == "all"
191
+ Requires-Dist: pyjwt; extra == "all"
192
+ Requires-Dist: websockets; extra == "all"
193
+ Requires-Dist: azure-identity>=1.19.0; extra == "all"
194
+ Requires-Dist: grpcio>=1.63.0; extra == "all"
195
+ Requires-Dist: msrestazure; extra == "all"
196
196
  Requires-Dist: casbin; extra == "all"
197
+ Requires-Dist: pydo>=0.3.0; extra == "all"
197
198
  Dynamic: author
198
199
  Dynamic: classifier
199
200
  Dynamic: description
@@ -291,12 +292,12 @@ SkyPilot supports your existing GPU, TPU, and CPU workloads, with no code change
291
292
  Install with pip:
292
293
  ```bash
293
294
  # Choose your clouds:
294
- pip install -U "skypilot[kubernetes,aws,gcp,azure,oci,nebius,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp]"
295
+ pip install -U "skypilot[kubernetes,aws,gcp,azure,oci,nebius,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp,seeweb]"
295
296
  ```
296
297
  To get the latest features and fixes, use the nightly build or [install from source](https://docs.skypilot.co/en/latest/getting-started/installation.html):
297
298
  ```bash
298
299
  # Choose your clouds:
299
- pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,nebius,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp]"
300
+ pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,nebius,lambda,runpod,fluidstack,paperspace,cudo,ibm,scp,seeweb]"
300
301
  ```
301
302
 
302
303
  <p align="center">
@@ -305,7 +306,7 @@ pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,nebius,lambda,runpod,
305
306
 
306
307
  Current supported infra: Kubernetes, AWS, GCP, Azure, OCI, Nebius, Lambda Cloud, RunPod, Fluidstack,
307
308
  Cudo, Digital Ocean, Paperspace, Cloudflare, Samsung, IBM, Vast.ai,
308
- VMware vSphere.
309
+ VMware vSphere, Seeweb.
309
310
  <p align="center">
310
311
  <img alt="SkyPilot" src="https://raw.githubusercontent.com/skypilot-org/skypilot/master/docs/source/images/cloud-logos-light.png" width=85%>
311
312
  </p>