anyscale 0.26.16__py3-none-any.whl → 0.26.17__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.
@@ -0,0 +1,147 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Managed Ray API
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by: https://openapi-generator.tech
10
+ """
11
+
12
+
13
+ import pprint
14
+ import re # noqa: F401
15
+
16
+ import six
17
+
18
+ from openapi_client.configuration import Configuration
19
+
20
+
21
+ class JobwithreportListResponse(object):
22
+ """NOTE: This class is auto generated by OpenAPI Generator.
23
+ Ref: https://openapi-generator.tech
24
+
25
+ Do not edit the class manually.
26
+ """
27
+
28
+ """
29
+ Attributes:
30
+ openapi_types (dict): The key is attribute name
31
+ and the value is attribute type.
32
+ attribute_map (dict): The key is attribute name
33
+ and the value is json key in definition.
34
+ """
35
+ openapi_types = {
36
+ 'results': 'list[JobWithReport]',
37
+ 'metadata': 'ListResponseMetadata'
38
+ }
39
+
40
+ attribute_map = {
41
+ 'results': 'results',
42
+ 'metadata': 'metadata'
43
+ }
44
+
45
+ def __init__(self, results=None, metadata=None, local_vars_configuration=None): # noqa: E501
46
+ """JobwithreportListResponse - a model defined in OpenAPI""" # noqa: E501
47
+ if local_vars_configuration is None:
48
+ local_vars_configuration = Configuration()
49
+ self.local_vars_configuration = local_vars_configuration
50
+
51
+ self._results = None
52
+ self._metadata = None
53
+ self.discriminator = None
54
+
55
+ self.results = results
56
+ if metadata is not None:
57
+ self.metadata = metadata
58
+
59
+ @property
60
+ def results(self):
61
+ """Gets the results of this JobwithreportListResponse. # noqa: E501
62
+
63
+
64
+ :return: The results of this JobwithreportListResponse. # noqa: E501
65
+ :rtype: list[JobWithReport]
66
+ """
67
+ return self._results
68
+
69
+ @results.setter
70
+ def results(self, results):
71
+ """Sets the results of this JobwithreportListResponse.
72
+
73
+
74
+ :param results: The results of this JobwithreportListResponse. # noqa: E501
75
+ :type: list[JobWithReport]
76
+ """
77
+ if self.local_vars_configuration.client_side_validation and results is None: # noqa: E501
78
+ raise ValueError("Invalid value for `results`, must not be `None`") # noqa: E501
79
+
80
+ self._results = results
81
+
82
+ @property
83
+ def metadata(self):
84
+ """Gets the metadata of this JobwithreportListResponse. # noqa: E501
85
+
86
+
87
+ :return: The metadata of this JobwithreportListResponse. # noqa: E501
88
+ :rtype: ListResponseMetadata
89
+ """
90
+ return self._metadata
91
+
92
+ @metadata.setter
93
+ def metadata(self, metadata):
94
+ """Sets the metadata of this JobwithreportListResponse.
95
+
96
+
97
+ :param metadata: The metadata of this JobwithreportListResponse. # noqa: E501
98
+ :type: ListResponseMetadata
99
+ """
100
+
101
+ self._metadata = metadata
102
+
103
+ def to_dict(self):
104
+ """Returns the model properties as a dict"""
105
+ result = {}
106
+
107
+ for attr, _ in six.iteritems(self.openapi_types):
108
+ value = getattr(self, attr)
109
+ if isinstance(value, list):
110
+ result[attr] = list(map(
111
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
112
+ value
113
+ ))
114
+ elif hasattr(value, "to_dict"):
115
+ result[attr] = value.to_dict()
116
+ elif isinstance(value, dict):
117
+ result[attr] = dict(map(
118
+ lambda item: (item[0], item[1].to_dict())
119
+ if hasattr(item[1], "to_dict") else item,
120
+ value.items()
121
+ ))
122
+ else:
123
+ result[attr] = value
124
+
125
+ return result
126
+
127
+ def to_str(self):
128
+ """Returns the string representation of the model"""
129
+ return pprint.pformat(self.to_dict())
130
+
131
+ def __repr__(self):
132
+ """For `print` and `pprint`"""
133
+ return self.to_str()
134
+
135
+ def __eq__(self, other):
136
+ """Returns true if both objects are equal"""
137
+ if not isinstance(other, JobwithreportListResponse):
138
+ return False
139
+
140
+ return self.to_dict() == other.to_dict()
141
+
142
+ def __ne__(self, other):
143
+ """Returns true if both objects are not equal"""
144
+ if not isinstance(other, JobwithreportListResponse):
145
+ return True
146
+
147
+ return self.to_dict() != other.to_dict()
@@ -1166,3 +1166,46 @@ def get_default_cloud() -> None:
1166
1166
 
1167
1167
  except ValueError as e:
1168
1168
  log.error(f"Error retrieving default cloud: {e}")
1169
+
1170
+
1171
+ @cloud_cli.command(
1172
+ name="jobs-report",
1173
+ help=(
1174
+ "Generate a report of the jobs created in the last 7 days in HTML format. "
1175
+ "Shows unused CPU-hours, unused GPU-hours, and other data."
1176
+ ),
1177
+ cls=AnyscaleCommand,
1178
+ hidden=True,
1179
+ )
1180
+ @click.option(
1181
+ "--cloud-id",
1182
+ help="ID of the cloud to generate a report on.",
1183
+ type=str,
1184
+ required=True,
1185
+ )
1186
+ @click.option(
1187
+ "--csv",
1188
+ help="Outputs the report in CSV format.",
1189
+ type=bool,
1190
+ required=False,
1191
+ default=False,
1192
+ )
1193
+ @click.option(
1194
+ "--out",
1195
+ help="Output file name for the report.",
1196
+ type=str,
1197
+ required=False,
1198
+ default="jobs_report.html",
1199
+ )
1200
+ def generate_jobs_report(cloud_id: str, csv: bool, out: str) -> None:
1201
+ """
1202
+ Generate a report of the jobs created in the last 7 days in HTML format.
1203
+ Shows unused CPU-hours, unused GPU-hours, and other data.
1204
+ :param cloud_id: The ID of the cloud to generate a report on.
1205
+ :param csv: Outputs the report in CSV format.
1206
+ :param out: Output file name for the report.
1207
+ """
1208
+ try:
1209
+ CloudController().generate_jobs_report(cloud_id, csv, out)
1210
+ except ValueError as e:
1211
+ log.error(f"Error generating jobs report: {e}")
@@ -3,6 +3,7 @@ Fetches data required and formats output for `anyscale cloud` commands.
3
3
  """
4
4
 
5
5
  import copy
6
+ from datetime import datetime, timedelta
6
7
  import json
7
8
  from os import getenv
8
9
  import pathlib
@@ -16,6 +17,7 @@ import boto3
16
17
  from botocore.exceptions import ClientError, NoCredentialsError
17
18
  import click
18
19
  from click import Abort, ClickException
20
+ from rich.progress import Progress, track
19
21
  import yaml
20
22
 
21
23
  from anyscale import __version__ as anyscale_version
@@ -72,8 +74,12 @@ from anyscale.controllers.cloud_functional_verification_controller import (
72
74
  CloudFunctionalVerificationType,
73
75
  )
74
76
  from anyscale.formatters import clouds_formatter
77
+ from anyscale.job._private.job_sdk import (
78
+ HA_JOB_STATE_TO_JOB_STATE,
79
+ TERMINAL_HA_JOB_STATES,
80
+ )
75
81
  from anyscale.shared_anyscale_utils.aws import AwsRoleArn
76
- from anyscale.shared_anyscale_utils.conf import ANYSCALE_ENV
82
+ from anyscale.shared_anyscale_utils.conf import ANYSCALE_ENV, ANYSCALE_HOST
77
83
  from anyscale.util import ( # pylint:disable=private-import
78
84
  _client,
79
85
  _get_aws_efs_mount_target_ip,
@@ -3643,3 +3649,140 @@ class CloudController(BaseController):
3643
3649
  )
3644
3650
 
3645
3651
  ### End of edit cloud ###
3652
+
3653
+ def generate_jobs_report(self, cloud_id: str, csv: bool, out_path: str) -> None:
3654
+ end_time = datetime.now()
3655
+ start_time = end_time - timedelta(days=7)
3656
+
3657
+ full_results = []
3658
+ paging_token: Optional[str] = None
3659
+ count_per_page = 20
3660
+ curr_page_results = None
3661
+ total_jobs: Optional[int] = None
3662
+
3663
+ with Progress() as progress:
3664
+ download_task = progress.add_task("Downloading jobs...", total=None)
3665
+
3666
+ while curr_page_results is None or len(curr_page_results) == count_per_page:
3667
+ response = self.api_client.list_job_reports_api_v2_job_reports_get(
3668
+ cloud_id,
3669
+ start_time=start_time,
3670
+ end_time=end_time,
3671
+ paging_token=paging_token,
3672
+ count=count_per_page,
3673
+ )
3674
+ curr_page_results = response.results
3675
+ full_results.extend(curr_page_results)
3676
+ paging_token = response.metadata.next_paging_token
3677
+ total_jobs = response.metadata.total
3678
+ progress.update(
3679
+ download_task, total=total_jobs, advance=len(curr_page_results)
3680
+ )
3681
+
3682
+ progress.update(download_task, completed=total_jobs)
3683
+
3684
+ if not full_results:
3685
+ self.log.info("No jobs found in the last 7 days.")
3686
+ return
3687
+
3688
+ filtered_results = [
3689
+ job
3690
+ for job in full_results
3691
+ if job.job_state in TERMINAL_HA_JOB_STATES and job.job_report is not None
3692
+ ]
3693
+ filtered_results.sort(key=lambda x: x.created_at)
3694
+
3695
+ with open(out_path, "w") as out_file:
3696
+ if csv:
3697
+ out_file.write(
3698
+ "Job ID,Job name,Job state,Created at,Finished at,Duration,Unused CPU hours,Unused GPU hours,Max concurrent instances\n"
3699
+ )
3700
+ for job in track(filtered_results, description="Generating report..."):
3701
+ job_state = HA_JOB_STATE_TO_JOB_STATE[job.job_state]
3702
+ if job.finished_at is not None:
3703
+ duration = str(job.finished_at - job.created_at)
3704
+ finished_at = str(job.finished_at)
3705
+ else:
3706
+ duration = ""
3707
+ finished_at = ""
3708
+ unused_cpu_hours = job.job_report.unused_cpu_hours or ""
3709
+ unused_gpu_hours = job.job_report.unused_gpu_hours or ""
3710
+ max_instances_launched = job.job_report.max_instances_launched or ""
3711
+
3712
+ out_file.write(
3713
+ f"{job.job_id},{job.job_name},{job_state},{str(job.created_at)},{finished_at},{duration},{unused_cpu_hours},{unused_gpu_hours},{max_instances_launched}\n"
3714
+ )
3715
+ else:
3716
+ out_file.write(
3717
+ f"""
3718
+ <html>
3719
+ <head>
3720
+ <title>Jobs Report - {str(end_time)}</title>
3721
+ <style>
3722
+ table {{
3723
+ border: 1px solid black;
3724
+ border-collapse: collapse;
3725
+ }}
3726
+ th, td {{
3727
+ border: 1px solid black;
3728
+ border-collapse: collapse;
3729
+ padding: 8px;
3730
+ }}
3731
+ </style>
3732
+ </head>
3733
+ <body>
3734
+ <h1>Job Report - {str(end_time)}</h1>
3735
+ <p>Total jobs reported (finished jobs): {len(filtered_results)}</p>
3736
+ <p>Total jobs in the last 7 days: {total_jobs}</p>
3737
+ <table>
3738
+ <thead>
3739
+ <tr>
3740
+ <th>Job ID</th>
3741
+ <th>Job name</th>
3742
+ <th>Job state</th>
3743
+ <th>Created at</th>
3744
+ <th>Finished at</th>
3745
+ <th>Duration</th>
3746
+ <th>Unused CPU hours</th>
3747
+ <th>Unused GPU hours</th>
3748
+ <th>Max concurrent instances</th>
3749
+ </tr>
3750
+ </thead>
3751
+ <tbody>
3752
+ """
3753
+ )
3754
+
3755
+ for job in track(filtered_results, description="Generating report..."):
3756
+ job_state = HA_JOB_STATE_TO_JOB_STATE[job.job_state]
3757
+ if job.finished_at is not None:
3758
+ duration = str(job.finished_at - job.created_at)
3759
+ finished_at = str(job.finished_at)
3760
+ else:
3761
+ duration = ""
3762
+ finished_at = ""
3763
+ unused_cpu_hours = job.job_report.unused_cpu_hours or ""
3764
+ unused_gpu_hours = job.job_report.unused_gpu_hours or ""
3765
+ max_instances_launched = job.job_report.max_instances_launched or ""
3766
+
3767
+ out_file.write(
3768
+ f"""
3769
+ <tr>
3770
+ <td><a target="_blank" rel="noreferrer" href="{ANYSCALE_HOST}/jobs/{job.job_id}">{job.job_id}</a></td>
3771
+ <td>{job.job_name}</td>
3772
+ <td>{job_state}</td>
3773
+ <td>{str(job.created_at)}</td>
3774
+ <td>{finished_at}</td>
3775
+ <td>{duration}</td>
3776
+ <td>{unused_cpu_hours}</td>
3777
+ <td>{unused_gpu_hours}</td>
3778
+ <td>{max_instances_launched}</td>
3779
+ </tr>
3780
+ """
3781
+ )
3782
+
3783
+ out_file.write(
3784
+ """
3785
+ </tbody>
3786
+ </table>
3787
+ """
3788
+ )
@@ -33,6 +33,26 @@ from anyscale.utils.runtime_env import parse_requirements_file
33
33
 
34
34
  logger = BlockLogger()
35
35
 
36
+ HA_JOB_STATE_TO_JOB_STATE = {
37
+ HaJobStates.UPDATING: JobState.RUNNING,
38
+ HaJobStates.RUNNING: JobState.RUNNING,
39
+ HaJobStates.RESTARTING: JobState.RUNNING,
40
+ HaJobStates.CLEANING_UP: JobState.RUNNING,
41
+ HaJobStates.PENDING: JobState.STARTING,
42
+ HaJobStates.AWAITING_CLUSTER_START: JobState.STARTING,
43
+ HaJobStates.SUCCESS: JobState.SUCCEEDED,
44
+ HaJobStates.ERRORED: JobState.FAILED,
45
+ HaJobStates.TERMINATED: JobState.FAILED,
46
+ HaJobStates.BROKEN: JobState.FAILED,
47
+ HaJobStates.OUT_OF_RETRIES: JobState.FAILED,
48
+ }
49
+
50
+ TERMINAL_HA_JOB_STATES = [
51
+ HaJobStates.SUCCESS,
52
+ HaJobStates.TERMINATED,
53
+ HaJobStates.OUT_OF_RETRIES,
54
+ ]
55
+
36
56
 
37
57
  class PrivateJobSDK(WorkloadSDK):
38
58
  _POLLING_INTERVAL_SECONDS = 10.0
@@ -215,20 +235,6 @@ class PrivateJobSDK(WorkloadSDK):
215
235
  )
216
236
  return job.id
217
237
 
218
- _HA_JOB_STATE_TO_JOB_STATE = {
219
- HaJobStates.UPDATING: JobState.RUNNING,
220
- HaJobStates.RUNNING: JobState.RUNNING,
221
- HaJobStates.RESTARTING: JobState.RUNNING,
222
- HaJobStates.CLEANING_UP: JobState.RUNNING,
223
- HaJobStates.PENDING: JobState.STARTING,
224
- HaJobStates.AWAITING_CLUSTER_START: JobState.STARTING,
225
- HaJobStates.SUCCESS: JobState.SUCCEEDED,
226
- HaJobStates.ERRORED: JobState.FAILED,
227
- HaJobStates.TERMINATED: JobState.FAILED,
228
- HaJobStates.BROKEN: JobState.FAILED,
229
- HaJobStates.OUT_OF_RETRIES: JobState.FAILED,
230
- }
231
-
232
238
  _BACKEND_JOB_STATUS_TO_JOB_RUN_STATE = {
233
239
  BackendJobStatus.RUNNING: JobRunState.RUNNING,
234
240
  BackendJobStatus.COMPLETED: JobRunState.SUCCEEDED,
@@ -241,9 +247,7 @@ class PrivateJobSDK(WorkloadSDK):
241
247
 
242
248
  def _job_state_from_job_model(self, model: ProductionJob) -> JobState:
243
249
  ha_state = model.state.current_state if model.state else None
244
- return cast(
245
- JobState, self._HA_JOB_STATE_TO_JOB_STATE.get(ha_state, JobState.UNKNOWN)
246
- )
250
+ return cast(JobState, HA_JOB_STATE_TO_JOB_STATE.get(ha_state, JobState.UNKNOWN))
247
251
 
248
252
  def _job_run_model_to_job_run_status(self, run: Job) -> JobRunStatus:
249
253
  state = self._BACKEND_JOB_STATUS_TO_JOB_RUN_STATE.get(
@@ -358,12 +362,6 @@ class PrivateJobSDK(WorkloadSDK):
358
362
  self.logger.info(f"Marked job '{job_model.name}' for termination")
359
363
  return job_model.id
360
364
 
361
- _TERMINAL_HA_JOB_STATES = [
362
- HaJobStates.SUCCESS,
363
- HaJobStates.TERMINATED,
364
- HaJobStates.OUT_OF_RETRIES,
365
- ]
366
-
367
365
  def archive(
368
366
  self,
369
367
  *,
@@ -377,7 +375,7 @@ class PrivateJobSDK(WorkloadSDK):
377
375
  )
378
376
 
379
377
  ha_state = job_model.state.current_state if job_model.state else None
380
- if ha_state not in self._TERMINAL_HA_JOB_STATES:
378
+ if ha_state not in TERMINAL_HA_JOB_STATES:
381
379
  raise RuntimeError(
382
380
  f"Job with ID '{job_model.id}' has not reached a terminal state and cannot be archived."
383
381
  )
anyscale/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.26.16"
1
+ __version__ = "0.26.17"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anyscale
3
- Version: 0.26.16
3
+ Version: 0.26.17
4
4
  Summary: Command Line Interface for Anyscale
5
5
  Author: Anyscale Inc.
6
6
  License: AS License
@@ -1,6 +1,6 @@
1
1
  anyscale/__init__.py,sha256=YtAe4ql_2J7SnRMMvJzx1Fdw2ZjtC2VLfZFPSDMdLxA,8595
2
2
  anyscale/anyscale-cloud-setup-gcp-oa.yaml,sha256=varT3AFGxDy7V8o3_zCwUyoi22MiDmZovfpvkbkyeAU,2715
3
- anyscale/anyscale-cloud-setup-gcp.yaml,sha256=cH43b2tfhQr0tKQtQsE2uXLF0vJtuen68qo5DlHG_lA,3908
3
+ anyscale/anyscale-cloud-setup-gcp.yaml,sha256=b9fKDG8syJuoZJOAr4LZdLGto3sDDil9EOoboXWC9UE,4011
4
4
  anyscale/anyscale-cloud-setup-oa.yaml,sha256=MMfjT2UCNQS43I3mGOMoSq1cq1dufxtnXU9Zy260TK8,3192
5
5
  anyscale/anyscale-cloud-setup.yaml,sha256=PoAPDoVbnWLayNGjEgLYJd1RoyopYhReVCwHoEUjuMM,8937
6
6
  anyscale/anyscale_schema.json,sha256=pQtFMvsYLZF39HcfhFV-ze15W9oELuWHz16PED7sMSQ,193
@@ -27,7 +27,7 @@ anyscale/scripts.py,sha256=HR6JOCBVBXMVi1Kz5uJmjsh73t2l1W8UbUge83ofnqk,5474
27
27
  anyscale/snapshot.py,sha256=UGJT5C1s_4xmQxjWODK5DFpGxHRBX5jOCdSCqXESH8E,1685
28
28
  anyscale/tables.py,sha256=TV4F2uLnwehvbkAfaP7iuLlT2wLIo6ORH2LVdRGXW5g,2840
29
29
  anyscale/util.py,sha256=Tqb9qWSxQI_PBJVSDxm9RWqFyGJFClgZDPByhb_fhU8,40813
30
- anyscale/version.py,sha256=vEOqYFBjbYbsWUrfgGxQ8I86asToHKX7HNLE41dykhE,24
30
+ anyscale/version.py,sha256=OWXB5PQB1lPtcMILip9aMkE-cXhBESEz6ArfUUlCX8g,24
31
31
  anyscale/workspace_utils.py,sha256=OViE88CnIF5ruVxd3kazQ0Mf2BxqtMq6wx-XQ5A2cp8,1204
32
32
  anyscale/_private/anyscale_client/README.md,sha256=gk8obk7kqg6VWoUHcqDMwJULh35tYKEZFC0UF_dixGA,718
33
33
  anyscale/_private/anyscale_client/__init__.py,sha256=807Blx3RHQeS8BmKZcsOQQ4dYoKlCnpm6Bdsif2CrHg,337
@@ -105,7 +105,7 @@ anyscale/background/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
105
105
  anyscale/background/job_runner.py,sha256=LTuv9JOahyv6C9i7DLQAONgQF6--FfYZEmJrKy-sUG8,2687
106
106
  anyscale/client/.gitignore,sha256=JZyvYEtT2DCSK9V5Joi6lQofhMik4PXiJRCWsg7SvqI,807
107
107
  anyscale/client/.openapi-generator-ignore,sha256=pu2PTide7pJtJ-DFLzDy0cTYQJRlrB-8RRH3zGLeUds,1040
108
- anyscale/client/README.md,sha256=PXHUrwyAww6owFfX26ac4IFMcXDKTqiEDZm5Jlu7YbM,118787
108
+ anyscale/client/README.md,sha256=NZRw9OwsTRkN0sEcB4AYqY0rsYQSyZMzsKrt_FYvFBQ,119345
109
109
  anyscale/client/git_push.sh,sha256=EDCZOTTiLxbtPHmiU63qC99rGH67B7dhdPZdNUKivF0,1827
110
110
  anyscale/client/requirements.txt,sha256=dkVKYUStC5h_g_87SH7pRdhXCj7ySozAJMGAFEzGgFc,126
111
111
  anyscale/client/setup.cfg,sha256=l7bdKSIedeBhhoDtupsBwx1xPrlBf2yYeTH7a8kMga4,28
@@ -113,14 +113,14 @@ anyscale/client/setup.py,sha256=tSxqw1kAL1B9adnrnOarjnQfSbwGmnTr_kg8ZXhlm5A,1109
113
113
  anyscale/client/test-requirements.txt,sha256=sTjmDTj5W9fh1ZAeo8UT2EBdeGDBNttj_PHiPBXg1D4,111
114
114
  anyscale/client/tox.ini,sha256=M6L3UmvAdvU65LsoAF-Oi7oRjwZlCJZn8I7ofdXn5Ok,156
115
115
  anyscale/client/.openapi-generator/VERSION,sha256=J0RzX-4u4jfin1kviKtmncjUePyjHm2kyvmkobOrt_E,5
116
- anyscale/client/openapi_client/__init__.py,sha256=ve2JRfQLzLfaP_y5CTytiu9dlJkI4i1fBQdb3LFs39g,50956
116
+ anyscale/client/openapi_client/__init__.py,sha256=g5yOLWPZG2Ej-mkVr8KT3CKJ9se2Iu89Ap_gTyn1Yjc,51307
117
117
  anyscale/client/openapi_client/api_client.py,sha256=d8Un6j2Ny2vlS2qBXPVFj6_ql0k36DFahpWt_28TfCk,25563
118
118
  anyscale/client/openapi_client/configuration.py,sha256=Dd5XrlHwv-wxnf0C35PG_-HBQoY3Yaz6hKrmkZz-m0E,12363
119
119
  anyscale/client/openapi_client/exceptions.py,sha256=3egwsXQG2j_vARbqgBxUO1xSltAhpfiHTYVP7VXTvU0,3792
120
120
  anyscale/client/openapi_client/rest.py,sha256=Ehj37v7GHW6SXV067Hze5HE42ayKaGi6a6ZlkR7u3Lg,12501
121
121
  anyscale/client/openapi_client/api/__init__.py,sha256=i8u7BI2xX1GrXTL3hN0pKpYIlnT-D_uDxH2ElOfYG1I,141
122
- anyscale/client/openapi_client/api/default_api.py,sha256=DuhazQT246YNmVmxTxTbuwKMBYS3Fa1FWzVMIwoGT-g,1921710
123
- anyscale/client/openapi_client/models/__init__.py,sha256=-DgBfAM69iJlCNUu3h9wJyE2L-DSTyuUoozIdFs8ZDM,50466
122
+ anyscale/client/openapi_client/api/default_api.py,sha256=nd9jzHg7cskIcYJN-gj2ejRSRFKDhHNlC9v7Ru7jfkI,1933658
123
+ anyscale/client/openapi_client/models/__init__.py,sha256=ajtzyW9qthIaOQSDqng9ND0Pca7wMvrfDJlgDhv2YYk,50817
124
124
  anyscale/client/openapi_client/models/access_config.py,sha256=b2mA0qtuTA5PFbp6C61Jc_T2zUMaojM1v32IhZo0MfY,3648
125
125
  anyscale/client/openapi_client/models/actor_status.py,sha256=6xyX_aIqURj2raBdY9DmBxsdDACFrqqYvElGiM6YG2E,2813
126
126
  anyscale/client/openapi_client/models/admin_create_user.py,sha256=9DPr8D0lKgoEZ3Z2kGsAd8L7ocFCiP6woOGLVs8SRb8,7251
@@ -403,6 +403,8 @@ anyscale/client/openapi_client/models/head_ip.py,sha256=9tA-NZRKeMS_ZbVivHY8-sYi
403
403
  anyscale/client/openapi_client/models/headip_response.py,sha256=IDibJ0klCJa8XCme3z97sN562tQnBOfjugCjNSgXeGc,3484
404
404
  anyscale/client/openapi_client/models/http_protocol_config.py,sha256=Jx7OQY7paI8_QM1KuCnBRpSMoExMRSIvN9Tfgc7sUl0,4203
405
405
  anyscale/client/openapi_client/models/http_validation_error.py,sha256=KsPu9vOlvrO888Ht7vNclZjbghvL_VCzCgAEowWIK10,3413
406
+ anyscale/client/openapi_client/models/i_know_response.py,sha256=zc8ksZIsLnO7QsUiDuXMZAVEOVSXRROiWsHTx5271AA,5229
407
+ anyscale/client/openapi_client/models/i_know_time_series_event.py,sha256=N3oYWEzC6DLpV0mFnc4wWEglkJf6C3Zi56yjUYKoKrs,4370
406
408
  anyscale/client/openapi_client/models/idle_termination_status.py,sha256=gKV6Vhsk6qX9a0VpgkUTubyHrfVxAiiqvvz0YiGd3DY,3045
407
409
  anyscale/client/openapi_client/models/instance_usage_budget.py,sha256=bmXndzjWt3FbpZYuPTFs_KuLy3JiQVJpF4CTuXIs3yk,18163
408
410
  anyscale/client/openapi_client/models/instance_usage_budget_evaluation_period.py,sha256=CsNpLq0wAHqA47kDN-zAMPehDMvmRoCnqnaujs_P5RA,2918
@@ -423,10 +425,13 @@ anyscale/client/openapi_client/models/job_queue_execution_mode.py,sha256=5G2g8z_
423
425
  anyscale/client/openapi_client/models/job_queue_spec.py,sha256=7s4kjatMjuFtYJd8trZVW1lEsQ3SdOFsVbppZfdOAvA,9693
424
426
  anyscale/client/openapi_client/models/job_queue_state.py,sha256=5Ejli6rOUioLQj5EbABn02xPSwsBMgiFa3FW2WbCrp4,2830
425
427
  anyscale/client/openapi_client/models/job_queues_query.py,sha256=eJ11_nKrpAm-6038VDRFraIB-mr8DPOvJYJ8Peg9ZCA,7693
428
+ anyscale/client/openapi_client/models/job_report.py,sha256=B1TFEjlPQ46J8BCDFSr7g7PHh5nkxNRMRKxrMwZm8dQ,5982
426
429
  anyscale/client/openapi_client/models/job_run_type.py,sha256=S3eoraHzgnpxGysw3Sh24ZinKZYKWqgNWfO5oQg_p8o,2890
427
430
  anyscale/client/openapi_client/models/job_state_log_level_types.py,sha256=FCBUP-XKYXD4NsyW2_dBOhXNGKrDhEEF7s1rALRuFgE,2853
431
+ anyscale/client/openapi_client/models/job_with_report.py,sha256=pkLUtF2d8RF3VNp_6RiiWpH0e9BYrZ2BRY9C50xi_6Y,7481
428
432
  anyscale/client/openapi_client/models/jobqueue_response.py,sha256=cwvt1GkB2cKOWohhMukTazJGYmat0zBV4b2dvpqixkQ,3506
429
433
  anyscale/client/openapi_client/models/jobs_sort_field.py,sha256=G5NGcfckLltrUMLhIJsgOjtu9ckBkjyXqOqvb__GNvc,2929
434
+ anyscale/client/openapi_client/models/jobwithreport_list_response.py,sha256=dOVXB8NVOhgkGt39AXgwDYykEG6RLWvhl3h6aPtRwf8,4392
430
435
  anyscale/client/openapi_client/models/json_patch_operation.py,sha256=oHgT9WKmcuAp7fkkvFl0nPhoxdQVmPoxPfF82ivf73k,5419
431
436
  anyscale/client/openapi_client/models/kubernetes_manager_registration_request.py,sha256=CaAwpENkOAjpRNPoJzd2mGuvTOm5l4ZtJFQkG0P4VPI,4039
432
437
  anyscale/client/openapi_client/models/kubernetes_manager_registration_response.py,sha256=70j5F-CY429Z2yjCm7LRh4aebSwNV05L8pi087D1Uwc,4049
@@ -734,7 +739,7 @@ anyscale/cloud/_private/cloud_sdk.py,sha256=xCoAVomOfo75YWZzHMm9TDeL8UUx79Gn1DeE
734
739
  anyscale/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
735
740
  anyscale/commands/aggregated_instance_usage_commands.py,sha256=TRP1X3hdIWbKg9V20VtazlDXsYAeV--M0DH3-Z5tnj4,2293
736
741
  anyscale/commands/auth_commands.py,sha256=X1g6Yu9kqgPb4HLODlZTYEk8G5AVLeyizPIgagWx-p0,1026
737
- anyscale/commands/cloud_commands.py,sha256=C0AyWttfstcj66WX8y5hH4E0KMO4k33AQhnmGYzY5tw,41123
742
+ anyscale/commands/cloud_commands.py,sha256=RHEqGRRg7j2VeW9tCSQLzYEE4xVGQmSJmFFnBZWd90Q,42325
738
743
  anyscale/commands/cloud_commands_util.py,sha256=d-6TSZ_syrGkZ3Fc1uRX6jG4dqYMebNkBNpYLojOJFg,247
739
744
  anyscale/commands/cluster_commands.py,sha256=taNcffyFfqJ1MgOQd0cz9kzRXWFTdp-wfLPM4l_2tBc,13487
740
745
  anyscale/commands/cluster_env_commands.py,sha256=KNWylyE8Ew1sDi7yu2Tp4RLcRu2_KJJJIzVGRyPflJo,3899
@@ -780,7 +785,7 @@ anyscale/connect_utils/start_interactive_session.py,sha256=DbuIK2wuWofmbwJ9MLbsb
780
785
  anyscale/controllers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
781
786
  anyscale/controllers/auth_controller.py,sha256=hDY2sPvUP8pvh8PnlDYH5rCHjQes2v3b_KBVjMbrzeE,5127
782
787
  anyscale/controllers/base_controller.py,sha256=1QFJoScFUV7YTzpKarhwPOc1SvI-xqX3TZmwxKonW6I,1998
783
- anyscale/controllers/cloud_controller.py,sha256=H0x9562CgdLL__ANv62rpvdWPA4ks1ZB2vjFaeYek0g,157734
788
+ anyscale/controllers/cloud_controller.py,sha256=MKhyhN2_V8n4HI-MQAnfZ4UaVH0ROnb_ke4Gv0KLLxA,162749
784
789
  anyscale/controllers/cloud_functional_verification_controller.py,sha256=bmRmHS89Pr4m9CxCRLCHiB1FeMOTplnxzo-LdX_uFVQ,33400
785
790
  anyscale/controllers/cluster_controller.py,sha256=Sb5wVjrjpycg5iqmENAVtZ4iy9Kr6kM97_ck-KH85LM,28745
786
791
  anyscale/controllers/cluster_env_controller.py,sha256=JalGzcmnFtMHefYL5U6ijMY3nX6W6BsMEfZSMtgBvtU,8048
@@ -809,7 +814,7 @@ anyscale/image/_private/image_sdk.py,sha256=c6ONvbcq1bUP0YbfIMw8QLRFfVbCiiTwULQA
809
814
  anyscale/job/__init__.py,sha256=_5Nb3a11F4oAHXirTgx5vDdgpVzJ62FdGFmADxxvcPE,5051
810
815
  anyscale/job/commands.py,sha256=je0WDrd3mxt3iuoGqKvE_2TuMWsffXXM_IQ5SRjUKnU,8524
811
816
  anyscale/job/models.py,sha256=n-tVkvIRznes0QEwHn75i9u_LZ8whisTaN4iltz5JFs,17859
812
- anyscale/job/_private/job_sdk.py,sha256=927btJc68nofPfMljwToXI9lzZ7edj-uLmmEaAmCp6I,18979
817
+ anyscale/job/_private/job_sdk.py,sha256=6kQ5bDggA3f1MXcrlXAGrFRA7WAOcvKDVi8FXwq7z-E,18871
813
818
  anyscale/llm/__init__.py,sha256=lRp09PWR2gcJF_1Y9ieIIQWirijP5p_l3AQkTir2iN4,76
814
819
  anyscale/llm/sdk.py,sha256=VmA03eegizqikWR3eH2jYNiA8-FY3Qq1GGtvdkgU470,733
815
820
  anyscale/llm/dataset/__init__.py,sha256=J-z8d7Bdvjf_5OOjcHrFQrXnCxbdcvzUBcyapawIuHg,131
@@ -1106,10 +1111,10 @@ anyscale/workspace/__init__.py,sha256=Innbm5ZhCyADEVBiYSo_vbpKwUNcMzVSAfxIGKOYe6
1106
1111
  anyscale/workspace/commands.py,sha256=b1sqNseoPj-1VXznqQOLe0V_a663bOTvJX-TaOMJa1Y,14590
1107
1112
  anyscale/workspace/models.py,sha256=Ey67KqxdslS51yK7xetbRaFjE8sURAArpf-F38r3cUU,9760
1108
1113
  anyscale/workspace/_private/workspace_sdk.py,sha256=l2baX2BtLX90ZJU3XZpwiDK_xM3SCjvjNv-pr6yUK2o,26938
1109
- anyscale-0.26.16.dist-info/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1110
- anyscale-0.26.16.dist-info/METADATA,sha256=3ZgitoGLjrkn86aOOn5URMX9o4wuwsDKo6VKzfh-_7g,3160
1111
- anyscale-0.26.16.dist-info/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1112
- anyscale-0.26.16.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
1113
- anyscale-0.26.16.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1114
- anyscale-0.26.16.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1115
- anyscale-0.26.16.dist-info/RECORD,,
1114
+ anyscale-0.26.17.dist-info/LICENSE,sha256=UOPu974Wzsna6frFv1mu4VrZgNdZT7lbcNPzo5ue3qs,3494
1115
+ anyscale-0.26.17.dist-info/METADATA,sha256=y6BWr9IEs4mi0Uz4En_fhYU2wg2rL26ofUXnnsb8Deg,3160
1116
+ anyscale-0.26.17.dist-info/NOTICE,sha256=gHqDhSnUYlRXX-mDOL5FtE7774oiKyV_HO80qM3r9Xo,196
1117
+ anyscale-0.26.17.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
1118
+ anyscale-0.26.17.dist-info/entry_points.txt,sha256=NqO18sCZn6zG6J0S38itjcN00s7aE3C3v3k5lMAfCLk,51
1119
+ anyscale-0.26.17.dist-info/top_level.txt,sha256=g3NVNS8Oh0NZwbFFgeX696C5MZZkS5dqV2NqcsbDRJE,9
1120
+ anyscale-0.26.17.dist-info/RECORD,,