skypilot-nightly 1.0.0.dev20250302__py3-none-any.whl → 1.0.0.dev20250304__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.
sky/jobs/client/sdk.py CHANGED
@@ -184,7 +184,7 @@ def tail_logs(name: Optional[str] = None,
184
184
  follow: bool = True,
185
185
  controller: bool = False,
186
186
  refresh: bool = False,
187
- output_stream: Optional['io.TextIOBase'] = None) -> None:
187
+ output_stream: Optional['io.TextIOBase'] = None) -> int:
188
188
  """Tails logs of managed jobs.
189
189
 
190
190
  You can provide either a job name or a job ID to tail logs. If both are not
@@ -199,6 +199,11 @@ def tail_logs(name: Optional[str] = None,
199
199
  output_stream: The stream to write the logs to. If None, print to the
200
200
  console.
201
201
 
202
+ Returns:
203
+ Exit code based on success or failure of the job. 0 if success,
204
+ 100 if the job failed. See exceptions.JobExitCode for possible exit
205
+ codes.
206
+
202
207
  Request Raises:
203
208
  ValueError: invalid arguments.
204
209
  sky.exceptions.ClusterNotUpError: the jobs controller is not up.
@@ -217,7 +222,7 @@ def tail_logs(name: Optional[str] = None,
217
222
  timeout=(5, None),
218
223
  )
219
224
  request_id = server_common.get_request_id(response)
220
- sdk.stream_response(request_id, response, output_stream)
225
+ return sdk.stream_response(request_id, response, output_stream)
221
226
 
222
227
 
223
228
  @usage_lib.entrypoint
sky/jobs/constants.py CHANGED
@@ -40,7 +40,7 @@ JOBS_CLUSTER_NAME_PREFIX_LENGTH = 25
40
40
  # The version of the lib files that jobs/utils use. Whenever there is an API
41
41
  # change for the jobs/utils, we need to bump this version and update
42
42
  # job.utils.ManagedJobCodeGen to handle the version update.
43
- MANAGED_JOBS_VERSION = 2
43
+ MANAGED_JOBS_VERSION = 3
44
44
 
45
45
  # The command for setting up the jobs dashboard on the controller. It firstly
46
46
  # checks if the systemd services are available, and if not (e.g., Kubernetes
sky/jobs/server/core.py CHANGED
@@ -460,12 +460,17 @@ def cancel(name: Optional[str] = None,
460
460
 
461
461
  @usage_lib.entrypoint
462
462
  def tail_logs(name: Optional[str], job_id: Optional[int], follow: bool,
463
- controller: bool, refresh: bool) -> None:
463
+ controller: bool, refresh: bool) -> int:
464
464
  # NOTE(dev): Keep the docstring consistent between the Python API and CLI.
465
465
  """Tail logs of managed jobs.
466
466
 
467
467
  Please refer to sky.cli.job_logs for documentation.
468
468
 
469
+ Returns:
470
+ Exit code based on success or failure of the job. 0 if success,
471
+ 100 if the job failed. See exceptions.JobExitCode for possible exit
472
+ codes.
473
+
469
474
  Raises:
470
475
  ValueError: invalid arguments.
471
476
  sky.exceptions.ClusterNotUpError: the jobs controller is not up.
@@ -494,11 +499,11 @@ def tail_logs(name: Optional[str], job_id: Optional[int], follow: bool,
494
499
  backend = backend_utils.get_backend_from_handle(handle)
495
500
  assert isinstance(backend, backends.CloudVmRayBackend), backend
496
501
 
497
- backend.tail_managed_job_logs(handle,
498
- job_id=job_id,
499
- job_name=name,
500
- follow=follow,
501
- controller=controller)
502
+ return backend.tail_managed_job_logs(handle,
503
+ job_id=job_id,
504
+ job_name=name,
505
+ follow=follow,
506
+ controller=controller)
502
507
 
503
508
 
504
509
  def start_dashboard_forwarding(refresh: bool = False) -> Tuple[int, int]:
sky/jobs/utils.py CHANGED
@@ -511,8 +511,14 @@ def cancel_job_by_name(job_name: str) -> str:
511
511
  return f'Job {job_name!r} is scheduled to be cancelled.'
512
512
 
513
513
 
514
- def stream_logs_by_id(job_id: int, follow: bool = True) -> str:
515
- """Stream logs by job id."""
514
+ def stream_logs_by_id(job_id: int, follow: bool = True) -> Tuple[str, int]:
515
+ """Stream logs by job id.
516
+
517
+ Returns:
518
+ A tuple containing the log message and an exit code based on success or
519
+ failure of the job. 0 if success, 100 if the job failed.
520
+ See exceptions.JobExitCode for possible exit codes.
521
+ """
516
522
 
517
523
  def should_keep_logging(status: managed_job_state.ManagedJobStatus) -> bool:
518
524
  # If we see CANCELLING, just exit - we could miss some job logs but the
@@ -547,13 +553,16 @@ def stream_logs_by_id(job_id: int, follow: bool = True) -> str:
547
553
  start_streaming = True
548
554
  if start_streaming:
549
555
  print(line, end='', flush=True)
550
- return ''
556
+ return '', exceptions.JobExitCode.from_managed_job_status(
557
+ managed_job_status)
551
558
  return (f'{colorama.Fore.YELLOW}'
552
559
  f'Job {job_id} is already in terminal state '
553
560
  f'{managed_job_status.value}. For more details, run: '
554
561
  f'sky jobs logs --controller {job_id}'
555
562
  f'{colorama.Style.RESET_ALL}'
556
- f'{job_msg}')
563
+ f'{job_msg}',
564
+ exceptions.JobExitCode.from_managed_job_status(
565
+ managed_job_status))
557
566
  backend = backends.CloudVmRayBackend()
558
567
  task_id, managed_job_status = (
559
568
  managed_job_state.get_latest_task_id_status(job_id))
@@ -604,11 +613,12 @@ def stream_logs_by_id(job_id: int, follow: bool = True) -> str:
604
613
  job_id=None,
605
614
  managed_job_id=job_id,
606
615
  follow=follow)
607
- if returncode == 0:
608
- # If the log tailing exit successfully (the real job can be
609
- # SUCCEEDED or FAILED), we can safely break the loop. We use the
610
- # status in job queue to show the information, as the
611
- # ManagedJobStatus is not updated yet.
616
+ if returncode in [rc.value for rc in exceptions.JobExitCode]:
617
+ # If the log tailing exits with a known exit code we can safely
618
+ # break the loop because it indicates the tailing process
619
+ # succeeded (even though the real job can be SUCCEEDED or
620
+ # FAILED). We use the status in job queue to show the
621
+ # information, as the ManagedJobStatus is not updated yet.
612
622
  job_statuses = backend.get_job_status(handle, stream_logs=False)
613
623
  job_status = list(job_statuses.values())[0]
614
624
  assert job_status is not None, 'No job found.'
@@ -728,18 +738,25 @@ def stream_logs_by_id(job_id: int, follow: bool = True) -> str:
728
738
  logger.info(
729
739
  ux_utils.finishing_message(f'Managed job finished: {job_id} '
730
740
  f'(status: {managed_job_status.value}).'))
731
- return ''
741
+ return '', exceptions.JobExitCode.from_managed_job_status(
742
+ managed_job_status)
732
743
 
733
744
 
734
745
  def stream_logs(job_id: Optional[int],
735
746
  job_name: Optional[str],
736
747
  controller: bool = False,
737
- follow: bool = True) -> str:
738
- """Stream logs by job id or job name."""
748
+ follow: bool = True) -> Tuple[str, int]:
749
+ """Stream logs by job id or job name.
750
+
751
+ Returns:
752
+ A tuple containing the log message and the exit code based on success
753
+ or failure of the job. 0 if success, 100 if the job failed.
754
+ See exceptions.JobExitCode for possible exit codes.
755
+ """
739
756
  if job_id is None and job_name is None:
740
757
  job_id = managed_job_state.get_latest_job_id()
741
758
  if job_id is None:
742
- return 'No managed job found.'
759
+ return 'No managed job found.', exceptions.JobExitCode.NOT_FOUND
743
760
 
744
761
  if controller:
745
762
  if job_id is None:
@@ -754,7 +771,8 @@ def stream_logs(job_id: Optional[int],
754
771
  if job['job_name'] == job_name
755
772
  }
756
773
  if not managed_job_ids:
757
- return f'No managed job found with name {job_name!r}.'
774
+ return (f'No managed job found with name {job_name!r}.',
775
+ exceptions.JobExitCode.NOT_FOUND)
758
776
  if len(managed_job_ids) > 1:
759
777
  job_ids_str = ', '.join(
760
778
  str(job_id) for job_id in managed_job_ids)
@@ -776,7 +794,7 @@ def stream_logs(job_id: Optional[int],
776
794
  if not follow:
777
795
  # Assume that the log file hasn't been written yet. Since we
778
796
  # aren't following, just return.
779
- return ''
797
+ return '', exceptions.JobExitCode.SUCCEEDED
780
798
 
781
799
  job_status = managed_job_state.get_status(job_id)
782
800
  if job_status is None:
@@ -787,7 +805,8 @@ def stream_logs(job_id: Optional[int],
787
805
  # point, it never will be. This job may have been submitted
788
806
  # using an old version that did not create the log file, so this
789
807
  # is not considered an exceptional case.
790
- return ''
808
+ return '', exceptions.JobExitCode.from_managed_job_status(
809
+ job_status)
791
810
 
792
811
  time.sleep(log_lib.SKY_LOG_WAITING_GAP_SECONDS)
793
812
 
@@ -833,15 +852,17 @@ def stream_logs(job_id: Optional[int],
833
852
 
834
853
  if follow:
835
854
  return ux_utils.finishing_message(
836
- f'Job finished (status: {job_status}).')
855
+ f'Job finished (status: {job_status}).'
856
+ ), exceptions.JobExitCode.from_managed_job_status(job_status)
837
857
 
838
- return ''
858
+ return '', exceptions.JobExitCode.SUCCEEDED
839
859
 
840
860
  if job_id is None:
841
861
  assert job_name is not None
842
862
  job_ids = managed_job_state.get_nonterminal_job_ids_by_name(job_name)
843
863
  if not job_ids:
844
- return f'No running managed job found with name {job_name!r}.'
864
+ return (f'No running managed job found with name {job_name!r}.',
865
+ exceptions.JobExitCode.NOT_FOUND)
845
866
  if len(job_ids) > 1:
846
867
  raise ValueError(
847
868
  f'Multiple running jobs found with name {job_name!r}.')
@@ -1167,6 +1188,7 @@ class ManagedJobCodeGen:
1167
1188
  >> codegen = ManagedJobCodeGen.show_jobs(...)
1168
1189
  """
1169
1190
  _PREFIX = textwrap.dedent("""\
1191
+ import sys
1170
1192
  from sky.jobs import utils
1171
1193
  from sky.jobs import state as managed_job_state
1172
1194
  from sky.jobs import constants as managed_job_constants
@@ -1222,9 +1244,17 @@ class ManagedJobCodeGen:
1222
1244
  follow: bool = True,
1223
1245
  controller: bool = False) -> str:
1224
1246
  code = textwrap.dedent(f"""\
1225
- msg = utils.stream_logs({job_id!r}, {job_name!r},
1247
+ result = utils.stream_logs(job_id={job_id!r}, job_name={job_name!r},
1226
1248
  follow={follow}, controller={controller})
1227
- print(msg, flush=True)
1249
+ if managed_job_version < 3:
1250
+ # Versions 2 and older did not return a retcode, so we just print
1251
+ # the result.
1252
+ # TODO: Remove compatibility before 0.12.0
1253
+ print(result, flush=True)
1254
+ else:
1255
+ msg, retcode = result
1256
+ print(msg, flush=True)
1257
+ sys.exit(retcode)
1228
1258
  """)
1229
1259
  return cls._build(code)
1230
1260
 
@@ -298,7 +298,7 @@ def query_instances(
298
298
  'pending': status_lib.ClusterStatus.INIT,
299
299
  'stopped': status_lib.ClusterStatus.STOPPED,
300
300
  'running': status_lib.ClusterStatus.UP,
301
- 'unhealthy': status_lib.ClusterStatus.INIT,
301
+ 'failed': status_lib.ClusterStatus.INIT,
302
302
  'terminated': None,
303
303
  }
304
304
  statuses: Dict[str, Optional[status_lib.ClusterStatus]] = {}
sky/server/constants.py CHANGED
@@ -3,7 +3,7 @@
3
3
  # API server version, whenever there is a change in API server that requires a
4
4
  # restart of the local API server or error out when the client does not match
5
5
  # the server version.
6
- API_VERSION = '2'
6
+ API_VERSION = '3'
7
7
 
8
8
  # Prefix for API request names.
9
9
  REQUEST_NAME_PREFIX = 'sky.'
@@ -12,6 +12,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union
12
12
 
13
13
  import pydantic
14
14
 
15
+ from sky import admin_policy
15
16
  from sky import serve
16
17
  from sky import sky_logging
17
18
  from sky import skypilot_config
@@ -113,15 +114,9 @@ class CheckBody(RequestBody):
113
114
  verbose: bool
114
115
 
115
116
 
116
- class ValidateBody(RequestBody):
117
- """The request body for the validate endpoint."""
118
- dag: str
119
-
120
-
121
- class OptimizeBody(RequestBody):
122
- """The request body for the optimize endpoint."""
117
+ class DagRequestBody(RequestBody):
118
+ """Request body base class for endpoints with a dag."""
123
119
  dag: str
124
- minimize: common_lib.OptimizeTarget = common_lib.OptimizeTarget.COST
125
120
 
126
121
  def to_kwargs(self) -> Dict[str, Any]:
127
122
  # Import here to avoid requirement of the whole SkyPilot dependency on
@@ -139,6 +134,19 @@ class OptimizeBody(RequestBody):
139
134
  return kwargs
140
135
 
141
136
 
137
+ class ValidateBody(DagRequestBody):
138
+ """The request body for the validate endpoint."""
139
+ dag: str
140
+ request_options: Optional[admin_policy.RequestOptions]
141
+
142
+
143
+ class OptimizeBody(DagRequestBody):
144
+ """The request body for the optimize endpoint."""
145
+ dag: str
146
+ minimize: common_lib.OptimizeTarget = common_lib.OptimizeTarget.COST
147
+ request_options: Optional[admin_policy.RequestOptions]
148
+
149
+
142
150
  class LaunchBody(RequestBody):
143
151
  """The request body for the launch endpoint."""
144
152
  task: str
sky/server/server.py CHANGED
@@ -27,7 +27,6 @@ from sky import core
27
27
  from sky import exceptions
28
28
  from sky import execution
29
29
  from sky import global_user_state
30
- from sky import optimizer
31
30
  from sky import sky_logging
32
31
  from sky.clouds import service_catalog
33
32
  from sky.data import storage_utils
@@ -42,6 +41,7 @@ from sky.server.requests import payloads
42
41
  from sky.server.requests import requests as requests_lib
43
42
  from sky.skylet import constants
44
43
  from sky.usage import usage_lib
44
+ from sky.utils import admin_policy_utils
45
45
  from sky.utils import common as common_lib
46
46
  from sky.utils import common_utils
47
47
  from sky.utils import dag_utils
@@ -258,9 +258,22 @@ async def validate(validate_body: payloads.ValidateBody) -> None:
258
258
  """Validates the user's DAG."""
259
259
  # TODO(SKY-1035): validate if existing cluster satisfies the requested
260
260
  # resources, e.g. sky exec --gpus V100:8 existing-cluster-with-no-gpus
261
+
262
+ # TODO: Our current launch process is split into three calls:
263
+ # validate, optimize, and launch. This requires us to apply the admin policy
264
+ # in each step, which may be an expensive operation. We should consolidate
265
+ # these into a single call or have a TTL cache for (task, admin_policy)
266
+ # pairs.
261
267
  logger.debug(f'Validating tasks: {validate_body.dag}')
262
268
  try:
263
269
  dag = dag_utils.load_chain_dag_from_yaml_str(validate_body.dag)
270
+ # TODO: Admin policy may contain arbitrary code, which may be expensive
271
+ # to run and may block the server thread. However, moving it into the
272
+ # executor adds a ~150ms penalty on the local API server because of
273
+ # added RTTs. For now, we stick to doing the validation inline in the
274
+ # server thread.
275
+ dag, _ = admin_policy_utils.apply(
276
+ dag, request_options=validate_body.request_options)
264
277
  for task in dag.tasks:
265
278
  # Will validate workdir and file_mounts in the backend, as those
266
279
  # need to be validated after the files are uploaded to the SkyPilot
@@ -283,7 +296,7 @@ async def optimize(optimize_body: payloads.OptimizeBody,
283
296
  request_name='optimize',
284
297
  request_body=optimize_body,
285
298
  ignore_return_value=True,
286
- func=optimizer.Optimizer.optimize,
299
+ func=core.optimize,
287
300
  schedule_type=requests_lib.ScheduleType.SHORT,
288
301
  )
289
302
 
sky/skylet/constants.py CHANGED
@@ -93,7 +93,7 @@ SKYLET_VERSION = '12'
93
93
  # The version of the lib files that skylet/jobs use. Whenever there is an API
94
94
  # change for the job_lib or log_lib, we need to bump this version, so that the
95
95
  # user can be notified to update their SkyPilot version on the remote cluster.
96
- SKYLET_LIB_VERSION = 2
96
+ SKYLET_LIB_VERSION = 3
97
97
  SKYLET_VERSION_FILE = '~/.sky/skylet_version'
98
98
 
99
99
  # `sky jobs dashboard`-related
sky/skylet/job_lib.py CHANGED
@@ -938,7 +938,9 @@ class JobLibCodeGen:
938
938
  _PREFIX = [
939
939
  'import os',
940
940
  'import getpass',
941
- 'from sky.skylet import job_lib, log_lib, constants',
941
+ 'import sys',
942
+ 'from sky import exceptions',
943
+ 'from sky.skylet import log_lib, job_lib, constants',
942
944
  ]
943
945
 
944
946
  @classmethod
@@ -1033,6 +1035,13 @@ class JobLibCodeGen:
1033
1035
  f'tail_log_kwargs = {{"job_id": job_id, "log_dir": log_dir, "managed_job_id": {managed_job_id!r}, "follow": {follow}}}',
1034
1036
  f'{_LINUX_NEW_LINE}if getattr(constants, "SKYLET_LIB_VERSION", 1) > 1: tail_log_kwargs["tail"] = {tail}',
1035
1037
  f'{_LINUX_NEW_LINE}log_lib.tail_logs(**tail_log_kwargs)',
1038
+ # After tailing, check the job status and exit with appropriate code
1039
+ 'job_status = job_lib.get_status(job_id)',
1040
+ # Backward compatibility for returning exit code: Skylet versions 2
1041
+ # and older did not have JobExitCode, so we use 0 for those versions
1042
+ # TODO: Remove this special handling after 0.10.0.
1043
+ 'exit_code = exceptions.JobExitCode.from_job_status(job_status) if getattr(constants, "SKYLET_LIB_VERSION", 1) > 2 else 0',
1044
+ 'sys.exit(exit_code)',
1036
1045
  ]
1037
1046
  return cls._build(code)
1038
1047
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250302
3
+ Version: 1.0.0.dev20250304
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -241,13 +241,13 @@ pip install "skypilot-nightly[kubernetes,aws,gcp,azure,oci,lambda,runpod,fluidst
241
241
  </p>
242
242
 
243
243
 
244
- ## Getting Started
244
+ ## Getting started
245
245
  You can find our documentation [here](https://docs.skypilot.co/).
246
246
  - [Installation](https://docs.skypilot.co/en/latest/getting-started/installation.html)
247
247
  - [Quickstart](https://docs.skypilot.co/en/latest/getting-started/quickstart.html)
248
248
  - [CLI reference](https://docs.skypilot.co/en/latest/reference/cli.html)
249
249
 
250
- ## SkyPilot in 1 Minute
250
+ ## SkyPilot in 1 minute
251
251
 
252
252
  A SkyPilot task specifies: resource requirements, data to be synced, setup commands, and the task commands.
253
253
 
@@ -299,59 +299,46 @@ SkyPilot then performs the heavy-lifting for you, including:
299
299
  </p>
300
300
 
301
301
 
302
- Refer to [Quickstart](https://docs.skypilot.co/en/latest/getting-started/quickstart.html) to get started with SkyPilot.
302
+ See [Quickstart](https://docs.skypilot.co/en/latest/getting-started/quickstart.html) to get started with SkyPilot.
303
303
 
304
- ## More Information
304
+ ## Runnable examples
305
+
306
+ See [**SkyPilot examples**](https://docs.skypilot.co/en/docs-examples/examples/index.html) that cover: development, training, serving, LLM models, AI apps, and common frameworks.
307
+
308
+ Latest featured examples:
309
+
310
+ | Task | Examples |
311
+ |----------|----------|
312
+ | Training | [PyTorch](https://docs.skypilot.co/en/latest/getting-started/tutorial.html), [DeepSpeed](https://docs.skypilot.co/en/latest/examples/training/deepspeed.html), [Finetune Llama 3](https://docs.skypilot.co/en/latest/examples/training/llama-3_1-finetuning.html), [NeMo](https://docs.skypilot.co/en/latest/examples/training/nemo.html), [Ray](https://docs.skypilot.co/en/latest/examples/training/ray.html), [Unsloth](https://docs.skypilot.co/en/latest/examples/training/unsloth.html), [Jax/TPU](https://docs.skypilot.co/en/latest/examples/training/tpu.html) |
313
+ | Serving | [vLLM](https://docs.skypilot.co/en/latest/examples/serving/vllm.html), [SGLang](https://docs.skypilot.co/en/latest/examples/serving/sglang.html), [Ollama](https://docs.skypilot.co/en/latest/examples/serving/ollama.html) |
314
+ | Models | [DeepSeek-R1](https://docs.skypilot.co/en/latest/examples/models/deepseek-r1.html), [Llama 3](https://docs.skypilot.co/en/latest/examples/models/llama-3.html), [CodeLlama](https://docs.skypilot.co/en/latest/examples/models/codellama.html), [Qwen](https://docs.skypilot.co/en/latest/examples/models/qwen.html), [Mixtral](https://docs.skypilot.co/en/latest/examples/models/mixtral.html) |
315
+ | AI apps | [RAG](https://docs.skypilot.co/en/latest/examples/applications/rag.html), [vector databases](https://docs.skypilot.co/en/latest/examples/applications/vector_database.html) (ChromaDB, CLIP) |
316
+ | Common frameworks | [Airflow](https://docs.skypilot.co/en/latest/examples/frameworks/airflow.html), [Jupyter](https://docs.skypilot.co/en/latest/examples/frameworks/jupyter.html) |
317
+
318
+ Source files and more examples can be found in [`llm/`](https://github.com/skypilot-org/skypilot/tree/master/llm) and [`examples/`](https://github.com/skypilot-org/skypilot/tree/master/examples).
319
+
320
+ ## More information
305
321
  To learn more, see [SkyPilot Overview](https://docs.skypilot.co/en/latest/overview.html), [SkyPilot docs](https://docs.skypilot.co/en/latest/), and [SkyPilot blog](https://blog.skypilot.co/).
306
322
 
307
- <!-- Keep this section in sync with index.rst in SkyPilot Docs -->
308
- Runnable examples:
309
- - [**AI Gallery**](https://docs.skypilot.co/en/latest/gallery/index.html)
310
- - LLMs on SkyPilot
311
- - [DeepSeek-R1](./llm/deepseek-r1/)
312
- - [DeepSeek-Janus](./llm/deepseek-janus/)
313
- - [Llama 3.2: lightweight and vision models](./llm/llama-3_2/)
314
- - [Pixtral](./llm/pixtral/)
315
- - [Llama 3.1 finetuning](./llm/llama-3_1-finetuning/) and [serving](./llm/llama-3_1/)
316
- - [GPT-2 via `llm.c`](./llm/gpt-2/)
317
- - [Llama 3](./llm/llama-3/)
318
- - [Qwen](./llm/qwen/)
319
- - [Databricks DBRX](./llm/dbrx/)
320
- - [Gemma](./llm/gemma/)
321
- - [Mixtral 8x7B](./llm/mixtral/); [Mistral 7B](https://docs.mistral.ai/self-deployment/skypilot/) (from official Mistral team)
322
- - [Code Llama](./llm/codellama/)
323
- - [vLLM: Serving LLM 24x Faster On the Cloud](./llm/vllm/) (from official vLLM team)
324
- - [SGLang: Fast and Expressive LLM Serving On the Cloud](./llm/sglang/) (from official SGLang team)
325
- - [Vicuna chatbots: Training & Serving](./llm/vicuna/) (from official Vicuna team)
326
- - [Train your own Vicuna on Llama-2](./llm/vicuna-llama-2/)
327
- - [Self-Hosted Llama-2 Chatbot](./llm/llama-2/)
328
- - [Ollama: Quantized LLMs on CPUs](./llm/ollama/)
329
- - [LoRAX](./llm/lorax/)
330
- - [QLoRA](https://github.com/artidoro/qlora/pull/132)
331
- - [LLaMA-LoRA-Tuner](https://github.com/zetavg/LLaMA-LoRA-Tuner#run-on-a-cloud-service-via-skypilot)
332
- - [Tabby: Self-hosted AI coding assistant](https://github.com/TabbyML/tabby/blob/bed723fcedb44a6b867ce22a7b1f03d2f3531c1e/experimental/eval/skypilot.yaml)
333
- - [LocalGPT](./llm/localgpt)
334
- - [Falcon](./llm/falcon)
335
- - Add yours here & see more in [`llm/`](./llm)!
336
- - Framework examples: [Vector Database](./examples/vector_database/), [PyTorch DDP](https://github.com/skypilot-org/skypilot/blob/master/examples/resnet_distributed_torch.yaml), [DeepSpeed](./examples/deepspeed-multinode/sky.yaml), [JAX/Flax on TPU](https://github.com/skypilot-org/skypilot/blob/master/examples/tpu/tpuvm_mnist.yaml), [Stable Diffusion](https://github.com/skypilot-org/skypilot/tree/master/examples/stable_diffusion), [Detectron2](https://github.com/skypilot-org/skypilot/blob/master/examples/detectron2_docker.yaml), [Distributed](https://github.com/skypilot-org/skypilot/blob/master/examples/resnet_distributed_tf_app.py) [TensorFlow](https://github.com/skypilot-org/skypilot/blob/master/examples/resnet_app_storage.yaml), [Ray Train](examples/distributed_ray_train/ray_train.yaml), [NeMo](https://github.com/skypilot-org/skypilot/blob/master/examples/nemo/), [programmatic grid search](https://github.com/skypilot-org/skypilot/blob/master/examples/huggingface_glue_imdb_grid_search_app.py), [Docker](https://github.com/skypilot-org/skypilot/blob/master/examples/docker/echo_app.yaml), [Cog](https://github.com/skypilot-org/skypilot/blob/master/examples/cog/), [Unsloth](https://github.com/skypilot-org/skypilot/blob/master/examples/unsloth/unsloth.yaml), [Ollama](https://github.com/skypilot-org/skypilot/blob/master/llm/ollama), [llm.c](https://github.com/skypilot-org/skypilot/tree/master/llm/gpt-2), [Airflow](./examples/airflow/training_workflow) and [many more (`examples/`)](./examples).
337
-
338
- Case Studies and Integrations: [Community Spotlights](https://blog.skypilot.co/community/)
323
+ Case studies and integrations: [Community Spotlights](https://blog.skypilot.co/community/)
339
324
 
340
325
  Follow updates:
341
- - [Twitter](https://twitter.com/skypilot_org)
342
326
  - [Slack](http://slack.skypilot.co)
327
+ - [X / Twitter](https://twitter.com/skypilot_org)
328
+ - [LinkedIn](https://www.linkedin.com/company/skypilot-oss/)
343
329
  - [SkyPilot Blog](https://blog.skypilot.co/) ([Introductory blog post](https://blog.skypilot.co/introducing-skypilot/))
344
330
 
345
331
  Read the research:
346
332
  - [SkyPilot paper](https://www.usenix.org/system/files/nsdi23-yang-zongheng.pdf) and [talk](https://www.usenix.org/conference/nsdi23/presentation/yang-zongheng) (NSDI 2023)
347
333
  - [Sky Computing whitepaper](https://arxiv.org/abs/2205.07147)
348
334
  - [Sky Computing vision paper](https://sigops.org/s/conferences/hotos/2021/papers/hotos21-s02-stoica.pdf) (HotOS 2021)
349
- - [Policy for Managed Spot Jobs](https://www.usenix.org/conference/nsdi24/presentation/wu-zhanghao) (NSDI 2024)
335
+ - [SkyServe: AI serving across regions and clouds](https://arxiv.org/pdf/2411.01438) (EuroSys 2025)
336
+ - [Managed jobs spot instance policy](https://www.usenix.org/conference/nsdi24/presentation/wu-zhanghao) (NSDI 2024)
350
337
 
351
338
  SkyPilot was initially started at the [Sky Computing Lab](https://sky.cs.berkeley.edu) at UC Berkeley and has since gained many industry contributors. To read about the project's origin and vision, see [Concept: Sky Computing](https://docs.skypilot.co/en/latest/sky-computing.html).
352
339
 
353
- ## Support and Questions
354
- We are excited to hear your feedback!
340
+ ## Questions and feedback
341
+ We are excited to hear your feedback:
355
342
  * For issues and feature requests, please [open a GitHub issue](https://github.com/skypilot-org/skypilot/issues/new).
356
343
  * For questions, please use [GitHub Discussions](https://github.com/skypilot-org/skypilot/discussions).
357
344
 
@@ -1,12 +1,12 @@
1
- sky/__init__.py,sha256=I1eDvAaLP1jLIfIf2_Y64Cz9tEvM6WDxAniUymSbjN8,6428
1
+ sky/__init__.py,sha256=nBS4cQvvG4s3GLt8Ueva04qVaT4Zdxdxpq8oD7kS2SI,6428
2
2
  sky/admin_policy.py,sha256=hPo02f_A32gCqhUueF0QYy1fMSSKqRwYEg_9FxScN_s,3248
3
3
  sky/authentication.py,sha256=hCEqi77nprQEg3ktfRL51xiiw16zwZOmFEDB_Z7fWVU,22384
4
4
  sky/check.py,sha256=NDKx_Zm7YRxPjMv82wz3ESLnGIPljaACyqVdVNM0PzY,11258
5
- sky/cli.py,sha256=-3dv9uu0jp3uRgZYsdI_1SQTE6o0CD1XBql6gMydgHE,220651
5
+ sky/cli.py,sha256=FDCSA5L__Djdk2Dc5eAmbE0YsfEu9zdE8vSu51oA19Q,221469
6
6
  sky/cloud_stores.py,sha256=kEHXd2divyra-1c3EusHxKyM5yTQlTXc6cKVXofsefA,23978
7
- sky/core.py,sha256=fDCit8n9BAXxJ9Dexq_CCOTmY8uZGK73wEaouNCRAbA,45573
7
+ sky/core.py,sha256=MU9hcTdh8baMGrr2ZXmbxx12vNlhajrkeyg5QtV717c,47609
8
8
  sky/dag.py,sha256=Yl7Ry26Vql5cv4YMz8g9kOUgtoCihJnw7c8NgZYakMY,3242
9
- sky/exceptions.py,sha256=RCAojf2r9sUOdFYEhOoB05G-VP0xwkEVfsYdh2TZypA,13783
9
+ sky/exceptions.py,sha256=MrDCfAmxmkTRSrUhOTLNNAYqEZLus_aErJm8b9SvbLk,16077
10
10
  sky/execution.py,sha256=0M4RTEzWn-B9oz221XdZOIGH12XOACmNq0j-WGUT_No,28023
11
11
  sky/global_user_state.py,sha256=sUDdSsJeiJkbgmZNwy8YGFK0XeNh-RBr1VDUvbmjf0g,33246
12
12
  sky/models.py,sha256=4xSW05BdDPEjW8Ubvj3VlVOVnzv0TbrolsFvR5R5v1U,638
@@ -34,7 +34,7 @@ sky/adaptors/vsphere.py,sha256=zJP9SeObEoLrpgHW2VHvZE48EhgVf8GfAEIwBeaDMfM,2129
34
34
  sky/backends/__init__.py,sha256=UDjwbUgpTRApbPJnNfR786GadUuwgRk3vsWoVu5RB_c,536
35
35
  sky/backends/backend.py,sha256=4BOqKZ-bwBTpjNnZF4JAHX2m2Iga7EmEn8Ao3tEivaM,7527
36
36
  sky/backends/backend_utils.py,sha256=B_46tG9PyrppxLWdg4mWGuuIr3TEcWTz6qhYXjAY2bw,133452
37
- sky/backends/cloud_vm_ray_backend.py,sha256=B8sH-m5pujvkTN_sLENsHw-SWpbaWwlHda26yI_1wnk,247459
37
+ sky/backends/cloud_vm_ray_backend.py,sha256=KIU4IkUTBGE__7MC3ayjYMwE14mSxeiHjrGnK7wAQXw,247773
38
38
  sky/backends/docker_utils.py,sha256=Hyw1YY20EyghhEbYx6O2FIMDcGkNzBzV9TM7LFynei8,8358
39
39
  sky/backends/local_docker_backend.py,sha256=nSYCjms3HOPjPNOrcCqsUKm1WV3AAovRFjEQ7hcEXW4,17021
40
40
  sky/backends/wheel_utils.py,sha256=5BUzBqfYz7p1ME6_0PXGmcsAkLVb8NrFt317p7a4X8s,8278
@@ -43,9 +43,9 @@ sky/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  sky/benchmark/benchmark_state.py,sha256=X8CXmuU9KgsDRhKedhFgjeRMUFWtQsjFs1qECvPG2yg,8723
44
44
  sky/benchmark/benchmark_utils.py,sha256=o4RymqSceq5mLEZL0upQM6NVEzJJQzj9s9tTm49uUTc,26365
45
45
  sky/client/__init__.py,sha256=pz6xvVSd9X-gwqbsDL0E9QOojYqM0KAD0j-NCyCIF1k,38
46
- sky/client/cli.py,sha256=-3dv9uu0jp3uRgZYsdI_1SQTE6o0CD1XBql6gMydgHE,220651
46
+ sky/client/cli.py,sha256=FDCSA5L__Djdk2Dc5eAmbE0YsfEu9zdE8vSu51oA19Q,221469
47
47
  sky/client/common.py,sha256=axDic7WOG1e78SdFm5XIwdhX7YNvf3g4k7INrsW3X4s,14611
48
- sky/client/sdk.py,sha256=zNjZFDTecloxdkGqmSq9wrdKjX9pEMJLghu5bUThJWk,67406
48
+ sky/client/sdk.py,sha256=IRx72BXqOn_WVvtOuTXfgR5zcSm_lyoXeYxa5c_2_qk,68723
49
49
  sky/clouds/__init__.py,sha256=OW6mJ-9hpJSBORCgt2LippLQEYZHNfnBW1mooRNNvxo,1416
50
50
  sky/clouds/aws.py,sha256=J8tczaTDL239UowN9tUlhI92SeHw01wtFucSckvG63w,54112
51
51
  sky/clouds/azure.py,sha256=bawEw6wOLAVyrjxMD-4UjLCuMj1H5_jH8qggpfZYS54,31703
@@ -89,7 +89,7 @@ sky/clouds/service_catalog/data_fetchers/analyze.py,sha256=VdksJQs3asFE8H5T3ZV1F
89
89
  sky/clouds/service_catalog/data_fetchers/fetch_aws.py,sha256=Zj4bqWPiDcT_ZFyHxQw_k7ORxWZrx91euar9kL0VPaI,23343
90
90
  sky/clouds/service_catalog/data_fetchers/fetch_azure.py,sha256=7YVnoGDGGZI2TK02bj_LOoD4E5J5CFl6eqz2XlR4Vy8,12790
91
91
  sky/clouds/service_catalog/data_fetchers/fetch_cudo.py,sha256=52P48lvWN0s1ArjeLPeLemPRpxjSRcHincRle0nqdm4,3440
92
- sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py,sha256=yKuAFbjBRNz_e2RNNDT_aHHAuKQ86Ac7GKgIie5O6Pg,7273
92
+ sky/clouds/service_catalog/data_fetchers/fetch_fluidstack.py,sha256=hsqpQi_YUI-qil3zLCEGatrR7BkWzywr4otRdHrd-4k,7350
93
93
  sky/clouds/service_catalog/data_fetchers/fetch_gcp.py,sha256=JnugFifzHPQITlbDKoKexE8NqgagOEfQWTxon7P6vJ0,30935
94
94
  sky/clouds/service_catalog/data_fetchers/fetch_lambda_cloud.py,sha256=MUzogyLruLQmIt-To6TsfnGPgv_nnlp49XYbeshsd7I,5003
95
95
  sky/clouds/service_catalog/data_fetchers/fetch_vast.py,sha256=zR9icM3ty5C8tGw13pQbsBtQQMgG4kl1j_jSGqqrgOA,4741
@@ -107,19 +107,19 @@ sky/data/mounting_utils.py,sha256=i79Y-DZXVR88fjG_MBPB8EgsZBnHdpf1LGnJSm_VhAg,16
107
107
  sky/data/storage.py,sha256=mTgMGdfSV6Gia076Dvgmc18ZlqF6eObima558UShiXA,207165
108
108
  sky/data/storage_utils.py,sha256=zB99nRTJjh8isU0UmqERmlwwRNgfig91IwrwVH8CcNw,12383
109
109
  sky/jobs/__init__.py,sha256=qoI53-xXE0-SOkrLWigvhgFXjk7dWE0OTqGPYIk-kmM,1458
110
- sky/jobs/constants.py,sha256=Yv4cIUhkM-kIMlwcmhiFVPXI7aLnLw7MBhStDqSjjOM,3088
110
+ sky/jobs/constants.py,sha256=1XiIqdR5dEgGgepLKWkZCRT3MYSsMBR-dO7N4RTsjwg,3088
111
111
  sky/jobs/controller.py,sha256=4G1CKI7M7D1BgJLbJMeqzg0iDDv7FR4ObB1BKZFFjhk,29585
112
112
  sky/jobs/recovery_strategy.py,sha256=RLrqq8B1likxTknPzt3_BqO26sFVpoatxzUuGfwc18A,26170
113
113
  sky/jobs/scheduler.py,sha256=8k2ieJ1TTvJ0TOalnklJtrMwFuatsh-ojoPMBgFRBlI,13119
114
114
  sky/jobs/state.py,sha256=tDULLH6DVs4oKUIKhh0UAn3RzyVGuIUtEq5kW7K1Ojw,44585
115
- sky/jobs/utils.py,sha256=Ta0UJXNhQWaNdKHPw4ZIF_o82m_AUH2RKE2Uj4U_TKM,54235
115
+ sky/jobs/utils.py,sha256=O1cOXeWXzZNxQzEZ4xwadskQr1Azm1pCRe4Ju0dfvfg,55845
116
116
  sky/jobs/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
- sky/jobs/client/sdk.py,sha256=RBaU4IR9e8oMMzpMa-yMlpcd3sD5M4_c5xbp2VPbz9U,9939
117
+ sky/jobs/client/sdk.py,sha256=4STtriCWLUq1mm-tEsh_iXC7r-U7_PY0R9X6-DNpaXs,10122
118
118
  sky/jobs/dashboard/dashboard.py,sha256=JaVrNUEFQPLmsDZnrR76Uo8QqcAHdgYzx7GZTxDfl9M,7885
119
119
  sky/jobs/dashboard/static/favicon.ico,sha256=uYlvgxSM7gjBmXpZ8wydvZUPAbJiiix-rc2Xe5mma9s,15086
120
120
  sky/jobs/dashboard/templates/index.html,sha256=tz95q8O2pF7IvfY6yv0rnPyhj4DX8WX4RIVVxqFKV1Y,28519
121
121
  sky/jobs/server/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
122
- sky/jobs/server/core.py,sha256=K5qxukyBnPD1DjcNMFJheULWoYSLaVXtjt0D1Cb9GoI,24902
122
+ sky/jobs/server/core.py,sha256=s6A3KJsSQz1GlD6qfJ-XiEg6scc3sqMTqVd1Kr6ZTIU,25113
123
123
  sky/jobs/server/dashboard_utils.py,sha256=2Mbx40W1pQqPEPHsSDbHeaF0j5cgyKy-_A9Owdwp_AQ,2315
124
124
  sky/jobs/server/server.py,sha256=vdVxl4ZkBRlfOdsUO5Ttxon_-NE9XoMVMSo8fJ-Y73Y,7803
125
125
  sky/provision/__init__.py,sha256=LzOo5LjkRXwSf29dUqN14YbjzQu3liXLQcmweTeZ4dE,6457
@@ -152,7 +152,7 @@ sky/provision/do/utils.py,sha256=ytRi-t8UtS8hoqoXAqrP9I5PVkDJdLd9wygRygSDe5c,103
152
152
  sky/provision/fluidstack/__init__.py,sha256=h2df4JHCHtBMYZwtC05WM0VnLbAsRO-T3GFTf6NpY04,592
153
153
  sky/provision/fluidstack/config.py,sha256=hDqesKEVjIhXLTWej3fDdpbHtKBXoybxFGgC6T8U5uo,326
154
154
  sky/provision/fluidstack/fluidstack_utils.py,sha256=dYEHRRY86nCxQtZ_GIV6WhkNvvnkIuqDDKJqf1CouKY,5729
155
- sky/provision/fluidstack/instance.py,sha256=yHg3SHHILqrmE_VLr2kXG50Nf5CSm1NRYohCUpA4s60,13790
155
+ sky/provision/fluidstack/instance.py,sha256=TCGLojd5mEuEaUQ1BnmRvXMOSSBjltyf7dhPG3OLdgQ,13787
156
156
  sky/provision/gcp/__init__.py,sha256=zlgjR2JoaGD7sStGStMRu9bJ62f-8NKEIyb-bFHBlzM,528
157
157
  sky/provision/gcp/config.py,sha256=rNpnRFNZqqvEHjzjSdwMoI7Fq7RW9w_dL2vIaubj3Dc,33319
158
158
  sky/provision/gcp/constants.py,sha256=9eLZatVSW2uGqxrvFGaWK2A_Ab0o_4S4GdgUuI7mfsk,7441
@@ -229,13 +229,13 @@ sky/serve/server/core.py,sha256=pRvFadEIH_WTUkTtSmuFoPBP4JFq8Obt68ifi9DWuog,3686
229
229
  sky/serve/server/server.py,sha256=gQGVU9nHYdGbaLhGjIUNIYn4xwKjRASRJkiiTL5AI1Y,3283
230
230
  sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
231
231
  sky/server/common.py,sha256=pEa-q3P5aOm6RMlit0pVzlDoJnZU_6zViO7aK_7htn0,17843
232
- sky/server/constants.py,sha256=89jKE3SIe1T3_7j6ECTy4pZnhZZD7fBwsWOCOkTban8,770
233
- sky/server/server.py,sha256=IDVx6qHl75PRSyc23NLMi0JLjqrTjOHWiCeNvK1D60U,42511
232
+ sky/server/constants.py,sha256=_ZNrxYh8vmgbf3DmkGDduxjvO2y43ZSPTkH5rCNsVjU,770
233
+ sky/server/server.py,sha256=VOro33c4ZybLeZF57ANiZRWUjtyUvCDEeQMX7yd_HYE,43271
234
234
  sky/server/stream_utils.py,sha256=-3IX1YCgxAFfcvQIV0TCvOn1wbRLWovAx3ckCrsExWU,5651
235
235
  sky/server/html/log.html,sha256=TSGZktua9Ysl_ysg3w60rjxAxhH61AJnsYDHdtqrjmI,6929
236
236
  sky/server/requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
237
  sky/server/requests/executor.py,sha256=Jk8RJoQlicDqaHhgVWMH3UiL-dJS7lGSGd05GPv-Lrc,19781
238
- sky/server/requests/payloads.py,sha256=75bHfIJ5TR8z3BVVKMYLKxK5BzjtxwawCpwN8B88-FA,16077
238
+ sky/server/requests/payloads.py,sha256=nVb7vr1SNAq6ay2dNe9301zLHp7NrM79M7nsWAECBms,16340
239
239
  sky/server/requests/requests.py,sha256=aMdjiK5kjSYP36pxdXFU6qgKOXcOmtViHbFm3V8Dvf8,19590
240
240
  sky/server/requests/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
241
  sky/server/requests/queues/mp_queue.py,sha256=_7AFas__0b1L8e7Bwy4lu0VYU18R85YwMlDHPhQCfh0,2998
@@ -250,9 +250,9 @@ sky/skylet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
250
250
  sky/skylet/attempt_skylet.py,sha256=GZ6ITjjA0m-da3IxXXfoHR6n4pjp3X3TOXUqVvSrV0k,2136
251
251
  sky/skylet/autostop_lib.py,sha256=W4CtMira6QnmYToFT5kYTGjNPRZNC-bZPfsF1k3tluE,4480
252
252
  sky/skylet/configs.py,sha256=UtnpmEL0F9hH6PSjhsps7xgjGZ6qzPOfW1p2yj9tSng,1887
253
- sky/skylet/constants.py,sha256=wELTCOQLIafwtl7_L8vjDwdqYQQxG-Sup3H7vxmcyB4,18037
253
+ sky/skylet/constants.py,sha256=6I_JGIQXHGDNodNCQYLqflmJotDVnFUt4R48BASyUN0,18037
254
254
  sky/skylet/events.py,sha256=pnV3ZiwWhXqTHpU5B5Y9Xwam_7FQDI6IrxgSx7X_NVA,12743
255
- sky/skylet/job_lib.py,sha256=8W6GM2zxqGMIoD3AGiXcKsK_7-qouuTojiVL6upSeoA,43728
255
+ sky/skylet/job_lib.py,sha256=j_VRDWcEGIStLLEC0cD9B3JxggPJOZaDAaNKe50uhy4,44319
256
256
  sky/skylet/log_lib.py,sha256=DzOrgY8C7RdEMLC9O9kEKV-iLMb9wVMPSnDha8eMx28,20900
257
257
  sky/skylet/log_lib.pyi,sha256=rRk4eUX0RHGs1QL9CXsJq6RE7FqqxZlfuPJOLXTvg7I,4453
258
258
  sky/skylet/skylet.py,sha256=mWmqCvxSlfdVU_L8NL6P52jmCt3smd8K0HdyNBfMPeI,1234
@@ -344,9 +344,9 @@ sky/utils/kubernetes/k8s_gpu_labeler_setup.yaml,sha256=VLKT2KKimZu1GDg_4AIlIt488
344
344
  sky/utils/kubernetes/kubernetes_deploy_utils.py,sha256=otzHzpliHDCpzYT-nU9Q0ZExbiFpDPWvhxwkvchZj7k,10073
345
345
  sky/utils/kubernetes/rsync_helper.sh,sha256=h4YwrPFf9727CACnMJvF3EyK_0OeOYKKt4su_daKekw,1256
346
346
  sky/utils/kubernetes/ssh_jump_lifecycle_manager.py,sha256=Kq1MDygF2IxFmu9FXpCxqucXLmeUrvs6OtRij6XTQbo,6554
347
- skypilot_nightly-1.0.0.dev20250302.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
348
- skypilot_nightly-1.0.0.dev20250302.dist-info/METADATA,sha256=KBkT-GZ-9phSYbZBfrXZt0Rx_Ikvyt1o8K0P_iDw4iE,19115
349
- skypilot_nightly-1.0.0.dev20250302.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
350
- skypilot_nightly-1.0.0.dev20250302.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
351
- skypilot_nightly-1.0.0.dev20250302.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
352
- skypilot_nightly-1.0.0.dev20250302.dist-info/RECORD,,
347
+ skypilot_nightly-1.0.0.dev20250304.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
348
+ skypilot_nightly-1.0.0.dev20250304.dist-info/METADATA,sha256=jiLF-ux0ZwUp4eKySgZB9QR7PrPU24Iavg7gSuzVKcw,18173
349
+ skypilot_nightly-1.0.0.dev20250304.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
350
+ skypilot_nightly-1.0.0.dev20250304.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
351
+ skypilot_nightly-1.0.0.dev20250304.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
352
+ skypilot_nightly-1.0.0.dev20250304.dist-info/RECORD,,