skypilot-nightly 1.0.0.dev20250509__py3-none-any.whl → 1.0.0.dev20251107__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 (512) hide show
  1. sky/__init__.py +22 -6
  2. sky/adaptors/aws.py +25 -7
  3. sky/adaptors/common.py +24 -1
  4. sky/adaptors/coreweave.py +278 -0
  5. sky/adaptors/do.py +8 -2
  6. sky/adaptors/hyperbolic.py +8 -0
  7. sky/adaptors/kubernetes.py +149 -18
  8. sky/adaptors/nebius.py +170 -17
  9. sky/adaptors/primeintellect.py +1 -0
  10. sky/adaptors/runpod.py +68 -0
  11. sky/adaptors/seeweb.py +167 -0
  12. sky/adaptors/shadeform.py +89 -0
  13. sky/admin_policy.py +187 -4
  14. sky/authentication.py +179 -225
  15. sky/backends/__init__.py +4 -2
  16. sky/backends/backend.py +22 -9
  17. sky/backends/backend_utils.py +1299 -380
  18. sky/backends/cloud_vm_ray_backend.py +1715 -518
  19. sky/backends/docker_utils.py +1 -1
  20. sky/backends/local_docker_backend.py +11 -6
  21. sky/backends/wheel_utils.py +37 -9
  22. sky/{clouds/service_catalog → catalog}/__init__.py +21 -19
  23. sky/{clouds/service_catalog → catalog}/aws_catalog.py +27 -8
  24. sky/{clouds/service_catalog → catalog}/azure_catalog.py +10 -7
  25. sky/{clouds/service_catalog → catalog}/common.py +89 -48
  26. sky/{clouds/service_catalog → catalog}/cudo_catalog.py +8 -5
  27. sky/{clouds/service_catalog → catalog}/data_fetchers/analyze.py +1 -1
  28. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_aws.py +30 -40
  29. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_cudo.py +38 -38
  30. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_gcp.py +42 -15
  31. sky/catalog/data_fetchers/fetch_hyperbolic.py +136 -0
  32. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_lambda_cloud.py +1 -0
  33. sky/catalog/data_fetchers/fetch_nebius.py +335 -0
  34. sky/catalog/data_fetchers/fetch_runpod.py +698 -0
  35. sky/catalog/data_fetchers/fetch_seeweb.py +329 -0
  36. sky/catalog/data_fetchers/fetch_shadeform.py +142 -0
  37. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vast.py +1 -1
  38. sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_vsphere.py +1 -1
  39. sky/{clouds/service_catalog → catalog}/do_catalog.py +5 -2
  40. sky/{clouds/service_catalog → catalog}/fluidstack_catalog.py +6 -3
  41. sky/{clouds/service_catalog → catalog}/gcp_catalog.py +41 -15
  42. sky/catalog/hyperbolic_catalog.py +136 -0
  43. sky/{clouds/service_catalog → catalog}/ibm_catalog.py +9 -6
  44. sky/{clouds/service_catalog → catalog}/kubernetes_catalog.py +36 -24
  45. sky/{clouds/service_catalog → catalog}/lambda_catalog.py +9 -6
  46. sky/{clouds/service_catalog → catalog}/nebius_catalog.py +9 -7
  47. sky/{clouds/service_catalog → catalog}/oci_catalog.py +9 -6
  48. sky/{clouds/service_catalog → catalog}/paperspace_catalog.py +5 -2
  49. sky/catalog/primeintellect_catalog.py +95 -0
  50. sky/{clouds/service_catalog → catalog}/runpod_catalog.py +11 -4
  51. sky/{clouds/service_catalog → catalog}/scp_catalog.py +9 -6
  52. sky/catalog/seeweb_catalog.py +184 -0
  53. sky/catalog/shadeform_catalog.py +165 -0
  54. sky/catalog/ssh_catalog.py +167 -0
  55. sky/{clouds/service_catalog → catalog}/vast_catalog.py +6 -3
  56. sky/{clouds/service_catalog → catalog}/vsphere_catalog.py +5 -2
  57. sky/check.py +491 -203
  58. sky/cli.py +5 -6005
  59. sky/client/{cli.py → cli/command.py} +2477 -1885
  60. sky/client/cli/deprecation_utils.py +99 -0
  61. sky/client/cli/flags.py +359 -0
  62. sky/client/cli/table_utils.py +320 -0
  63. sky/client/common.py +70 -32
  64. sky/client/oauth.py +82 -0
  65. sky/client/sdk.py +1203 -297
  66. sky/client/sdk_async.py +833 -0
  67. sky/client/service_account_auth.py +47 -0
  68. sky/cloud_stores.py +73 -0
  69. sky/clouds/__init__.py +13 -0
  70. sky/clouds/aws.py +358 -93
  71. sky/clouds/azure.py +105 -83
  72. sky/clouds/cloud.py +127 -36
  73. sky/clouds/cudo.py +68 -50
  74. sky/clouds/do.py +66 -48
  75. sky/clouds/fluidstack.py +63 -44
  76. sky/clouds/gcp.py +339 -110
  77. sky/clouds/hyperbolic.py +293 -0
  78. sky/clouds/ibm.py +70 -49
  79. sky/clouds/kubernetes.py +563 -162
  80. sky/clouds/lambda_cloud.py +74 -54
  81. sky/clouds/nebius.py +206 -80
  82. sky/clouds/oci.py +88 -66
  83. sky/clouds/paperspace.py +61 -44
  84. sky/clouds/primeintellect.py +317 -0
  85. sky/clouds/runpod.py +164 -74
  86. sky/clouds/scp.py +89 -83
  87. sky/clouds/seeweb.py +466 -0
  88. sky/clouds/shadeform.py +400 -0
  89. sky/clouds/ssh.py +263 -0
  90. sky/clouds/utils/aws_utils.py +10 -4
  91. sky/clouds/utils/gcp_utils.py +87 -11
  92. sky/clouds/utils/oci_utils.py +38 -14
  93. sky/clouds/utils/scp_utils.py +177 -124
  94. sky/clouds/vast.py +99 -77
  95. sky/clouds/vsphere.py +51 -40
  96. sky/core.py +349 -139
  97. sky/dag.py +15 -0
  98. sky/dashboard/out/404.html +1 -1
  99. sky/dashboard/out/_next/static/chunks/1141-e6aa9ab418717c59.js +11 -0
  100. sky/dashboard/out/_next/static/chunks/1272-1ef0bf0237faccdb.js +1 -0
  101. sky/dashboard/out/_next/static/chunks/1871-74503c8e80fd253b.js +6 -0
  102. sky/dashboard/out/_next/static/chunks/2260-7703229c33c5ebd5.js +1 -0
  103. sky/dashboard/out/_next/static/chunks/2350.fab69e61bac57b23.js +1 -0
  104. sky/dashboard/out/_next/static/chunks/2369.fc20f0c2c8ed9fe7.js +15 -0
  105. sky/dashboard/out/_next/static/chunks/2755.fff53c4a3fcae910.js +26 -0
  106. sky/dashboard/out/_next/static/chunks/3294.72362fa129305b19.js +1 -0
  107. sky/dashboard/out/_next/static/chunks/3785.ad6adaa2a0fa9768.js +1 -0
  108. sky/dashboard/out/_next/static/chunks/3850-ff4a9a69d978632b.js +1 -0
  109. sky/dashboard/out/_next/static/chunks/3937.210053269f121201.js +1 -0
  110. sky/dashboard/out/_next/static/chunks/4725.a830b5c9e7867c92.js +1 -0
  111. sky/dashboard/out/_next/static/chunks/4937.a2baa2df5572a276.js +15 -0
  112. sky/dashboard/out/_next/static/chunks/5739-d67458fcb1386c92.js +8 -0
  113. sky/dashboard/out/_next/static/chunks/6130-2be46d70a38f1e82.js +1 -0
  114. sky/dashboard/out/_next/static/chunks/616-3d59f75e2ccf9321.js +39 -0
  115. sky/dashboard/out/_next/static/chunks/6212-7bd06f60ba693125.js +13 -0
  116. sky/dashboard/out/_next/static/chunks/6601-06114c982db410b6.js +1 -0
  117. sky/dashboard/out/_next/static/chunks/6856-ef8ba11f96d8c4a3.js +1 -0
  118. sky/dashboard/out/_next/static/chunks/6989-01359c57e018caa4.js +1 -0
  119. sky/dashboard/out/_next/static/chunks/6990-32b6e2d3822301fa.js +1 -0
  120. sky/dashboard/out/_next/static/chunks/7359-c8d04e06886000b3.js +30 -0
  121. sky/dashboard/out/_next/static/chunks/7411-b15471acd2cba716.js +41 -0
  122. sky/dashboard/out/_next/static/chunks/7615-3301e838e5f25772.js +1 -0
  123. sky/dashboard/out/_next/static/chunks/8640.5b9475a2d18c5416.js +16 -0
  124. sky/dashboard/out/_next/static/chunks/8969-1e4613c651bf4051.js +1 -0
  125. sky/dashboard/out/_next/static/chunks/9025.fa408f3242e9028d.js +6 -0
  126. sky/dashboard/out/_next/static/chunks/9353-cff34f7e773b2e2b.js +1 -0
  127. sky/dashboard/out/_next/static/chunks/9360.7310982cf5a0dc79.js +31 -0
  128. sky/dashboard/out/_next/static/chunks/9847.3aaca6bb33455140.js +30 -0
  129. sky/dashboard/out/_next/static/chunks/fd9d1056-86323a29a8f7e46a.js +1 -0
  130. sky/dashboard/out/_next/static/chunks/framework-cf60a09ccd051a10.js +33 -0
  131. sky/dashboard/out/_next/static/chunks/main-app-587214043926b3cc.js +1 -0
  132. sky/dashboard/out/_next/static/chunks/main-f15ccb73239a3bf1.js +1 -0
  133. sky/dashboard/out/_next/static/chunks/pages/_app-bde01e4a2beec258.js +34 -0
  134. sky/dashboard/out/_next/static/chunks/pages/_error-c66a4e8afc46f17b.js +1 -0
  135. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-c736ead69c2d86ec.js +16 -0
  136. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-a37d2063af475a1c.js +1 -0
  137. sky/dashboard/out/_next/static/chunks/pages/clusters-d44859594e6f8064.js +1 -0
  138. sky/dashboard/out/_next/static/chunks/pages/config-dfb9bf07b13045f4.js +1 -0
  139. sky/dashboard/out/_next/static/chunks/pages/index-444f1804401f04ea.js +1 -0
  140. sky/dashboard/out/_next/static/chunks/pages/infra/[context]-c0b5935149902e6f.js +1 -0
  141. sky/dashboard/out/_next/static/chunks/pages/infra-aed0ea19df7cf961.js +1 -0
  142. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-5796e8d6aea291a0.js +16 -0
  143. sky/dashboard/out/_next/static/chunks/pages/jobs/pools/[pool]-6edeb7d06032adfc.js +21 -0
  144. sky/dashboard/out/_next/static/chunks/pages/jobs-479dde13399cf270.js +1 -0
  145. sky/dashboard/out/_next/static/chunks/pages/users-5ab3b907622cf0fe.js +1 -0
  146. sky/dashboard/out/_next/static/chunks/pages/volumes-b84b948ff357c43e.js +1 -0
  147. sky/dashboard/out/_next/static/chunks/pages/workspace/new-3f88a1c7e86a3f86.js +1 -0
  148. sky/dashboard/out/_next/static/chunks/pages/workspaces/[name]-c5a3eeee1c218af1.js +1 -0
  149. sky/dashboard/out/_next/static/chunks/pages/workspaces-22b23febb3e89ce1.js +1 -0
  150. sky/dashboard/out/_next/static/chunks/webpack-2679be77fc08a2f8.js +1 -0
  151. sky/dashboard/out/_next/static/css/0748ce22df867032.css +3 -0
  152. sky/dashboard/out/_next/static/zB0ed6ge_W1MDszVHhijS/_buildManifest.js +1 -0
  153. sky/dashboard/out/clusters/[cluster]/[job].html +1 -1
  154. sky/dashboard/out/clusters/[cluster].html +1 -1
  155. sky/dashboard/out/clusters.html +1 -1
  156. sky/dashboard/out/config.html +1 -0
  157. sky/dashboard/out/index.html +1 -1
  158. sky/dashboard/out/infra/[context].html +1 -0
  159. sky/dashboard/out/infra.html +1 -0
  160. sky/dashboard/out/jobs/[job].html +1 -1
  161. sky/dashboard/out/jobs/pools/[pool].html +1 -0
  162. sky/dashboard/out/jobs.html +1 -1
  163. sky/dashboard/out/users.html +1 -0
  164. sky/dashboard/out/volumes.html +1 -0
  165. sky/dashboard/out/workspace/new.html +1 -0
  166. sky/dashboard/out/workspaces/[name].html +1 -0
  167. sky/dashboard/out/workspaces.html +1 -0
  168. sky/data/data_utils.py +137 -1
  169. sky/data/mounting_utils.py +269 -84
  170. sky/data/storage.py +1451 -1807
  171. sky/data/storage_utils.py +43 -57
  172. sky/exceptions.py +132 -2
  173. sky/execution.py +206 -63
  174. sky/global_user_state.py +2374 -586
  175. sky/jobs/__init__.py +5 -0
  176. sky/jobs/client/sdk.py +242 -65
  177. sky/jobs/client/sdk_async.py +143 -0
  178. sky/jobs/constants.py +9 -8
  179. sky/jobs/controller.py +839 -277
  180. sky/jobs/file_content_utils.py +80 -0
  181. sky/jobs/log_gc.py +201 -0
  182. sky/jobs/recovery_strategy.py +398 -152
  183. sky/jobs/scheduler.py +315 -189
  184. sky/jobs/server/core.py +829 -255
  185. sky/jobs/server/server.py +156 -115
  186. sky/jobs/server/utils.py +136 -0
  187. sky/jobs/state.py +2092 -701
  188. sky/jobs/utils.py +1242 -160
  189. sky/logs/__init__.py +21 -0
  190. sky/logs/agent.py +108 -0
  191. sky/logs/aws.py +243 -0
  192. sky/logs/gcp.py +91 -0
  193. sky/metrics/__init__.py +0 -0
  194. sky/metrics/utils.py +443 -0
  195. sky/models.py +78 -1
  196. sky/optimizer.py +164 -70
  197. sky/provision/__init__.py +90 -4
  198. sky/provision/aws/config.py +147 -26
  199. sky/provision/aws/instance.py +135 -50
  200. sky/provision/azure/instance.py +10 -5
  201. sky/provision/common.py +13 -1
  202. sky/provision/cudo/cudo_machine_type.py +1 -1
  203. sky/provision/cudo/cudo_utils.py +14 -8
  204. sky/provision/cudo/cudo_wrapper.py +72 -71
  205. sky/provision/cudo/instance.py +10 -6
  206. sky/provision/do/instance.py +10 -6
  207. sky/provision/do/utils.py +4 -3
  208. sky/provision/docker_utils.py +114 -23
  209. sky/provision/fluidstack/instance.py +13 -8
  210. sky/provision/gcp/__init__.py +1 -0
  211. sky/provision/gcp/config.py +301 -19
  212. sky/provision/gcp/constants.py +218 -0
  213. sky/provision/gcp/instance.py +36 -8
  214. sky/provision/gcp/instance_utils.py +18 -4
  215. sky/provision/gcp/volume_utils.py +247 -0
  216. sky/provision/hyperbolic/__init__.py +12 -0
  217. sky/provision/hyperbolic/config.py +10 -0
  218. sky/provision/hyperbolic/instance.py +437 -0
  219. sky/provision/hyperbolic/utils.py +373 -0
  220. sky/provision/instance_setup.py +93 -14
  221. sky/provision/kubernetes/__init__.py +5 -0
  222. sky/provision/kubernetes/config.py +9 -52
  223. sky/provision/kubernetes/constants.py +17 -0
  224. sky/provision/kubernetes/instance.py +789 -247
  225. sky/provision/kubernetes/manifests/fusermount-server-daemonset.yaml +1 -2
  226. sky/provision/kubernetes/network.py +27 -17
  227. sky/provision/kubernetes/network_utils.py +40 -43
  228. sky/provision/kubernetes/utils.py +1192 -531
  229. sky/provision/kubernetes/volume.py +282 -0
  230. sky/provision/lambda_cloud/instance.py +22 -16
  231. sky/provision/nebius/constants.py +50 -0
  232. sky/provision/nebius/instance.py +19 -6
  233. sky/provision/nebius/utils.py +196 -91
  234. sky/provision/oci/instance.py +10 -5
  235. sky/provision/paperspace/instance.py +10 -7
  236. sky/provision/paperspace/utils.py +1 -1
  237. sky/provision/primeintellect/__init__.py +10 -0
  238. sky/provision/primeintellect/config.py +11 -0
  239. sky/provision/primeintellect/instance.py +454 -0
  240. sky/provision/primeintellect/utils.py +398 -0
  241. sky/provision/provisioner.py +110 -36
  242. sky/provision/runpod/__init__.py +5 -0
  243. sky/provision/runpod/instance.py +27 -6
  244. sky/provision/runpod/utils.py +51 -18
  245. sky/provision/runpod/volume.py +180 -0
  246. sky/provision/scp/__init__.py +15 -0
  247. sky/provision/scp/config.py +93 -0
  248. sky/provision/scp/instance.py +531 -0
  249. sky/provision/seeweb/__init__.py +11 -0
  250. sky/provision/seeweb/config.py +13 -0
  251. sky/provision/seeweb/instance.py +807 -0
  252. sky/provision/shadeform/__init__.py +11 -0
  253. sky/provision/shadeform/config.py +12 -0
  254. sky/provision/shadeform/instance.py +351 -0
  255. sky/provision/shadeform/shadeform_utils.py +83 -0
  256. sky/provision/ssh/__init__.py +18 -0
  257. sky/provision/vast/instance.py +13 -8
  258. sky/provision/vast/utils.py +10 -7
  259. sky/provision/vsphere/common/vim_utils.py +1 -2
  260. sky/provision/vsphere/instance.py +15 -10
  261. sky/provision/vsphere/vsphere_utils.py +9 -19
  262. sky/py.typed +0 -0
  263. sky/resources.py +844 -118
  264. sky/schemas/__init__.py +0 -0
  265. sky/schemas/api/__init__.py +0 -0
  266. sky/schemas/api/responses.py +225 -0
  267. sky/schemas/db/README +4 -0
  268. sky/schemas/db/env.py +90 -0
  269. sky/schemas/db/global_user_state/001_initial_schema.py +124 -0
  270. sky/schemas/db/global_user_state/002_add_workspace_to_cluster_history.py +35 -0
  271. sky/schemas/db/global_user_state/003_fix_initial_revision.py +61 -0
  272. sky/schemas/db/global_user_state/004_is_managed.py +34 -0
  273. sky/schemas/db/global_user_state/005_cluster_event.py +32 -0
  274. sky/schemas/db/global_user_state/006_provision_log.py +41 -0
  275. sky/schemas/db/global_user_state/007_cluster_event_request_id.py +34 -0
  276. sky/schemas/db/global_user_state/008_skylet_ssh_tunnel_metadata.py +34 -0
  277. sky/schemas/db/global_user_state/009_last_activity_and_launched_at.py +89 -0
  278. sky/schemas/db/global_user_state/010_save_ssh_key.py +66 -0
  279. sky/schemas/db/script.py.mako +28 -0
  280. sky/schemas/db/serve_state/001_initial_schema.py +67 -0
  281. sky/schemas/db/skypilot_config/001_initial_schema.py +30 -0
  282. sky/schemas/db/spot_jobs/001_initial_schema.py +97 -0
  283. sky/schemas/db/spot_jobs/002_cluster_pool.py +42 -0
  284. sky/schemas/db/spot_jobs/003_pool_hash.py +34 -0
  285. sky/schemas/db/spot_jobs/004_job_file_contents.py +42 -0
  286. sky/schemas/db/spot_jobs/005_logs_gc.py +38 -0
  287. sky/schemas/generated/__init__.py +0 -0
  288. sky/schemas/generated/autostopv1_pb2.py +36 -0
  289. sky/schemas/generated/autostopv1_pb2.pyi +43 -0
  290. sky/schemas/generated/autostopv1_pb2_grpc.py +146 -0
  291. sky/schemas/generated/jobsv1_pb2.py +86 -0
  292. sky/schemas/generated/jobsv1_pb2.pyi +254 -0
  293. sky/schemas/generated/jobsv1_pb2_grpc.py +542 -0
  294. sky/schemas/generated/managed_jobsv1_pb2.py +74 -0
  295. sky/schemas/generated/managed_jobsv1_pb2.pyi +278 -0
  296. sky/schemas/generated/managed_jobsv1_pb2_grpc.py +278 -0
  297. sky/schemas/generated/servev1_pb2.py +58 -0
  298. sky/schemas/generated/servev1_pb2.pyi +115 -0
  299. sky/schemas/generated/servev1_pb2_grpc.py +322 -0
  300. sky/serve/autoscalers.py +357 -5
  301. sky/serve/client/impl.py +310 -0
  302. sky/serve/client/sdk.py +47 -139
  303. sky/serve/client/sdk_async.py +130 -0
  304. sky/serve/constants.py +10 -8
  305. sky/serve/controller.py +64 -19
  306. sky/serve/load_balancer.py +106 -60
  307. sky/serve/load_balancing_policies.py +115 -1
  308. sky/serve/replica_managers.py +273 -162
  309. sky/serve/serve_rpc_utils.py +179 -0
  310. sky/serve/serve_state.py +554 -251
  311. sky/serve/serve_utils.py +733 -220
  312. sky/serve/server/core.py +66 -711
  313. sky/serve/server/impl.py +1093 -0
  314. sky/serve/server/server.py +21 -18
  315. sky/serve/service.py +133 -48
  316. sky/serve/service_spec.py +135 -16
  317. sky/serve/spot_placer.py +3 -0
  318. sky/server/auth/__init__.py +0 -0
  319. sky/server/auth/authn.py +50 -0
  320. sky/server/auth/loopback.py +38 -0
  321. sky/server/auth/oauth2_proxy.py +200 -0
  322. sky/server/common.py +475 -181
  323. sky/server/config.py +81 -23
  324. sky/server/constants.py +44 -6
  325. sky/server/daemons.py +229 -0
  326. sky/server/html/token_page.html +185 -0
  327. sky/server/metrics.py +160 -0
  328. sky/server/requests/executor.py +528 -138
  329. sky/server/requests/payloads.py +351 -17
  330. sky/server/requests/preconditions.py +21 -17
  331. sky/server/requests/process.py +112 -29
  332. sky/server/requests/request_names.py +120 -0
  333. sky/server/requests/requests.py +817 -224
  334. sky/server/requests/serializers/decoders.py +82 -31
  335. sky/server/requests/serializers/encoders.py +140 -22
  336. sky/server/requests/threads.py +106 -0
  337. sky/server/rest.py +417 -0
  338. sky/server/server.py +1290 -284
  339. sky/server/state.py +20 -0
  340. sky/server/stream_utils.py +345 -57
  341. sky/server/uvicorn.py +217 -3
  342. sky/server/versions.py +270 -0
  343. sky/setup_files/MANIFEST.in +5 -0
  344. sky/setup_files/alembic.ini +156 -0
  345. sky/setup_files/dependencies.py +136 -31
  346. sky/setup_files/setup.py +44 -42
  347. sky/sky_logging.py +102 -5
  348. sky/skylet/attempt_skylet.py +1 -0
  349. sky/skylet/autostop_lib.py +129 -8
  350. sky/skylet/configs.py +27 -20
  351. sky/skylet/constants.py +171 -19
  352. sky/skylet/events.py +105 -21
  353. sky/skylet/job_lib.py +335 -104
  354. sky/skylet/log_lib.py +297 -18
  355. sky/skylet/log_lib.pyi +44 -1
  356. sky/skylet/ray_patches/__init__.py +17 -3
  357. sky/skylet/ray_patches/autoscaler.py.diff +18 -0
  358. sky/skylet/ray_patches/cli.py.diff +19 -0
  359. sky/skylet/ray_patches/command_runner.py.diff +17 -0
  360. sky/skylet/ray_patches/log_monitor.py.diff +20 -0
  361. sky/skylet/ray_patches/resource_demand_scheduler.py.diff +32 -0
  362. sky/skylet/ray_patches/updater.py.diff +18 -0
  363. sky/skylet/ray_patches/worker.py.diff +41 -0
  364. sky/skylet/services.py +564 -0
  365. sky/skylet/skylet.py +63 -4
  366. sky/skylet/subprocess_daemon.py +103 -29
  367. sky/skypilot_config.py +506 -99
  368. sky/ssh_node_pools/__init__.py +1 -0
  369. sky/ssh_node_pools/core.py +135 -0
  370. sky/ssh_node_pools/server.py +233 -0
  371. sky/task.py +621 -137
  372. sky/templates/aws-ray.yml.j2 +10 -3
  373. sky/templates/azure-ray.yml.j2 +1 -1
  374. sky/templates/do-ray.yml.j2 +1 -1
  375. sky/templates/gcp-ray.yml.j2 +57 -0
  376. sky/templates/hyperbolic-ray.yml.j2 +67 -0
  377. sky/templates/jobs-controller.yaml.j2 +27 -24
  378. sky/templates/kubernetes-loadbalancer.yml.j2 +2 -0
  379. sky/templates/kubernetes-ray.yml.j2 +607 -51
  380. sky/templates/lambda-ray.yml.j2 +1 -1
  381. sky/templates/nebius-ray.yml.j2 +33 -12
  382. sky/templates/paperspace-ray.yml.j2 +1 -1
  383. sky/templates/primeintellect-ray.yml.j2 +71 -0
  384. sky/templates/runpod-ray.yml.j2 +9 -1
  385. sky/templates/scp-ray.yml.j2 +3 -50
  386. sky/templates/seeweb-ray.yml.j2 +108 -0
  387. sky/templates/shadeform-ray.yml.j2 +72 -0
  388. sky/templates/sky-serve-controller.yaml.j2 +22 -2
  389. sky/templates/websocket_proxy.py +178 -18
  390. sky/usage/usage_lib.py +18 -11
  391. sky/users/__init__.py +0 -0
  392. sky/users/model.conf +15 -0
  393. sky/users/permission.py +387 -0
  394. sky/users/rbac.py +121 -0
  395. sky/users/server.py +720 -0
  396. sky/users/token_service.py +218 -0
  397. sky/utils/accelerator_registry.py +34 -5
  398. sky/utils/admin_policy_utils.py +84 -38
  399. sky/utils/annotations.py +16 -5
  400. sky/utils/asyncio_utils.py +78 -0
  401. sky/utils/auth_utils.py +153 -0
  402. sky/utils/benchmark_utils.py +60 -0
  403. sky/utils/cli_utils/status_utils.py +159 -86
  404. sky/utils/cluster_utils.py +31 -9
  405. sky/utils/command_runner.py +354 -68
  406. sky/utils/command_runner.pyi +93 -3
  407. sky/utils/common.py +35 -8
  408. sky/utils/common_utils.py +310 -87
  409. sky/utils/config_utils.py +87 -5
  410. sky/utils/context.py +402 -0
  411. sky/utils/context_utils.py +222 -0
  412. sky/utils/controller_utils.py +264 -89
  413. sky/utils/dag_utils.py +31 -12
  414. sky/utils/db/__init__.py +0 -0
  415. sky/utils/db/db_utils.py +470 -0
  416. sky/utils/db/migration_utils.py +133 -0
  417. sky/utils/directory_utils.py +12 -0
  418. sky/utils/env_options.py +13 -0
  419. sky/utils/git.py +567 -0
  420. sky/utils/git_clone.sh +460 -0
  421. sky/utils/infra_utils.py +195 -0
  422. sky/utils/kubernetes/cleanup-tunnel.sh +62 -0
  423. sky/utils/kubernetes/config_map_utils.py +133 -0
  424. sky/utils/kubernetes/create_cluster.sh +13 -27
  425. sky/utils/kubernetes/delete_cluster.sh +10 -7
  426. sky/utils/kubernetes/deploy_remote_cluster.py +1299 -0
  427. sky/utils/kubernetes/exec_kubeconfig_converter.py +22 -31
  428. sky/utils/kubernetes/generate_kind_config.py +6 -66
  429. sky/utils/kubernetes/generate_kubeconfig.sh +4 -1
  430. sky/utils/kubernetes/gpu_labeler.py +5 -5
  431. sky/utils/kubernetes/kubernetes_deploy_utils.py +354 -47
  432. sky/utils/kubernetes/ssh-tunnel.sh +379 -0
  433. sky/utils/kubernetes/ssh_utils.py +221 -0
  434. sky/utils/kubernetes_enums.py +8 -15
  435. sky/utils/lock_events.py +94 -0
  436. sky/utils/locks.py +368 -0
  437. sky/utils/log_utils.py +300 -6
  438. sky/utils/perf_utils.py +22 -0
  439. sky/utils/resource_checker.py +298 -0
  440. sky/utils/resources_utils.py +249 -32
  441. sky/utils/rich_utils.py +213 -37
  442. sky/utils/schemas.py +905 -147
  443. sky/utils/serialize_utils.py +16 -0
  444. sky/utils/status_lib.py +10 -0
  445. sky/utils/subprocess_utils.py +38 -15
  446. sky/utils/tempstore.py +70 -0
  447. sky/utils/timeline.py +24 -52
  448. sky/utils/ux_utils.py +84 -15
  449. sky/utils/validator.py +11 -1
  450. sky/utils/volume.py +86 -0
  451. sky/utils/yaml_utils.py +111 -0
  452. sky/volumes/__init__.py +13 -0
  453. sky/volumes/client/__init__.py +0 -0
  454. sky/volumes/client/sdk.py +149 -0
  455. sky/volumes/server/__init__.py +0 -0
  456. sky/volumes/server/core.py +258 -0
  457. sky/volumes/server/server.py +122 -0
  458. sky/volumes/volume.py +212 -0
  459. sky/workspaces/__init__.py +0 -0
  460. sky/workspaces/core.py +655 -0
  461. sky/workspaces/server.py +101 -0
  462. sky/workspaces/utils.py +56 -0
  463. skypilot_nightly-1.0.0.dev20251107.dist-info/METADATA +675 -0
  464. skypilot_nightly-1.0.0.dev20251107.dist-info/RECORD +594 -0
  465. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/WHEEL +1 -1
  466. sky/benchmark/benchmark_state.py +0 -256
  467. sky/benchmark/benchmark_utils.py +0 -641
  468. sky/clouds/service_catalog/constants.py +0 -7
  469. sky/dashboard/out/_next/static/LksQgChY5izXjokL3LcEu/_buildManifest.js +0 -1
  470. sky/dashboard/out/_next/static/chunks/236-f49500b82ad5392d.js +0 -6
  471. sky/dashboard/out/_next/static/chunks/312-c3c8845990db8ffc.js +0 -15
  472. sky/dashboard/out/_next/static/chunks/37-0a572fe0dbb89c4d.js +0 -6
  473. sky/dashboard/out/_next/static/chunks/678-206dddca808e6d16.js +0 -59
  474. sky/dashboard/out/_next/static/chunks/845-0f8017370869e269.js +0 -1
  475. sky/dashboard/out/_next/static/chunks/979-7bf73a4c7cea0f5c.js +0 -1
  476. sky/dashboard/out/_next/static/chunks/fd9d1056-2821b0f0cabcd8bd.js +0 -1
  477. sky/dashboard/out/_next/static/chunks/framework-87d061ee6ed71b28.js +0 -33
  478. sky/dashboard/out/_next/static/chunks/main-app-241eb28595532291.js +0 -1
  479. sky/dashboard/out/_next/static/chunks/main-e0e2335212e72357.js +0 -1
  480. sky/dashboard/out/_next/static/chunks/pages/_app-e6b013bc3f77ad60.js +0 -1
  481. sky/dashboard/out/_next/static/chunks/pages/_error-1be831200e60c5c0.js +0 -1
  482. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]/[job]-e15db85d0ea1fbe1.js +0 -1
  483. sky/dashboard/out/_next/static/chunks/pages/clusters/[cluster]-f383db7389368ea7.js +0 -1
  484. sky/dashboard/out/_next/static/chunks/pages/clusters-a93b93e10b8b074e.js +0 -1
  485. sky/dashboard/out/_next/static/chunks/pages/index-f9f039532ca8cbc4.js +0 -1
  486. sky/dashboard/out/_next/static/chunks/pages/jobs/[job]-03f279c6741fb48b.js +0 -1
  487. sky/dashboard/out/_next/static/chunks/pages/jobs-a75029b67aab6a2e.js +0 -1
  488. sky/dashboard/out/_next/static/chunks/webpack-830f59b8404e96b8.js +0 -1
  489. sky/dashboard/out/_next/static/css/c6933bbb2ce7f4dd.css +0 -3
  490. sky/jobs/dashboard/dashboard.py +0 -223
  491. sky/jobs/dashboard/static/favicon.ico +0 -0
  492. sky/jobs/dashboard/templates/index.html +0 -831
  493. sky/jobs/server/dashboard_utils.py +0 -69
  494. sky/skylet/providers/scp/__init__.py +0 -2
  495. sky/skylet/providers/scp/config.py +0 -149
  496. sky/skylet/providers/scp/node_provider.py +0 -578
  497. sky/templates/kubernetes-ssh-jump.yml.j2 +0 -94
  498. sky/utils/db_utils.py +0 -100
  499. sky/utils/kubernetes/deploy_remote_cluster.sh +0 -308
  500. sky/utils/kubernetes/ssh_jump_lifecycle_manager.py +0 -191
  501. skypilot_nightly-1.0.0.dev20250509.dist-info/METADATA +0 -361
  502. skypilot_nightly-1.0.0.dev20250509.dist-info/RECORD +0 -396
  503. /sky/{clouds/service_catalog → catalog}/config.py +0 -0
  504. /sky/{benchmark → catalog/data_fetchers}/__init__.py +0 -0
  505. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_azure.py +0 -0
  506. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_fluidstack.py +0 -0
  507. /sky/{clouds/service_catalog → catalog}/data_fetchers/fetch_ibm.py +0 -0
  508. /sky/{clouds/service_catalog/data_fetchers → client/cli}/__init__.py +0 -0
  509. /sky/dashboard/out/_next/static/{LksQgChY5izXjokL3LcEu → zB0ed6ge_W1MDszVHhijS}/_ssgManifest.js +0 -0
  510. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/entry_points.txt +0 -0
  511. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/licenses/LICENSE +0 -0
  512. {skypilot_nightly-1.0.0.dev20250509.dist-info → skypilot_nightly-1.0.0.dev20251107.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,310 @@
1
+ """Implementation of SDK for SkyServe."""
2
+ import json
3
+ import typing
4
+ from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
5
+
6
+ import click
7
+
8
+ from sky.client import common as client_common
9
+ from sky.server import common as server_common
10
+ from sky.server.requests import payloads
11
+ from sky.server.requests import request_names
12
+ from sky.utils import admin_policy_utils
13
+ from sky.utils import dag_utils
14
+
15
+ if typing.TYPE_CHECKING:
16
+ import io
17
+
18
+ import sky
19
+ from sky.serve import serve_utils
20
+
21
+
22
+ def up(
23
+ task: Union['sky.Task', 'sky.Dag'],
24
+ service_name: str,
25
+ pool: bool = False,
26
+ # Internal only:
27
+ # pylint: disable=invalid-name
28
+ _need_confirmation: bool = False
29
+ ) -> server_common.RequestId[Tuple[str, str]]:
30
+ assert not pool, 'Command `up` is not supported for pool.'
31
+ # Avoid circular import.
32
+ from sky.client import sdk # pylint: disable=import-outside-toplevel
33
+
34
+ dag = dag_utils.convert_entrypoint_to_dag(task)
35
+ with admin_policy_utils.apply_and_use_config_in_current_request(
36
+ dag,
37
+ request_name=request_names.AdminPolicyRequestName.SERVE_UP,
38
+ at_client_side=True) as dag:
39
+ sdk.validate(dag)
40
+ request_id = sdk.optimize(dag)
41
+ sdk.stream_and_get(request_id)
42
+ if _need_confirmation:
43
+ noun = 'pool' if pool else 'service'
44
+ prompt = f'Launching a new {noun} {service_name!r}. Proceed?'
45
+ if prompt is not None:
46
+ click.confirm(prompt,
47
+ default=True,
48
+ abort=True,
49
+ show_default=True)
50
+
51
+ dag = client_common.upload_mounts_to_api_server(dag)
52
+ dag_str = dag_utils.dump_chain_dag_to_yaml_str(dag)
53
+
54
+ body = payloads.ServeUpBody(
55
+ task=dag_str,
56
+ service_name=service_name,
57
+ )
58
+
59
+ response = server_common.make_authenticated_request(
60
+ 'POST',
61
+ '/serve/up',
62
+ json=json.loads(body.model_dump_json()),
63
+ timeout=(5, None))
64
+ return server_common.get_request_id(response)
65
+
66
+
67
+ def update(
68
+ task: Union['sky.Task', 'sky.Dag'],
69
+ service_name: str,
70
+ mode: 'serve_utils.UpdateMode',
71
+ pool: bool = False,
72
+ # Internal only:
73
+ # pylint: disable=invalid-name
74
+ _need_confirmation: bool = False
75
+ ) -> server_common.RequestId[None]:
76
+ assert not pool, 'Command `update` is not supported for pool.'
77
+ # Avoid circular import.
78
+ from sky.client import sdk # pylint: disable=import-outside-toplevel
79
+ noun = 'pool' if pool else 'service'
80
+
81
+ dag = dag_utils.convert_entrypoint_to_dag(task)
82
+ with admin_policy_utils.apply_and_use_config_in_current_request(
83
+ dag,
84
+ request_name=request_names.AdminPolicyRequestName.SERVE_UPDATE,
85
+ at_client_side=True) as dag:
86
+ sdk.validate(dag)
87
+ request_id = sdk.optimize(dag)
88
+ sdk.stream_and_get(request_id)
89
+ if _need_confirmation:
90
+ click.confirm(f'Updating {noun} {service_name!r}. Proceed?',
91
+ default=True,
92
+ abort=True,
93
+ show_default=True)
94
+
95
+ dag = client_common.upload_mounts_to_api_server(dag)
96
+ dag_str = dag_utils.dump_chain_dag_to_yaml_str(dag)
97
+
98
+ body = payloads.ServeUpdateBody(
99
+ task=dag_str,
100
+ service_name=service_name,
101
+ mode=mode,
102
+ )
103
+
104
+ response = server_common.make_authenticated_request(
105
+ 'POST',
106
+ '/serve/update',
107
+ json=json.loads(body.model_dump_json()),
108
+ timeout=(5, None))
109
+ return server_common.get_request_id(response)
110
+
111
+
112
+ def apply(
113
+ task: Optional[Union['sky.Task', 'sky.Dag']],
114
+ workers: Optional[int],
115
+ service_name: str,
116
+ mode: 'serve_utils.UpdateMode',
117
+ pool: bool = False,
118
+ # Internal only:
119
+ # pylint: disable=invalid-name
120
+ _need_confirmation: bool = False
121
+ ) -> server_common.RequestId[None]:
122
+ assert pool, 'Command `apply` is only supported for pool.'
123
+ # Avoid circular import.
124
+ from sky.client import sdk # pylint: disable=import-outside-toplevel
125
+
126
+ noun = 'pool' if pool else 'service'
127
+ # There are two cases here. If task is None, we should be trying to
128
+ # update the number of workers in the pool. If task is not None, we should
129
+ # be trying to apply a new config to the pool. The two code paths
130
+ # are slightly different with us needing to craft the dag and validate
131
+ # it if we have a task. In the future we could move this logic to the
132
+ # server side and simplify this code, for the time being we keep it here.
133
+ if task is None:
134
+ if workers is None:
135
+ raise ValueError(f'Cannot create a new {noun} without specifying '
136
+ f'task or workers. Please provide either a task '
137
+ f'or specify the number of workers.')
138
+
139
+ body = payloads.JobsPoolApplyBody(
140
+ workers=workers,
141
+ pool_name=service_name,
142
+ mode=mode,
143
+ )
144
+
145
+ response = server_common.make_authenticated_request(
146
+ 'POST',
147
+ '/jobs/pool_apply',
148
+ json=json.loads(body.model_dump_json()),
149
+ timeout=(5, None))
150
+ return server_common.get_request_id(response)
151
+ else:
152
+ dag = dag_utils.convert_entrypoint_to_dag(task)
153
+ with admin_policy_utils.apply_and_use_config_in_current_request(
154
+ dag,
155
+ request_name=request_names.AdminPolicyRequestName.
156
+ JOBS_POOL_APPLY,
157
+ at_client_side=True) as dag:
158
+ sdk.validate(dag)
159
+ request_id = sdk.optimize(dag)
160
+ sdk.stream_and_get(request_id)
161
+ if _need_confirmation:
162
+ prompt = f'Applying config to {noun} {service_name!r}. Proceed?'
163
+ if prompt is not None:
164
+ click.confirm(prompt,
165
+ default=True,
166
+ abort=True,
167
+ show_default=True)
168
+
169
+ dag = client_common.upload_mounts_to_api_server(dag)
170
+ dag_str = dag_utils.dump_chain_dag_to_yaml_str(dag)
171
+
172
+ body = payloads.JobsPoolApplyBody(
173
+ task=dag_str,
174
+ pool_name=service_name,
175
+ mode=mode,
176
+ )
177
+ response = server_common.make_authenticated_request(
178
+ 'POST',
179
+ '/jobs/pool_apply',
180
+ json=json.loads(body.model_dump_json()),
181
+ timeout=(5, None))
182
+ return server_common.get_request_id(response)
183
+
184
+
185
+ def down(
186
+ service_names: Optional[Union[str, List[str]]],
187
+ all: bool = False, # pylint: disable=redefined-builtin
188
+ purge: bool = False,
189
+ pool: bool = False,
190
+ ) -> server_common.RequestId[None]:
191
+ if pool:
192
+ body = payloads.JobsPoolDownBody(
193
+ pool_names=service_names,
194
+ all=all,
195
+ purge=purge,
196
+ )
197
+ else:
198
+ body = payloads.ServeDownBody(
199
+ service_names=service_names,
200
+ all=all,
201
+ purge=purge,
202
+ )
203
+ response = server_common.make_authenticated_request(
204
+ 'POST',
205
+ '/jobs/pool_down' if pool else '/serve/down',
206
+ json=json.loads(body.model_dump_json()),
207
+ timeout=(5, None))
208
+ return server_common.get_request_id(response)
209
+
210
+
211
+ def status(
212
+ service_names: Optional[Union[str, List[str]]],
213
+ pool: bool = False,
214
+ ) -> server_common.RequestId[List[Dict[str, Any]]]:
215
+ if pool:
216
+ body = payloads.JobsPoolStatusBody(pool_names=service_names)
217
+ else:
218
+ body = payloads.ServeStatusBody(service_names=service_names)
219
+ response = server_common.make_authenticated_request(
220
+ 'POST',
221
+ '/jobs/pool_status' if pool else '/serve/status',
222
+ json=json.loads(body.model_dump_json()),
223
+ timeout=(5, None))
224
+ return server_common.get_request_id(response)
225
+
226
+
227
+ def tail_logs(service_name: str,
228
+ target: Union[str, 'serve_utils.ServiceComponent'],
229
+ replica_id: Optional[int] = None,
230
+ follow: bool = True,
231
+ output_stream: Optional['io.TextIOBase'] = None,
232
+ tail: Optional[int] = None,
233
+ pool: bool = False) -> None:
234
+ # Avoid circular import.
235
+ from sky.client import sdk # pylint: disable=import-outside-toplevel
236
+
237
+ if pool:
238
+ body = payloads.JobsPoolLogsBody(
239
+ pool_name=service_name,
240
+ target=target,
241
+ worker_id=replica_id,
242
+ follow=follow,
243
+ tail=tail,
244
+ )
245
+ else:
246
+ body = payloads.ServeLogsBody(
247
+ service_name=service_name,
248
+ target=target,
249
+ replica_id=replica_id,
250
+ follow=follow,
251
+ tail=tail,
252
+ )
253
+ response = server_common.make_authenticated_request(
254
+ 'POST',
255
+ '/jobs/pool_logs' if pool else '/serve/logs',
256
+ json=json.loads(body.model_dump_json()),
257
+ timeout=(5, None),
258
+ stream=True)
259
+ request_id: server_common.RequestId[None] = server_common.get_request_id(
260
+ response)
261
+ sdk.stream_response(request_id=request_id,
262
+ response=response,
263
+ output_stream=output_stream,
264
+ resumable=True,
265
+ get_result=follow)
266
+
267
+
268
+ def sync_down_logs(service_name: str,
269
+ local_dir: str,
270
+ *,
271
+ targets: Optional[Union[
272
+ str, 'serve_utils.ServiceComponent',
273
+ Sequence[Union[str,
274
+ 'serve_utils.ServiceComponent']]]] = None,
275
+ replica_ids: Optional[List[int]] = None,
276
+ tail: Optional[int] = None,
277
+ pool: bool = False) -> None:
278
+ # Avoid circular import.
279
+ from sky.client import sdk # pylint: disable=import-outside-toplevel
280
+
281
+ if pool:
282
+ body = payloads.JobsPoolDownloadLogsBody(
283
+ pool_name=service_name,
284
+ local_dir=local_dir,
285
+ targets=targets,
286
+ worker_ids=replica_ids,
287
+ tail=tail,
288
+ )
289
+ else:
290
+ body = payloads.ServeDownloadLogsBody(
291
+ service_name=service_name,
292
+ # No need to set here, since the server will override it
293
+ # to a directory on the API server.
294
+ local_dir=local_dir,
295
+ targets=targets,
296
+ replica_ids=replica_ids,
297
+ tail=tail,
298
+ )
299
+ response = server_common.make_authenticated_request(
300
+ 'POST',
301
+ '/jobs/pool_sync-down-logs' if pool else '/serve/sync-down-logs',
302
+ json=json.loads(body.model_dump_json()),
303
+ timeout=(5, None))
304
+ request_id: server_common.RequestId[str] = server_common.get_request_id(
305
+ response)
306
+ remote_dir = sdk.stream_and_get(request_id)
307
+
308
+ # Download from API server paths to the client's local_dir
309
+ client_common.download_logs_from_api_server([remote_dir], remote_dir,
310
+ local_dir)
sky/serve/client/sdk.py CHANGED
@@ -1,28 +1,23 @@
1
1
  """SDK for SkyServe."""
2
2
  import json
3
3
  import typing
4
- from typing import List, Optional, Union
4
+ from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
5
5
 
6
- import click
7
-
8
- from sky.adaptors import common as adaptors_common
9
- from sky.client import common as client_common
6
+ from sky.serve.client import impl
10
7
  from sky.server import common as server_common
8
+ from sky.server import rest
11
9
  from sky.server.requests import payloads
12
10
  from sky.usage import usage_lib
13
- from sky.utils import dag_utils
11
+ from sky.utils import context
14
12
 
15
13
  if typing.TYPE_CHECKING:
16
14
  import io
17
15
 
18
- import requests
19
-
20
16
  import sky
21
17
  from sky.serve import serve_utils
22
- else:
23
- requests = adaptors_common.LazyImport('requests')
24
18
 
25
19
 
20
+ @context.contextual
26
21
  @usage_lib.entrypoint
27
22
  @server_common.check_server_healthy_or_start
28
23
  def up(
@@ -31,7 +26,7 @@ def up(
31
26
  # Internal only:
32
27
  # pylint: disable=invalid-name
33
28
  _need_confirmation: bool = False
34
- ) -> server_common.RequestId:
29
+ ) -> server_common.RequestId[Tuple[str, str]]:
35
30
  """Spins up a service.
36
31
 
37
32
  Please refer to the sky.cli.serve_up for the document.
@@ -50,35 +45,13 @@ def up(
50
45
  argument.
51
46
  endpoint (str): The service endpoint.
52
47
  """
53
-
54
- # Avoid circular import.
55
- from sky.client import sdk # pylint: disable=import-outside-toplevel
56
-
57
- dag = dag_utils.convert_entrypoint_to_dag(task)
58
- sdk.validate(dag)
59
- request_id = sdk.optimize(dag)
60
- sdk.stream_and_get(request_id)
61
- if _need_confirmation:
62
- prompt = f'Launching a new service {service_name!r}. Proceed?'
63
- if prompt is not None:
64
- click.confirm(prompt, default=True, abort=True, show_default=True)
65
-
66
- dag = client_common.upload_mounts_to_api_server(dag)
67
- dag_str = dag_utils.dump_chain_dag_to_yaml_str(dag)
68
-
69
- body = payloads.ServeUpBody(
70
- task=dag_str,
71
- service_name=service_name,
72
- )
73
- response = requests.post(
74
- f'{server_common.get_server_url()}/serve/up',
75
- json=json.loads(body.model_dump_json()),
76
- timeout=(5, None),
77
- cookies=server_common.get_api_cookie_jar(),
78
- )
79
- return server_common.get_request_id(response)
48
+ return impl.up(task,
49
+ service_name,
50
+ pool=False,
51
+ _need_confirmation=_need_confirmation)
80
52
 
81
53
 
54
+ @context.contextual
82
55
  @usage_lib.entrypoint
83
56
  @server_common.check_server_healthy_or_start
84
57
  def update(
@@ -88,7 +61,7 @@ def update(
88
61
  # Internal only:
89
62
  # pylint: disable=invalid-name
90
63
  _need_confirmation: bool = False
91
- ) -> server_common.RequestId:
64
+ ) -> server_common.RequestId[None]:
92
65
  """Updates an existing service.
93
66
 
94
67
  Please refer to the sky.cli.serve_update for the document.
@@ -108,34 +81,11 @@ def update(
108
81
  Request Returns:
109
82
  None
110
83
  """
111
- # Avoid circular import.
112
- from sky.client import sdk # pylint: disable=import-outside-toplevel
113
-
114
- dag = dag_utils.convert_entrypoint_to_dag(task)
115
- sdk.validate(dag)
116
- request_id = sdk.optimize(dag)
117
- sdk.stream_and_get(request_id)
118
- if _need_confirmation:
119
- click.confirm(f'Updating service {service_name!r}. Proceed?',
120
- default=True,
121
- abort=True,
122
- show_default=True)
123
-
124
- dag = client_common.upload_mounts_to_api_server(dag)
125
- dag_str = dag_utils.dump_chain_dag_to_yaml_str(dag)
126
- body = payloads.ServeUpdateBody(
127
- task=dag_str,
128
- service_name=service_name,
129
- mode=mode,
130
- )
131
-
132
- response = requests.post(
133
- f'{server_common.get_server_url()}/serve/update',
134
- json=json.loads(body.model_dump_json()),
135
- timeout=(5, None),
136
- cookies=server_common.get_api_cookie_jar(),
137
- )
138
- return server_common.get_request_id(response)
84
+ return impl.update(task,
85
+ service_name,
86
+ mode,
87
+ pool=False,
88
+ _need_confirmation=_need_confirmation)
139
89
 
140
90
 
141
91
  @usage_lib.entrypoint
@@ -144,7 +94,7 @@ def down(
144
94
  service_names: Optional[Union[str, List[str]]],
145
95
  all: bool = False, # pylint: disable=redefined-builtin
146
96
  purge: bool = False
147
- ) -> server_common.RequestId:
97
+ ) -> server_common.RequestId[None]:
148
98
  """Tears down a service.
149
99
 
150
100
  Please refer to the sky.cli.serve_down for the docs.
@@ -166,24 +116,13 @@ def down(
166
116
  ValueError: if the arguments are invalid.
167
117
  RuntimeError: if failed to terminate the service.
168
118
  """
169
- body = payloads.ServeDownBody(
170
- service_names=service_names,
171
- all=all,
172
- purge=purge,
173
- )
174
- response = requests.post(
175
- f'{server_common.get_server_url()}/serve/down',
176
- json=json.loads(body.model_dump_json()),
177
- timeout=(5, None),
178
- cookies=server_common.get_api_cookie_jar(),
179
- )
180
- return server_common.get_request_id(response)
119
+ return impl.down(service_names, all, purge, pool=False)
181
120
 
182
121
 
183
122
  @usage_lib.entrypoint
184
123
  @server_common.check_server_healthy_or_start
185
124
  def terminate_replica(service_name: str, replica_id: int,
186
- purge: bool) -> server_common.RequestId:
125
+ purge: bool) -> server_common.RequestId[None]:
187
126
  """Tears down a specific replica for the given service.
188
127
 
189
128
  Args:
@@ -206,20 +145,19 @@ def terminate_replica(service_name: str, replica_id: int,
206
145
  replica_id=replica_id,
207
146
  purge=purge,
208
147
  )
209
- response = requests.post(
210
- f'{server_common.get_server_url()}/serve/terminate-replica',
148
+ response = server_common.make_authenticated_request(
149
+ 'POST',
150
+ '/serve/terminate-replica',
211
151
  json=json.loads(body.model_dump_json()),
212
- timeout=(5, None),
213
- cookies=server_common.get_api_cookie_jar(),
214
- )
152
+ timeout=(5, None))
215
153
  return server_common.get_request_id(response)
216
154
 
217
155
 
218
156
  @usage_lib.entrypoint
219
157
  @server_common.check_server_healthy_or_start
220
158
  def status(
221
- service_names: Optional[Union[str,
222
- List[str]]]) -> server_common.RequestId:
159
+ service_names: Optional[Union[str, List[str]]]
160
+ ) -> server_common.RequestId[List[Dict[str, Any]]]:
223
161
  """Gets service statuses.
224
162
 
225
163
  If service_names is given, return those services. Otherwise, return all
@@ -278,23 +216,18 @@ def status(
278
216
  RuntimeError: if failed to get the service status.
279
217
  exceptions.ClusterNotUpError: if the sky serve controller is not up.
280
218
  """
281
- body = payloads.ServeStatusBody(service_names=service_names,)
282
- response = requests.post(
283
- f'{server_common.get_server_url()}/serve/status',
284
- json=json.loads(body.model_dump_json()),
285
- timeout=(5, None),
286
- cookies=server_common.get_api_cookie_jar(),
287
- )
288
- return server_common.get_request_id(response)
219
+ return impl.status(service_names, pool=False)
289
220
 
290
221
 
291
222
  @usage_lib.entrypoint
292
223
  @server_common.check_server_healthy_or_start
224
+ @rest.retry_transient_errors()
293
225
  def tail_logs(service_name: str,
294
226
  target: Union[str, 'serve_utils.ServiceComponent'],
295
227
  replica_id: Optional[int] = None,
296
228
  follow: bool = True,
297
- output_stream: Optional['io.TextIOBase'] = None) -> None:
229
+ output_stream: Optional['io.TextIOBase'] = None,
230
+ tail: Optional[int] = None) -> None:
298
231
  """Tails logs for a service.
299
232
 
300
233
  Usage:
@@ -356,24 +289,13 @@ def tail_logs(service_name: str,
356
289
  sky.exceptions.ClusterNotUpError: the sky serve controller is not up.
357
290
  ValueError: arguments not valid, or failed to tail the logs.
358
291
  """
359
- # Avoid circular import.
360
- from sky.client import sdk # pylint: disable=import-outside-toplevel
361
-
362
- body = payloads.ServeLogsBody(
363
- service_name=service_name,
364
- target=target,
365
- replica_id=replica_id,
366
- follow=follow,
367
- )
368
- response = requests.post(
369
- f'{server_common.get_server_url()}/serve/logs',
370
- json=json.loads(body.model_dump_json()),
371
- timeout=(5, None),
372
- stream=True,
373
- cookies=server_common.get_api_cookie_jar(),
374
- )
375
- request_id = server_common.get_request_id(response)
376
- sdk.stream_response(request_id, response, output_stream)
292
+ return impl.tail_logs(service_name,
293
+ target,
294
+ replica_id,
295
+ follow,
296
+ output_stream,
297
+ tail,
298
+ pool=False)
377
299
 
378
300
 
379
301
  @usage_lib.entrypoint
@@ -383,9 +305,10 @@ def sync_down_logs(service_name: str,
383
305
  *,
384
306
  targets: Optional[Union[
385
307
  str, 'serve_utils.ServiceComponent',
386
- List[Union[str,
387
- 'serve_utils.ServiceComponent']]]] = None,
388
- replica_ids: Optional[List[int]] = None) -> None:
308
+ Sequence[Union[str,
309
+ 'serve_utils.ServiceComponent']]]] = None,
310
+ replica_ids: Optional[List[int]] = None,
311
+ tail: Optional[int] = None) -> None:
389
312
  """Sync down logs from the service components to a local directory.
390
313
 
391
314
  This function syncs logs from the specified service components (controller,
@@ -414,24 +337,9 @@ def sync_down_logs(service_name: str,
414
337
  sky.exceptions.ClusterNotUpError: If the controller is not up.
415
338
  ValueError: Arguments not valid.
416
339
  """
417
- # Avoid circular import.
418
- from sky.client import sdk # pylint: disable=import-outside-toplevel
419
-
420
- body = payloads.ServeDownloadLogsBody(
421
- service_name=service_name,
422
- # No need to set here, since the server will override it
423
- # to a directory on the API server.
424
- local_dir=local_dir,
425
- targets=targets,
426
- replica_ids=replica_ids,
427
- )
428
- response = requests.post(
429
- f'{server_common.get_server_url()}/serve/sync-down-logs',
430
- json=json.loads(body.model_dump_json()),
431
- timeout=(5, None),
432
- )
433
- remote_dir = sdk.stream_and_get(server_common.get_request_id(response))
434
-
435
- # Download from API server paths to the client's local_dir
436
- client_common.download_logs_from_api_server([remote_dir], remote_dir,
437
- local_dir)
340
+ return impl.sync_down_logs(service_name,
341
+ local_dir,
342
+ targets=targets,
343
+ replica_ids=replica_ids,
344
+ tail=tail,
345
+ pool=False)