lightning-sdk 0.1.37__py3-none-any.whl → 0.1.38__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. lightning_sdk/__init__.py +1 -1
  2. lightning_sdk/ai_hub.py +21 -23
  3. lightning_sdk/api/ai_hub_api.py +29 -4
  4. lightning_sdk/api/job_api.py +6 -2
  5. lightning_sdk/api/teamspace_api.py +18 -14
  6. lightning_sdk/api/utils.py +19 -0
  7. lightning_sdk/cli/ai_hub.py +1 -1
  8. lightning_sdk/cli/run.py +8 -0
  9. lightning_sdk/job/base.py +13 -0
  10. lightning_sdk/job/job.py +8 -0
  11. lightning_sdk/job/v1.py +5 -1
  12. lightning_sdk/job/v2.py +4 -0
  13. lightning_sdk/lightning_cloud/openapi/__init__.py +13 -2
  14. lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +5 -1
  15. lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +680 -62
  16. lightning_sdk/lightning_cloud/openapi/models/__init__.py +13 -2
  17. lightning_sdk/lightning_cloud/openapi/models/create.py +6 -32
  18. lightning_sdk/lightning_cloud/openapi/models/deploymenttemplates_id_body.py +32 -6
  19. lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +27 -1
  20. lightning_sdk/lightning_cloud/openapi/models/multimachinejobs_id_body.py +123 -0
  21. lightning_sdk/lightning_cloud/openapi/models/project_id_agents_body.py +53 -1
  22. lightning_sdk/lightning_cloud/openapi/models/project_id_cloudspaces_body.py +27 -1
  23. lightning_sdk/lightning_cloud/openapi/models/project_id_multimachinejobs_body.py +201 -0
  24. lightning_sdk/lightning_cloud/openapi/models/update.py +6 -32
  25. lightning_sdk/lightning_cloud/openapi/models/v1_api_pricing_spec.py +149 -0
  26. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +27 -1
  27. lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_template_request.py +32 -6
  28. lightning_sdk/lightning_cloud/openapi/models/v1_data_connection.py +6 -32
  29. lightning_sdk/lightning_cloud/openapi/models/v1_delete_multi_machine_job_response.py +97 -0
  30. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_metrics.py +43 -17
  31. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_performance.py +305 -0
  32. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template.py +32 -6
  33. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter.py +27 -1
  34. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_type.py +1 -0
  35. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_summary.py +27 -1
  36. lightning_sdk/lightning_cloud/openapi/models/{v1_efs_data_connection.py → v1_efs_config.py} +22 -22
  37. lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_response.py +27 -1
  38. lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py +53 -1
  39. lightning_sdk/lightning_cloud/openapi/models/v1_lambda_labs_direct_v1.py +125 -0
  40. lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_jobs_response.py +123 -0
  41. lightning_sdk/lightning_cloud/openapi/models/v1_machines_selector.py +149 -0
  42. lightning_sdk/lightning_cloud/openapi/models/v1_message.py +6 -6
  43. lightning_sdk/lightning_cloud/openapi/models/v1_message_content.py +6 -6
  44. lightning_sdk/lightning_cloud/openapi/models/v1_message_content_type.py +103 -0
  45. lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +53 -1
  46. lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job.py +383 -0
  47. lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_state.py +108 -0
  48. lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_status.py +279 -0
  49. lightning_sdk/lightning_cloud/openapi/models/v1_rule_resource.py +2 -0
  50. lightning_sdk/lightning_cloud/openapi/models/v1_system_info.py +27 -1
  51. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +53 -1
  52. lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_compute_config.py +27 -1
  53. lightning_sdk/lightning_cloud/openapi/models/v1_validate_data_connection_response.py +6 -32
  54. lightning_sdk/lightning_cloud/openapi/models/validate.py +6 -32
  55. lightning_sdk/teamspace.py +5 -0
  56. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/METADATA +1 -1
  57. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/RECORD +61 -50
  58. lightning_sdk/lightning_cloud/openapi/models/v1_efs_folder_data_connection.py +0 -201
  59. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/LICENSE +0 -0
  60. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/WHEEL +0 -0
  61. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/entry_points.txt +0 -0
  62. {lightning_sdk-0.1.37.dist-info → lightning_sdk-0.1.38.dist-info}/top_level.txt +0 -0
lightning_sdk/__init__.py CHANGED
@@ -27,5 +27,5 @@ __all__ = [
27
27
  "AIHub",
28
28
  ]
29
29
 
30
- __version__ = "0.1.37"
30
+ __version__ = "0.1.38"
31
31
  _check_version_and_prompt_upgrade(__version__)
lightning_sdk/ai_hub.py CHANGED
@@ -47,17 +47,7 @@ class AIHub:
47
47
  including its name, description, creation and update timestamps,
48
48
  parameters, tags, job specifications, and autoscaling settings.
49
49
  """
50
- template = self._api.api_info(api_id)
51
-
52
- api_arguments = [
53
- {
54
- "name": param.name,
55
- "short_description": param.short_description,
56
- "required": param.required,
57
- "default": param.input.default_value,
58
- }
59
- for param in template.parameter_spec.parameters
60
- ]
50
+ template, api_arguments = self._api.api_info(api_id)
61
51
 
62
52
  return {
63
53
  "name": template.name,
@@ -129,33 +119,33 @@ class AIHub:
129
119
  raise ValueError("You need to pass a teamspace or an org for your deployment.")
130
120
  return teamspace
131
121
 
132
- def deploy(
122
+ def run(
133
123
  self,
134
124
  api_id: str,
135
- cluster: Optional[str] = None,
125
+ api_arguments: Optional[Dict[str, Any]] = None,
136
126
  name: Optional[str] = None,
127
+ cluster: Optional[str] = None,
137
128
  teamspace: Optional[Union[str, "Teamspace"]] = None,
138
129
  org: Optional[Union[str, "Organization"]] = None,
139
- api_arguments: Optional[Dict[str, Any]] = None,
140
130
  ) -> Dict[str, Union[str, bool]]:
141
131
  """Deploy an API from the AI Hub.
142
132
 
143
133
  Example:
144
134
  from lightning_sdk import AIHub
145
135
  hub = AIHub()
146
- deployment = hub.deploy("temp_xxxx")
136
+ deployment = hub.run("temp_xxxx")
147
137
 
148
138
  # Using API arguments
149
- api_arugments = {"model": "unitary/toxic-bert", "batch_size" 10, "token": "lit_xxxx"}
150
- deployment = hub.deploy("temp_xxxx", api_arugments=api_arugments)
139
+ api_arugments = {"model": "unitary/toxic-bert", "batch_size": 10, "token": "lit_xxxx"}
140
+ deployment = hub.run("temp_xxxx", api_arugments=api_arugments)
151
141
 
152
142
  Args:
153
- api_id: The ID of the API you want to deploy.
154
- cluster: The cluster where you want to deploy the API, such as "lightning-public-prod". Defaults to None.
143
+ api_id: The ID of the AIHub template you want to run.
144
+ api_arguments: Additional API argument, such as model name, or batch size.
155
145
  name: Name for the deployed API. Defaults to None.
146
+ cluster: The cluster where you want to run the template, such as "lightning-public-prod". Defaults to None.
156
147
  teamspace: The team or group for deployment. Defaults to None.
157
148
  org: The organization for deployment. Defaults to None.
158
- api_arguments: Additional API argument, such as model name, or batch size.
159
149
 
160
150
  Returns:
161
151
  A dictionary containing the name of the deployed API,
@@ -169,14 +159,22 @@ class AIHub:
169
159
  teamspace_id = teamspace.id
170
160
 
171
161
  api_arguments = api_arguments or {}
172
- deployment = self._api.deploy_api(
162
+ deployment = self._api.run_api(
173
163
  template_id=api_id, cluster_id=cluster, project_id=teamspace_id, name=name, api_arguments=api_arguments
174
164
  )
175
- url = quote(f"{LIGHTNING_CLOUD_URL}/{teamspace._org.name}/{teamspace.name}/jobs/{deployment.name}", safe=":/()")
165
+ url = (
166
+ quote(
167
+ f"{LIGHTNING_CLOUD_URL}/{teamspace._org.name}/{teamspace.name}/jobs/{deployment.name}",
168
+ safe=":/()",
169
+ )
170
+ + "?app_id=deployment"
171
+ )
176
172
  print("Deployment available at:", url)
173
+
177
174
  return {
178
175
  "id": deployment.id,
179
176
  "name": deployment.name,
180
- "base_url": deployment.status.urls[0],
177
+ "deployment_url": url,
178
+ "api_endpoint": deployment.status.urls[0],
181
179
  "interruptible": deployment.spec.spot,
182
180
  }
@@ -1,5 +1,5 @@
1
1
  import traceback
2
- from typing import Dict, List, Optional
2
+ from typing import Dict, List, Optional, Tuple
3
3
 
4
4
  import backoff
5
5
 
@@ -22,15 +22,40 @@ class AIHubApi:
22
22
  def __init__(self) -> None:
23
23
  self._client = LightningClient(max_tries=3)
24
24
 
25
- def api_info(self, api_id: str) -> "V1DeploymentTemplate":
25
+ def api_info(self, api_id: str) -> Tuple[V1DeploymentTemplate, List[Dict[str, str]]]:
26
26
  try:
27
- return self._client.deployment_templates_service_get_deployment_template(api_id)
27
+ template = self._client.deployment_templates_service_get_deployment_template(api_id)
28
28
  except Exception as e:
29
29
  stack_trace = traceback.format_exc()
30
30
  if "record not found" in stack_trace:
31
31
  raise ValueError(f"api_id={api_id} not found.") from None
32
32
  raise e
33
33
 
34
+ api_arguments = []
35
+ for param in template.parameter_spec.parameters:
36
+ default = None
37
+ if param.type == V1DeploymentTemplateParameterType.INPUT and param.input:
38
+ default = param.input.default_value
39
+ if param.type == V1DeploymentTemplateParameterType.SELECT and param.select:
40
+ default = param.select.options[0]
41
+ if param.type == V1DeploymentTemplateParameterType.CHECKBOX and param.checkbox:
42
+ default = (
43
+ (param.checkbox.true_value or "True")
44
+ if param.checkbox.is_checked
45
+ else (param.checkbox.false_value or "False")
46
+ )
47
+
48
+ api_arguments.append(
49
+ {
50
+ "name": param.name,
51
+ "short_description": param.short_description,
52
+ "required": param.required,
53
+ "type": param.type,
54
+ "default": default,
55
+ }
56
+ )
57
+ return template, api_arguments
58
+
34
59
  @backoff.on_predicate(backoff.expo, lambda x: not x, max_tries=5)
35
60
  def list_apis(self, search_query: str) -> List[V1DeploymentTemplateGalleryResponse]:
36
61
  kwargs = {"show_globally_visible": True}
@@ -84,7 +109,7 @@ class AIHubApi:
84
109
 
85
110
  return job
86
111
 
87
- def deploy_api(
112
+ def run_api(
88
113
  self, template_id: str, project_id: str, cluster_id: str, name: Optional[str], api_arguments: Dict[str, str]
89
114
  ) -> V1Deployment:
90
115
  template = self._client.deployment_templates_service_get_deployment_template(template_id)
@@ -141,13 +141,15 @@ class JobApiV2:
141
141
  self,
142
142
  name: str,
143
143
  command: Optional[str],
144
- cluster_id: str,
144
+ cluster_id: Optional[str],
145
145
  teamspace_id: str,
146
146
  studio_id: Optional[str],
147
147
  image: Optional[str],
148
148
  machine: Machine,
149
149
  interruptible: bool,
150
150
  env: Optional[Dict[str, str]],
151
+ image_credentials: Optional[str],
152
+ cluster_auth: bool,
151
153
  ) -> V1Job:
152
154
  env_vars = []
153
155
  if env is not None:
@@ -160,13 +162,15 @@ class JobApiV2:
160
162
 
161
163
  spec = V1JobSpec(
162
164
  cloudspace_id=studio_id or "",
163
- cluster_id=cluster_id,
165
+ cluster_id=cluster_id or "",
164
166
  command=command or "",
165
167
  env=env_vars,
166
168
  image=image or "",
167
169
  instance_name=instance_name,
168
170
  run_id=run_id,
169
171
  spot=interruptible,
172
+ image_cluster_credentials=cluster_auth,
173
+ image_secret_ref=image_credentials or "",
170
174
  )
171
175
  body = ProjectIdJobsBody(name=name, spec=spec)
172
176
 
@@ -3,7 +3,7 @@ from dataclasses import dataclass
3
3
  from pathlib import Path
4
4
  from typing import Dict, List, Optional
5
5
 
6
- from lightning_sdk.api.utils import _download_model_files, _DummyBody, _ModelFileUploader
6
+ from lightning_sdk.api.utils import _download_model_files, _DummyBody, _get_model_version, _ModelFileUploader
7
7
  from lightning_sdk.lightning_cloud.login import Auth
8
8
  from lightning_sdk.lightning_cloud.openapi import (
9
9
  ModelIdVersionsBody,
@@ -159,6 +159,16 @@ class TeamspaceApi:
159
159
 
160
160
  return self._client.assistants_service_create_assistant(body=body, project_id=teamspace_id)
161
161
 
162
+ # lazy property which is only created when needed
163
+ @property
164
+ def models(self) -> ModelsStoreApi:
165
+ if not self._models:
166
+ self._models = ModelsStoreApi(self._client.api_client)
167
+ return self._models
168
+
169
+ def get_model_version(self, name: str, version: str, teamspace_id: str) -> V1ModelVersionArchive:
170
+ return _get_model_version(client=self._client, name=name, version=version, teamspace_id=teamspace_id)
171
+
162
172
  def create_model(
163
173
  self,
164
174
  name: str,
@@ -167,17 +177,15 @@ class TeamspaceApi:
167
177
  teamspace_id: str,
168
178
  cluster_id: str,
169
179
  ) -> V1ModelVersionArchive:
170
- if not self._models:
171
- self._models = ModelsStoreApi(self._client.api_client)
172
180
  # ask if such model already exists by listing models with specific name
173
- models = self._models.models_store_list_models(project_id=teamspace_id, name=name).models
181
+ models = self.models.models_store_list_models(project_id=teamspace_id, name=name).models
174
182
  if len(models) == 0:
175
- return self._models.models_store_create_model(
183
+ return self.models.models_store_create_model(
176
184
  body=ProjectIdModelsBody(cluster_id=cluster_id, metadata=metadata, name=name, private=private),
177
185
  project_id=teamspace_id,
178
186
  )
179
187
  assert len(models) == 1, "Multiple models with the same name found"
180
- return self._models.models_store_create_model_version(
188
+ return self.models.models_store_create_model_version(
181
189
  body=ModelIdVersionsBody(cluster_id=cluster_id),
182
190
  project_id=teamspace_id,
183
191
  model_id=models[0].id,
@@ -185,18 +193,16 @@ class TeamspaceApi:
185
193
 
186
194
  def delete_model(self, name: str, version: Optional[str], teamspace_id: str) -> None:
187
195
  """Delete a model or a version from the model store."""
188
- if not self._models:
189
- self._models = ModelsStoreApi(self._client.api_client)
190
- models = self._models.models_store_list_models(project_id=teamspace_id, name=name).models
196
+ models = self.models.models_store_list_models(project_id=teamspace_id, name=name).models
191
197
  assert len(models) == 1, "Multiple models with the same name found"
192
198
  model_id = models[0].id
193
199
  # decide if delete only version of whole model
194
200
  if version:
195
201
  if version == "latest":
196
202
  version = models[0].latest_version
197
- self._models.models_store_delete_model_version(project_id=teamspace_id, model_id=model_id, version=version)
203
+ self.models.models_store_delete_model_version(project_id=teamspace_id, model_id=model_id, version=version)
198
204
  else:
199
- self._models.models_store_delete_model(project_id=teamspace_id, model_id=model_id)
205
+ self.models.models_store_delete_model(project_id=teamspace_id, model_id=model_id)
200
206
 
201
207
  def upload_model_file(
202
208
  self,
@@ -242,9 +248,7 @@ class TeamspaceApi:
242
248
  )
243
249
 
244
250
  def complete_model_upload(self, model_id: str, version: str, teamspace_id: str) -> None:
245
- if not self._models:
246
- self._models = ModelsStoreApi(self._client.api_client)
247
- self._models.models_store_complete_model_upload(
251
+ self.models.models_store_complete_model_upload(
248
252
  body=_DummyBody(),
249
253
  project_id=teamspace_id,
250
254
  model_id=model_id,
@@ -28,6 +28,7 @@ from lightning_sdk.lightning_cloud.openapi import (
28
28
  V1UploadProjectArtifactResponse,
29
29
  VersionUploadsBody,
30
30
  )
31
+ from lightning_sdk.lightning_cloud.openapi.models.v1_model_version_archive import V1ModelVersionArchive
31
32
 
32
33
  try:
33
34
  from lightning_sdk.lightning_cloud.openapi import AppsIdBody1 as AppsIdBody
@@ -492,6 +493,24 @@ class _FileDownloader:
492
493
  os.rename(tmp_filename, self.local_path)
493
494
 
494
495
 
496
+ def _get_model_version(client: LightningClient, teamspace_id: str, name: str, version: str) -> V1ModelVersionArchive:
497
+ api = ModelsStoreApi(client.api_client)
498
+ models = api.models_store_list_models(project_id=teamspace_id, name=name).models
499
+ if not models:
500
+ raise ValueError(f"Model `{name}` does not exist")
501
+ elif len(models) > 1:
502
+ raise ValueError("Multiple models with the same name found")
503
+ if version == "latest":
504
+ return models[0].latest_version
505
+ versions = api.models_store_list_model_versions(project_id=teamspace_id, model_id=models[0].id).versions
506
+ if not versions:
507
+ raise ValueError(f"Model `{name}` does not have any versions")
508
+ for ver in versions:
509
+ if ver.version == version:
510
+ return ver
511
+ raise ValueError(f"Model `{name}` does not have version `{version}`")
512
+
513
+
495
514
  def _download_model_files(
496
515
  client: LightningClient,
497
516
  teamspace_id: str,
@@ -46,4 +46,4 @@ class _AIHub(_StudiosMenu):
46
46
  teamspace: Teamspace to deploy the API to. Defaults to user's default teamspace.
47
47
  org: Organization to deploy the API to. Defaults to user's default organization.
48
48
  """
49
- return self._hub.deploy(api_id, cluster=cluster, name=name, teamspace=teamspace, org=org)
49
+ return self._hub.run(api_id, cluster=cluster, name=name, teamspace=teamspace, org=org)
lightning_sdk/cli/run.py CHANGED
@@ -36,6 +36,10 @@ class _Run:
36
36
  If not provided will fall back to the teamspaces default cluster.
37
37
  env: Environment variables to set inside the job.
38
38
  interruptible: Whether the job should run on interruptible instances. They are cheaper but can be preempted.
39
+ image_credentials: The credentials used to pull the image. Required if the image is private.
40
+ This should be the name of the respective credentials secret created on the Lightning AI platform.
41
+ cluster_auth: Whether to authenticate with the cluster to pull the image.
42
+ Required if the registry is part of a cluster provider (e.g. ECR).
39
43
  """
40
44
  self.job.__func__.__doc__ = docstr
41
45
 
@@ -55,6 +59,8 @@ class _Run:
55
59
  cluster: Optional[str] = None,
56
60
  env: Optional[Dict[str, str]] = None,
57
61
  interruptible: bool = False,
62
+ image_credentials: Optional[str] = None,
63
+ cluster_auth: bool = False,
58
64
  ) -> None:
59
65
  machine_enum = Machine(machine.upper())
60
66
  Job.run(
@@ -69,4 +75,6 @@ class _Run:
69
75
  cluster=cluster,
70
76
  env=env,
71
77
  interruptible=interruptible,
78
+ image_credentials=image_credentials,
79
+ cluster_auth=cluster_auth,
72
80
  )
lightning_sdk/job/base.py CHANGED
@@ -50,6 +50,8 @@ class _BaseJob(ABC):
50
50
  cluster: Optional[str] = None,
51
51
  env: Optional[Dict[str, str]] = None,
52
52
  interruptible: bool = False,
53
+ image_credentials: Optional[str] = None,
54
+ cluster_auth: bool = False,
53
55
  ) -> "_BaseJob":
54
56
  from lightning_sdk.studio import Studio
55
57
 
@@ -80,6 +82,13 @@ class _BaseJob(ABC):
80
82
  "Studio cluster does not match provided cluster. "
81
83
  "Can only run jobs with Studio envs in the same cluster."
82
84
  )
85
+
86
+ if image_credentials is not None:
87
+ raise ValueError("image_credentials is only supported when using a custom image")
88
+
89
+ if cluster_auth:
90
+ raise ValueError("cluster_auth is only supported when using a custom image")
91
+
83
92
  else:
84
93
  if studio is not None:
85
94
  raise RuntimeError(
@@ -95,6 +104,8 @@ class _BaseJob(ABC):
95
104
  image=image,
96
105
  env=env,
97
106
  interruptible=interruptible,
107
+ image_credentials=image_credentials,
108
+ cluster_auth=cluster_auth,
98
109
  )
99
110
  return inst
100
111
 
@@ -108,6 +119,8 @@ class _BaseJob(ABC):
108
119
  env: Optional[Dict[str, str]] = None,
109
120
  interruptible: bool = False,
110
121
  cluster: Optional[str] = None,
122
+ image_credentials: Optional[str] = None,
123
+ cluster_auth: bool = False,
111
124
  ) -> None:
112
125
  """Submits a job and updates the internal _job attribute as well as the _name attribute."""
113
126
 
lightning_sdk/job/job.py CHANGED
@@ -58,6 +58,8 @@ class Job(_BaseJob):
58
58
  cluster: Optional[str] = None,
59
59
  env: Optional[Dict[str, str]] = None,
60
60
  interruptible: bool = False,
61
+ image_credentials: Optional[str] = None,
62
+ cluster_auth: bool = False,
61
63
  ) -> "Job":
62
64
  ret_val = super().run(
63
65
  name=name,
@@ -71,6 +73,8 @@ class Job(_BaseJob):
71
73
  cluster=cluster,
72
74
  env=env,
73
75
  interruptible=interruptible,
76
+ image_credentials=image_credentials,
77
+ cluster_auth=cluster_auth,
74
78
  )
75
79
  # required for typing with "Job"
76
80
  assert isinstance(ret_val, cls)
@@ -85,6 +89,8 @@ class Job(_BaseJob):
85
89
  env: Optional[Dict[str, str]] = None,
86
90
  interruptible: bool = False,
87
91
  cluster: Optional[str] = None,
92
+ image_credentials: Optional[str] = None,
93
+ cluster_auth: bool = False,
88
94
  ) -> None:
89
95
  return self._internal_job._submit(
90
96
  machine=machine,
@@ -94,6 +100,8 @@ class Job(_BaseJob):
94
100
  image=image,
95
101
  env=env,
96
102
  interruptible=interruptible,
103
+ image_credentials=image_credentials,
104
+ cluster_auth=cluster_auth,
97
105
  )
98
106
 
99
107
  def stop(self) -> None:
lightning_sdk/job/v1.py CHANGED
@@ -54,6 +54,8 @@ class _JobV1(_BaseJob):
54
54
  cluster=cluster,
55
55
  env=None,
56
56
  interruptible=interruptible,
57
+ image_credentials=None,
58
+ cluster_auth=False,
57
59
  )
58
60
 
59
61
  def _submit(
@@ -65,11 +67,13 @@ class _JobV1(_BaseJob):
65
67
  env: Optional[Dict[str, str]] = None,
66
68
  interruptible: bool = False,
67
69
  cluster: Optional[str] = None,
70
+ image_credentials: Optional[str] = None,
71
+ cluster_auth: bool = False,
68
72
  ) -> None:
69
73
  if studio is None:
70
74
  raise ValueError("Studio is required for submitting jobs")
71
75
 
72
- if image is not None:
76
+ if image is not None or image_credentials is not None or cluster_auth:
73
77
  raise ValueError("Image is not supported for submitting jobs")
74
78
 
75
79
  if env is not None:
lightning_sdk/job/v2.py CHANGED
@@ -34,6 +34,8 @@ class _JobV2(_BaseJob):
34
34
  env: Optional[Dict[str, str]] = None,
35
35
  interruptible: bool = False,
36
36
  cluster: Optional[str] = None,
37
+ image_credentials: Optional[str] = None,
38
+ cluster_auth: bool = False,
37
39
  ) -> None:
38
40
  # Command is required if Studio is provided to know what to run
39
41
  # Image is mutually exclusive with Studio
@@ -62,6 +64,8 @@ class _JobV2(_BaseJob):
62
64
  machine=machine,
63
65
  interruptible=interruptible,
64
66
  env=env,
67
+ image_credentials=image_credentials,
68
+ cluster_auth=cluster_auth,
65
69
  )
66
70
  self._job = submitted
67
71
  self._name = submitted.name
@@ -138,6 +138,7 @@ from lightning_sdk.lightning_cloud.openapi.models.metricsstream_delete_body impo
138
138
  from lightning_sdk.lightning_cloud.openapi.models.metricsstream_id_body import MetricsstreamIdBody
139
139
  from lightning_sdk.lightning_cloud.openapi.models.model_id_versions_body import ModelIdVersionsBody
140
140
  from lightning_sdk.lightning_cloud.openapi.models.models_model_id_body import ModelsModelIdBody
141
+ from lightning_sdk.lightning_cloud.openapi.models.multimachinejobs_id_body import MultimachinejobsIdBody
141
142
  from lightning_sdk.lightning_cloud.openapi.models.multipartuploads_upload_id_body import MultipartuploadsUploadIdBody
142
143
  from lightning_sdk.lightning_cloud.openapi.models.org_id_memberships_body import OrgIdMembershipsBody
143
144
  from lightning_sdk.lightning_cloud.openapi.models.org_id_roles_body import OrgIdRolesBody
@@ -157,6 +158,7 @@ from lightning_sdk.lightning_cloud.openapi.models.project_id_invite_body import
157
158
  from lightning_sdk.lightning_cloud.openapi.models.project_id_jobs_body import ProjectIdJobsBody
158
159
  from lightning_sdk.lightning_cloud.openapi.models.project_id_memberships_body import ProjectIdMembershipsBody
159
160
  from lightning_sdk.lightning_cloud.openapi.models.project_id_models_body import ProjectIdModelsBody
161
+ from lightning_sdk.lightning_cloud.openapi.models.project_id_multimachinejobs_body import ProjectIdMultimachinejobsBody
160
162
  from lightning_sdk.lightning_cloud.openapi.models.project_id_projectclustersbindings_body import ProjectIdProjectclustersbindingsBody
161
163
  from lightning_sdk.lightning_cloud.openapi.models.project_id_secrets_body import ProjectIdSecretsBody
162
164
  from lightning_sdk.lightning_cloud.openapi.models.project_id_serviceexecution_body import ProjectIdServiceexecutionBody
@@ -200,6 +202,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_agent_job import V1AgentJob
200
202
  from lightning_sdk.lightning_cloud.openapi.models.v1_agent_job_artifact import V1AgentJobArtifact
201
203
  from lightning_sdk.lightning_cloud.openapi.models.v1_agent_upload_multipart_url import V1AgentUploadMultipartUrl
202
204
  from lightning_sdk.lightning_cloud.openapi.models.v1_agent_upload_part_response import V1AgentUploadPartResponse
205
+ from lightning_sdk.lightning_cloud.openapi.models.v1_api_pricing_spec import V1ApiPricingSpec
203
206
  from lightning_sdk.lightning_cloud.openapi.models.v1_app_type import V1AppType
204
207
  from lightning_sdk.lightning_cloud.openapi.models.v1_append_logger_metrics_response import V1AppendLoggerMetricsResponse
205
208
  from lightning_sdk.lightning_cloud.openapi.models.v1_approve_auto_join_domain_response import V1ApproveAutoJoinDomainResponse
@@ -340,6 +343,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_managed_model_respon
340
343
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_metrics_stream_response import V1DeleteMetricsStreamResponse
341
344
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_model_response import V1DeleteModelResponse
342
345
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_model_version_response import V1DeleteModelVersionResponse
346
+ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_multi_machine_job_response import V1DeleteMultiMachineJobResponse
343
347
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_membership_response import V1DeleteOrgMembershipResponse
344
348
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_membership_role_binding_response import V1DeleteOrgMembershipRoleBindingResponse
345
349
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_org_role_response import V1DeleteOrgRoleResponse
@@ -364,6 +368,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_deployment import V1Deploym
364
368
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_event import V1DeploymentEvent
365
369
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_event_type import V1DeploymentEventType
366
370
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_metrics import V1DeploymentMetrics
371
+ from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_performance import V1DeploymentPerformance
367
372
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_release import V1DeploymentRelease
368
373
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_spec import V1DeploymentSpec
369
374
  from lightning_sdk.lightning_cloud.openapi.models.v1_deployment_state import V1DeploymentState
@@ -388,9 +393,8 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_drive_status import V1Drive
388
393
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type import V1DriveType
389
394
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_spec import V1DriveTypeSpec
390
395
  from lightning_sdk.lightning_cloud.openapi.models.v1_drive_type_status import V1DriveTypeStatus
391
- from lightning_sdk.lightning_cloud.openapi.models.v1_efs_folder_data_connection import V1EFSFolderDataConnection
392
396
  from lightning_sdk.lightning_cloud.openapi.models.v1_ebs import V1Ebs
393
- from lightning_sdk.lightning_cloud.openapi.models.v1_efs_data_connection import V1EfsDataConnection
397
+ from lightning_sdk.lightning_cloud.openapi.models.v1_efs_config import V1EfsConfig
394
398
  from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint import V1Endpoint
395
399
  from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint_auth import V1EndpointAuth
396
400
  from lightning_sdk.lightning_cloud.openapi.models.v1_endpoint_prewarm import V1EndpointPrewarm
@@ -478,6 +482,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_job_timing import V1JobTimi
478
482
  from lightning_sdk.lightning_cloud.openapi.models.v1_joinable_organization import V1JoinableOrganization
479
483
  from lightning_sdk.lightning_cloud.openapi.models.v1_keep_alive_cloud_space_instance_response import V1KeepAliveCloudSpaceInstanceResponse
480
484
  from lightning_sdk.lightning_cloud.openapi.models.v1_knowledge_configuration import V1KnowledgeConfiguration
485
+ from lightning_sdk.lightning_cloud.openapi.models.v1_lambda_labs_direct_v1 import V1LambdaLabsDirectV1
481
486
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_app_user import V1LightningAppUser
482
487
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_auth import V1LightningAuth
483
488
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_basic_auth import V1LightningBasicAuth
@@ -552,6 +557,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_memberships_response i
552
557
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_metrics_streams_response import V1ListMetricsStreamsResponse
553
558
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_model_versions_response import V1ListModelVersionsResponse
554
559
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_models_response import V1ListModelsResponse
560
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_multi_machine_jobs_response import V1ListMultiMachineJobsResponse
555
561
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_new_features_for_user_response import V1ListNewFeaturesForUserResponse
556
562
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_org_members_response import V1ListOrgMembersResponse
557
563
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_org_membership_role_binding_response import V1ListOrgMembershipRoleBindingResponse
@@ -587,6 +593,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_login_response import V1Log
587
593
  from lightning_sdk.lightning_cloud.openapi.models.v1_logout_request import V1LogoutRequest
588
594
  from lightning_sdk.lightning_cloud.openapi.models.v1_logout_response import V1LogoutResponse
589
595
  from lightning_sdk.lightning_cloud.openapi.models.v1_logs_response import V1LogsResponse
596
+ from lightning_sdk.lightning_cloud.openapi.models.v1_machines_selector import V1MachinesSelector
590
597
  from lightning_sdk.lightning_cloud.openapi.models.v1_magic_link_login_request import V1MagicLinkLoginRequest
591
598
  from lightning_sdk.lightning_cloud.openapi.models.v1_magic_link_login_response import V1MagicLinkLoginResponse
592
599
  from lightning_sdk.lightning_cloud.openapi.models.v1_managed_endpoint import V1ManagedEndpoint
@@ -595,6 +602,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_membership import V1Members
595
602
  from lightning_sdk.lightning_cloud.openapi.models.v1_message import V1Message
596
603
  from lightning_sdk.lightning_cloud.openapi.models.v1_message_author import V1MessageAuthor
597
604
  from lightning_sdk.lightning_cloud.openapi.models.v1_message_content import V1MessageContent
605
+ from lightning_sdk.lightning_cloud.openapi.models.v1_message_content_type import V1MessageContentType
598
606
  from lightning_sdk.lightning_cloud.openapi.models.v1_metadata import V1Metadata
599
607
  from lightning_sdk.lightning_cloud.openapi.models.v1_metric_value import V1MetricValue
600
608
  from lightning_sdk.lightning_cloud.openapi.models.v1_metrics import V1Metrics
@@ -604,6 +612,9 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_metrics_tracker import V1Me
604
612
  from lightning_sdk.lightning_cloud.openapi.models.v1_model import V1Model
605
613
  from lightning_sdk.lightning_cloud.openapi.models.v1_model_version_archive import V1ModelVersionArchive
606
614
  from lightning_sdk.lightning_cloud.openapi.models.v1_mount_target import V1MountTarget
615
+ from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job import V1MultiMachineJob
616
+ from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_state import V1MultiMachineJobState
617
+ from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_status import V1MultiMachineJobStatus
607
618
  from lightning_sdk.lightning_cloud.openapi.models.v1_named_get_logger_metrics import V1NamedGetLoggerMetrics
608
619
  from lightning_sdk.lightning_cloud.openapi.models.v1_network_config import V1NetworkConfig
609
620
  from lightning_sdk.lightning_cloud.openapi.models.v1_new_feature import V1NewFeature
@@ -2197,6 +2197,7 @@ class ClusterServiceApi(object):
2197
2197
  >>> result = thread.get()
2198
2198
 
2199
2199
  :param async_req bool
2200
+ :param bool include_pricing:
2200
2201
  :return: V1ListDefaultClusterAcceleratorsResponse
2201
2202
  If the method is called asynchronously,
2202
2203
  returns the request thread.
@@ -2217,12 +2218,13 @@ class ClusterServiceApi(object):
2217
2218
  >>> result = thread.get()
2218
2219
 
2219
2220
  :param async_req bool
2221
+ :param bool include_pricing:
2220
2222
  :return: V1ListDefaultClusterAcceleratorsResponse
2221
2223
  If the method is called asynchronously,
2222
2224
  returns the request thread.
2223
2225
  """
2224
2226
 
2225
- all_params = [] # noqa: E501
2227
+ all_params = ['include_pricing'] # noqa: E501
2226
2228
  all_params.append('async_req')
2227
2229
  all_params.append('_return_http_data_only')
2228
2230
  all_params.append('_preload_content')
@@ -2243,6 +2245,8 @@ class ClusterServiceApi(object):
2243
2245
  path_params = {}
2244
2246
 
2245
2247
  query_params = []
2248
+ if 'include_pricing' in params:
2249
+ query_params.append(('includePricing', params['include_pricing'])) # noqa: E501
2246
2250
 
2247
2251
  header_params = {}
2248
2252