skypilot-nightly 1.0.0.dev20250905__py3-none-any.whl → 1.0.0.dev20251203__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.
Files changed (397) hide show
  1. sky/__init__.py +10 -2
  2. sky/adaptors/aws.py +81 -16
  3. sky/adaptors/common.py +25 -2
  4. sky/adaptors/coreweave.py +278 -0
  5. sky/adaptors/do.py +8 -2
  6. sky/adaptors/gcp.py +11 -0
  7. sky/adaptors/ibm.py +5 -2
  8. sky/adaptors/kubernetes.py +64 -0
  9. sky/adaptors/nebius.py +3 -1
  10. sky/adaptors/primeintellect.py +1 -0
  11. sky/adaptors/seeweb.py +183 -0
  12. sky/adaptors/shadeform.py +89 -0
  13. sky/admin_policy.py +20 -0
  14. sky/authentication.py +157 -263
  15. sky/backends/__init__.py +3 -2
  16. sky/backends/backend.py +11 -3
  17. sky/backends/backend_utils.py +588 -184
  18. sky/backends/cloud_vm_ray_backend.py +1088 -904
  19. sky/backends/local_docker_backend.py +9 -5
  20. sky/backends/task_codegen.py +633 -0
  21. sky/backends/wheel_utils.py +18 -0
  22. sky/catalog/__init__.py +8 -0
  23. sky/catalog/aws_catalog.py +4 -0
  24. sky/catalog/common.py +19 -1
  25. sky/catalog/data_fetchers/fetch_aws.py +102 -80
  26. sky/catalog/data_fetchers/fetch_gcp.py +30 -3
  27. sky/catalog/data_fetchers/fetch_nebius.py +9 -6
  28. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  29. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  30. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  31. sky/catalog/kubernetes_catalog.py +24 -28
  32. sky/catalog/primeintellect_catalog.py +95 -0
  33. sky/catalog/runpod_catalog.py +5 -1
  34. sky/catalog/seeweb_catalog.py +184 -0
  35. sky/catalog/shadeform_catalog.py +165 -0
  36. sky/check.py +73 -43
  37. sky/client/cli/command.py +675 -412
  38. sky/client/cli/flags.py +4 -2
  39. sky/{volumes/utils.py → client/cli/table_utils.py} +111 -13
  40. sky/client/cli/utils.py +79 -0
  41. sky/client/common.py +12 -2
  42. sky/client/sdk.py +132 -63
  43. sky/client/sdk_async.py +34 -33
  44. sky/cloud_stores.py +82 -3
  45. sky/clouds/__init__.py +6 -0
  46. sky/clouds/aws.py +337 -129
  47. sky/clouds/azure.py +24 -18
  48. sky/clouds/cloud.py +40 -13
  49. sky/clouds/cudo.py +16 -13
  50. sky/clouds/do.py +9 -7
  51. sky/clouds/fluidstack.py +12 -5
  52. sky/clouds/gcp.py +14 -7
  53. sky/clouds/hyperbolic.py +12 -5
  54. sky/clouds/ibm.py +12 -5
  55. sky/clouds/kubernetes.py +80 -45
  56. sky/clouds/lambda_cloud.py +12 -5
  57. sky/clouds/nebius.py +23 -9
  58. sky/clouds/oci.py +19 -12
  59. sky/clouds/paperspace.py +4 -1
  60. sky/clouds/primeintellect.py +317 -0
  61. sky/clouds/runpod.py +85 -24
  62. sky/clouds/scp.py +12 -8
  63. sky/clouds/seeweb.py +477 -0
  64. sky/clouds/shadeform.py +400 -0
  65. sky/clouds/ssh.py +4 -2
  66. sky/clouds/utils/scp_utils.py +61 -50
  67. sky/clouds/vast.py +33 -27
  68. sky/clouds/vsphere.py +14 -16
  69. sky/core.py +174 -165
  70. sky/dashboard/out/404.html +1 -1
  71. sky/dashboard/out/_next/static/96_E2yl3QAiIJGOYCkSpB/_buildManifest.js +1 -0
  72. sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
  73. sky/dashboard/out/_next/static/chunks/1871-7e202677c42f43fe.js +6 -0
  74. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  75. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  76. sky/dashboard/out/_next/static/chunks/2755.edd818326d489a1d.js +26 -0
  77. sky/dashboard/out/_next/static/chunks/3294.20a8540fe697d5ee.js +1 -0
  78. sky/dashboard/out/_next/static/chunks/3785.7e245f318f9d1121.js +1 -0
  79. sky/dashboard/out/_next/static/chunks/{6601-06114c982db410b6.js → 3800-7b45f9fbb6308557.js} +1 -1
  80. sky/dashboard/out/_next/static/chunks/4725.172ede95d1b21022.js +1 -0
  81. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  82. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  83. sky/dashboard/out/_next/static/chunks/6856-8f27d1c10c98def8.js +1 -0
  84. sky/dashboard/out/_next/static/chunks/6990-9146207c4567fdfd.js +1 -0
  85. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  86. sky/dashboard/out/_next/static/chunks/7615-019513abc55b3b47.js +1 -0
  87. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  88. sky/dashboard/out/_next/static/chunks/8969-452f9d5cbdd2dc73.js +1 -0
  89. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  90. sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
  91. sky/dashboard/out/_next/static/chunks/9360.a536cf6b1fa42355.js +31 -0
  92. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  93. sky/dashboard/out/_next/static/chunks/pages/{_app-ce361c6959bc2001.js → _app-bde01e4a2beec258.js} +1 -1
  94. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-792db96d918c98c9.js +16 -0
  95. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-abfcac9c137aa543.js +1 -0
  96. sky/dashboard/out/_next/static/chunks/pages/clusters-ee39056f9851a3ff.js +1 -0
  97. sky/dashboard/out/_next/static/chunks/pages/infra/{[context]-6563820e094f68ca.js → [context]-c0b5935149902e6f.js} +1 -1
  98. sky/dashboard/out/_next/static/chunks/pages/{infra-aabba60d57826e0f.js → infra-aed0ea19df7cf961.js} +1 -1
  99. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-d66997e2bfc837cf.js +16 -0
  100. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-9faf940b253e3e06.js +21 -0
  101. sky/dashboard/out/_next/static/chunks/pages/jobs-2072b48b617989c9.js +1 -0
  102. sky/dashboard/out/_next/static/chunks/pages/users-f42674164aa73423.js +1 -0
  103. sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
  104. sky/dashboard/out/_next/static/chunks/pages/workspaces/{[name]-af76bb06dbb3954f.js → [name]-84a40f8c7c627fe4.js} +1 -1
  105. sky/dashboard/out/_next/static/chunks/pages/{workspaces-7598c33a746cdc91.js → workspaces-531b2f8c4bf89f82.js} +1 -1
  106. sky/dashboard/out/_next/static/chunks/webpack-64e05f17bf2cf8ce.js +1 -0
  107. sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
  108. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  109. sky/dashboard/out/clusters/[cluster].html +1 -1
  110. sky/dashboard/out/clusters.html +1 -1
  111. sky/dashboard/out/config.html +1 -1
  112. sky/dashboard/out/index.html +1 -1
  113. sky/dashboard/out/infra/[context].html +1 -1
  114. sky/dashboard/out/infra.html +1 -1
  115. sky/dashboard/out/jobs/[job].html +1 -1
  116. sky/dashboard/out/jobs/pools/[pool].html +1 -1
  117. sky/dashboard/out/jobs.html +1 -1
  118. sky/dashboard/out/users.html +1 -1
  119. sky/dashboard/out/volumes.html +1 -1
  120. sky/dashboard/out/workspace/new.html +1 -1
  121. sky/dashboard/out/workspaces/[name].html +1 -1
  122. sky/dashboard/out/workspaces.html +1 -1
  123. sky/data/data_utils.py +92 -1
  124. sky/data/mounting_utils.py +162 -29
  125. sky/data/storage.py +200 -19
  126. sky/data/storage_utils.py +10 -45
  127. sky/exceptions.py +18 -7
  128. sky/execution.py +74 -31
  129. sky/global_user_state.py +605 -191
  130. sky/jobs/__init__.py +2 -0
  131. sky/jobs/client/sdk.py +101 -4
  132. sky/jobs/client/sdk_async.py +31 -5
  133. sky/jobs/constants.py +15 -8
  134. sky/jobs/controller.py +726 -284
  135. sky/jobs/file_content_utils.py +128 -0
  136. sky/jobs/log_gc.py +193 -0
  137. sky/jobs/recovery_strategy.py +250 -100
  138. sky/jobs/scheduler.py +271 -173
  139. sky/jobs/server/core.py +367 -114
  140. sky/jobs/server/server.py +81 -35
  141. sky/jobs/server/utils.py +89 -35
  142. sky/jobs/state.py +1498 -620
  143. sky/jobs/utils.py +771 -306
  144. sky/logs/agent.py +40 -5
  145. sky/logs/aws.py +9 -19
  146. sky/metrics/utils.py +282 -39
  147. sky/optimizer.py +1 -1
  148. sky/provision/__init__.py +37 -1
  149. sky/provision/aws/config.py +34 -13
  150. sky/provision/aws/instance.py +5 -2
  151. sky/provision/azure/instance.py +5 -3
  152. sky/provision/common.py +2 -0
  153. sky/provision/cudo/instance.py +4 -3
  154. sky/provision/do/instance.py +4 -3
  155. sky/provision/docker_utils.py +97 -26
  156. sky/provision/fluidstack/instance.py +6 -5
  157. sky/provision/gcp/config.py +6 -1
  158. sky/provision/gcp/instance.py +4 -2
  159. sky/provision/hyperbolic/instance.py +4 -2
  160. sky/provision/instance_setup.py +66 -20
  161. sky/provision/kubernetes/__init__.py +2 -0
  162. sky/provision/kubernetes/config.py +7 -44
  163. sky/provision/kubernetes/constants.py +0 -1
  164. sky/provision/kubernetes/instance.py +609 -213
  165. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  166. sky/provision/kubernetes/network.py +12 -8
  167. sky/provision/kubernetes/network_utils.py +8 -25
  168. sky/provision/kubernetes/utils.py +382 -418
  169. sky/provision/kubernetes/volume.py +150 -18
  170. sky/provision/lambda_cloud/instance.py +16 -13
  171. sky/provision/nebius/instance.py +6 -2
  172. sky/provision/nebius/utils.py +103 -86
  173. sky/provision/oci/instance.py +4 -2
  174. sky/provision/paperspace/instance.py +4 -3
  175. sky/provision/primeintellect/__init__.py +10 -0
  176. sky/provision/primeintellect/config.py +11 -0
  177. sky/provision/primeintellect/instance.py +454 -0
  178. sky/provision/primeintellect/utils.py +398 -0
  179. sky/provision/provisioner.py +30 -9
  180. sky/provision/runpod/__init__.py +2 -0
  181. sky/provision/runpod/instance.py +4 -3
  182. sky/provision/runpod/volume.py +69 -13
  183. sky/provision/scp/instance.py +307 -130
  184. sky/provision/seeweb/__init__.py +11 -0
  185. sky/provision/seeweb/config.py +13 -0
  186. sky/provision/seeweb/instance.py +812 -0
  187. sky/provision/shadeform/__init__.py +11 -0
  188. sky/provision/shadeform/config.py +12 -0
  189. sky/provision/shadeform/instance.py +351 -0
  190. sky/provision/shadeform/shadeform_utils.py +83 -0
  191. sky/provision/vast/instance.py +5 -3
  192. sky/provision/volume.py +164 -0
  193. sky/provision/vsphere/common/ssl_helper.py +1 -1
  194. sky/provision/vsphere/common/vapiconnect.py +2 -1
  195. sky/provision/vsphere/common/vim_utils.py +3 -2
  196. sky/provision/vsphere/instance.py +8 -6
  197. sky/provision/vsphere/vsphere_utils.py +8 -1
  198. sky/resources.py +11 -3
  199. sky/schemas/api/responses.py +107 -6
  200. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  201. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  202. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  203. sky/schemas/db/global_user_state/011_is_ephemeral.py +34 -0
  204. sky/schemas/db/kv_cache/001_initial_schema.py +29 -0
  205. sky/schemas/db/serve_state/002_yaml_content.py +34 -0
  206. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  207. sky/schemas/db/spot_jobs/002_cluster_pool.py +3 -3
  208. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  209. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  210. sky/schemas/db/spot_jobs/006_controller_pid_started_at.py +34 -0
  211. sky/schemas/db/spot_jobs/007_config_file_content.py +34 -0
  212. sky/schemas/generated/jobsv1_pb2.py +86 -0
  213. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  214. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  215. sky/schemas/generated/managed_jobsv1_pb2.py +76 -0
  216. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  217. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  218. sky/schemas/generated/servev1_pb2.py +58 -0
  219. sky/schemas/generated/servev1_pb2.pyi +115 -0
  220. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  221. sky/serve/autoscalers.py +2 -0
  222. sky/serve/client/impl.py +55 -21
  223. sky/serve/constants.py +4 -3
  224. sky/serve/controller.py +17 -11
  225. sky/serve/load_balancing_policies.py +1 -1
  226. sky/serve/replica_managers.py +219 -142
  227. sky/serve/serve_rpc_utils.py +179 -0
  228. sky/serve/serve_state.py +63 -54
  229. sky/serve/serve_utils.py +145 -109
  230. sky/serve/server/core.py +46 -25
  231. sky/serve/server/impl.py +311 -162
  232. sky/serve/server/server.py +21 -19
  233. sky/serve/service.py +84 -68
  234. sky/serve/service_spec.py +45 -7
  235. sky/server/auth/loopback.py +38 -0
  236. sky/server/auth/oauth2_proxy.py +12 -7
  237. sky/server/common.py +47 -24
  238. sky/server/config.py +62 -28
  239. sky/server/constants.py +9 -1
  240. sky/server/daemons.py +109 -38
  241. sky/server/metrics.py +76 -96
  242. sky/server/middleware_utils.py +166 -0
  243. sky/server/requests/executor.py +381 -145
  244. sky/server/requests/payloads.py +71 -18
  245. sky/server/requests/preconditions.py +15 -13
  246. sky/server/requests/request_names.py +121 -0
  247. sky/server/requests/requests.py +507 -157
  248. sky/server/requests/serializers/decoders.py +48 -17
  249. sky/server/requests/serializers/encoders.py +85 -20
  250. sky/server/requests/threads.py +117 -0
  251. sky/server/rest.py +116 -24
  252. sky/server/server.py +420 -172
  253. sky/server/stream_utils.py +219 -45
  254. sky/server/uvicorn.py +30 -19
  255. sky/setup_files/MANIFEST.in +6 -1
  256. sky/setup_files/alembic.ini +8 -0
  257. sky/setup_files/dependencies.py +62 -19
  258. sky/setup_files/setup.py +44 -44
  259. sky/sky_logging.py +13 -5
  260. sky/skylet/attempt_skylet.py +106 -24
  261. sky/skylet/configs.py +3 -1
  262. sky/skylet/constants.py +111 -26
  263. sky/skylet/events.py +64 -10
  264. sky/skylet/job_lib.py +141 -104
  265. sky/skylet/log_lib.py +233 -5
  266. sky/skylet/log_lib.pyi +40 -2
  267. sky/skylet/providers/ibm/node_provider.py +12 -8
  268. sky/skylet/providers/ibm/vpc_provider.py +13 -12
  269. sky/skylet/runtime_utils.py +21 -0
  270. sky/skylet/services.py +524 -0
  271. sky/skylet/skylet.py +22 -1
  272. sky/skylet/subprocess_daemon.py +104 -29
  273. sky/skypilot_config.py +99 -79
  274. sky/ssh_node_pools/server.py +9 -8
  275. sky/task.py +221 -104
  276. sky/templates/aws-ray.yml.j2 +1 -0
  277. sky/templates/azure-ray.yml.j2 +1 -0
  278. sky/templates/cudo-ray.yml.j2 +1 -0
  279. sky/templates/do-ray.yml.j2 +1 -0
  280. sky/templates/fluidstack-ray.yml.j2 +1 -0
  281. sky/templates/gcp-ray.yml.j2 +1 -0
  282. sky/templates/hyperbolic-ray.yml.j2 +1 -0
  283. sky/templates/ibm-ray.yml.j2 +2 -1
  284. sky/templates/jobs-controller.yaml.j2 +3 -0
  285. sky/templates/kubernetes-ray.yml.j2 +196 -55
  286. sky/templates/lambda-ray.yml.j2 +1 -0
  287. sky/templates/nebius-ray.yml.j2 +3 -0
  288. sky/templates/oci-ray.yml.j2 +1 -0
  289. sky/templates/paperspace-ray.yml.j2 +1 -0
  290. sky/templates/primeintellect-ray.yml.j2 +72 -0
  291. sky/templates/runpod-ray.yml.j2 +1 -0
  292. sky/templates/scp-ray.yml.j2 +1 -0
  293. sky/templates/seeweb-ray.yml.j2 +171 -0
  294. sky/templates/shadeform-ray.yml.j2 +73 -0
  295. sky/templates/vast-ray.yml.j2 +1 -0
  296. sky/templates/vsphere-ray.yml.j2 +1 -0
  297. sky/templates/websocket_proxy.py +188 -43
  298. sky/usage/usage_lib.py +16 -4
  299. sky/users/permission.py +60 -43
  300. sky/utils/accelerator_registry.py +6 -3
  301. sky/utils/admin_policy_utils.py +18 -5
  302. sky/utils/annotations.py +22 -0
  303. sky/utils/asyncio_utils.py +78 -0
  304. sky/utils/atomic.py +1 -1
  305. sky/utils/auth_utils.py +153 -0
  306. sky/utils/cli_utils/status_utils.py +12 -7
  307. sky/utils/cluster_utils.py +28 -6
  308. sky/utils/command_runner.py +88 -27
  309. sky/utils/command_runner.pyi +36 -3
  310. sky/utils/common.py +3 -1
  311. sky/utils/common_utils.py +37 -4
  312. sky/utils/config_utils.py +1 -14
  313. sky/utils/context.py +127 -40
  314. sky/utils/context_utils.py +73 -18
  315. sky/utils/controller_utils.py +229 -70
  316. sky/utils/db/db_utils.py +95 -18
  317. sky/utils/db/kv_cache.py +149 -0
  318. sky/utils/db/migration_utils.py +24 -7
  319. sky/utils/env_options.py +4 -0
  320. sky/utils/git.py +559 -1
  321. sky/utils/kubernetes/create_cluster.sh +15 -30
  322. sky/utils/kubernetes/delete_cluster.sh +10 -7
  323. sky/utils/kubernetes/{deploy_remote_cluster.py → deploy_ssh_node_pools.py} +258 -380
  324. sky/utils/kubernetes/generate_kind_config.py +6 -66
  325. sky/utils/kubernetes/gpu_labeler.py +13 -3
  326. sky/utils/kubernetes/k8s_gpu_labeler_job.yaml +2 -1
  327. sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml +16 -16
  328. sky/utils/kubernetes/kubernetes_deploy_utils.py +213 -194
  329. sky/utils/kubernetes/rsync_helper.sh +11 -3
  330. sky/utils/kubernetes_enums.py +7 -15
  331. sky/utils/lock_events.py +4 -4
  332. sky/utils/locks.py +128 -31
  333. sky/utils/log_utils.py +0 -319
  334. sky/utils/resource_checker.py +13 -10
  335. sky/utils/resources_utils.py +53 -29
  336. sky/utils/rich_utils.py +8 -4
  337. sky/utils/schemas.py +107 -52
  338. sky/utils/subprocess_utils.py +17 -4
  339. sky/utils/thread_utils.py +91 -0
  340. sky/utils/timeline.py +2 -1
  341. sky/utils/ux_utils.py +35 -1
  342. sky/utils/volume.py +88 -4
  343. sky/utils/yaml_utils.py +9 -0
  344. sky/volumes/client/sdk.py +48 -10
  345. sky/volumes/server/core.py +59 -22
  346. sky/volumes/server/server.py +46 -17
  347. sky/volumes/volume.py +54 -42
  348. sky/workspaces/core.py +57 -21
  349. sky/workspaces/server.py +13 -12
  350. sky_templates/README.md +3 -0
  351. sky_templates/__init__.py +3 -0
  352. sky_templates/ray/__init__.py +0 -0
  353. sky_templates/ray/start_cluster +183 -0
  354. sky_templates/ray/stop_cluster +75 -0
  355. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/METADATA +331 -65
  356. skypilot_nightly-1.0.0.dev20251203.dist-info/RECORD +611 -0
  357. skypilot_nightly-1.0.0.dev20251203.dist-info/top_level.txt +2 -0
  358. sky/client/cli/git.py +0 -549
  359. sky/dashboard/out/_next/static/chunks/1121-408ed10b2f9fce17.js +0 -1
  360. sky/dashboard/out/_next/static/chunks/1141-943efc7aff0f0c06.js +0 -1
  361. sky/dashboard/out/_next/static/chunks/1836-37fede578e2da5f8.js +0 -40
  362. sky/dashboard/out/_next/static/chunks/3015-86cabed5d4669ad0.js +0 -1
  363. sky/dashboard/out/_next/static/chunks/3294.c80326aec9bfed40.js +0 -6
  364. sky/dashboard/out/_next/static/chunks/3785.4872a2f3aa489880.js +0 -1
  365. sky/dashboard/out/_next/static/chunks/4045.b30465273dc5e468.js +0 -21
  366. sky/dashboard/out/_next/static/chunks/4676-9da7fdbde90b5549.js +0 -10
  367. sky/dashboard/out/_next/static/chunks/4725.10f7a9a5d3ea8208.js +0 -1
  368. sky/dashboard/out/_next/static/chunks/5339.3fda4a4010ff4e06.js +0 -51
  369. sky/dashboard/out/_next/static/chunks/6135-4b4d5e824b7f9d3c.js +0 -1
  370. sky/dashboard/out/_next/static/chunks/649.b9d7f7d10c1b8c53.js +0 -45
  371. sky/dashboard/out/_next/static/chunks/6856-dca7962af4814e1b.js +0 -1
  372. sky/dashboard/out/_next/static/chunks/6990-08b2a1cae076a943.js +0 -1
  373. sky/dashboard/out/_next/static/chunks/7325.b4bc99ce0892dcd5.js +0 -6
  374. sky/dashboard/out/_next/static/chunks/754-d0da8ab45f9509e9.js +0 -18
  375. sky/dashboard/out/_next/static/chunks/7669.1f5d9a402bf5cc42.js +0 -36
  376. sky/dashboard/out/_next/static/chunks/8969-0be3036bf86f8256.js +0 -1
  377. sky/dashboard/out/_next/static/chunks/9025.c12318fb6a1a9093.js +0 -6
  378. sky/dashboard/out/_next/static/chunks/9037-fa1737818d0a0969.js +0 -6
  379. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-1cbba24bd1bd35f8.js +0 -16
  380. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-0b4b35dc1dfe046c.js +0 -16
  381. sky/dashboard/out/_next/static/chunks/pages/clusters-469814d711d63b1b.js +0 -1
  382. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-dd64309c3fe67ed2.js +0 -11
  383. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-07349868f7905d37.js +0 -16
  384. sky/dashboard/out/_next/static/chunks/pages/jobs-1f70d9faa564804f.js +0 -1
  385. sky/dashboard/out/_next/static/chunks/pages/users-018bf31cda52e11b.js +0 -1
  386. sky/dashboard/out/_next/static/chunks/pages/volumes-739726d6b823f532.js +0 -1
  387. sky/dashboard/out/_next/static/chunks/webpack-4fe903277b57b523.js +0 -1
  388. sky/dashboard/out/_next/static/css/4614e06482d7309e.css +0 -3
  389. sky/dashboard/out/_next/static/mS-4qZPSkRuA1u-g2wQhg/_buildManifest.js +0 -1
  390. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  391. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  392. skypilot_nightly-1.0.0.dev20250905.dist-info/RECORD +0 -547
  393. skypilot_nightly-1.0.0.dev20250905.dist-info/top_level.txt +0 -1
  394. /sky/dashboard/out/_next/static/{mS-4qZPSkRuA1u-g2wQhg → 96_E2yl3QAiIJGOYCkSpB}/_ssgManifest.js +0 -0
  395. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/WHEEL +0 -0
  396. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/entry_points.txt +0 -0
  397. {skypilot_nightly-1.0.0.dev20250905.dist-info → skypilot_nightly-1.0.0.dev20251203.dist-info}/licenses/LICENSE +0 -0
sky/clouds/scp.py CHANGED
@@ -41,10 +41,7 @@ class SCP(clouds.Cloud):
41
41
  # Reference: https://cloud.samsungsds.com/openapiguide/#/docs
42
42
  # /v2-en-virtual_server-definitions-VirtualServerCreateV3Request
43
43
  _MAX_CLUSTER_NAME_LEN_LIMIT = 28
44
- # MULTI_NODE: Multi-node is not supported by the implementation yet.
45
- _MULTI_NODE = 'Multi-node is not supported by the SCP Cloud yet.'
46
44
  _CLOUD_UNSUPPORTED_FEATURES = {
47
- clouds.CloudImplementationFeatures.MULTI_NODE: _MULTI_NODE,
48
45
  clouds.CloudImplementationFeatures.CLONE_DISK_FROM_CLUSTER:
49
46
  (f'Migrating disk is currently not supported on {_REPR}.'),
50
47
  clouds.CloudImplementationFeatures.IMAGE_ID:
@@ -74,7 +71,9 @@ class SCP(clouds.Cloud):
74
71
 
75
72
  @classmethod
76
73
  def _unsupported_features_for_resources(
77
- cls, resources: 'resources_lib.Resources'
74
+ cls,
75
+ resources: 'resources_lib.Resources',
76
+ region: Optional[str] = None,
78
77
  ) -> Dict[clouds.CloudImplementationFeatures, str]:
79
78
  features = cls._CLOUD_UNSUPPORTED_FEATURES
80
79
  if resources.use_spot:
@@ -92,10 +91,15 @@ class SCP(clouds.Cloud):
92
91
  return catalog.regions(clouds='scp')
93
92
 
94
93
  @classmethod
95
- def regions_with_offering(cls, instance_type: Optional[str],
96
- accelerators: Optional[Dict[str, int]],
97
- use_spot: bool, region: Optional[str],
98
- zone: Optional[str]) -> List[clouds.Region]:
94
+ def regions_with_offering(
95
+ cls,
96
+ instance_type: Optional[str],
97
+ accelerators: Optional[Dict[str, int]],
98
+ use_spot: bool,
99
+ region: Optional[str],
100
+ zone: Optional[str],
101
+ resources: Optional['resources_lib.Resources'] = None,
102
+ ) -> List[clouds.Region]:
99
103
 
100
104
  del accelerators, zone # unused
101
105
  if use_spot:
sky/clouds/seeweb.py ADDED
@@ -0,0 +1,477 @@
1
+ """Seeweb Cloud
2
+
3
+ History:
4
+ @ Aug 6, 2025: Initial version of the integration.
5
+ - Francesco Massa
6
+ - Marco Cristofanilli (marco.cATseeweb.it)
7
+
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import typing
13
+ from typing import Any, Dict, Iterator, List, Optional, Tuple, Union
14
+
15
+ from sky import catalog
16
+ from sky import clouds
17
+ from sky import sky_logging
18
+ from sky.adaptors import seeweb as seeweb_adaptor
19
+ from sky.provision import seeweb as seeweb_provision
20
+ from sky.utils import registry
21
+ from sky.utils import resources_utils
22
+ from sky.utils import ux_utils
23
+
24
+ if typing.TYPE_CHECKING:
25
+ from sky import resources as resources_lib
26
+ from sky.utils import status_lib
27
+ from sky.utils import volume as volume_lib
28
+
29
+ # ---------- key file path -----------------
30
+ _SEEWEB_KEY_FILE = '~/.seeweb_cloud/seeweb_keys'
31
+
32
+ logger = sky_logging.init_logger(__name__)
33
+ # (content: ini-like)
34
+ # api_key = <TOKEN>
35
+
36
+
37
+ @registry.CLOUD_REGISTRY.register
38
+ class Seeweb(clouds.Cloud):
39
+ """Seeweb GPU Cloud."""
40
+
41
+ _REPR = 'Seeweb'
42
+ # Define unsupported features to provide clear error messages
43
+ # This helps users understand what Seeweb can and cannot do
44
+ _CLOUD_UNSUPPORTED_FEATURES = {
45
+ clouds.CloudImplementationFeatures.MULTI_NODE:
46
+ ('Multi-node not supported. '
47
+ 'Seeweb does not support multi-node clusters.'),
48
+ clouds.CloudImplementationFeatures.CUSTOM_DISK_TIER:
49
+ ('Custom disk tiers not supported. '
50
+ 'Seeweb does not support custom disk tiers.'),
51
+ clouds.CloudImplementationFeatures.STORAGE_MOUNTING:
52
+ ('Storage mounting not supported. '
53
+ 'Seeweb does not support storage mounting.'),
54
+ clouds.CloudImplementationFeatures.HIGH_AVAILABILITY_CONTROLLERS:
55
+ ('High availability controllers not supported. '
56
+ 'Seeweb does not support high availability controllers.'),
57
+ clouds.CloudImplementationFeatures.SPOT_INSTANCE:
58
+ ('Spot instances not supported. '
59
+ 'Seeweb does not support spot instances.'),
60
+ clouds.CloudImplementationFeatures.CLONE_DISK_FROM_CLUSTER:
61
+ ('Disk cloning not supported. '
62
+ 'Seeweb does not support disk cloning.'),
63
+ clouds.CloudImplementationFeatures.IMAGE_ID:
64
+ ('Custom image IDs not supported. '
65
+ 'Seeweb does not support custom image IDs.'),
66
+ clouds.CloudImplementationFeatures.CUSTOM_NETWORK_TIER:
67
+ ('Custom network tiers not supported. '
68
+ 'Seeweb does not support custom network tiers.'),
69
+ clouds.CloudImplementationFeatures.HOST_CONTROLLERS:
70
+ ('Host controllers not supported. '
71
+ 'Seeweb does not support host controllers.'),
72
+ clouds.CloudImplementationFeatures.CUSTOM_MULTI_NETWORK:
73
+ ('Custom multi-network not supported. '
74
+ 'Seeweb does not support custom multi-network.'),
75
+ }
76
+ _MAX_CLUSTER_NAME_LEN_LIMIT = 120
77
+ _regions: List[clouds.Region] = []
78
+
79
+ PROVISIONER_VERSION = clouds.ProvisionerVersion.SKYPILOT
80
+ STATUS_VERSION = clouds.StatusVersion.SKYPILOT
81
+
82
+ # Enable port support with updatable version
83
+ OPEN_PORTS_VERSION = clouds.OpenPortsVersion.UPDATABLE
84
+
85
+ @classmethod
86
+ def _unsupported_features_for_resources(
87
+ cls,
88
+ resources: 'resources_lib.Resources',
89
+ region: Optional[str] = None,
90
+ ) -> Dict[clouds.CloudImplementationFeatures, str]:
91
+ return cls._CLOUD_UNSUPPORTED_FEATURES
92
+
93
+ @classmethod
94
+ def max_cluster_name_length(cls) -> Optional[int]:
95
+ return cls._MAX_CLUSTER_NAME_LEN_LIMIT
96
+
97
+ @classmethod
98
+ def regions(cls) -> List['clouds.Region']:
99
+ """Return available regions for Seeweb."""
100
+ # Get regions from the catalog system
101
+ # This reads from the CSV files generated by fetch_seeweb.py
102
+ regions = catalog.regions(clouds='seeweb')
103
+ return regions
104
+
105
+ @classmethod
106
+ def regions_with_offering(
107
+ cls,
108
+ instance_type: str,
109
+ accelerators: Optional[Dict[str, int]],
110
+ use_spot: bool,
111
+ region: Optional[str],
112
+ zone: Optional[str],
113
+ resources: Optional['resources_lib.Resources'] = None,
114
+ ) -> List[clouds.Region]:
115
+ assert zone is None, 'Seeweb does not support zones.'
116
+ del zone
117
+ if use_spot:
118
+ return []
119
+
120
+ # Get regions from catalog based on instance type
121
+ # This will read the CSV and return only regions
122
+ # where the instance type exists
123
+ regions = catalog.get_region_zones_for_instance_type(
124
+ instance_type, use_spot, 'seeweb')
125
+
126
+ if region is not None:
127
+ regions = [r for r in regions if r.name == region]
128
+
129
+ return regions
130
+
131
+ @classmethod
132
+ def zones_provision_loop(
133
+ cls,
134
+ *,
135
+ region: str,
136
+ num_nodes: int,
137
+ instance_type: str,
138
+ accelerators: Optional[Dict[str, int]] = None,
139
+ use_spot: bool = False,
140
+ ) -> Iterator[None]:
141
+ del num_nodes
142
+ regions = cls.regions_with_offering(instance_type,
143
+ accelerators,
144
+ use_spot,
145
+ region=region,
146
+ zone=None)
147
+ for r in regions:
148
+ assert r.zones is None, r
149
+ yield r.zones
150
+
151
+ @classmethod
152
+ def get_zone_shell_cmd(cls) -> Optional[str]:
153
+ """Seeweb doesn't support zones."""
154
+ return None
155
+
156
+ def instance_type_to_hourly_cost(
157
+ self,
158
+ instance_type: str,
159
+ use_spot: bool,
160
+ region: Optional[str],
161
+ zone: Optional[str],
162
+ ) -> float:
163
+ cost = catalog.get_hourly_cost(instance_type,
164
+ use_spot=use_spot,
165
+ region=region,
166
+ zone=zone,
167
+ clouds='seeweb')
168
+ return cost
169
+
170
+ def accelerators_to_hourly_cost(
171
+ self,
172
+ accelerators: Dict[str, int],
173
+ use_spot: bool,
174
+ region: Optional[str],
175
+ zone: Optional[str],
176
+ ) -> float:
177
+
178
+ return 0.0
179
+
180
+ def get_egress_cost(self, num_gigabytes: float):
181
+ return 0.0
182
+
183
+ def make_deploy_resources_variables(
184
+ self,
185
+ resources: 'resources_lib.Resources',
186
+ cluster_name: resources_utils.ClusterName,
187
+ region: 'clouds.Region',
188
+ zones: Optional[List['clouds.Zone']],
189
+ num_nodes: int,
190
+ dryrun: bool = False,
191
+ volume_mounts: Optional[List['volume_lib.VolumeMount']] = None,
192
+ ) -> Dict[str, Any]:
193
+ """Create deployment variables for Seeweb."""
194
+
195
+ # Note: Spot instances and multi-node are automatically handled by
196
+ # the framework via _CLOUD_UNSUPPORTED_FEATURES
197
+
198
+ resources = resources.assert_launchable()
199
+
200
+ acc_dict = self.get_accelerators_from_instance_type(
201
+ resources.instance_type)
202
+ docker_image = resources.extract_docker_image()
203
+ docker_run_options: List[str] = []
204
+ if docker_image is not None:
205
+ if acc_dict:
206
+ docker_run_options.append('--gpus all')
207
+ logger.info(
208
+ 'Launching Seeweb cluster with docker image %s. Ensure the '
209
+ 'image is Debian-based and allows passwordless sudo.',
210
+ docker_image)
211
+
212
+ # Standard custom_resources string for Ray
213
+ custom_resources = resources_utils.make_ray_custom_resources_str(
214
+ acc_dict)
215
+
216
+ # Seeweb-specific GPU configuration for the provisioner
217
+ # This tells the provisioner how to configure GPU resources
218
+ seeweb_gpu_config = None
219
+ if resources.accelerators:
220
+ # If the instance has accelerators, prepare GPU configuration
221
+ accelerator_name = list(resources.accelerators.keys())[0]
222
+ accelerator_count = resources.accelerators[accelerator_name]
223
+ seeweb_gpu_config = {
224
+ 'gpu': accelerator_count,
225
+ 'gpu_label': accelerator_name,
226
+ }
227
+
228
+ # Seeweb uses pre-configured images based on instance type
229
+ # Determine image based on whether the instance type name contains "GPU"
230
+ if resources.instance_type and 'GPU' in resources.instance_type.upper():
231
+ # GPU instance - use image with NVIDIA drivers
232
+ if resources.instance_type in ['ECS1GPU10', 'ECS2GPU10']:
233
+ # H200 GPU instance - use UEFI image with NVIDIA drivers
234
+ image_id = 'ubuntu-2204-uefi-nvidia-driver'
235
+ else:
236
+ # Other GPU instance - use standard image with NVIDIA drivers
237
+ image_id = 'ubuntu-2204-nvidia-driver'
238
+ else:
239
+ # CPU-only instance - use standard Ubuntu image
240
+ image_id = 'ubuntu-2204'
241
+
242
+ result = {
243
+ 'instance_type': resources.instance_type,
244
+ 'region': region.name,
245
+ 'cluster_name': cluster_name,
246
+ 'custom_resources': custom_resources,
247
+ 'seeweb_gpu_config': seeweb_gpu_config,
248
+ 'image_id': image_id,
249
+ }
250
+ if docker_run_options:
251
+ result['docker_run_options'] = docker_run_options
252
+ return result
253
+
254
+ @classmethod
255
+ def get_vcpus_mem_from_instance_type(
256
+ cls, instance_type: str) -> Tuple[Optional[float], Optional[float]]:
257
+ result = catalog.get_vcpus_mem_from_instance_type(instance_type,
258
+ clouds='seeweb')
259
+ return result
260
+
261
+ @classmethod
262
+ def get_accelerators_from_instance_type(
263
+ cls,
264
+ instance_type: str,
265
+ ) -> Optional[Dict[str, Union[int, float]]]:
266
+ result = catalog.get_accelerators_from_instance_type(instance_type,
267
+ clouds='seeweb')
268
+ return result
269
+
270
+ @classmethod
271
+ def get_default_instance_type(
272
+ cls,
273
+ cpus: Optional[str] = None,
274
+ memory: Optional[str] = None,
275
+ disk_tier: Optional[resources_utils.DiskTier] = None,
276
+ region: Optional[str] = None,
277
+ zone: Optional[str] = None,
278
+ ) -> Optional[str]:
279
+ result = catalog.get_default_instance_type(cpus=cpus,
280
+ memory=memory,
281
+ disk_tier=disk_tier,
282
+ clouds='seeweb')
283
+ return result
284
+
285
+ def _get_feasible_launchable_resources(
286
+ self, resources: 'resources_lib.Resources'
287
+ ) -> 'resources_utils.FeasibleResources':
288
+ """Get feasible resources for Seeweb."""
289
+ if resources.use_spot:
290
+ return resources_utils.FeasibleResources(
291
+ [], [], 'Spot instances not supported on Seeweb')
292
+
293
+ if resources.accelerators and len(resources.accelerators) > 1:
294
+ return resources_utils.FeasibleResources(
295
+ [], [], 'Multiple accelerator types not supported on Seeweb')
296
+
297
+ # If no instance_type is specified, try to get a default one
298
+ if not resources.instance_type:
299
+ # If accelerators are specified, try to find instance
300
+ # type forthat accelerator
301
+ if resources.accelerators:
302
+ # Get the first accelerator
303
+ # (we already checked there's only one)
304
+ acc_name, acc_count = list(resources.accelerators.items())[0]
305
+
306
+ # Use catalog to find instance type for this accelerator
307
+ # This leverages the catalog system to find suitable instances
308
+ (
309
+ instance_types,
310
+ fuzzy_candidates,
311
+ ) = catalog.get_instance_type_for_accelerator(
312
+ acc_name=acc_name,
313
+ acc_count=acc_count,
314
+ cpus=resources.cpus,
315
+ memory=resources.memory,
316
+ use_spot=resources.use_spot,
317
+ region=resources.region,
318
+ zone=resources.zone,
319
+ clouds='seeweb',
320
+ )
321
+
322
+ if instance_types and len(instance_types) > 0:
323
+ # Use the first (cheapest) instance type
324
+ selected_instance_type = instance_types[0]
325
+ resources = resources.copy(
326
+ instance_type=selected_instance_type)
327
+ else:
328
+ return resources_utils.FeasibleResources(
329
+ [],
330
+ fuzzy_candidates,
331
+ f'No instance type found for accelerator'
332
+ f'{acc_name}:{acc_count} on Seeweb',
333
+ )
334
+ else:
335
+ # No accelerators specified, use default instance type
336
+ default_instance_type = self.get_default_instance_type(
337
+ cpus=resources.cpus,
338
+ memory=resources.memory,
339
+ region=resources.region,
340
+ zone=resources.zone,
341
+ )
342
+
343
+ if default_instance_type:
344
+ # Create new resources with the default instance type
345
+ resources = resources.copy(
346
+ instance_type=default_instance_type)
347
+ else:
348
+ return resources_utils.FeasibleResources(
349
+ [],
350
+ [],
351
+ f'No suitable instance type found for'
352
+ f'cpus={resources.cpus}, memory={resources.memory}',
353
+ )
354
+
355
+ # Check if instance type exists
356
+ if resources.instance_type:
357
+ exists = catalog.instance_type_exists(resources.instance_type,
358
+ clouds='seeweb')
359
+ if not exists:
360
+ return resources_utils.FeasibleResources(
361
+ [],
362
+ [],
363
+ f'Instance type {resources.instance_type}'
364
+ f' not available on Seeweb',
365
+ )
366
+
367
+ # Set the cloud if not already set
368
+ if not resources.cloud:
369
+ resources = resources.copy(cloud=self)
370
+
371
+ # Return the resources as feasible
372
+ return resources_utils.FeasibleResources([resources], [], None)
373
+
374
+ @classmethod
375
+ def _check_compute_credentials(cls) -> Tuple[bool, Optional[str]]:
376
+ """Check Seeweb compute credentials."""
377
+ try:
378
+ result = seeweb_adaptor.check_compute_credentials()
379
+ return result, None
380
+ except Exception as e: # pylint: disable=broad-except
381
+ return False, str(e)
382
+
383
+ @classmethod
384
+ def _check_storage_credentials(cls) -> Tuple[bool, Optional[str]]:
385
+ """Check Seeweb storage credentials."""
386
+ try:
387
+ result = seeweb_adaptor.check_storage_credentials()
388
+ return result, None
389
+ except Exception as e: # pylint: disable=broad-except
390
+ return False, str(e)
391
+
392
+ @classmethod
393
+ def get_user_identities(cls) -> Optional[List[List[str]]]:
394
+ # Seeweb doesn't have user identity concept
395
+ return None
396
+
397
+ @classmethod
398
+ def query_status(
399
+ cls,
400
+ name: str,
401
+ tag_filters: Dict[str, str],
402
+ region: Optional[str],
403
+ zone: Optional[str],
404
+ **kwargs,
405
+ ) -> List['status_lib.ClusterStatus']:
406
+ """Query the status of Seeweb cluster instances."""
407
+ cluster_name_on_cloud = name
408
+
409
+ result = seeweb_provision.instance.query_instances(
410
+ cluster_name=name,
411
+ cluster_name_on_cloud=cluster_name_on_cloud,
412
+ provider_config={},
413
+ non_terminated_only=True)
414
+ # Convert Dict[str, Tuple[Optional[ClusterStatus],
415
+ # Optional[str]]] to List[ClusterStatus]
416
+ return [status for status, _ in result.values() if status is not None]
417
+
418
+ def get_credential_file_mounts(self) -> Dict[str, str]:
419
+ """Returns the credential files to mount."""
420
+ # Mount the Seeweb API key file to the remote instance
421
+ # This allows the provisioner to authenticate with Seeweb API
422
+ result = {
423
+ _SEEWEB_KEY_FILE: _SEEWEB_KEY_FILE,
424
+ }
425
+ return result
426
+
427
+ def instance_type_exists(self, instance_type: str) -> bool:
428
+ """Returns whether the instance type exists for Seeweb."""
429
+ result = catalog.instance_type_exists(instance_type, clouds='seeweb')
430
+ return result
431
+
432
+ @classmethod
433
+ def get_image_size(cls, image_id: str, region: Optional[str]) -> float:
434
+ """Seeweb doesn't support custom images."""
435
+ del image_id, region
436
+ with ux_utils.print_exception_no_traceback():
437
+ raise ValueError(f'Custom images are not supported on {cls._REPR}. '
438
+ 'Seeweb clusters use pre-configured images only.')
439
+
440
+ # Image-related methods (not supported)
441
+ @classmethod
442
+ def create_image_from_cluster(
443
+ cls,
444
+ cluster_name: resources_utils.ClusterName,
445
+ region: Optional[str],
446
+ zone: Optional[str],
447
+ ) -> str:
448
+ del cluster_name, region, zone # unused
449
+ with ux_utils.print_exception_no_traceback():
450
+ raise ValueError(
451
+ f'Creating images from clusters is not supported on'
452
+ f' {cls._REPR}. Seeweb does not support custom'
453
+ f' image creation.')
454
+
455
+ @classmethod
456
+ def maybe_move_image(
457
+ cls,
458
+ image_id: str,
459
+ source_region: str,
460
+ target_region: str,
461
+ source_zone: Optional[str],
462
+ target_zone: Optional[str],
463
+ ) -> str:
464
+ del image_id, source_region, target_region, source_zone, target_zone
465
+ with ux_utils.print_exception_no_traceback():
466
+ raise ValueError(
467
+ f'Moving images between regions is not supported on'
468
+ f' {cls._REPR}. '
469
+ 'Seeweb does not support custom images.')
470
+
471
+ @classmethod
472
+ def delete_image(cls, image_id: str, region: Optional[str]) -> None:
473
+ del image_id, region
474
+ with ux_utils.print_exception_no_traceback():
475
+ raise ValueError(
476
+ f'Deleting images is not supported on {cls._REPR}. '
477
+ 'Seeweb does not support custom image management.')