lightning-sdk 2025.12.17__py3-none-any.whl → 2026.1.27__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 (130) hide show
  1. lightning_sdk/__version__.py +1 -1
  2. lightning_sdk/api/k8s_api.py +75 -29
  3. lightning_sdk/api/studio_api.py +192 -37
  4. lightning_sdk/api/teamspace_api.py +180 -54
  5. lightning_sdk/api/utils.py +8 -0
  6. lightning_sdk/cli/cp/__init__.py +67 -0
  7. lightning_sdk/cli/cp/teamspace_uploads.py +93 -0
  8. lightning_sdk/cli/entrypoint.py +2 -0
  9. lightning_sdk/cli/groups.py +22 -0
  10. lightning_sdk/cli/legacy/clusters_menu.py +2 -2
  11. lightning_sdk/cli/legacy/deploy/_auth.py +7 -6
  12. lightning_sdk/cli/legacy/download.py +29 -98
  13. lightning_sdk/cli/legacy/run.py +13 -2
  14. lightning_sdk/cli/legacy/upload.py +24 -31
  15. lightning_sdk/cli/studio/__init__.py +4 -0
  16. lightning_sdk/cli/studio/cp.py +24 -65
  17. lightning_sdk/cli/studio/ls.py +57 -0
  18. lightning_sdk/cli/studio/rm.py +71 -0
  19. lightning_sdk/cli/utils/filesystem.py +103 -0
  20. lightning_sdk/cli/utils/logging.py +2 -1
  21. lightning_sdk/cli/utils/teamspace_selection.py +5 -0
  22. lightning_sdk/exceptions.py +31 -0
  23. lightning_sdk/job/base.py +1 -1
  24. lightning_sdk/k8s_cluster.py +9 -10
  25. lightning_sdk/lightning_cloud/__version__.py +1 -1
  26. lightning_sdk/lightning_cloud/openapi/__init__.py +43 -23
  27. lightning_sdk/lightning_cloud/openapi/api/__init__.py +2 -1
  28. lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +118 -1
  29. lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +378 -536
  30. lightning_sdk/lightning_cloud/openapi/api/container_registry_service_api.py +456 -0
  31. lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +5 -1
  32. lightning_sdk/lightning_cloud/openapi/api/file_system_service_api.py +11 -11
  33. lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +113 -0
  34. lightning_sdk/lightning_cloud/openapi/api/k8_s_cluster_service_api.py +246 -19
  35. lightning_sdk/lightning_cloud/openapi/api/lightningwork_service_api.py +116 -11
  36. lightning_sdk/lightning_cloud/openapi/api/lit_logger_service_api.py +588 -2
  37. lightning_sdk/lightning_cloud/openapi/api/models_store_api.py +9 -1
  38. lightning_sdk/lightning_cloud/openapi/api/organizations_service_api.py +113 -0
  39. lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py +5 -1
  40. lightning_sdk/lightning_cloud/openapi/api/{kubernetes_virtual_machine_service_api.py → virtual_machine_service_api.py} +82 -82
  41. lightning_sdk/lightning_cloud/openapi/models/__init__.py +41 -22
  42. lightning_sdk/lightning_cloud/openapi/models/cluster_service_create_cluster_capacity_reservation_body.py +53 -1
  43. lightning_sdk/lightning_cloud/openapi/models/cluster_service_create_machine_body.py +53 -1
  44. lightning_sdk/lightning_cloud/openapi/models/cluster_service_create_org_cluster_capacity_reservation_body.py +409 -0
  45. lightning_sdk/lightning_cloud/openapi/models/{v1_add_container_registry_response.py → cluster_service_report_machine_system_metrics_body.py} +23 -23
  46. lightning_sdk/lightning_cloud/openapi/models/container_registry_config_ecr.py +149 -0
  47. lightning_sdk/lightning_cloud/openapi/models/{v1_container_registry_status.py → container_registry_provider.py} +14 -10
  48. lightning_sdk/lightning_cloud/openapi/models/container_registry_service_create_container_registry_body.py +201 -0
  49. lightning_sdk/lightning_cloud/openapi/models/{v1_ecr_registry_config_input.py → container_registry_service_refresh_container_registry_credentials_body.py} +21 -21
  50. lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +27 -1
  51. lightning_sdk/lightning_cloud/openapi/models/{v1_ecr_registry_config.py → jobs_service_duplicate_deployment_body.py} +51 -51
  52. lightning_sdk/lightning_cloud/openapi/models/lit_logger_service_create_lit_logger_media_body.py +305 -0
  53. lightning_sdk/lightning_cloud/openapi/models/lit_logger_service_update_lit_logger_media_body.py +149 -0
  54. lightning_sdk/lightning_cloud/openapi/models/lit_logger_service_update_metrics_stream_body.py +53 -1
  55. lightning_sdk/lightning_cloud/openapi/models/organizations_service_update_org_role_body.py +175 -0
  56. lightning_sdk/lightning_cloud/openapi/models/v1_capacity_reservation_used_by.py +227 -0
  57. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_provider.py +2 -1
  58. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_type.py +1 -0
  59. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +27 -1
  60. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py +53 -1
  61. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +79 -27
  62. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_type.py +0 -1
  63. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry.py +63 -89
  64. lightning_sdk/lightning_cloud/openapi/models/{cluster_service_add_container_registry_body.py → v1_container_registry_config.py} +16 -16
  65. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry_scopes.py +149 -0
  66. lightning_sdk/lightning_cloud/openapi/models/{v1_delete_kubernetes_virtual_machine_response.py → v1_create_container_registry_response.py} +6 -6
  67. lightning_sdk/lightning_cloud/openapi/models/v1_create_lit_logger_media_response.py +149 -0
  68. lightning_sdk/lightning_cloud/openapi/models/v1_create_org_cluster_capacity_reservation_response.py +201 -0
  69. lightning_sdk/lightning_cloud/openapi/models/v1_create_sdk_command_history_request.py +29 -3
  70. lightning_sdk/lightning_cloud/openapi/models/v1_cudo_direct_v1.py +175 -0
  71. lightning_sdk/lightning_cloud/openapi/models/{cluster_service_refresh_container_registry_credentials_body.py → v1_delete_lit_logger_media_response.py} +6 -6
  72. lightning_sdk/lightning_cloud/openapi/models/{kubernetes_virtual_machine_service_update_kubernetes_virtual_machine_body.py → v1_delete_org_cluster_capacity_reservation_response.py} +6 -6
  73. lightning_sdk/lightning_cloud/openapi/models/v1_delete_virtual_machine_response.py +97 -0
  74. lightning_sdk/lightning_cloud/openapi/models/v1_describe_org_cluster_capacity_reservation_response.py +201 -0
  75. lightning_sdk/lightning_cloud/openapi/models/v1_external_cluster_spec.py +27 -27
  76. lightning_sdk/lightning_cloud/openapi/models/v1_external_search_user.py +27 -1
  77. lightning_sdk/lightning_cloud/openapi/models/v1_generic_job_spec.py +79 -1
  78. lightning_sdk/lightning_cloud/openapi/models/{v1_validate_container_registry_response.py → v1_get_kubernetes_pod_logs_response.py} +37 -37
  79. lightning_sdk/lightning_cloud/openapi/models/{v1_get_machine_response.py → v1_get_kubernetes_pod_response.py} +23 -23
  80. lightning_sdk/lightning_cloud/openapi/models/v1_job.py +27 -1
  81. lightning_sdk/lightning_cloud/openapi/models/v1_job_spec.py +27 -1
  82. lightning_sdk/lightning_cloud/openapi/models/v1_joinable_organization.py +27 -1
  83. lightning_sdk/lightning_cloud/openapi/models/{v1_container_registry_integration.py → v1_k8s_incident_setting.py} +49 -23
  84. lightning_sdk/lightning_cloud/openapi/models/v1_k8s_incident_type.py +108 -0
  85. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_settings_v1.py +53 -1
  86. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_v1.py +53 -27
  87. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_pod.py +27 -1
  88. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_pod_logs_page.py +227 -0
  89. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_config.py +53 -1
  90. lightning_sdk/lightning_cloud/openapi/models/v1_list_container_registries_response.py +6 -6
  91. lightning_sdk/lightning_cloud/openapi/models/v1_list_kubernetes_pods_response.py +43 -17
  92. lightning_sdk/lightning_cloud/openapi/models/v1_list_kubernetes_pods_sort_order.py +104 -0
  93. lightning_sdk/lightning_cloud/openapi/models/v1_list_lit_logger_media_response.py +149 -0
  94. lightning_sdk/lightning_cloud/openapi/models/v1_list_models_response.py +55 -3
  95. lightning_sdk/lightning_cloud/openapi/models/{v1_list_kubernetes_virtual_machines_response.py → v1_list_virtual_machines_response.py} +16 -16
  96. lightning_sdk/lightning_cloud/openapi/models/v1_lit_logger_media.py +513 -0
  97. lightning_sdk/lightning_cloud/openapi/models/v1_machine.py +27 -53
  98. lightning_sdk/lightning_cloud/openapi/models/v1_machine_direct_v1.py +107 -3
  99. lightning_sdk/lightning_cloud/openapi/models/v1_media_type.py +104 -0
  100. lightning_sdk/lightning_cloud/openapi/models/{v1_ai_pod_v1.py → v1_mithril_direct_v1.py} +51 -51
  101. lightning_sdk/lightning_cloud/openapi/models/v1_nebius_direct_v1.py +29 -3
  102. lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +27 -1
  103. lightning_sdk/lightning_cloud/openapi/models/v1_refresh_container_registry_credentials_response.py +1 -27
  104. lightning_sdk/lightning_cloud/openapi/models/{cluster_service_validate_container_registry_body.py → v1_report_cloud_space_instance_idle_state_response.py} +6 -6
  105. lightning_sdk/lightning_cloud/openapi/models/v1_report_machine_system_metrics_response.py +97 -0
  106. lightning_sdk/lightning_cloud/openapi/models/{v1_ecr_registry_details.py → v1_tenant_credentials.py} +53 -53
  107. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +183 -157
  108. lightning_sdk/lightning_cloud/openapi/models/{v1_kubernetes_virtual_machine.py → v1_virtual_machine.py} +94 -68
  109. lightning_sdk/lightning_cloud/openapi/models/{v1_kubevirt_vm_configuration.py → v1_vm_configuration.py} +20 -20
  110. lightning_sdk/lightning_cloud/openapi/models/{v1_kubevirt_provider_configuration.py → v1_vm_provider_configuration.py} +32 -32
  111. lightning_sdk/lightning_cloud/openapi/models/virtual_machine_service_create_virtual_machine_body.py +565 -0
  112. lightning_sdk/lightning_cloud/openapi/models/virtual_machine_service_update_virtual_machine_body.py +97 -0
  113. lightning_sdk/lightning_cloud/openapi/rest.py +2 -2
  114. lightning_sdk/lightning_cloud/rest_client.py +0 -2
  115. lightning_sdk/machine.py +3 -3
  116. lightning_sdk/studio.py +14 -4
  117. lightning_sdk/teamspace.py +28 -7
  118. lightning_sdk/utils/logging.py +2 -1
  119. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/METADATA +1 -5
  120. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/RECORD +125 -102
  121. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/WHEEL +1 -1
  122. lightning_sdk/lightning_cloud/cli/__main__.py +0 -29
  123. lightning_sdk/lightning_cloud/openapi/models/kubernetes_virtual_machine_service_create_kubernetes_virtual_machine_body.py +0 -513
  124. lightning_sdk/lightning_cloud/openapi/models/v1_container_registry_info.py +0 -281
  125. lightning_sdk/lightning_cloud/openapi/models/v1_kubevirt_vm_resources.py +0 -201
  126. lightning_sdk/lightning_cloud/source_code/logs_socket_api.py +0 -103
  127. /lightning_sdk/lightning_cloud/openapi/models/{v1_list_filesystem_mmts_response.py → v1_list_filesystem_mm_ts_response.py} +0 -0
  128. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/LICENSE +0 -0
  129. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/entry_points.txt +0 -0
  130. {lightning_sdk-2025.12.17.dist-info → lightning_sdk-2026.1.27.dist-info}/top_level.txt +0 -0
lightning_sdk/machine.py CHANGED
@@ -162,12 +162,12 @@ Machine.CPU_X_4 = Machine(name="CPU_X_4", slug="cpu-4", family="CPU", accelerato
162
162
  Machine.CPU_X_8 = Machine(name="CPU_X_8", slug="cpu-8", family="CPU", accelerator_count=8)
163
163
  Machine.CPU_X_16 = Machine(name="CPU_X_16", slug="cpu-16", family="CPU", accelerator_count=16)
164
164
  # available data-prep (big disk) machines
165
- Machine.DATA_PREP = Machine(name="DATA_PREP", slug="data-prep-mid", family="DATA_PREP", accelerator_count=32)
165
+ Machine.DATA_PREP = Machine(name="DATA_PREP", slug="data-prep-mid", family="DATA-PREP", accelerator_count=32)
166
166
  Machine.DATA_PREP_MAX = Machine(
167
- name="DATA_PREP_MAX", slug="data-prep-max-large", family="DATA_PREP", accelerator_count=64
167
+ name="DATA_PREP_MAX", slug="data-prep-max-large", family="DATA-PREP", accelerator_count=64
168
168
  )
169
169
  Machine.DATA_PREP_ULTRA = Machine(
170
- name="DATA_PREP_ULTRA", slug="data-prep-ultra-extra-large", family="DATA_PREP", accelerator_count=96
170
+ name="DATA_PREP_ULTRA", slug="data-prep-ultra-extra-large", family="DATA-PREP", accelerator_count=96
171
171
  )
172
172
 
173
173
  # GPU machines
lightning_sdk/studio.py CHANGED
@@ -11,7 +11,7 @@ from lightning_sdk.api.studio_api import StudioApi
11
11
  from lightning_sdk.api.utils import AccessibleResource, raise_access_error_if_not_allowed
12
12
  from lightning_sdk.base_studio import BaseStudio
13
13
  from lightning_sdk.constants import _LIGHTNING_DEBUG
14
- from lightning_sdk.exceptions import OutOfCapacityError
14
+ from lightning_sdk.exceptions import NotSupportedError, OutOfCapacityError
15
15
  from lightning_sdk.lightning_cloud.openapi import V1ClusterType, V1Endpoint
16
16
  from lightning_sdk.machine import DEFAULT_MACHINE, CloudProvider, Machine
17
17
  from lightning_sdk.organization import Organization
@@ -341,12 +341,20 @@ class Studio(metaclass=TrackCallsMeta):
341
341
  if new_machine != self.machine:
342
342
  raise RuntimeError(
343
343
  f"Requested to start {self._cls_name} on {new_machine}, "
344
- "but {self._cls_name} is already running on {self.machine}."
344
+ f"but {self._cls_name} is already running on {self.machine}."
345
345
  " Consider switching instead!"
346
346
  )
347
347
  _logger.info(f"{self._cls_name} {self.name} is already running")
348
348
  return
349
349
 
350
+ if not self._studio_api.machine_is_supported(
351
+ new_machine, self._teamspace.id, self.cloud_account, _get_org_id(self._teamspace)
352
+ ):
353
+ raise NotSupportedError(
354
+ "Requested machine is not supported in the selected cloud account. "
355
+ "Try a different machine or cloud account by setting the `machine` or `cloud_account` argument."
356
+ )
357
+
350
358
  if not self._studio_api.machine_has_capacity(
351
359
  new_machine,
352
360
  self._teamspace.id,
@@ -548,7 +556,7 @@ class Studio(metaclass=TrackCallsMeta):
548
556
  if status != Status.Running:
549
557
  raise RuntimeError(
550
558
  f"Cannot run a command in a {self._cls_name} that is not running. "
551
- "{self._cls_name} {self.name} is {status}."
559
+ f"{self._cls_name} {self.name} is {status}."
552
560
  )
553
561
  output, exit_code = self._studio_api.run_studio_commands(self._studio.id, self._teamspace.id, *commands)
554
562
  output = output.strip()
@@ -605,11 +613,13 @@ class Studio(metaclass=TrackCallsMeta):
605
613
  progress_bar = tqdm(total=len(all_files), desc="Uploading files", unit="file")
606
614
  for local_file, remote_path in sorted(all_files, key=lambda p: p[1]):
607
615
  if progress_bar:
608
- progress_bar.set_description(f"Uploading {local_file}")
616
+ progress_bar.set_description("Uploading files")
609
617
  self.upload_file(local_file, remote_path=remote_path, progress_bar=False)
610
618
  if progress_bar:
611
619
  progress_bar.update(1)
612
620
  if progress_bar:
621
+ progress_bar.set_description("Upload complete")
622
+ progress_bar.refresh()
613
623
  progress_bar.close()
614
624
 
615
625
  def download_file(self, remote_path: str, file_path: Optional[str] = None) -> None:
@@ -539,21 +539,37 @@ class Teamspace(metaclass=TrackCallsMeta):
539
539
  return self._teamspace_api.list_model_versions(teamspace_id=self.id, model_name=name)
540
540
 
541
541
  def upload_file(
542
- self, file_path: Union[Path, str], remote_path: Optional[str] = None, progress_bar: bool = True
542
+ self,
543
+ file_path: Union[Path, str],
544
+ remote_path: Optional[str] = None,
545
+ progress_bar: bool = True,
546
+ cloud_account: Optional[str] = None,
543
547
  ) -> None:
544
548
  """Uploads file to given remote path in the Teamspace drive."""
545
549
  if remote_path is None:
546
550
  remote_path = os.path.split(file_path)[1]
547
551
 
552
+ if cloud_account is None:
553
+ warnings.warn(
554
+ f"No cloud account specified. Using teamspace default cloud account: {self.default_cloud_account}."
555
+ )
556
+ cloud_account = self.default_cloud_account
557
+
548
558
  self._teamspace_api.upload_file(
549
559
  teamspace_id=self._teamspace.id,
550
- cloud_account=self.default_cloud_account,
560
+ cloud_account=cloud_account,
551
561
  file_path=file_path,
552
562
  remote_path=os.path.normpath(remote_path),
553
563
  progress_bar=progress_bar,
554
564
  )
555
565
 
556
- def upload_folder(self, folder_path: str, remote_path: Optional[str] = None, progress_bar: bool = True) -> None:
566
+ def upload_folder(
567
+ self,
568
+ folder_path: str,
569
+ remote_path: Optional[str] = None,
570
+ progress_bar: bool = True,
571
+ cloud_account: Optional[str] = None,
572
+ ) -> None:
557
573
  """Uploads a given folder to a remote path in the Teamspace drive."""
558
574
  if folder_path is None:
559
575
  raise ValueError("Cannot upload a folder that is None.")
@@ -575,13 +591,15 @@ class Teamspace(metaclass=TrackCallsMeta):
575
591
  for local_file, remote_path in sorted(all_files, key=lambda p: p[1]):
576
592
  if progress_bar:
577
593
  progress_bar.set_description(f"Uploading {local_file}")
578
- self.upload_file(local_file, remote_path=remote_path, progress_bar=False)
594
+ self.upload_file(local_file, remote_path=remote_path, progress_bar=False, cloud_account=cloud_account)
579
595
  if progress_bar:
580
596
  progress_bar.update(1)
581
597
  if progress_bar:
582
598
  progress_bar.close()
583
599
 
584
- def download_file(self, remote_path: str, file_path: Optional[str] = None) -> None:
600
+ def download_file(
601
+ self, remote_path: str, file_path: Optional[str] = None, cloud_account: Optional[str] = None
602
+ ) -> None:
585
603
  """Downloads a given file in Teamspace drive to a target location."""
586
604
  if file_path is None:
587
605
  file_path = remote_path
@@ -590,9 +608,12 @@ class Teamspace(metaclass=TrackCallsMeta):
590
608
  path=remote_path,
591
609
  target_path=file_path,
592
610
  teamspace_id=self._teamspace.id,
611
+ cloud_account=cloud_account,
593
612
  )
594
613
 
595
- def download_folder(self, remote_path: str, target_path: Optional[str] = None) -> None:
614
+ def download_folder(
615
+ self, remote_path: str, target_path: Optional[str] = None, cloud_account: Optional[str] = None
616
+ ) -> None:
596
617
  """Downloads a folder in the Teamspace drive to a given target path."""
597
618
  if target_path is None:
598
619
  target_path = remote_path
@@ -601,7 +622,7 @@ class Teamspace(metaclass=TrackCallsMeta):
601
622
  path=remote_path,
602
623
  target_path=target_path,
603
624
  teamspace_id=self._teamspace.id,
604
- cloud_account=self.default_cloud_account,
625
+ cloud_account=cloud_account,
605
626
  )
606
627
 
607
628
  def new_folder(
@@ -22,7 +22,7 @@ def track_calls() -> Callable[..., any]:
22
22
  bound_args.apply_defaults()
23
23
 
24
24
  args_str = ", ".join(f"{k}: {v}" for k, v in bound_args.arguments.items() if k != "self")
25
- message = f"VERSION: {__version__} | ARGS: {args_str} "
25
+ message = f"ARGS: {args_str} "
26
26
 
27
27
  body = V1CreateSDKCommandHistoryRequest(
28
28
  command=func.__qualname__,
@@ -30,6 +30,7 @@ def track_calls() -> Callable[..., any]:
30
30
  project_id=None,
31
31
  severity=V1SDKCommandHistorySeverity.INFO,
32
32
  type=V1SDKCommandHistoryType.SDK,
33
+ version=__version__,
33
34
  )
34
35
 
35
36
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lightning_sdk
3
- Version: 2025.12.17
3
+ Version: 2026.1.27
4
4
  Summary: SDK to develop using Lightning AI Studios
5
5
  Author-email: Lightning-AI <justus@lightning.ai>
6
6
  License: MIT License
@@ -38,8 +38,6 @@ Requires-Dist: click
38
38
  Requires-Dist: docker
39
39
  Requires-Dist: fastapi
40
40
  Requires-Dist: packaging
41
- Requires-Dist: pandas
42
- Requires-Dist: pyjwt
43
41
  Requires-Dist: pyyaml
44
42
  Requires-Dist: requests
45
43
  Requires-Dist: rich
@@ -48,8 +46,6 @@ Requires-Dist: six
48
46
  Requires-Dist: tqdm
49
47
  Requires-Dist: urllib3<=2.5.0
50
48
  Requires-Dist: uvicorn
51
- Requires-Dist: websocket-client
52
- Requires-Dist: wget
53
49
  Provides-Extra: serve
54
50
  Requires-Dist: litserve>=0.2.5; extra == "serve"
55
51