lightning-sdk 0.2.12__py3-none-any.whl → 0.2.13__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 (34) hide show
  1. lightning_sdk/__init__.py +1 -1
  2. lightning_sdk/api/llm_api.py +17 -5
  3. lightning_sdk/api/studio_api.py +17 -0
  4. lightning_sdk/cli/entrypoint.py +1 -1
  5. lightning_sdk/cli/serve.py +149 -39
  6. lightning_sdk/deployment/deployment.py +2 -2
  7. lightning_sdk/lightning_cloud/openapi/__init__.py +6 -0
  8. lightning_sdk/lightning_cloud/openapi/api/__init__.py +1 -0
  9. lightning_sdk/lightning_cloud/openapi/api/git_credentials_service_api.py +497 -0
  10. lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +14 -5
  11. lightning_sdk/lightning_cloud/openapi/models/__init__.py +5 -0
  12. lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py +27 -1
  13. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +27 -1
  14. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +27 -1
  15. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +79 -1
  16. lightning_sdk/lightning_cloud/openapi/models/v1_create_git_credentials_request.py +175 -0
  17. lightning_sdk/lightning_cloud/openapi/models/v1_delete_git_credentials_response.py +97 -0
  18. lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py +27 -1
  19. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_state.py +2 -0
  20. lightning_sdk/lightning_cloud/openapi/models/v1_git_credentials.py +227 -0
  21. lightning_sdk/lightning_cloud/openapi/models/v1_list_git_credentials_response.py +123 -0
  22. lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py +15 -15
  23. lightning_sdk/lightning_cloud/openapi/models/v1_nebius_direct_v1.py +149 -0
  24. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +53 -1
  25. lightning_sdk/llm/llm.py +92 -30
  26. lightning_sdk/plugin.py +19 -0
  27. lightning_sdk/studio.py +33 -0
  28. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/METADATA +1 -1
  29. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/RECORD +34 -28
  30. /lightning_sdk/cli/{docker.py → docker_cli.py} +0 -0
  31. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/LICENSE +0 -0
  32. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/WHEEL +0 -0
  33. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/entry_points.txt +0 -0
  34. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.13.dist-info}/top_level.txt +0 -0
@@ -85,6 +85,7 @@ class V1UserFeatures(object):
85
85
  'mmt_strategy_selector': 'bool',
86
86
  'multicloud_saas': 'bool',
87
87
  'multiple_studio_versions': 'bool',
88
+ 'nerf_fs_nonpaying': 'bool',
88
89
  'org_admin_alerts': 'bool',
89
90
  'org_level_member_permissions': 'bool',
90
91
  'org_usage_limits': 'bool',
@@ -110,6 +111,7 @@ class V1UserFeatures(object):
110
111
  'slurm_machine_selector': 'bool',
111
112
  'stop_ide_container_on_shutdown': 'bool',
112
113
  'studio_config': 'bool',
114
+ 'studio_deployment': 'bool',
113
115
  'studio_on_stop': 'bool',
114
116
  'studio_version_visibility': 'bool',
115
117
  'studios_dashboard': 'bool',
@@ -167,6 +169,7 @@ class V1UserFeatures(object):
167
169
  'mmt_strategy_selector': 'mmtStrategySelector',
168
170
  'multicloud_saas': 'multicloudSaas',
169
171
  'multiple_studio_versions': 'multipleStudioVersions',
172
+ 'nerf_fs_nonpaying': 'nerfFsNonpaying',
170
173
  'org_admin_alerts': 'orgAdminAlerts',
171
174
  'org_level_member_permissions': 'orgLevelMemberPermissions',
172
175
  'org_usage_limits': 'orgUsageLimits',
@@ -192,6 +195,7 @@ class V1UserFeatures(object):
192
195
  'slurm_machine_selector': 'slurmMachineSelector',
193
196
  'stop_ide_container_on_shutdown': 'stopIdeContainerOnShutdown',
194
197
  'studio_config': 'studioConfig',
198
+ 'studio_deployment': 'studioDeployment',
195
199
  'studio_on_stop': 'studioOnStop',
196
200
  'studio_version_visibility': 'studioVersionVisibility',
197
201
  'studios_dashboard': 'studiosDashboard',
@@ -204,7 +208,7 @@ class V1UserFeatures(object):
204
208
  'weka': 'weka'
205
209
  }
206
210
 
207
- def __init__(self, affiliate_links: 'bool' =None, agents_v2: 'bool' =None, ai_hub_monetization: 'bool' =None, auto_fast_load: 'bool' =None, auto_join_orgs: 'bool' =None, b2c_experience: 'bool' =None, byoc_litcr: 'bool' =None, cap_add: 'list[str]' =None, cap_drop: 'list[str]' =None, capacity_reservation_byoc: 'bool' =None, capacity_reservation_dry_run: 'bool' =None, chat_models: 'bool' =None, cloud_space_environment_templates: 'bool' =None, code_tab: 'bool' =None, collab_screen_sharing: 'bool' =None, concurrent_gpu_limit: 'bool' =None, cost_attribution_settings: 'bool' =None, custom_app_domain: 'bool' =None, custom_instance_types: 'bool' =None, datasets: 'bool' =None, default_one_cluster: 'bool' =None, deployment_alerts: 'bool' =None, deployment_persistent_disk: 'bool' =None, dgx_cloud: 'bool' =None, doc_helper_chat: 'bool' =None, docs_agent: 'bool' =None, drive_v2: 'bool' =None, enable_storage_limits: 'bool' =None, enterprise_compute_admin: 'bool' =None, fair_share: 'bool' =None, featured_studios_admin: 'bool' =None, filestore: 'bool' =None, gcp_local_disk_binding: 'bool' =None, inactive_notify_delete: 'bool' =None, instant_capacity_reservation: 'bool' =None, job_artifacts_v2: 'bool' =None, lambda_labs: 'bool' =None, landing_studios: 'bool' =None, lit_logger: 'bool' =None, marketplace: 'bool' =None, mmt_fault_tolerance: 'bool' =None, mmt_strategy_selector: 'bool' =None, multicloud_saas: 'bool' =None, multiple_studio_versions: 'bool' =None, org_admin_alerts: 'bool' =None, org_level_member_permissions: 'bool' =None, org_usage_limits: 'bool' =None, pipelines: 'bool' =None, plugin_distributed: 'bool' =None, plugin_inference: 'bool' =None, plugin_label_studio: 'bool' =None, plugin_langflow: 'bool' =None, plugin_python_profiler: 'bool' =None, plugin_service: 'bool' =None, plugin_sweeps: 'bool' =None, pricing_updates: 'bool' =None, product_generator: 'bool' =None, project_selector: 'bool' =None, publish_pipelines: 'bool' =None, r2_data_connections: 'bool' =None, restartable_jobs: 'bool' =None, runnable_public_studio_page: 'bool' =None, security_docs: 'bool' =None, show_dev_admin: 'bool' =None, single_wallet: 'bool' =None, slurm: 'bool' =None, slurm_machine_selector: 'bool' =None, stop_ide_container_on_shutdown: 'bool' =None, studio_config: 'bool' =None, studio_on_stop: 'bool' =None, studio_version_visibility: 'bool' =None, studios_dashboard: 'bool' =None, studios_dashboard_system_metrics: 'bool' =None, teamspace_storage_tab: 'bool' =None, trainium2: 'bool' =None, use_rclone_mounts_only: 'bool' =None, voltage_park: 'bool' =None, vultr: 'bool' =None, weka: 'bool' =None): # noqa: E501
211
+ def __init__(self, affiliate_links: 'bool' =None, agents_v2: 'bool' =None, ai_hub_monetization: 'bool' =None, auto_fast_load: 'bool' =None, auto_join_orgs: 'bool' =None, b2c_experience: 'bool' =None, byoc_litcr: 'bool' =None, cap_add: 'list[str]' =None, cap_drop: 'list[str]' =None, capacity_reservation_byoc: 'bool' =None, capacity_reservation_dry_run: 'bool' =None, chat_models: 'bool' =None, cloud_space_environment_templates: 'bool' =None, code_tab: 'bool' =None, collab_screen_sharing: 'bool' =None, concurrent_gpu_limit: 'bool' =None, cost_attribution_settings: 'bool' =None, custom_app_domain: 'bool' =None, custom_instance_types: 'bool' =None, datasets: 'bool' =None, default_one_cluster: 'bool' =None, deployment_alerts: 'bool' =None, deployment_persistent_disk: 'bool' =None, dgx_cloud: 'bool' =None, doc_helper_chat: 'bool' =None, docs_agent: 'bool' =None, drive_v2: 'bool' =None, enable_storage_limits: 'bool' =None, enterprise_compute_admin: 'bool' =None, fair_share: 'bool' =None, featured_studios_admin: 'bool' =None, filestore: 'bool' =None, gcp_local_disk_binding: 'bool' =None, inactive_notify_delete: 'bool' =None, instant_capacity_reservation: 'bool' =None, job_artifacts_v2: 'bool' =None, lambda_labs: 'bool' =None, landing_studios: 'bool' =None, lit_logger: 'bool' =None, marketplace: 'bool' =None, mmt_fault_tolerance: 'bool' =None, mmt_strategy_selector: 'bool' =None, multicloud_saas: 'bool' =None, multiple_studio_versions: 'bool' =None, nerf_fs_nonpaying: 'bool' =None, org_admin_alerts: 'bool' =None, org_level_member_permissions: 'bool' =None, org_usage_limits: 'bool' =None, pipelines: 'bool' =None, plugin_distributed: 'bool' =None, plugin_inference: 'bool' =None, plugin_label_studio: 'bool' =None, plugin_langflow: 'bool' =None, plugin_python_profiler: 'bool' =None, plugin_service: 'bool' =None, plugin_sweeps: 'bool' =None, pricing_updates: 'bool' =None, product_generator: 'bool' =None, project_selector: 'bool' =None, publish_pipelines: 'bool' =None, r2_data_connections: 'bool' =None, restartable_jobs: 'bool' =None, runnable_public_studio_page: 'bool' =None, security_docs: 'bool' =None, show_dev_admin: 'bool' =None, single_wallet: 'bool' =None, slurm: 'bool' =None, slurm_machine_selector: 'bool' =None, stop_ide_container_on_shutdown: 'bool' =None, studio_config: 'bool' =None, studio_deployment: 'bool' =None, studio_on_stop: 'bool' =None, studio_version_visibility: 'bool' =None, studios_dashboard: 'bool' =None, studios_dashboard_system_metrics: 'bool' =None, teamspace_storage_tab: 'bool' =None, trainium2: 'bool' =None, use_rclone_mounts_only: 'bool' =None, voltage_park: 'bool' =None, vultr: 'bool' =None, weka: 'bool' =None): # noqa: E501
208
212
  """V1UserFeatures - a model defined in Swagger""" # noqa: E501
209
213
  self._affiliate_links = None
210
214
  self._agents_v2 = None
@@ -250,6 +254,7 @@ class V1UserFeatures(object):
250
254
  self._mmt_strategy_selector = None
251
255
  self._multicloud_saas = None
252
256
  self._multiple_studio_versions = None
257
+ self._nerf_fs_nonpaying = None
253
258
  self._org_admin_alerts = None
254
259
  self._org_level_member_permissions = None
255
260
  self._org_usage_limits = None
@@ -275,6 +280,7 @@ class V1UserFeatures(object):
275
280
  self._slurm_machine_selector = None
276
281
  self._stop_ide_container_on_shutdown = None
277
282
  self._studio_config = None
283
+ self._studio_deployment = None
278
284
  self._studio_on_stop = None
279
285
  self._studio_version_visibility = None
280
286
  self._studios_dashboard = None
@@ -374,6 +380,8 @@ class V1UserFeatures(object):
374
380
  self.multicloud_saas = multicloud_saas
375
381
  if multiple_studio_versions is not None:
376
382
  self.multiple_studio_versions = multiple_studio_versions
383
+ if nerf_fs_nonpaying is not None:
384
+ self.nerf_fs_nonpaying = nerf_fs_nonpaying
377
385
  if org_admin_alerts is not None:
378
386
  self.org_admin_alerts = org_admin_alerts
379
387
  if org_level_member_permissions is not None:
@@ -424,6 +432,8 @@ class V1UserFeatures(object):
424
432
  self.stop_ide_container_on_shutdown = stop_ide_container_on_shutdown
425
433
  if studio_config is not None:
426
434
  self.studio_config = studio_config
435
+ if studio_deployment is not None:
436
+ self.studio_deployment = studio_deployment
427
437
  if studio_on_stop is not None:
428
438
  self.studio_on_stop = studio_on_stop
429
439
  if studio_version_visibility is not None:
@@ -1369,6 +1379,27 @@ class V1UserFeatures(object):
1369
1379
 
1370
1380
  self._multiple_studio_versions = multiple_studio_versions
1371
1381
 
1382
+ @property
1383
+ def nerf_fs_nonpaying(self) -> 'bool':
1384
+ """Gets the nerf_fs_nonpaying of this V1UserFeatures. # noqa: E501
1385
+
1386
+
1387
+ :return: The nerf_fs_nonpaying of this V1UserFeatures. # noqa: E501
1388
+ :rtype: bool
1389
+ """
1390
+ return self._nerf_fs_nonpaying
1391
+
1392
+ @nerf_fs_nonpaying.setter
1393
+ def nerf_fs_nonpaying(self, nerf_fs_nonpaying: 'bool'):
1394
+ """Sets the nerf_fs_nonpaying of this V1UserFeatures.
1395
+
1396
+
1397
+ :param nerf_fs_nonpaying: The nerf_fs_nonpaying of this V1UserFeatures. # noqa: E501
1398
+ :type: bool
1399
+ """
1400
+
1401
+ self._nerf_fs_nonpaying = nerf_fs_nonpaying
1402
+
1372
1403
  @property
1373
1404
  def org_admin_alerts(self) -> 'bool':
1374
1405
  """Gets the org_admin_alerts of this V1UserFeatures. # noqa: E501
@@ -1894,6 +1925,27 @@ class V1UserFeatures(object):
1894
1925
 
1895
1926
  self._studio_config = studio_config
1896
1927
 
1928
+ @property
1929
+ def studio_deployment(self) -> 'bool':
1930
+ """Gets the studio_deployment of this V1UserFeatures. # noqa: E501
1931
+
1932
+
1933
+ :return: The studio_deployment of this V1UserFeatures. # noqa: E501
1934
+ :rtype: bool
1935
+ """
1936
+ return self._studio_deployment
1937
+
1938
+ @studio_deployment.setter
1939
+ def studio_deployment(self, studio_deployment: 'bool'):
1940
+ """Sets the studio_deployment of this V1UserFeatures.
1941
+
1942
+
1943
+ :param studio_deployment: The studio_deployment of this V1UserFeatures. # noqa: E501
1944
+ :type: bool
1945
+ """
1946
+
1947
+ self._studio_deployment = studio_deployment
1948
+
1897
1949
  @property
1898
1950
  def studio_on_stop(self) -> 'bool':
1899
1951
  """Gets the studio_on_stop of this V1UserFeatures. # noqa: E501
lightning_sdk/llm/llm.py CHANGED
@@ -1,41 +1,64 @@
1
- from typing import Dict, List, Optional, Set, Tuple
1
+ from typing import Dict, List, Optional, Set, Tuple, Union
2
2
 
3
+ from lightning_sdk.api import UserApi
3
4
  from lightning_sdk.api.llm_api import LLMApi
5
+ from lightning_sdk.lightning_cloud.login import Auth
4
6
  from lightning_sdk.lightning_cloud.openapi import V1Assistant
7
+ from lightning_sdk.lightning_cloud.openapi.rest import ApiException
8
+ from lightning_sdk.organization import Organization
9
+ from lightning_sdk.user import User
10
+ from lightning_sdk.utils.resolve import _resolve_org, _resolve_user
5
11
 
6
12
 
7
13
  class LLM:
8
- def __init__(self, name: str) -> None:
14
+ def __init__(
15
+ self,
16
+ name: str,
17
+ user: Union[str, "User", None] = None,
18
+ org: Union[str, "Organization", None] = None,
19
+ ) -> None:
20
+ self._auth = Auth()
21
+ self._user = None
22
+
23
+ try:
24
+ self._auth.authenticate()
25
+ self._user = User(name=UserApi()._get_user_by_id(self._auth.user_id).username)
26
+ except ConnectionError as e:
27
+ raise e
28
+
29
+ self._name = name
30
+ try:
31
+ self._user = _resolve_user(self._user or user)
32
+ except ValueError:
33
+ self._user = None
34
+
9
35
  self._name = name
10
36
  self._org, self._model_name = self._parse_model_name(name)
37
+ try:
38
+ # check if it is a org model
39
+ self._org = _resolve_org(self._org or org)
40
+ except ApiException:
41
+ self._org = None
42
+
11
43
  self._llm_api = LLMApi()
12
- self._models = self._build_model_lookup(self._llm_api.list_models())
13
- self._model_exists()
14
- self._public_models = self._build_public_model_lookup(self._get_public_models())
44
+ self._public_models = self._build_model_lookup(self._get_public_models())
45
+ self._org_models = self._build_model_lookup(self._get_org_models())
46
+ self._user_models = self._build_model_lookup(self._get_user_models())
15
47
  self._model = self._get_model()
48
+ self._conversations = {}
16
49
 
17
50
  def _parse_model_name(self, name: str) -> Tuple[str, str]:
18
51
  parts = name.split("/")
19
- if len(parts) != 2:
20
- raise ValueError(f"Model name must be in the format `organization/model_name`, but got '{name}'.")
21
- return parts[0], parts[1]
52
+ if len(parts) == 1:
53
+ # a user model or a org model
54
+ return None, parts[0]
55
+ if len(parts) == 2:
56
+ return parts[0], parts[1]
57
+ raise ValueError(
58
+ f"Model name must be in the format `organization/model_name` or `model_name`, but got '{name}'."
59
+ )
22
60
 
23
61
  def _build_model_lookup(self, endpoints: List[str]) -> Dict[str, Set[str]]:
24
- return {endpoint.id: {model.name for model in endpoint.models_metadata} for endpoint in endpoints}
25
-
26
- def _model_exists(self) -> bool:
27
- if self._org not in self._models:
28
- raise ValueError(
29
- f"Model provider {self._org} not found. Available models providers: {list(self._models.keys())}"
30
- )
31
-
32
- if self._model_name not in self._models[self._org]:
33
- raise ValueError(
34
- f"Model {self._model_name} not found. Available models by {self._org}: {self._models[self._org]}"
35
- )
36
- return True
37
-
38
- def _build_public_model_lookup(self, endpoints: List[str]) -> Dict[str, Set[str]]:
39
62
  result = {}
40
63
  for endpoint in endpoints:
41
64
  result.setdefault(endpoint.model, []).append(endpoint)
@@ -44,13 +67,52 @@ class LLM:
44
67
  def _get_public_models(self) -> List[str]:
45
68
  return self._llm_api.get_public_models()
46
69
 
47
- def _get_model(self, public_model: bool = True) -> V1Assistant:
48
- # TODO figure out how to identify if model is public or not
49
- if not public_model:
50
- raise NotImplementedError("Non-public models are not supported yet.")
70
+ def _get_org_models(self) -> List[str]:
71
+ return self._llm_api.get_org_models(self._org.id) if self._org else []
72
+
73
+ def _get_user_models(self) -> List[str]:
74
+ return self._llm_api.get_user_models(self._user.id) if self._user else []
75
+
76
+ def _get_model(self) -> V1Assistant:
51
77
  # TODO how to handle multiple models with same model type? For now, just use the first one
52
- return self._public_models.get(self._model_name)[0]
78
+ if self._model_name in self._public_models:
79
+ return self._public_models.get(self._model_name)[0]
80
+ if self._model_name in self._org_models:
81
+ return self._org_models.get(self._model_name)[0]
82
+ if self._model_name in self._user_models:
83
+ return self._user_models.get(self._model_name)[0]
84
+
85
+ available_models = []
86
+ if self._public_models:
87
+ available_models.append(f"Public Models: {', '.join(self._public_models.keys())}")
88
+
89
+ if self._org and self._org_models:
90
+ available_models.append(f"Org ({self._org.name}) Models: {', '.join(self._org_models.keys())}")
53
91
 
54
- def chat(self, prompt: str, system_prompt: Optional[str] = None) -> str:
55
- output = self._llm_api.start_conversation(prompt, system_prompt, self._model.id)
92
+ if self._user and self._user_models:
93
+ available_models.append(f"User ({self._user.name}) Models: {', '.join(self._user_models.keys())}")
94
+
95
+ available_models_str = "\n".join(available_models)
96
+ raise ValueError(f"Model '{self._model_name}' not found. \nAvailable models: \n{available_models_str}")
97
+
98
+ def chat(
99
+ self,
100
+ prompt: str,
101
+ system_prompt: Optional[str] = None,
102
+ max_completion_tokens: Optional[int] = 500,
103
+ conversation: Optional[str] = None,
104
+ ) -> str:
105
+ conversation_id = self._conversations.get(conversation) if conversation else None
106
+ output = self._llm_api.start_conversation(
107
+ prompt=prompt,
108
+ system_prompt=system_prompt,
109
+ max_completion_tokens=max_completion_tokens,
110
+ assistant_id=self._model.id,
111
+ conversation_id=conversation_id,
112
+ )
113
+ if conversation and not conversation_id:
114
+ self._conversations[conversation] = output.conversation_id
56
115
  return output.choices[0].delta.content
116
+
117
+ def list_conversations(self) -> List[Dict]:
118
+ return list(self._conversations.keys())
lightning_sdk/plugin.py CHANGED
@@ -395,6 +395,25 @@ class SlurmJobsPlugin(_Plugin):
395
395
  return resp
396
396
 
397
397
 
398
+ class CustomPortPlugin(_Plugin):
399
+ """Plugin handling the port of a given service."""
400
+
401
+ _plugin_run_name = "Custom Port"
402
+ _slug_name = "custom-port"
403
+
404
+ def run(self, name: Optional[str] = None, port: int = 8000) -> str:
405
+ """Starts a new port to the given Studio."""
406
+ if name is None:
407
+ name = _run_name("port")
408
+
409
+ return self._studio._studio_api.start_new_port(
410
+ teamspace_id=self._studio._teamspace.id,
411
+ studio_id=self._studio._studio.id,
412
+ name=name,
413
+ port=port,
414
+ )
415
+
416
+
398
417
  @runtime_checkable
399
418
  class _RunnablePlugin(Protocol):
400
419
  _plugin_run_name: str
lightning_sdk/studio.py CHANGED
@@ -1,7 +1,10 @@
1
+ import glob
1
2
  import os
2
3
  import warnings
3
4
  from typing import TYPE_CHECKING, Any, Dict, Mapping, Optional, Tuple, Union
4
5
 
6
+ from tqdm.auto import tqdm
7
+
5
8
  from lightning_sdk.api.studio_api import StudioApi
6
9
  from lightning_sdk.api.utils import _machine_to_compute_name
7
10
  from lightning_sdk.constants import _LIGHTNING_DEBUG
@@ -265,6 +268,34 @@ class Studio:
265
268
  progress_bar=progress_bar,
266
269
  )
267
270
 
271
+ def upload_folder(self, folder_path: str, remote_path: Optional[str] = None, progress_bar: bool = True) -> None:
272
+ """Uploads a given folder to a remote path on the Studio."""
273
+ if folder_path is None:
274
+ raise ValueError("Cannot upload a folder that is None.")
275
+ folder_path = os.path.normpath(folder_path)
276
+ if os.path.isfile(folder_path):
277
+ raise NotADirectoryError(f"Cannot upload a file as a folder. '{folder_path}' is a file.")
278
+ if not os.path.exists(folder_path):
279
+ raise NotADirectoryError(f"Cannot upload a folder that does not exist. '{folder_path}' is not a directory.")
280
+ all_files = []
281
+ for fp in glob.glob(os.path.join(folder_path, "**"), recursive=True):
282
+ if not os.path.isfile(fp):
283
+ continue
284
+ rel_path = os.path.relpath(fp, folder_path)
285
+ remote_file = os.path.join(remote_path, rel_path) if remote_path else rel_path
286
+ all_files.append((fp, remote_file))
287
+
288
+ if progress_bar:
289
+ progress_bar = tqdm(total=len(all_files), desc="Uploading files", unit="file")
290
+ for local_file, remote_path in sorted(all_files, key=lambda p: p[1]):
291
+ if progress_bar:
292
+ progress_bar.set_description(f"Uploading {local_file}")
293
+ self.upload_file(local_file, remote_path=remote_path, progress_bar=False)
294
+ if progress_bar:
295
+ progress_bar.update(1)
296
+ if progress_bar:
297
+ progress_bar.close()
298
+
268
299
  def download_file(self, remote_path: str, file_path: Optional[str] = None) -> None:
269
300
  """Downloads a file from the Studio to a given target path."""
270
301
  if file_path is None:
@@ -445,6 +476,7 @@ class Studio:
445
476
  def _add_plugin(self, plugin_name: str) -> None:
446
477
  """Adds the just installed plugin to the internal list of plugins."""
447
478
  from lightning_sdk.plugin import (
479
+ CustomPortPlugin,
448
480
  InferenceServerPlugin,
449
481
  JobsPlugin,
450
482
  MultiMachineTrainingPlugin,
@@ -458,6 +490,7 @@ class Studio:
458
490
  "jobs": JobsPlugin,
459
491
  "multi-machine-training": MultiMachineTrainingPlugin,
460
492
  "inference-server": InferenceServerPlugin,
493
+ "custom-port": CustomPortPlugin,
461
494
  }.get(plugin_name, Plugin)
462
495
 
463
496
  description = self._list_installed_plugins()[plugin_name]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lightning_sdk
3
- Version: 0.2.12
3
+ Version: 0.2.13
4
4
  Summary: SDK to develop using Lightning AI Studios
5
5
  Author-email: Lightning-AI <justus@lightning.ai>
6
6
  License: MIT License
@@ -1,5 +1,5 @@
1
1
  docs/source/conf.py,sha256=r8yX20eC-4mHhMTd0SbQb5TlSWHhO6wnJ0VJ_FBFpag,13249
2
- lightning_sdk/__init__.py,sha256=mqv_YOYNQIkOBETZSFpZolbKquQ-7wrOBtGRLnP1In4,1105
2
+ lightning_sdk/__init__.py,sha256=JvA56wHJ6zj6udKxn_l-gvmB-UR22UVw-vr3KzUtE2w,1105
3
3
  lightning_sdk/agents.py,sha256=ly6Ma1j0ZgGPFyvPvMN28JWiB9dATIstFa5XM8pMi6I,1577
4
4
  lightning_sdk/ai_hub.py,sha256=iI1vNhgcz_Ff1c3rN1ogN7dK-r-HXRj6NMtS2cA14UA,6925
5
5
  lightning_sdk/constants.py,sha256=ztl1PTUBULnqTf3DyKUSJaV_O20hNtUYT6XvAYIrmIk,749
@@ -9,10 +9,10 @@ lightning_sdk/machine.py,sha256=EMr-ulyYEYhIkKFnGBOofnFf4asndTSeoOQxlyd3xW4,3632
9
9
  lightning_sdk/models.py,sha256=tPFiiDQiDsFhfStcVPH5_PcujbBEfKS2IB5FS9NfwZk,7838
10
10
  lightning_sdk/organization.py,sha256=WCfzdgjtvY1_A07DnxOpp74V2JR2gQwtXbIEcFDnoVU,1232
11
11
  lightning_sdk/owner.py,sha256=t5svD2it4C9pbSpVuG9WJL46CYi37JXNziwnXxhiU5U,1361
12
- lightning_sdk/plugin.py,sha256=_K0m-PSyXE86B-SFQVQm0JEvfdIVXeARmnlATCAiMdo,14632
12
+ lightning_sdk/plugin.py,sha256=f3P5-xZY6x-MX0Fs2z_Q2erSxPSiHZARO0BVkCezHw4,15192
13
13
  lightning_sdk/serve.py,sha256=hxNAAbrhm483NxXbbHiXHtSUmvkuAe70wUHyAAK414Q,11654
14
14
  lightning_sdk/status.py,sha256=lLGAuSvXBoXQFEEsEYwdCi0RcSNatUn5OPjJVjDtoM0,386
15
- lightning_sdk/studio.py,sha256=hyvAiVhkETAtbu0RRF1Aw6F8Y__E1SSAmsB8PHfmqHo,19935
15
+ lightning_sdk/studio.py,sha256=vIDUG4uzE_t0oq2MXJ5vBKi1NGzxbWJ1Sf1UBerIn1g,21565
16
16
  lightning_sdk/teamspace.py,sha256=GL0fiZ7oz3Uz1qftDmSFZScpuUm3H4kBcm4abv06xLM,16533
17
17
  lightning_sdk/user.py,sha256=vdn8pZqkAZO0-LoRsBdg0TckRKtd_H3QF4gpiZcl4iY,1130
18
18
  lightning_sdk/api/__init__.py,sha256=Qn2VVRvir_gO7w4yxGLkZY-R3T7kdiTPKgQ57BhIA9k,413
@@ -22,11 +22,11 @@ lightning_sdk/api/cluster_api.py,sha256=OxAhEdNt-9bYQ-u3MCADdVGsilXf2e7Wcxvb73Cm
22
22
  lightning_sdk/api/deployment_api.py,sha256=8ZH2q08oc2jnPlPEBwZXmtv4DyHRZ9BnK1FxR_EztMA,24013
23
23
  lightning_sdk/api/job_api.py,sha256=_mMAI_BG_48i-BLwCP_U72zgmM5zYa2KUZ7u66HWkIc,13568
24
24
  lightning_sdk/api/lit_container_api.py,sha256=jCJVwd-3MNjejL9FyvH89pzt-SeG3G8qCJD16iTMJAQ,11454
25
- lightning_sdk/api/llm_api.py,sha256=eQ9Jh_fq8j95aVM1yhdfeV9LR1ighzRiX_b-Tb7sGe0,1204
25
+ lightning_sdk/api/llm_api.py,sha256=SzDwMluWIOLV-UIhD8ouQMYMUq91QidVJ9-DzTacNCE,1644
26
26
  lightning_sdk/api/mmt_api.py,sha256=-v7ATab-ThAM-HRClS92Ehxuu9MlBfdKWWFCGvVUHiM,8962
27
27
  lightning_sdk/api/org_api.py,sha256=Ze3z_ATVrukobujV5YdC42DKj45Vuwl7X52q_Vr-o3U,803
28
28
  lightning_sdk/api/pipeline_api.py,sha256=P5P9C6qOpyBGU0t5N68h1LuFAsAKmPPgkac6uObrYKw,1676
29
- lightning_sdk/api/studio_api.py,sha256=BqmGmotUJrM-RoMfwYSdymAir491tBkPsIlvdJqOoUw,25858
29
+ lightning_sdk/api/studio_api.py,sha256=HAJrkd7u5m1PP5XoXakF_EsvdF9_atkJSBlHuy24_YU,26605
30
30
  lightning_sdk/api/teamspace_api.py,sha256=syN_FK8nHhLl3FG9Oxe8L6aK5YbOMn_GQlkijhTRJA8,13147
31
31
  lightning_sdk/api/user_api.py,sha256=sL7RIjjtmZmvCZWx7BBZslhj1BeNh4Idn-RVcdmf7M0,2598
32
32
  lightning_sdk/api/utils.py,sha256=3KvVmucfrUIPV0HC0y5DHhWB0b3D5tvLFXSrDU6XjcI,23833
@@ -38,9 +38,9 @@ lightning_sdk/cli/configure.py,sha256=B84BtYU0ccKvc1qfK1kqn7sbnHaKW_5Po54k-m7lKH
38
38
  lightning_sdk/cli/connect.py,sha256=qsKb_NMvaA4xrESjMEApM5lyfuHJApe3eCeeI8ttrmQ,975
39
39
  lightning_sdk/cli/create.py,sha256=L7QSeiiP_YjjtaAm76EmNGBw--1f6vPMveTrjcjMDp0,2820
40
40
  lightning_sdk/cli/delete.py,sha256=EIaLB_iCw435xiBDQyd2OuMyCSj86oVdsj8C9btI1us,3871
41
- lightning_sdk/cli/docker.py,sha256=EozLC4qnvHhgukmnu35itfI5n7v-abCpwKPkPy3eOV4,997
41
+ lightning_sdk/cli/docker_cli.py,sha256=EozLC4qnvHhgukmnu35itfI5n7v-abCpwKPkPy3eOV4,997
42
42
  lightning_sdk/cli/download.py,sha256=ZuqGouAWmao8RIm7cQvshpFoEGSLWOBo5inrZFREvpY,7601
43
- lightning_sdk/cli/entrypoint.py,sha256=Z-dAwjPbss_LO9NX1liNvpAIdDLxemGB7wfzqjIjwhk,2675
43
+ lightning_sdk/cli/entrypoint.py,sha256=meb97tbey_FMJqhw60o9ZKx_U4c8nHVg82G55xMtA7U,2679
44
44
  lightning_sdk/cli/exceptions.py,sha256=QUF3OMAMZwBikvlusimSHSBjb6ywvHpfAumJBEaodSw,169
45
45
  lightning_sdk/cli/generate.py,sha256=8mjm5tMYIXMoN2X_eEKpwBIUcCWaARiQAmreh-9LIBg,1575
46
46
  lightning_sdk/cli/inspect.py,sha256=GA3XDC3DSkqJ4B5NQR9qmGGvkP0K8Sk90xZhzTGzC1o,1614
@@ -50,7 +50,7 @@ lightning_sdk/cli/list.py,sha256=bH_rX9J_Ubb9dkF2fpoZf0zMXH9YoEjcm63gk5v0zs4,109
50
50
  lightning_sdk/cli/mmts_menu.py,sha256=HUXo3ZoZ3fWOCNWTQWoJgUlFXYq5uVm_6uFjAq7BDe8,2219
51
51
  lightning_sdk/cli/open.py,sha256=sgMLWBnkXdIq8H9XK_rph2bye3b07AKTJBQIk9fCGVc,1937
52
52
  lightning_sdk/cli/run.py,sha256=8JZiDrKwDhlaTOJd6qq2mCWJRqKm6shCWLzpbmFYIkE,13929
53
- lightning_sdk/cli/serve.py,sha256=AR3WUefQViyRs335an_OFuaPRLPI-d9RlBTL9EcM4VI,20724
53
+ lightning_sdk/cli/serve.py,sha256=R2-uefXM6Ijdt8qsjdy4x_txGeqecUZc0E6s2uj-GG0,25344
54
54
  lightning_sdk/cli/start.py,sha256=jUk52lkEFC_fqiEPkwM8GwE68WMNEtzBuzjkvr3POd0,1840
55
55
  lightning_sdk/cli/stop.py,sha256=5nCrUe1BONpX1nKNhbSFqLaXXKaRhSO7PvM1BVYLgn4,2864
56
56
  lightning_sdk/cli/studios_menu.py,sha256=TA9rO6_fFHGMz0Nt4rJ6iV80X5pZE4xShrSiyXoU-oQ,4129
@@ -58,7 +58,7 @@ lightning_sdk/cli/switch.py,sha256=qLvDoQRldCNgO1XvIGg-i-GyqnkHVb_U1-X4svqeNNU,1
58
58
  lightning_sdk/cli/teamspace_menu.py,sha256=C3g3spTKgtMwoK7pnooy0MBPz4AKhFjcObkvZyZ4v04,3797
59
59
  lightning_sdk/cli/upload.py,sha256=jQbWVlwxsDp3YnFtZTXFeK_PqDssNpyFzL8wV3NkWk8,13849
60
60
  lightning_sdk/deployment/__init__.py,sha256=dXsa4psDzFYFklsq3JC-2V_L4FQjGZnQAf-ZiVlqG9c,545
61
- lightning_sdk/deployment/deployment.py,sha256=5CR1YWYhOYy3CYDEWd2EMJqRchR10p8kNKrpXYPMetU,20065
61
+ lightning_sdk/deployment/deployment.py,sha256=ikf3hXWnNARzGchMWdboJpt0jKSwfLf8LSwLPo8tbNE,20029
62
62
  lightning_sdk/job/__init__.py,sha256=1MxjQ6rHkyUHCypSW9RuXuVMVH11WiqhIXcU2LCFMwE,64
63
63
  lightning_sdk/job/base.py,sha256=TS5KavtfBAFbLbNqqumEizY9edjO1joSmtUdcO5CThQ,17748
64
64
  lightning_sdk/job/job.py,sha256=1Xf0ne4wwXpkb_GJgWD8mfueJZoKR8G4lC5T6OXijlw,13075
@@ -72,11 +72,11 @@ lightning_sdk/lightning_cloud/login.py,sha256=02f3itTEMJ4wKpVxOfAAfWfigVeX8G51eg
72
72
  lightning_sdk/lightning_cloud/rest_client.py,sha256=UZoHDJQ0qUu7LMGgaecBsAHzT3-auCcvSx18hQcN89E,6767
73
73
  lightning_sdk/lightning_cloud/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  lightning_sdk/lightning_cloud/cli/__main__.py,sha256=aHrigVV0qIp74MuYTdN6uO8a9Xp6E1aOwdR8w1fG-7c,688
75
- lightning_sdk/lightning_cloud/openapi/__init__.py,sha256=FI0oqK6Qff-mglTazEzH-olE_6Wt6joxcFb_QvwKkl4,100674
75
+ lightning_sdk/lightning_cloud/openapi/__init__.py,sha256=GfqeBOo_WzcN9NWa3PaKMMUZq9xOhNfvL1Ozbk3357Y,101331
76
76
  lightning_sdk/lightning_cloud/openapi/api_client.py,sha256=pUTQMNcZmH4BhpnuAXuT7wnegaxaX26bzdEWjdoLeTo,25630
77
77
  lightning_sdk/lightning_cloud/openapi/configuration.py,sha256=H4PTkRz1QAonxKHbx3LG-gDEtdQPAxMO-bVfMfbUfJg,8306
78
78
  lightning_sdk/lightning_cloud/openapi/rest.py,sha256=ZPPr6ZkBp6LtuAsiUU7D8Pz8Dt9ECbEM_26Ov74tdpw,13322
79
- lightning_sdk/lightning_cloud/openapi/api/__init__.py,sha256=_C00TAcO-QxqntW0MDh1y_LcEWuuHGIRKjCZAtNsnd4,3736
79
+ lightning_sdk/lightning_cloud/openapi/api/__init__.py,sha256=vH3Zjdq-AeY4zf1nQ2B6v7bpHVbpSc4Ju0TUlNoi7ws,3843
80
80
  lightning_sdk/lightning_cloud/openapi/api/agent_service_api.py,sha256=Va0QcK6cO3rgHxV16xI-fnq08mgZe_eFQl8mgyaZols,56603
81
81
  lightning_sdk/lightning_cloud/openapi/api/analytics_service_api.py,sha256=0BccCXj-fpDmrWImCQzPlHz7T8Hrw-vuwPCY-ieWt8Q,5263
82
82
  lightning_sdk/lightning_cloud/openapi/api/assistants_service_api.py,sha256=EUu77mGdZps3DvQ7eFefhzh7oNZCddrA3-XbrjcLv_E,92801
@@ -91,7 +91,8 @@ lightning_sdk/lightning_cloud/openapi/api/deployment_templates_service_api.py,sh
91
91
  lightning_sdk/lightning_cloud/openapi/api/endpoint_service_api.py,sha256=IgERziSMhxLxK5ATpsNpNs5Ybpu577mCH7f6yBCr7uw,113191
92
92
  lightning_sdk/lightning_cloud/openapi/api/experiments_service_api.py,sha256=lYQt6nvbaqFnRsWFf-jL3Fou-A7Hx6qgrpRgHI3eARQ,9844
93
93
  lightning_sdk/lightning_cloud/openapi/api/file_system_service_api.py,sha256=IRAf6X1wvhcW3dilmjedPGhKklIGUj3DP6HyQ5QS5WI,34592
94
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py,sha256=mIM2HGwznPaOUdEnDjmvyiZcJbWrRP5jQ9q6HjzZldk,195179
94
+ lightning_sdk/lightning_cloud/openapi/api/git_credentials_service_api.py,sha256=tz7xhdaeHoR9_KEx8vR0SyFLUsjElrcwl9hBaT_X_mc,19757
95
+ lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py,sha256=ZoVVqr7Ek3M0TBvoDwhjP12IOxDLeYBj-vjMswDvI_s,195736
95
96
  lightning_sdk/lightning_cloud/openapi/api/lightningapp_instance_service_api.py,sha256=Y9_XweSozZL_a8qCZTOgqW9cwIOx7FTMMU-ZX0eAJqs,77205
96
97
  lightning_sdk/lightning_cloud/openapi/api/lightningapp_v2_service_api.py,sha256=hORPARfDsJLtJOgieRzI_OWKMF9wEhET141vl6FPEBs,12909
97
98
  lightning_sdk/lightning_cloud/openapi/api/lightningwork_service_api.py,sha256=dXKzbr4I7TDW-PFsqgiaaw4RtYrzB1X6NZB_hxgMnts,43747
@@ -114,7 +115,7 @@ lightning_sdk/lightning_cloud/openapi/api/ssh_public_key_service_api.py,sha256=z
114
115
  lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py,sha256=U5atWnTx33jVy5BF1R3yAKZfxmOWyzdG14W8ZRjUhAw,65552
115
116
  lightning_sdk/lightning_cloud/openapi/api/studio_jobs_service_api.py,sha256=VJ7VcSvdmGbPkgmQZhaOSR47olcNPMzRlmT5J5uKsng,27877
116
117
  lightning_sdk/lightning_cloud/openapi/api/user_service_api.py,sha256=MR0jvZY0I-fFEPNpcSqrN3vl9XjrEn_D7_gYhwYeMrc,66796
117
- lightning_sdk/lightning_cloud/openapi/models/__init__.py,sha256=aDq2nEL74kYGjgeLCzxHAiWS4ajOco5cvqBIjjaDuE0,95173
118
+ lightning_sdk/lightning_cloud/openapi/models/__init__.py,sha256=3Ph1jbZ5FCazPgMRWo2aSONfMqCWLBN3Sx3l30sRW4Y,95723
118
119
  lightning_sdk/lightning_cloud/openapi/models/affiliatelinks_id_body.py,sha256=X087AkCafKp2g8E2MR5ghU3pxCNNcoehZJttvuVfdC8,4274
119
120
  lightning_sdk/lightning_cloud/openapi/models/agentmanagedendpoints_id_body.py,sha256=NzKKkTs2PtMSIJJYxeh3aDBj-djBrI_qATGz7n5Oqdk,9234
120
121
  lightning_sdk/lightning_cloud/openapi/models/agents_id_body.py,sha256=vYRXPGrwpj8nsSVwlaf3c6d5ysuvpNOXrfeUOKZn0dM,21508
@@ -153,7 +154,7 @@ lightning_sdk/lightning_cloud/openapi/models/data_connection_mount_data_connecti
153
154
  lightning_sdk/lightning_cloud/openapi/models/dataset_id_versions_body.py,sha256=hZLk1R65CrOxUvth_ve7Ae9py6pxyBCWQ5giaGjp13c,4467
154
155
  lightning_sdk/lightning_cloud/openapi/models/dataset_id_visibility_body.py,sha256=NQXzoa55Sc4JuEh_go4OkCy74c-ApW40yEcC5IJnD5U,4614
155
156
  lightning_sdk/lightning_cloud/openapi/models/datasets_id_body.py,sha256=OcNzTWEbLGF36eY-yImNCmTwY4ZMX2P8yPuHAvc6KSk,5533
156
- lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py,sha256=oQjOwtz_NVL9r4Yrbq9hXQt2jSFdLhqmwHsGrM_z9Gc,21445
157
+ lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py,sha256=XEMhwlLto_pKI3CnPWKrzTTjPwUWhf56LWIfov6hHqo,22329
157
158
  lightning_sdk/lightning_cloud/openapi/models/deploymenttemplates_id_body.py,sha256=Q-5xLj7_Rt6xt5uPLGzeyQCLiwd98PpaNrY5fMr0Dog,15829
158
159
  lightning_sdk/lightning_cloud/openapi/models/endpoints_id_body.py,sha256=-Nv94Q8XoAT3tfYVhcjutpihfoNS2b2STbTHJr1gomo,12309
159
160
  lightning_sdk/lightning_cloud/openapi/models/experiment_name_variant_name_body.py,sha256=f-pBOnWAd03BreivwAA0D1P1wEBGq2jaC1nK-GtGxVA,3910
@@ -346,7 +347,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_state.py,sha256=yLpc
346
347
  lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_version.py,sha256=ZQSAgV4qEeByenlyFqX_kZBy51_yVPVqNGhrCUvZ3_g,20082
347
348
  lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_version_publication.py,sha256=n1oHRq_UjYSP_kY2lmMjtqhHUu0H-wHQ5XiDJUEvB6s,6386
348
349
  lightning_sdk/lightning_cloud/openapi/models/v1_cloudflare_v1.py,sha256=-t3nXyqIn0VnqTRFlFuN3aUnPJRqtRH4gjaPylWwRXk,6869
349
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py,sha256=P2yCFvhlqNP8W5eFLzqGXvEpBm4PJxS6K_JF1FdXzHk,44394
350
+ lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py,sha256=UZqx7u-6dtbETKJ1huh5qmhPizvvSoD-7dQJ5UajQZ4,45251
350
351
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_availability.py,sha256=WrS0UpcTqqCu79ny5yOBJ16RNs5B4AQSXbniWE7iez0,7103
351
352
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py,sha256=vpwujOiKIrB1PKg7nzCFs7rvi3wL_Q1OBV5KyTTDNG0,15208
352
353
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_deletion_options.py,sha256=GyhAXDpVtfXfaUybBE0aRRvJ6d3DfD7VV3xH_fgQOlE,4859
@@ -354,8 +355,8 @@ lightning_sdk/lightning_cloud/openapi/models/v1_cluster_encryption_key.py,sha256
354
355
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_names.py,sha256=Xs3mhVEiuJVbkKwMarY7iB_NwKY9_sK0xGgXDMuo0cs,3637
355
356
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_proxy.py,sha256=4LbHvINs2CwQnuPg_uWw03GNNRT_wdqX42m_Zlqg2dY,5547
356
357
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_resource_tag.py,sha256=U6DfNNAIBZQ8SOF-2RXp2-CgmxaT1XJrNaCnZzaqjHg,4274
357
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py,sha256=nOS_FwQYUPJMYP_nqlhFXIbUiAntBg0TdpSXsiJJCrQ,17429
358
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py,sha256=0Tj3JC-IttCTop-2hxuR6XdC5hIpm80__v3CP1c1i28,24920
358
+ lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py,sha256=REWM1JHmP82lm9gtxjTyd6hm8K36NuVQmQM2K56n1gU,18293
359
+ lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py,sha256=vJh6RJh1SmJ8Bk3SMYfk8PQOgVv-Eym1zym65IiC7B0,27594
359
360
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_state.py,sha256=Mvl3dEhdtb7-rU4wUsR_-YOMpd7wE8uUAyXv3MiOcOk,3331
360
361
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_status.py,sha256=n9NhKdWg51q_7d4VM9Bsk5aakctU-o3R-0YmdzTsMW0,13267
361
362
  lightning_sdk/lightning_cloud/openapi/models/v1_cluster_tagging_options.py,sha256=1HfSu9xll5O67YAQrF02ji21LYlZGP8_Afs0djIcIgU,7490
@@ -397,6 +398,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_create_cluster_request.py,sha256
397
398
  lightning_sdk/lightning_cloud/openapi/models/v1_create_cluster_response.py,sha256=5HIu7Vr1yUyk8jW4zwhYn1vZ4eHlRGhMOH9IPTdCnFc,6532
398
399
  lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_request.py,sha256=rr7sIMsx-_TE7_MNvcjZ7pbbOp4hpC91iZoHSbodKkI,15162
399
400
  lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_template_request.py,sha256=bQDEeax61gx0N0uyhI7k3rbcvMKOICFzF_HjqGvseX4,18031
401
+ lightning_sdk/lightning_cloud/openapi/models/v1_create_git_credentials_request.py,sha256=lsEgWinvsLnFZ9ryw0gOSTvr4xQFHqNpHhXdvJuZ9z0,5467
400
402
  lightning_sdk/lightning_cloud/openapi/models/v1_create_job_request.py,sha256=Slg1avZSx1Xqeg88Car25vxxkqCIQ-z7Z7SfNSaueRU,5773
401
403
  lightning_sdk/lightning_cloud/openapi/models/v1_create_lit_dataset_multi_part_upload_response.py,sha256=fyvEOyxYwipZyExbVIalLgn2XntapZ6uM416AXV3Mek,3950
402
404
  lightning_sdk/lightning_cloud/openapi/models/v1_create_lit_page_request.py,sha256=AsxDH7tFC5HloDF2O0DOA3OzLGyzOzg5mrMVcbLFOxU,8785
@@ -443,6 +445,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_delete_deployment_release_respon
443
445
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_deployment_response.py,sha256=TE1u49hhJ_lPDQn3GZWDCr473IGJn5NWtBgM452L-CU,3046
444
446
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_endpoint_response.py,sha256=x6WcwHMZelRHu44RDAMLipb4GPPPnNOh4Xhoz0Q4crI,3034
445
447
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_file_endpoint_response.py,sha256=yBb8WAHX82Au0VsG9anIgPXo5W44eriEZl3_Snjq2gM,4684
448
+ lightning_sdk/lightning_cloud/openapi/models/v1_delete_git_credentials_response.py,sha256=X3sj8YRjNlhRTHp5XjczBQJ22rMFudmbLzaGKrMhsqg,3070
446
449
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_index_response.py,sha256=jb6auD4hLVGMm-6uZ9cj3dP6D21eY_XB01v-m3HqmTA,3016
447
450
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_job_response.py,sha256=e-nWOBNgJ9vmoGg_spLGzYAUipctVHbUYnaw4p_Uj-8,3004
448
451
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_lightning_run_response.py,sha256=ayTBMGTLLBer_Si1nyCvLLsQUYotRTKU78n6xEPAnss,3058
@@ -481,7 +484,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_delete_studio_job_response.py,sh
481
484
  lightning_sdk/lightning_cloud/openapi/models/v1_delete_user_slurm_job_response.py,sha256=kmy5RJKy63bRzBcWdMk00-vT3m2lVs05cic7jfU1JyQ,3058
482
485
  lightning_sdk/lightning_cloud/openapi/models/v1_dependency_cache_state.py,sha256=VL2MY_XvHWAd8toG-myqZlhuoEwjAIX1cemNSXxqk-k,3210
483
486
  lightning_sdk/lightning_cloud/openapi/models/v1_dependency_file_info.py,sha256=Fyh7eRcxFJ8Y4LHA3uJe_D5F9RhOxT4ChllHph_ryfQ,4571
484
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py,sha256=x4dE2XTNw9FNrwpz9UFHo8eVftIDBgRmYz49o3y38Wk,22216
487
+ lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py,sha256=NjUbic_upyEvDUUsl9nsRUdamgq45o66UFaJ7-Tdb1k,23080
485
488
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_api.py,sha256=hfvtI_8dSwM76baVcMwNC8DOxZlmdixASKW83--83Cg,8434
486
489
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_details.py,sha256=Q-JXOyEw88bVUmTCLmdBJ6txzNI2qsAQQltCOcOg4lg,5127
487
490
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_event.py,sha256=XDpq8DM8sN2UKCIlBWGEk-vzjGQGNoc0KjyRcCzDqZ4,9994
@@ -490,7 +493,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_deployment_metrics.py,sha256=WSs
490
493
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_performance.py,sha256=N-v8pFBVvJIAt0opbygd33R014Xeef3hoO4-ksT2yn4,10336
491
494
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_release.py,sha256=7sFF4w_XHV-bYPUGNRaADx2JInR8gxzPCmJ45NBRVfU,9430
492
495
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_spec.py,sha256=v1p0ryc6KgwRwXSJYjFLe4jzczpOMSiMws3JLjEoxGY,5922
493
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_state.py,sha256=jDfHlwqCyzX2GK_QmlkiBHf5YaQMST7fJqEIRI3tF9c,3248
496
+ lightning_sdk/lightning_cloud/openapi/models/v1_deployment_state.py,sha256=iWgBa7EW5reIRWQNpov0EnygO6sxB5Hy3SXfslezz_o,3334
494
497
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_status.py,sha256=7D9Ux2N5LWmNXxrynoXPThExLD8FAVOzIVtIKLqYQfo,8939
495
498
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_strategy.py,sha256=aewPM7IDeAEEx2HoMySQ2hcIrme2X6UvEENih_kzjl0,4593
496
499
  lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template.py,sha256=292s0GdPjfkC_QJ3UbgvdMALDwy0WDfTwCBuQEzyuqs,23129
@@ -585,6 +588,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_get_user_notification_preference
585
588
  lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py,sha256=4aguhh3Xiv2RK5cvdZmFcOKUo2UOgG_0oEOspfgRWFE,32165
586
589
  lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_breakdown_response.py,sha256=igCbjaeZXEbiPAa9cUjwG4cPUivt-7MiiWYikELHwsw,9983
587
590
  lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_response.py,sha256=0k1scTY1IAeKr3p0r7eV_xWRE7Nx54doTGygiQQPkbM,6879
591
+ lightning_sdk/lightning_cloud/openapi/models/v1_git_credentials.py,sha256=siIFxkpP0VVU53XVSj9ZHB3JWvUr9qOFliSDDx28i-g,6705
588
592
  lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py,sha256=x9LFc6NuL8yleoHmDlDinzNgmeOLwY6ElQs1xeoOTv4,16867
589
593
  lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1_status.py,sha256=Md6rMiUCMY4oDVE2IYaALD_I0o2PQIKF-9628IGmTyY,3791
590
594
  lightning_sdk/lightning_cloud/openapi/models/v1_gpu_system_metrics.py,sha256=io_MkTCTYi6qmYw8KqFZf2zHx8jgBsPKsEwqjr2BG0U,7722
@@ -677,8 +681,9 @@ lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_slurm_jobs_respo
677
681
  lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_snowflake_response.py,sha256=bggwyXLJ1WtQ_w6CgN0ZWqjVhJZizlCfiYdtKO2ILbs,4314
678
682
  lightning_sdk/lightning_cloud/openapi/models/v1_list_gallery_components_response.py,sha256=tLqiz_KmNmiweh8Ib-JGYkm9ZNkMNqkKIgG906i076I,3997
679
683
  lightning_sdk/lightning_cloud/openapi/models/v1_list_gallery_lightningapps_response.py,sha256=aNhF5e26GOGcd0RKb2RSwVWQD46SHE5zxG3DsYdExow,3871
684
+ lightning_sdk/lightning_cloud/openapi/models/v1_list_git_credentials_response.py,sha256=5vCdMRWWLy2eU0bpY7zYPqcY2feXggmSreaYhPxxJac,3975
680
685
  lightning_sdk/lightning_cloud/openapi/models/v1_list_job_files_response.py,sha256=6qBf9aO-mAd8ADTLMrHmRqFqDJ7UmC6SE9Sdspj7qPs,6436
681
- lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py,sha256=o0RGRh0-KoOjGitPRhe7bs1KOm9mJafrZzaA6mlnts8,3897
686
+ lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py,sha256=hRHytYlp1_SMG7brOM8wC5LjUlqET_-vQE3hgSbr6y8,3976
682
687
  lightning_sdk/lightning_cloud/openapi/models/v1_list_jobs_response.py,sha256=OqR_9hF5CkWYe7BZl6H1wV4haGzkTi8jI8YgWsrH_Yw,5435
683
688
  lightning_sdk/lightning_cloud/openapi/models/v1_list_joinable_organizations_response.py,sha256=wr52oD_zhlXxJr8SbYkxeUqpIUaBSeuS5VMhw7fz-Y0,4300
684
689
  lightning_sdk/lightning_cloud/openapi/models/v1_list_lightning_run_response.py,sha256=kcKkI2iD3IzujDoLh-FnzwvZ_syqdz2jlDEYVdR0kLY,3803
@@ -772,6 +777,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_fault_toleranc
772
777
  lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_state.py,sha256=ZLmTHpgo5Gu-aAd6n32RDofqlGY83ERzvOnkr0R8D4I,3479
773
778
  lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_status.py,sha256=yoOMJoszmdfEoUP7mzjl3PTK9dq6JUi8yXrxJljrY-0,9540
774
779
  lightning_sdk/lightning_cloud/openapi/models/v1_named_get_logger_metrics.py,sha256=VygKKjSPGIbWT9RxbmJfOSlNR-Fq12yKj8wT_SHd2ZQ,3966
780
+ lightning_sdk/lightning_cloud/openapi/models/v1_nebius_direct_v1.py,sha256=FXjBRxuNMVlNopuedGI5DV8y6Boy3CKoen6Odg9CnVk,4513
775
781
  lightning_sdk/lightning_cloud/openapi/models/v1_network_config.py,sha256=bHDZVIsqgiSi7eBf72RunvrLR-d-4b9S7oDMAZFBvCM,5476
776
782
  lightning_sdk/lightning_cloud/openapi/models/v1_new_feature.py,sha256=FMsA5E3T_94-IoZ7Dv-8N3agoZwmP7wTeFO443L_2Jw,10716
777
783
  lightning_sdk/lightning_cloud/openapi/models/v1_notification_preference.py,sha256=W46XDkg7j9X8V9uRu1LHcPK1jSPTSzBVVEmbJ4FVofY,6930
@@ -952,7 +958,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_upstream_open_ai.py,sha256=jt1qQ
952
958
  lightning_sdk/lightning_cloud/openapi/models/v1_usage.py,sha256=Z5cZrO1keYqrrUnvx5NSt5K-4-pGsUtqvTKn65_1oAk,14329
953
959
  lightning_sdk/lightning_cloud/openapi/models/v1_usage_details.py,sha256=U7qC698Xj5tb3D93ZskG6sDf3lTXE13UTlGeDTvtRU4,14062
954
960
  lightning_sdk/lightning_cloud/openapi/models/v1_usage_report.py,sha256=iH67BcONBSLYzcZpGpKWSOzJTCpuqYt7FU4OUs8BJ9k,6076
955
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py,sha256=P5rR9kl4uMhDE2qeLf0tnQCfLgLsgsTvEJZjnLzf5-8,71478
961
+ lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py,sha256=sXMi0JaKTyB5p_p7W61T62wX2rvtPhYOkKCvTouTJFw,73225
956
962
  lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_compute_config.py,sha256=3jeJfpbBpYY2B2Ao2j2N93CMO2CnvmPqndE4Lw3ZfMA,13056
957
963
  lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_flow_compute_config.py,sha256=3WpZ-lf7xPwuYyQDMdP7Uc6-dh3vf5TaaUlcMfesfMk,5208
958
964
  lightning_sdk/lightning_cloud/openapi/models/v1_user_slurm_job_action_response.py,sha256=BdNzXH8Vsf5PHjl9Rd-TVkpAgx1YC9rf8LD0js-ba20,3058
@@ -993,7 +999,7 @@ lightning_sdk/lightning_cloud/utils/dataset.py,sha256=4nUspe8iAaRPgSYpXA2uAQCgyd
993
999
  lightning_sdk/lightning_cloud/utils/name_generator.py,sha256=MkciuA10332V0mcE2PxLIiwWomWE0Fm_gNGK01vwRr4,58046
994
1000
  lightning_sdk/lightning_cloud/utils/network.py,sha256=axPgl8rhyPcPjxiztDxyksfxax3VNg2OXL5F5Uc81b4,406
995
1001
  lightning_sdk/llm/__init__.py,sha256=ErZva0HqN2iPtK_6hI6GN7A_HPGNrHo3wYh7vyFdO3Q,57
996
- lightning_sdk/llm/llm.py,sha256=gWQ4KO6IMJtrOOMsMweeW-zDg6DH-0eaInTbeqGTDyA,2460
1002
+ lightning_sdk/llm/llm.py,sha256=HPE6tGyURprELaI-zjvB_3I7mFDZT4g2SRDj180t-Qk,4610
997
1003
  lightning_sdk/mmt/__init__.py,sha256=ExMu90-96bGBnyp5h0CErQszUGB1-PcjC4-R8_NYbeY,117
998
1004
  lightning_sdk/mmt/base.py,sha256=B3HC-c82bPHprEZh1mhLCPCrCE8BOKqwIhY7xCF9CXg,15152
999
1005
  lightning_sdk/mmt/mmt.py,sha256=swdGP1DOM42a_QmmY1vg3--6ZBDiC4zToAzU9Eycv4U,13446
@@ -1011,9 +1017,9 @@ lightning_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
1011
1017
  lightning_sdk/utils/dynamic.py,sha256=glUTO1JC9APtQ6Gr9SO02a3zr56-sPAXM5C3NrTpgyQ,1959
1012
1018
  lightning_sdk/utils/enum.py,sha256=h2JRzqoBcSlUdanFHmkj_j5DleBHAu1esQYUsdNI-hU,4106
1013
1019
  lightning_sdk/utils/resolve.py,sha256=6qlBUkOmcFTjhQx_CAGfnvWBbMYp6XrCV_sX_IqplLE,6748
1014
- lightning_sdk-0.2.12.dist-info/LICENSE,sha256=uFIuZwj5z-4TeF2UuacPZ1o17HkvKObT8fY50qN84sg,1064
1015
- lightning_sdk-0.2.12.dist-info/METADATA,sha256=lvLCR5B3vE0QpeByWHNmgDrWc9gPanWBOkj0DSYVr5c,3992
1016
- lightning_sdk-0.2.12.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1017
- lightning_sdk-0.2.12.dist-info/entry_points.txt,sha256=msB9PJWIJ784dX-OP8by51d4IbKYH3Fj1vCuA9oXjHY,68
1018
- lightning_sdk-0.2.12.dist-info/top_level.txt,sha256=ps8doKILFXmN7F1mHncShmnQoTxKBRPIcchC8TpoBw4,19
1019
- lightning_sdk-0.2.12.dist-info/RECORD,,
1020
+ lightning_sdk-0.2.13.dist-info/LICENSE,sha256=uFIuZwj5z-4TeF2UuacPZ1o17HkvKObT8fY50qN84sg,1064
1021
+ lightning_sdk-0.2.13.dist-info/METADATA,sha256=SBrWq0CHnSePIEqhG4l4PANPJWxNLOIQegUMO-innFQ,3992
1022
+ lightning_sdk-0.2.13.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1023
+ lightning_sdk-0.2.13.dist-info/entry_points.txt,sha256=msB9PJWIJ784dX-OP8by51d4IbKYH3Fj1vCuA9oXjHY,68
1024
+ lightning_sdk-0.2.13.dist-info/top_level.txt,sha256=ps8doKILFXmN7F1mHncShmnQoTxKBRPIcchC8TpoBw4,19
1025
+ lightning_sdk-0.2.13.dist-info/RECORD,,
File without changes