skypilot-nightly 1.0.0.dev20250228__py3-none-any.whl → 1.0.0.dev2025022801__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/__init__.py CHANGED
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  import urllib.request
6
6
 
7
7
  # Replaced with the current commit when building the wheels.
8
- _SKYPILOT_COMMIT_SHA = '0f178b2af47ec2b185bc685cce6965c675613cc7'
8
+ _SKYPILOT_COMMIT_SHA = '2619dc8f63f271852a6b00f91381b27428ff1780'
9
9
 
10
10
 
11
11
  def _get_git_commit():
@@ -35,7 +35,7 @@ def _get_git_commit():
35
35
 
36
36
 
37
37
  __commit__ = _get_git_commit()
38
- __version__ = '1.0.0.dev20250228'
38
+ __version__ = '1.0.0.dev2025022801'
39
39
  __root_dir__ = os.path.dirname(os.path.abspath(__file__))
40
40
 
41
41
 
sky/cli.py CHANGED
@@ -5504,10 +5504,19 @@ def api():
5504
5504
  required=False,
5505
5505
  help=('The host to deploy the SkyPilot API server. To allow '
5506
5506
  'remote access, set this to 0.0.0.0'))
5507
+ @click.option('--foreground',
5508
+ is_flag=True,
5509
+ default=False,
5510
+ required=False,
5511
+ help='Run the SkyPilot API server in the foreground and output '
5512
+ 'its logs to stdout/stderr. Allowing external systems '
5513
+ 'to manage the process lifecycle and collect logs directly. '
5514
+ 'This is useful when the API server is managed by systems '
5515
+ 'like systemd and Kubernetes.')
5507
5516
  @usage_lib.entrypoint
5508
- def api_start(deploy: bool, host: Optional[str]):
5517
+ def api_start(deploy: bool, host: Optional[str], foreground: bool):
5509
5518
  """Starts the SkyPilot API server locally."""
5510
- sdk.api_start(deploy=deploy, host=host)
5519
+ sdk.api_start(deploy=deploy, host=host, foreground=foreground)
5511
5520
 
5512
5521
 
5513
5522
  @api.command('stop', cls=_DocumentedCodeCommand)
sky/client/cli.py CHANGED
@@ -5504,10 +5504,19 @@ def api():
5504
5504
  required=False,
5505
5505
  help=('The host to deploy the SkyPilot API server. To allow '
5506
5506
  'remote access, set this to 0.0.0.0'))
5507
+ @click.option('--foreground',
5508
+ is_flag=True,
5509
+ default=False,
5510
+ required=False,
5511
+ help='Run the SkyPilot API server in the foreground and output '
5512
+ 'its logs to stdout/stderr. Allowing external systems '
5513
+ 'to manage the process lifecycle and collect logs directly. '
5514
+ 'This is useful when the API server is managed by systems '
5515
+ 'like systemd and Kubernetes.')
5507
5516
  @usage_lib.entrypoint
5508
- def api_start(deploy: bool, host: Optional[str]):
5517
+ def api_start(deploy: bool, host: Optional[str], foreground: bool):
5509
5518
  """Starts the SkyPilot API server locally."""
5510
- sdk.api_start(deploy=deploy, host=host)
5519
+ sdk.api_start(deploy=deploy, host=host, foreground=foreground)
5511
5520
 
5512
5521
 
5513
5522
  @api.command('stop', cls=_DocumentedCodeCommand)
sky/client/sdk.py CHANGED
@@ -1611,6 +1611,7 @@ def api_start(
1611
1611
  *,
1612
1612
  deploy: bool = False,
1613
1613
  host: str = '127.0.0.1',
1614
+ foreground: bool = False,
1614
1615
  ) -> None:
1615
1616
  """Starts the API server.
1616
1617
 
@@ -1622,7 +1623,8 @@ def api_start(
1622
1623
  resources of the machine.
1623
1624
  host: The host to deploy the API server. It will be set to 0.0.0.0
1624
1625
  if deploy is True, to allow remote access.
1625
-
1626
+ foreground: Whether to run the API server in the foreground (run in
1627
+ the current process).
1626
1628
  Returns:
1627
1629
  None
1628
1630
  """
@@ -1641,7 +1643,10 @@ def api_start(
1641
1643
  'from the config file and/or unset the '
1642
1644
  'SKYPILOT_API_SERVER_ENDPOINT environment '
1643
1645
  'variable.')
1644
- server_common.check_server_healthy_or_start_fn(deploy, host)
1646
+ server_common.check_server_healthy_or_start_fn(deploy, host, foreground)
1647
+ if foreground:
1648
+ # Explain why current process exited
1649
+ logger.info('API server is already running:')
1645
1650
  logger.info(f'{ux_utils.INDENT_SYMBOL}SkyPilot API server: '
1646
1651
  f'{server_common.get_server_url(host)}\n'
1647
1652
  f'{ux_utils.INDENT_LAST_SYMBOL}'
sky/server/common.py CHANGED
@@ -145,57 +145,6 @@ def get_api_server_status(endpoint: Optional[str] = None) -> ApiServerInfo:
145
145
  return ApiServerInfo(status=ApiServerStatus.UNHEALTHY, api_version=None)
146
146
 
147
147
 
148
- def start_api_server_in_background(deploy: bool = False,
149
- host: str = '127.0.0.1'):
150
- if not is_api_server_local():
151
- raise RuntimeError(
152
- f'Cannot start API server: {get_server_url()} is not a local URL')
153
-
154
- # Check available memory before starting the server.
155
- avail_mem_size_gb: float = common_utils.get_mem_size_gb()
156
- if avail_mem_size_gb <= server_constants.MIN_AVAIL_MEM_GB:
157
- logger.warning(
158
- f'{colorama.Fore.YELLOW}Your SkyPilot API server machine only has '
159
- f'{avail_mem_size_gb:.1f}GB memory available. '
160
- f'At least {server_constants.MIN_AVAIL_MEM_GB}GB is recommended to '
161
- f'support higher load with better performance.'
162
- f'{colorama.Style.RESET_ALL}')
163
- log_path = os.path.expanduser(constants.API_SERVER_LOGS)
164
- os.makedirs(os.path.dirname(log_path), exist_ok=True)
165
-
166
- api_server_cmd = API_SERVER_CMD
167
- if deploy:
168
- api_server_cmd += ' --deploy'
169
- if host is not None:
170
- api_server_cmd += f' --host {host}'
171
- cmd = f'{sys.executable} {api_server_cmd} > {log_path} 2>&1 < /dev/null'
172
-
173
- # Start the API server process in the background and don't wait for it.
174
- # If this is called from a CLI invocation, we need start_new_session=True so
175
- # that SIGINT on the CLI will not also kill the API server.
176
- subprocess.Popen(cmd, shell=True, start_new_session=True)
177
-
178
- # Wait for the server to start until timeout.
179
- # Conservative upper time bound for starting the server based on profiling.
180
- timeout_sec = 12
181
- start_time = time.time()
182
- while True:
183
- api_server_info = get_api_server_status()
184
- assert api_server_info.status != ApiServerStatus.VERSION_MISMATCH, (
185
- f'API server version mismatch when starting the server. '
186
- f'Server version: {api_server_info.api_version} '
187
- f'Client version: {server_constants.API_VERSION}')
188
- if api_server_info.status == ApiServerStatus.HEALTHY:
189
- break
190
- elif time.time() - start_time >= timeout_sec:
191
- with ux_utils.print_exception_no_traceback():
192
- raise RuntimeError(
193
- 'Failed to start SkyPilot API server at '
194
- f'{get_server_url(host)}'
195
- f'\nView logs at: {constants.API_SERVER_LOGS}')
196
- time.sleep(0.5)
197
-
198
-
199
148
  def handle_request_error(response: requests.Response) -> None:
200
149
  if response.status_code != 200:
201
150
  with ux_utils.print_exception_no_traceback():
@@ -218,10 +167,10 @@ def get_request_id(response: requests.Response) -> RequestId:
218
167
  return request_id
219
168
 
220
169
 
221
- def _start_api_server(deploy: bool = False, host: str = '127.0.0.1'):
170
+ def _start_api_server(deploy: bool = False,
171
+ host: str = '127.0.0.1',
172
+ foreground: bool = False):
222
173
  """Starts a SkyPilot API server locally."""
223
- # Lock to prevent multiple processes from starting the server at the
224
- # same time, causing issues with database initialization.
225
174
  server_url = get_server_url(host)
226
175
  assert server_url in AVAILABLE_LOCAL_API_SERVER_URLS, (
227
176
  f'server url {server_url} is not a local url')
@@ -230,7 +179,60 @@ def _start_api_server(deploy: bool = False, host: str = '127.0.0.1'):
230
179
  f'SkyPilot API server at {server_url}. '
231
180
  'Starting a local server.'
232
181
  f'{colorama.Style.RESET_ALL}')
233
- start_api_server_in_background(deploy=deploy, host=host)
182
+ if not is_api_server_local():
183
+ raise RuntimeError(f'Cannot start API server: {get_server_url()} '
184
+ 'is not a local URL')
185
+
186
+ # Check available memory before starting the server.
187
+ avail_mem_size_gb: float = common_utils.get_mem_size_gb()
188
+ if avail_mem_size_gb <= server_constants.MIN_AVAIL_MEM_GB:
189
+ logger.warning(
190
+ f'{colorama.Fore.YELLOW}Your SkyPilot API server machine only '
191
+ f'has {avail_mem_size_gb:.1f}GB memory available. '
192
+ f'At least {server_constants.MIN_AVAIL_MEM_GB}GB is '
193
+ 'recommended to support higher load with better performance.'
194
+ f'{colorama.Style.RESET_ALL}')
195
+
196
+ args = [sys.executable, *API_SERVER_CMD.split()]
197
+ if deploy:
198
+ args += ['--deploy']
199
+ if host is not None:
200
+ args += [f'--host={host}']
201
+
202
+ if foreground:
203
+ # Replaces the current process with the API server
204
+ os.execvp(args[0], args)
205
+
206
+ log_path = os.path.expanduser(constants.API_SERVER_LOGS)
207
+ os.makedirs(os.path.dirname(log_path), exist_ok=True)
208
+ cmd = f'{" ".join(args)} > {log_path} 2>&1 < /dev/null'
209
+
210
+ # Start the API server process in the background and don't wait for it.
211
+ # If this is called from a CLI invocation, we need
212
+ # start_new_session=True so that SIGINT on the CLI will not also kill
213
+ # the API server.
214
+ subprocess.Popen(cmd, shell=True, start_new_session=True)
215
+
216
+ # Wait for the server to start until timeout.
217
+ # Conservative upper time bound for starting the server based on
218
+ # profiling.
219
+ timeout_sec = 12
220
+ start_time = time.time()
221
+ while True:
222
+ api_server_info = get_api_server_status()
223
+ assert api_server_info.status != ApiServerStatus.VERSION_MISMATCH, (
224
+ f'API server version mismatch when starting the server. '
225
+ f'Server version: {api_server_info.api_version} '
226
+ f'Client version: {server_constants.API_VERSION}')
227
+ if api_server_info.status == ApiServerStatus.HEALTHY:
228
+ break
229
+ elif time.time() - start_time >= timeout_sec:
230
+ with ux_utils.print_exception_no_traceback():
231
+ raise RuntimeError(
232
+ 'Failed to start SkyPilot API server at '
233
+ f'{get_server_url(host)}'
234
+ f'\nView logs at: {constants.API_SERVER_LOGS}')
235
+ time.sleep(0.5)
234
236
  logger.info(ux_utils.finishing_message('SkyPilot API server started.'))
235
237
 
236
238
 
@@ -260,7 +262,8 @@ def check_server_healthy(endpoint: Optional[str] = None,) -> None:
260
262
 
261
263
 
262
264
  def check_server_healthy_or_start_fn(deploy: bool = False,
263
- host: str = '127.0.0.1'):
265
+ host: str = '127.0.0.1',
266
+ foreground: bool = False):
264
267
  try:
265
268
  check_server_healthy()
266
269
  except exceptions.ApiServerConnectionError as exc:
@@ -268,13 +271,15 @@ def check_server_healthy_or_start_fn(deploy: bool = False,
268
271
  if not is_api_server_local():
269
272
  with ux_utils.print_exception_no_traceback():
270
273
  raise exceptions.ApiServerConnectionError(endpoint) from exc
274
+ # Lock to prevent multiple processes from starting the server at the
275
+ # same time, causing issues with database initialization.
271
276
  with filelock.FileLock(
272
277
  os.path.expanduser(constants.API_SERVER_CREATION_LOCK_PATH)):
273
278
  # Check again if server is already running. Other processes may
274
279
  # have started the server while we were waiting for the lock.
275
280
  api_server_info = get_api_server_status(endpoint)
276
281
  if api_server_info.status == ApiServerStatus.UNHEALTHY:
277
- _start_api_server(deploy, host)
282
+ _start_api_server(deploy, host, foreground)
278
283
 
279
284
 
280
285
  def check_server_healthy_or_start(func):
@@ -371,7 +371,8 @@ def request_worker(worker: RequestWorker, max_parallel_size: int) -> None:
371
371
  # TODO(aylei): crash the API server or recreate the worker process
372
372
  # to avoid broken state.
373
373
  logger.error(f'[{worker}] Worker process interrupted')
374
- raise
374
+ with ux_utils.print_exception_no_traceback():
375
+ raise
375
376
  except (Exception, SystemExit) as e: # pylint: disable=broad-except
376
377
  # Catch any other exceptions to avoid crashing the worker process.
377
378
  logger.error(
@@ -408,6 +409,7 @@ def start(deploy: bool) -> List[multiprocessing.Process]:
408
409
  f'long requests and will allow at max '
409
410
  f'{max_parallel_for_short} short requests in parallel.')
410
411
 
412
+ sub_procs = []
411
413
  # Setup the queues.
412
414
  if queue_backend == QueueBackend.MULTIPROCESSING:
413
415
  logger.info('Creating shared request queues')
@@ -424,27 +426,26 @@ def start(deploy: bool) -> List[multiprocessing.Process]:
424
426
  queue_server = multiprocessing.Process(
425
427
  target=mp_queue.start_queue_manager, args=(queue_names, port))
426
428
  queue_server.start()
427
-
429
+ sub_procs.append(queue_server)
428
430
  mp_queue.wait_for_queues_to_be_ready(queue_names, port=port)
429
431
 
430
432
  logger.info('Request queues created')
431
433
 
432
- worker_procs = []
433
434
  for worker_id in range(max_parallel_for_long):
434
435
  worker = RequestWorker(id=worker_id,
435
436
  schedule_type=api_requests.ScheduleType.LONG)
436
437
  worker_proc = multiprocessing.Process(target=request_worker,
437
438
  args=(worker, 1))
438
439
  worker_proc.start()
439
- worker_procs.append(worker_proc)
440
+ sub_procs.append(worker_proc)
440
441
 
441
442
  # Start a worker for short requests.
442
443
  worker = RequestWorker(id=1, schedule_type=api_requests.ScheduleType.SHORT)
443
444
  worker_proc = multiprocessing.Process(target=request_worker,
444
445
  args=(worker, max_parallel_for_short))
445
446
  worker_proc.start()
446
- worker_procs.append(worker_proc)
447
- return worker_procs
447
+ sub_procs.append(worker_proc)
448
+ return sub_procs
448
449
 
449
450
 
450
451
  @annotations.lru_cache(scope='global', maxsize=1)
sky/server/server.py CHANGED
@@ -1085,9 +1085,9 @@ if __name__ == '__main__':
1085
1085
  if cmd_args.deploy:
1086
1086
  num_workers = os.cpu_count()
1087
1087
 
1088
- workers = []
1088
+ sub_procs = []
1089
1089
  try:
1090
- workers = executor.start(cmd_args.deploy)
1090
+ sub_procs = executor.start(cmd_args.deploy)
1091
1091
  logger.info('Starting SkyPilot API server')
1092
1092
  # We don't support reload for now, since it may cause leakage of request
1093
1093
  # workers or interrupt running requests.
@@ -1101,5 +1101,6 @@ if __name__ == '__main__':
1101
1101
  raise
1102
1102
  finally:
1103
1103
  logger.info('Shutting down SkyPilot API server...')
1104
- for worker in workers:
1105
- worker.terminate()
1104
+ for sub_proc in sub_procs:
1105
+ sub_proc.terminate()
1106
+ sub_proc.join()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: skypilot-nightly
3
- Version: 1.0.0.dev20250228
3
+ Version: 1.0.0.dev2025022801
4
4
  Summary: SkyPilot: An intercloud broker for the clouds
5
5
  Author: SkyPilot Team
6
6
  License: Apache 2.0
@@ -1,8 +1,8 @@
1
- sky/__init__.py,sha256=jLsjhG2RasaqPtD_RYBd_LfTFzhUYIB8j6WkrjZVbKY,6428
1
+ sky/__init__.py,sha256=ePkgbQbrblshpx26zEL8mRs6JSmXHiMsiSEZlh_wg3w,6430
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=K28Bowflmjhir2e3hIPbZhsnfqvBsANSeBSnEXFoy10,219929
5
+ sky/cli.py,sha256=pdnOEBu-YjiyZCYeQnAsjUk40ETiGdBKiKk2cZgNe8k,220432
6
6
  sky/cloud_stores.py,sha256=-95XIqi_ouo7hvoN5mQNP6bGm07MyF6Yk-YP4Txb5wg,24034
7
7
  sky/core.py,sha256=X83hdpPTiWyEJLamrguCd03PUjkRiGgqTFfEBEQkzWc,45471
8
8
  sky/dag.py,sha256=Yl7Ry26Vql5cv4YMz8g9kOUgtoCihJnw7c8NgZYakMY,3242
@@ -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=K28Bowflmjhir2e3hIPbZhsnfqvBsANSeBSnEXFoy10,219929
46
+ sky/client/cli.py,sha256=pdnOEBu-YjiyZCYeQnAsjUk40ETiGdBKiKk2cZgNe8k,220432
47
47
  sky/client/common.py,sha256=axDic7WOG1e78SdFm5XIwdhX7YNvf3g4k7INrsW3X4s,14611
48
- sky/client/sdk.py,sha256=U4v8Khu1lf1oUoBuJUhIFnjsFhYM9x8XcKsnVRMtihI,66990
48
+ sky/client/sdk.py,sha256=YPDsrHLBfSjAi2ufDmlYVOTivoDG_Qj1sWq22KdYgJI,67259
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
@@ -228,13 +228,13 @@ sky/serve/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
228
228
  sky/serve/server/core.py,sha256=pRvFadEIH_WTUkTtSmuFoPBP4JFq8Obt68ifi9DWuog,36865
229
229
  sky/serve/server/server.py,sha256=gQGVU9nHYdGbaLhGjIUNIYn4xwKjRASRJkiiTL5AI1Y,3283
230
230
  sky/server/__init__.py,sha256=MPPBqFzXz6Jv5QSk6td_IcvnfXfNErDZVcizu4MLRow,27
231
- sky/server/common.py,sha256=0LphKrp89_sGI-xDakK2uEqI-zKuvbc4OTcuLCiKfmQ,17560
231
+ sky/server/common.py,sha256=pEa-q3P5aOm6RMlit0pVzlDoJnZU_6zViO7aK_7htn0,17843
232
232
  sky/server/constants.py,sha256=89jKE3SIe1T3_7j6ECTy4pZnhZZD7fBwsWOCOkTban8,770
233
- sky/server/server.py,sha256=4ipJG67sBFWylNYdPD1FUhth36yX23XbcROXipRSZsw,42438
233
+ sky/server/server.py,sha256=BPJCsfHy0mZHiwpO_15CgeE1a2VPv3JM5M2HLsy-q3M,42476
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
- sky/server/requests/executor.py,sha256=TWX2jYkkstgRyRkWNE19Mgw4_CfzadebOW30iTGdK_Q,19693
237
+ sky/server/requests/executor.py,sha256=Jk8RJoQlicDqaHhgVWMH3UiL-dJS7lGSGd05GPv-Lrc,19781
238
238
  sky/server/requests/payloads.py,sha256=QYgEz85jswXkEYxO1mkwPA8MWXD_pETs-g_JH_Tlm_w,16038
239
239
  sky/server/requests/requests.py,sha256=aMdjiK5kjSYP36pxdXFU6qgKOXcOmtViHbFm3V8Dvf8,19590
240
240
  sky/server/requests/queues/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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=iAjfyPclOs8qlALACcfxLpRAO9CZ-h16leFqXZ6tNaY,10096
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.dev20250228.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
348
- skypilot_nightly-1.0.0.dev20250228.dist-info/METADATA,sha256=IBTEc-5NtZ9KP63RfsWsMmXI6qzs7ZBSdi9bAN8QfAc,19236
349
- skypilot_nightly-1.0.0.dev20250228.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
350
- skypilot_nightly-1.0.0.dev20250228.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
351
- skypilot_nightly-1.0.0.dev20250228.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
352
- skypilot_nightly-1.0.0.dev20250228.dist-info/RECORD,,
347
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/LICENSE,sha256=emRJAvE7ngL6x0RhQvlns5wJzGI3NEQ_WMjNmd9TZc4,12170
348
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/METADATA,sha256=Kqe348n5KCVwF_hEOLzUTML-yW7aEwEeVUhO8YsDC_s,19238
349
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
350
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/entry_points.txt,sha256=StA6HYpuHj-Y61L2Ze-hK2IcLWgLZcML5gJu8cs6nU4,36
351
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/top_level.txt,sha256=qA8QuiNNb6Y1OF-pCUtPEr6sLEwy2xJX06Bd_CrtrHY,4
352
+ skypilot_nightly-1.0.0.dev2025022801.dist-info/RECORD,,