lightning-sdk 0.2.22__py3-none-any.whl → 0.2.24rc0__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 (101) hide show
  1. lightning_sdk/__init__.py +1 -1
  2. lightning_sdk/api/base_studio_api.py +9 -2
  3. lightning_sdk/api/deployment_api.py +9 -9
  4. lightning_sdk/api/license_api.py +2 -2
  5. lightning_sdk/api/llm_api.py +7 -11
  6. lightning_sdk/api/pipeline_api.py +31 -10
  7. lightning_sdk/api/studio_api.py +6 -0
  8. lightning_sdk/base_studio.py +22 -6
  9. lightning_sdk/cli/entrypoint.py +15 -13
  10. lightning_sdk/cli/start.py +5 -2
  11. lightning_sdk/deployment/deployment.py +17 -7
  12. lightning_sdk/lightning_cloud/openapi/__init__.py +20 -0
  13. lightning_sdk/lightning_cloud/openapi/api/__init__.py +1 -0
  14. lightning_sdk/lightning_cloud/openapi/api/assistants_service_api.py +114 -1
  15. lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +206 -0
  16. lightning_sdk/lightning_cloud/openapi/api/cloudy_service_api.py +129 -0
  17. lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +97 -0
  18. lightning_sdk/lightning_cloud/openapi/api/organizations_service_api.py +105 -0
  19. lightning_sdk/lightning_cloud/openapi/api/pipelines_service_api.py +118 -1
  20. lightning_sdk/lightning_cloud/openapi/api/user_service_api.py +105 -0
  21. lightning_sdk/lightning_cloud/openapi/configuration.py +1 -1
  22. lightning_sdk/lightning_cloud/openapi/models/__init__.py +19 -0
  23. lightning_sdk/lightning_cloud/openapi/models/agents_id_body.py +27 -1
  24. lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +81 -3
  25. lightning_sdk/lightning_cloud/openapi/models/cloudspace_id_visibility_body.py +123 -0
  26. lightning_sdk/lightning_cloud/openapi/models/create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs.py +27 -1
  27. lightning_sdk/lightning_cloud/openapi/models/credits_autoreplenish_body.py +175 -0
  28. lightning_sdk/lightning_cloud/openapi/models/credits_autoreplenish_body1.py +175 -0
  29. lightning_sdk/lightning_cloud/openapi/models/externalv1_user_status.py +79 -1
  30. lightning_sdk/lightning_cloud/openapi/models/metricsstream_create_body.py +27 -1
  31. lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +27 -1
  32. lightning_sdk/lightning_cloud/openapi/models/pipelines_id_body.py +27 -1
  33. lightning_sdk/lightning_cloud/openapi/models/pipelines_id_body1.py +123 -0
  34. lightning_sdk/lightning_cloud/openapi/models/project_id_agents_body.py +27 -1
  35. lightning_sdk/lightning_cloud/openapi/models/project_id_cloudspaces_body.py +53 -1
  36. lightning_sdk/lightning_cloud/openapi/models/update.py +29 -3
  37. lightning_sdk/lightning_cloud/openapi/models/v1_assistant.py +27 -1
  38. lightning_sdk/lightning_cloud/openapi/models/v1_check_cluster_name_availability_request.py +123 -0
  39. lightning_sdk/lightning_cloud/openapi/models/v1_check_cluster_name_availability_response.py +123 -0
  40. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_provider.py +2 -0
  41. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space.py +79 -1
  42. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_config.py +29 -3
  43. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_template_config.py +29 -3
  44. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_type.py +1 -0
  45. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_session.py +29 -3
  46. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_specialized_view.py +104 -0
  47. lightning_sdk/lightning_cloud/openapi/models/v1_cloudy_expert.py +279 -0
  48. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +79 -1
  49. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py +27 -1
  50. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +27 -1
  51. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +105 -1
  52. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_status.py +27 -1
  53. lightning_sdk/lightning_cloud/openapi/models/v1_conversation_response_chunk.py +29 -3
  54. lightning_sdk/lightning_cloud/openapi/models/v1_create_cloud_space_environment_template_request.py +29 -3
  55. lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_request.py +27 -1
  56. lightning_sdk/lightning_cloud/openapi/models/v1_create_organization_request.py +79 -1
  57. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_status.py +47 -21
  58. lightning_sdk/lightning_cloud/openapi/models/v1_external_cluster.py +253 -0
  59. lightning_sdk/lightning_cloud/openapi/models/v1_external_cluster_spec.py +853 -0
  60. lightning_sdk/lightning_cloud/openapi/models/v1_get_job_stats_response.py +53 -1
  61. lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +27 -1
  62. lightning_sdk/lightning_cloud/openapi/models/v1_instance_overprovisioning_spec.py +29 -27
  63. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_v1.py +123 -0
  64. lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_v1_status.py +149 -0
  65. lightning_sdk/lightning_cloud/openapi/models/v1_lightning_run.py +53 -1
  66. lightning_sdk/lightning_cloud/openapi/models/v1_list_cloudy_experts_response.py +123 -0
  67. lightning_sdk/lightning_cloud/openapi/models/v1_list_clusters_response.py +6 -6
  68. lightning_sdk/lightning_cloud/openapi/models/v1_list_project_clusters_response.py +6 -6
  69. lightning_sdk/lightning_cloud/openapi/models/v1_lite_published_cloud_space_response.py +513 -0
  70. lightning_sdk/lightning_cloud/openapi/models/v1_login_request.py +27 -1
  71. lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_request.py +29 -3
  72. lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_response.py +27 -1
  73. lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +27 -1
  74. lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +27 -1
  75. lightning_sdk/lightning_cloud/openapi/models/v1_pipeline.py +27 -1
  76. lightning_sdk/lightning_cloud/openapi/models/v1_shared_filesystem.py +131 -1
  77. lightning_sdk/lightning_cloud/openapi/models/v1_token_usage.py +175 -0
  78. lightning_sdk/lightning_cloud/openapi/models/v1_update_cloud_space_visibility_response.py +97 -0
  79. lightning_sdk/lightning_cloud/openapi/models/v1_update_organization_credits_auto_replenish_response.py +97 -0
  80. lightning_sdk/lightning_cloud/openapi/models/v1_update_user_credits_auto_replenish_response.py +97 -0
  81. lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +27 -1
  82. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +234 -104
  83. lightning_sdk/lightning_cloud/openapi/models/v1_volume.py +78 -104
  84. lightning_sdk/lightning_cloud/openapi/models/v1_volume_state.py +104 -0
  85. lightning_sdk/llm/llm.py +113 -115
  86. lightning_sdk/llm/public_assistants.json +8 -0
  87. lightning_sdk/pipeline/__init__.py +11 -2
  88. lightning_sdk/pipeline/pipeline.py +54 -14
  89. lightning_sdk/pipeline/printer.py +36 -16
  90. lightning_sdk/pipeline/schedule.py +2 -1
  91. lightning_sdk/pipeline/{types.py → steps.py} +77 -56
  92. lightning_sdk/pipeline/utils.py +65 -3
  93. lightning_sdk/sandbox.py +157 -0
  94. lightning_sdk/services/license.py +12 -6
  95. lightning_sdk/studio.py +10 -1
  96. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/METADATA +1 -1
  97. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/RECORD +101 -79
  98. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/LICENSE +0 -0
  99. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/WHEEL +0 -0
  100. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/entry_points.txt +0 -0
  101. {lightning_sdk-0.2.22.dist-info → lightning_sdk-0.2.24rc0.dist-info}/top_level.txt +0 -0
lightning_sdk/__init__.py CHANGED
@@ -31,6 +31,6 @@ __all__ = [
31
31
  "User",
32
32
  ]
33
33
 
34
- __version__ = "0.2.22"
34
+ __version__ = "0.2.24.rc0"
35
35
  _check_version_and_prompt_upgrade(__version__)
36
36
  _set_tqdm_envvars_noninteractive()
@@ -1,10 +1,13 @@
1
1
  from typing import Any, List, Optional
2
2
 
3
+ from lightning_sdk.lightning_cloud.openapi import (
4
+ V1CloudSpaceEnvironmentType,
5
+ V1ListCloudSpaceEnvironmentTemplatesResponse,
6
+ )
3
7
  from lightning_sdk.lightning_cloud.openapi.models.update import Update as BaseStudioUpdateBody
4
8
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_environment_template import (
5
9
  V1CloudSpaceEnvironmentTemplate,
6
10
  )
7
- from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_environment_type import V1CloudSpaceEnvironmentType
8
11
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
9
12
 
10
13
 
@@ -21,8 +24,12 @@ class BaseStudioApi:
21
24
  except ValueError as e:
22
25
  raise ValueError(f"Base studio {base_studio_id} does not exist") from e
23
26
 
24
- def get_all_base_studios(self, org_id: str) -> List[V1CloudSpaceEnvironmentTemplate]:
27
+ def get_all_base_studios(self, org_id: str, managed: bool = True) -> V1ListCloudSpaceEnvironmentTemplatesResponse:
25
28
  """Retrieve all base studios for a given organization."""
29
+ if managed:
30
+ return self._client.cloud_space_environment_template_service_list_managed_cloud_space_environment_templates(
31
+ org_id=org_id
32
+ )
26
33
  return self._client.cloud_space_environment_template_service_list_cloud_space_environment_templates(
27
34
  org_id=org_id
28
35
  )
@@ -102,10 +102,10 @@ class ExecHealthCheck(HealthCheck):
102
102
  def __init__(
103
103
  self,
104
104
  command: str,
105
- timeout_seconds: int = 60,
106
- initial_delay_seconds: int = 5,
107
- failure_threshold: int = 12,
108
- interval_seconds: int = 5,
105
+ initial_delay_seconds: int = 0,
106
+ failure_threshold: int = 600,
107
+ interval_seconds: int = 1,
108
+ timeout_seconds: int = 30,
109
109
  ) -> None:
110
110
  self.command = command
111
111
  self.timeout_seconds = timeout_seconds
@@ -131,17 +131,17 @@ class HttpHealthCheck(HealthCheck):
131
131
  self,
132
132
  path: str,
133
133
  port: float,
134
- timeout_seconds: int = 60,
135
- initial_delay_seconds: int = 5,
136
- failure_threshold: int = 12,
137
- interval_seconds: int = 5,
134
+ initial_delay_seconds: int = 0,
135
+ failure_threshold: int = 600,
136
+ interval_seconds: int = 1,
137
+ timeout_seconds: int = 30,
138
138
  ) -> None:
139
139
  self.path = path
140
140
  self.port = port
141
- self.timeout_seconds = timeout_seconds
142
141
  self.initial_delay_seconds = initial_delay_seconds
143
142
  self.failure_threshold = failure_threshold
144
143
  self.interval_seconds = interval_seconds
144
+ self.timeout_seconds = timeout_seconds
145
145
 
146
146
 
147
147
  class AutoScalingMetric:
@@ -10,8 +10,8 @@ LICENSE_CODE = os.environ.get("LICENSE_CODE", "d9s79g79ss")
10
10
  LICENSE_SIGNING_URL = f"{env.LIGHTNING_CLOUD_URL}?settings=licenses"
11
11
 
12
12
 
13
- def generate_url_user_settings(redirect_to: str = LICENSE_SIGNING_URL) -> str:
14
- params = urlencode({"redirectTo": redirect_to, "okbhrt": LICENSE_CODE})
13
+ def generate_url_user_settings(name: str, redirect_to: str = LICENSE_SIGNING_URL) -> str:
14
+ params = urlencode({"redirectTo": redirect_to, "okbhrt": LICENSE_CODE, "licenseName": name})
15
15
  return f"{env.LIGHTNING_CLOUD_URL}/sign-in?{params}"
16
16
 
17
17
 
@@ -18,17 +18,11 @@ class LLMApi:
18
18
  def __init__(self) -> None:
19
19
  self._client = LightningClient(retry=False, max_tries=0)
20
20
 
21
- def get_public_models(self) -> List[str]:
22
- result = self._client.assistants_service_list_assistants(published=True)
23
- return result.assistants
24
-
25
- def get_org_models(self, org_id: str) -> List[str]:
26
- result = self._client.assistants_service_list_assistants(org_id=org_id)
27
- return result.assistants
28
-
29
- def get_user_models(self, user_id: str) -> List[str]:
30
- result = self._client.assistants_service_list_assistants(user_id=user_id)
31
- return result.assistants
21
+ def get_assistant(self, model_provider: str, model_name: str, user_name: str, org_name: str) -> str:
22
+ result = self._client.assistants_service_get_managed_model_assistant(
23
+ model_provider=model_provider, model_name=model_name, user_name=user_name, org_name=org_name
24
+ )
25
+ return result.id
32
26
 
33
27
  def _parse_stream_line(self, decoded_line: str) -> Optional[V1ConversationResponseChunk]:
34
28
  try:
@@ -99,6 +93,7 @@ class LLMApi:
99
93
  "stream": stream,
100
94
  "metadata": metadata or {},
101
95
  "internal_conversation": is_internal_conversation,
96
+ "system_prompt": system_prompt,
102
97
  }
103
98
  if images:
104
99
  for image in images:
@@ -146,6 +141,7 @@ class LLMApi:
146
141
  "stream": stream,
147
142
  "metadata": metadata or {},
148
143
  "internal_conversation": is_internal_conversation,
144
+ "system_prompt": system_prompt,
149
145
  }
150
146
  if images:
151
147
  for image in images:
@@ -1,5 +1,6 @@
1
- from typing import TYPE_CHECKING, List, Optional
1
+ from typing import TYPE_CHECKING, List, Optional, Union
2
2
 
3
+ from lightning_sdk.api.cluster_api import ClusterApi
3
4
  from lightning_sdk.lightning_cloud.openapi.models import (
4
5
  ProjectIdPipelinesBody,
5
6
  ProjectIdSchedulesBody,
@@ -11,6 +12,7 @@ from lightning_sdk.lightning_cloud.openapi.models import (
11
12
  )
12
13
  from lightning_sdk.lightning_cloud.openapi.rest import ApiException
13
14
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
15
+ from lightning_sdk.teamspace import Teamspace
14
16
 
15
17
  if TYPE_CHECKING:
16
18
  from lightning_sdk.pipeline.schedule import Schedule
@@ -20,7 +22,8 @@ class PipelineApi:
20
22
  """Internal API client for Pipeline requests (mainly http requests)."""
21
23
 
22
24
  def __init__(self) -> None:
23
- self._client = LightningClient(retry=False, max_tries=0)
25
+ self._client = LightningClient(max_tries=0, retry=False)
26
+ self._cluster_api = ClusterApi()
24
27
 
25
28
  def get_pipeline_by_id(self, project_id: str, pipeline_id_or_name: str) -> Optional[V1Pipeline]:
26
29
  if pipeline_id_or_name.startswith("pip_"):
@@ -43,7 +46,7 @@ class PipelineApi:
43
46
  def create_pipeline(
44
47
  self,
45
48
  name: str,
46
- project_id: str,
49
+ teamspace: Teamspace,
47
50
  steps: List["V1PipelineStep"],
48
51
  shared_filesystem: bool,
49
52
  schedules: List["Schedule"],
@@ -52,19 +55,17 @@ class PipelineApi:
52
55
  body = ProjectIdPipelinesBody(
53
56
  name=name,
54
57
  steps=steps,
55
- shared_filesystem=V1SharedFilesystem(
56
- enabled=shared_filesystem,
57
- ),
58
+ shared_filesystem=self._prepare_shared_filesytem(shared_filesystem, steps, teamspace),
58
59
  parent_pipeline_id=parent_pipeline_id or "",
59
60
  )
60
61
 
61
- pipeline = self._client.pipelines_service_create_pipeline(body, project_id)
62
+ pipeline = self._client.pipelines_service_create_pipeline(body, teamspace.id)
62
63
 
63
64
  # Delete the previous schedules
64
65
  if parent_pipeline_id is not None:
65
- current_schedules = self._client.schedules_service_list_schedules(project_id).schedules
66
+ current_schedules = self._client.schedules_service_list_schedules(teamspace.id).schedules
66
67
  for schedule in current_schedules:
67
- self._client.schedules_service_delete_schedule(project_id, schedule.id)
68
+ self._client.schedules_service_delete_schedule(teamspace.id, schedule.id)
68
69
 
69
70
  if len(schedules):
70
71
  for schedule in schedules:
@@ -76,7 +77,7 @@ class PipelineApi:
76
77
  resource_type=V1ScheduleResourceType.PIPELINE,
77
78
  )
78
79
 
79
- self._client.schedules_service_create_schedule(body, project_id)
80
+ self._client.schedules_service_create_schedule(body, teamspace.id)
80
81
 
81
82
  return pipeline
82
83
 
@@ -87,3 +88,23 @@ class PipelineApi:
87
88
 
88
89
  def delete(self, project_id: str, pipeline_id: str) -> V1DeletePipelineResponse:
89
90
  return self._client.pipelines_service_delete_pipeline(project_id, pipeline_id)
91
+
92
+ def _prepare_shared_filesytem(
93
+ self, shared_filesystem: Union[bool, V1SharedFilesystem], steps: List["V1PipelineStep"], teamspace: Teamspace
94
+ ) -> V1SharedFilesystem:
95
+ if not shared_filesystem:
96
+ return V1SharedFilesystem(enabled=False)
97
+
98
+ from lightning_sdk.pipeline.utils import _get_cloud_account
99
+
100
+ cluster = self._cluster_api.get_cluster(
101
+ cluster_id=_get_cloud_account(steps), project_id=teamspace.id, org_id=teamspace.owner.id
102
+ )
103
+
104
+ if cluster.spec.aws_v1:
105
+ return V1SharedFilesystem(enabled=True, s3_folder=True)
106
+
107
+ if cluster.spec.google_cloud_v1:
108
+ return V1SharedFilesystem(enabled=True, gcs_folder=True)
109
+
110
+ raise NotImplementedError("This cluster isn't support yet")
@@ -123,6 +123,9 @@ class StudioApi:
123
123
  teamspace_id: str,
124
124
  cloud_account: Optional[str] = None,
125
125
  source: Optional[V1CloudSpaceSourceType] = None,
126
+ disable_secrets: bool = False,
127
+ sandbox: bool = False,
128
+ cloud_space_environment_template_id: Optional[str] = None,
126
129
  ) -> V1CloudSpace:
127
130
  """Create a Studio with a given name in a given Teamspace on a possibly given cloud_account."""
128
131
  body = ProjectIdCloudspacesBody(
@@ -131,6 +134,9 @@ class StudioApi:
131
134
  display_name=name,
132
135
  seed_files=[V1CloudSpaceSeedFile(path="main.py", contents="print('Hello, Lightning World!')\n")],
133
136
  source=source,
137
+ disable_secrets=disable_secrets,
138
+ sandbox=sandbox,
139
+ cloud_space_environment_template_id=cloud_space_environment_template_id,
134
140
  )
135
141
  studio = self._client.cloud_space_service_create_cloud_space(body, teamspace_id)
136
142
 
@@ -1,17 +1,23 @@
1
+ from dataclasses import dataclass
1
2
  from typing import List, Optional, Union
2
3
 
3
4
  from lightning_sdk.api.base_studio_api import BaseStudioApi
4
5
  from lightning_sdk.api.user_api import UserApi
5
6
  from lightning_sdk.lightning_cloud import login
6
- from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_environment_template import (
7
- V1CloudSpaceEnvironmentTemplate,
8
- )
9
7
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_environment_type import V1CloudSpaceEnvironmentType
10
8
  from lightning_sdk.organization import Organization
11
9
  from lightning_sdk.user import User
12
10
  from lightning_sdk.utils.resolve import _resolve_org, _resolve_user
13
11
 
14
12
 
13
+ @dataclass
14
+ class BaseStudioInfo:
15
+ id: str
16
+ name: str
17
+ managed_id: str
18
+ description: str
19
+
20
+
15
21
  class BaseStudio:
16
22
  def __init__(
17
23
  self,
@@ -61,7 +67,7 @@ class BaseStudio:
61
67
  environment_type: Optional[V1CloudSpaceEnvironmentType] = None,
62
68
  machine_image_version: Optional[str] = None,
63
69
  setup_script_text: Optional[str] = None,
64
- ) -> V1CloudSpaceEnvironmentTemplate:
70
+ ) -> None:
65
71
  self._base_studio = self._base_studio_api.update_base_studio(
66
72
  self._base_studio.id,
67
73
  self._org.id,
@@ -74,10 +80,20 @@ class BaseStudio:
74
80
  disabled=disabled,
75
81
  )
76
82
 
77
- def list(self) -> List[V1CloudSpaceEnvironmentTemplate]:
83
+ def list(self, managed: bool = True) -> List[BaseStudioInfo]:
78
84
  """List all base studios in the organization.
79
85
 
80
86
  Returns:
81
87
  List[V1CloudSpaceEnvironmentTemplate]: A list of base studio templates.
82
88
  """
83
- return self._base_studio_api.get_all_base_studios(self._org.id)
89
+ result = []
90
+ for template in self._base_studio_api.get_all_base_studios(self._org.id, managed).templates:
91
+ result.append(
92
+ BaseStudioInfo(
93
+ id=template.id,
94
+ name=template.name,
95
+ managed_id=template.managed_id,
96
+ description=template.description,
97
+ ),
98
+ )
99
+ return result
@@ -4,8 +4,9 @@ from types import TracebackType
4
4
  from typing import Type
5
5
 
6
6
  import click
7
- from rich.console import Console
7
+ from rich.console import Console, Group
8
8
  from rich.panel import Panel
9
+ from rich.syntax import Syntax
9
10
  from rich.text import Text
10
11
 
11
12
  from lightning_sdk import __version__
@@ -34,23 +35,24 @@ from lightning_sdk.lightning_cloud.login import Auth
34
35
 
35
36
  def _notify_exception(exception_type: Type[BaseException], value: BaseException, tb: TracebackType) -> None:
36
37
  """CLI won't show tracebacks, just print the exception message."""
37
- # if debug mode, print the traceback using rich
38
38
  console = Console()
39
- if value.args:
40
- message = str(value.args[0]) if value.args[0] else str(value)
41
- else:
42
- message = str(value) or "An unknown error occurred"
43
39
 
44
- error_content = Text()
45
- error_content.append(f"{exception_type.__name__}: ", style="bold red")
46
- error_content.append(message, style="white")
40
+ message = str(value.args[0]) if value.args else str(value) or "An unknown error occurred"
41
+
42
+ error_text = Text()
43
+ error_text.append(f"{exception_type.__name__}: ", style="bold red")
44
+ error_text.append(message, style="white")
45
+
46
+ renderables = [error_text]
47
47
 
48
48
  if _LIGHTNING_DEBUG:
49
- error_content.append("\n\nFull traceback:\n", style="bold yellow")
50
- tb_lines = traceback.format_exception(exception_type, value, tb)
51
- error_content.append("".join(tb_lines), style="dim white")
49
+ tb_text = "".join(traceback.format_exception(exception_type, value, tb))
50
+ renderables.append(Text("\n\nFull traceback:\n", style="bold yellow"))
51
+ renderables.append(Syntax(tb_text, "python", theme="monokai", line_numbers=False, word_wrap=True))
52
+ else:
53
+ renderables.append(Text("\n\nTo see the full traceback, set the LIGHTNING_DEBUG environment variable to 1."))
52
54
 
53
- console.print(Panel(error_content, title="⚡ Lightning CLI Error", border_style="red"))
55
+ console.print(Panel(Group(*renderables), title="⚡ Lightning CLI Error", border_style="red"))
54
56
 
55
57
 
56
58
  @click.group(name="lightning", help="Command line interface (CLI) to interact with/manage Lightning AI Studios.")
@@ -60,8 +60,11 @@ def studio(name: str, teamspace: Optional[str] = None, machine: str = "CPU", pro
60
60
 
61
61
  try:
62
62
  studio = Studio(name=name, teamspace=teamspace, org=owner, user=None, create_ok=False, provider=provider)
63
- except (RuntimeError, ValueError, ApiException):
64
- studio = Studio(name=name, teamspace=teamspace, org=None, user=owner, create_ok=False, provider=provider)
63
+ except (RuntimeError, ValueError, ApiException) as first_error:
64
+ try:
65
+ studio = Studio(name=name, teamspace=teamspace, org=None, user=owner, create_ok=False, provider=provider)
66
+ except (RuntimeError, ValueError, ApiException) as second_error:
67
+ raise first_error from second_error
65
68
 
66
69
  try:
67
70
  resolved_machine = getattr(Machine, machine.upper(), Machine(machine, machine))
@@ -197,11 +197,13 @@ class Deployment:
197
197
  if commands is not None:
198
198
  command = compose_commands(commands)
199
199
 
200
+ autoscaling_metric_name = ("CPU" if machine.is_cpu() else "GPU") if isinstance(machine, Machine) else "CPU"
201
+
200
202
  if autoscale is None:
201
203
  autoscale = AutoScaleConfig(
202
204
  min_replicas=0,
203
205
  max_replicas=1,
204
- metric="CPU" if machine.is_cpu() else "GPU",
206
+ metric=autoscaling_metric_name,
205
207
  threshold=90,
206
208
  )
207
209
 
@@ -380,27 +382,35 @@ class Deployment:
380
382
  return None
381
383
 
382
384
  @property
383
- def pending_replicas(self) -> Optional[List[str]]:
385
+ def pending_replicas(self) -> Optional[int]:
384
386
  """The number of pending replicas."""
385
387
  if self._deployment:
386
388
  self._deployment = self._deployment_api.get_deployment_by_name(self._name, self._teamspace.id)
387
- return self._deployment.status.pending_replicas
389
+ return int(self._deployment.status.pending_replicas)
390
+ return None
391
+
392
+ @property
393
+ def running_replicas(self) -> Optional[int]:
394
+ """The number of failing replicas."""
395
+ if self._deployment:
396
+ self._deployment = self._deployment_api.get_deployment_by_name(self._name, self._teamspace.id)
397
+ return int(self._deployment.status.ready_replicas)
388
398
  return None
389
399
 
390
400
  @property
391
- def failing_replicas(self) -> Optional[List[str]]:
401
+ def failing_replicas(self) -> Optional[int]:
392
402
  """The number of failing replicas."""
393
403
  if self._deployment:
394
404
  self._deployment = self._deployment_api.get_deployment_by_name(self._name, self._teamspace.id)
395
- return self._deployment.status.failing_replicas
405
+ return int(self._deployment.status.failing_replicas)
396
406
  return None
397
407
 
398
408
  @property
399
- def deleting_replicas(self) -> Optional[List[str]]:
409
+ def deleting_replicas(self) -> Optional[int]:
400
410
  """The number of deleting replicas."""
401
411
  if self._deployment:
402
412
  self._deployment = self._deployment_api.get_deployment_by_name(self._name, self._teamspace.id)
403
- return self._deployment.status.deleting_replicas
413
+ return int(self._deployment.status.deleting_replicas)
404
414
  return None
405
415
 
406
416
  @property
@@ -30,6 +30,7 @@ from lightning_sdk.lightning_cloud.openapi.api.billing_service_api import Billin
30
30
  from lightning_sdk.lightning_cloud.openapi.api.blog_posts_service_api import BlogPostsServiceApi
31
31
  from lightning_sdk.lightning_cloud.openapi.api.cloud_space_environment_template_service_api import CloudSpaceEnvironmentTemplateServiceApi
32
32
  from lightning_sdk.lightning_cloud.openapi.api.cloud_space_service_api import CloudSpaceServiceApi
33
+ from lightning_sdk.lightning_cloud.openapi.api.cloudy_service_api import CloudyServiceApi
33
34
  from lightning_sdk.lightning_cloud.openapi.api.cluster_service_api import ClusterServiceApi
34
35
  from lightning_sdk.lightning_cloud.openapi.api.data_connection_service_api import DataConnectionServiceApi
35
36
  from lightning_sdk.lightning_cloud.openapi.api.dataset_service_api import DatasetServiceApi
@@ -89,6 +90,7 @@ from lightning_sdk.lightning_cloud.openapi.models.cloud_space_id_versions_body i
89
90
  from lightning_sdk.lightning_cloud.openapi.models.cloudspace_id_metric_body import CloudspaceIdMetricBody
90
91
  from lightning_sdk.lightning_cloud.openapi.models.cloudspace_id_runs_body import CloudspaceIdRunsBody
91
92
  from lightning_sdk.lightning_cloud.openapi.models.cloudspace_id_systemmetrics_body import CloudspaceIdSystemmetricsBody
93
+ from lightning_sdk.lightning_cloud.openapi.models.cloudspace_id_visibility_body import CloudspaceIdVisibilityBody
92
94
  from lightning_sdk.lightning_cloud.openapi.models.cloudspaces_id_body import CloudspacesIdBody
93
95
  from lightning_sdk.lightning_cloud.openapi.models.cluster_id_capacityblock_body import ClusterIdCapacityblockBody
94
96
  from lightning_sdk.lightning_cloud.openapi.models.cluster_id_capacityreservations_body import ClusterIdCapacityreservationsBody
@@ -102,6 +104,8 @@ from lightning_sdk.lightning_cloud.openapi.models.conversations_id_body import C
102
104
  from lightning_sdk.lightning_cloud.openapi.models.create import Create
103
105
  from lightning_sdk.lightning_cloud.openapi.models.create_checkout_session_request_wallet_type import CreateCheckoutSessionRequestWalletType
104
106
  from lightning_sdk.lightning_cloud.openapi.models.create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs import CreateDeploymentRequestDefinesASpecForTheJobThatAllowsForAutoscalingJobs
107
+ from lightning_sdk.lightning_cloud.openapi.models.credits_autoreplenish_body import CreditsAutoreplenishBody
108
+ from lightning_sdk.lightning_cloud.openapi.models.credits_autoreplenish_body1 import CreditsAutoreplenishBody1
105
109
  from lightning_sdk.lightning_cloud.openapi.models.data_connection_mount_data_connection_mount_copy_status import DataConnectionMountDataConnectionMountCopyStatus
106
110
  from lightning_sdk.lightning_cloud.openapi.models.dataset_id_versions_body import DatasetIdVersionsBody
107
111
  from lightning_sdk.lightning_cloud.openapi.models.dataset_id_visibility_body import DatasetIdVisibilityBody
@@ -174,6 +178,7 @@ from lightning_sdk.lightning_cloud.openapi.models.org_id_memberships_body import
174
178
  from lightning_sdk.lightning_cloud.openapi.models.org_id_roles_body import OrgIdRolesBody
175
179
  from lightning_sdk.lightning_cloud.openapi.models.orgs_id_body import OrgsIdBody
176
180
  from lightning_sdk.lightning_cloud.openapi.models.pipelines_id_body import PipelinesIdBody
181
+ from lightning_sdk.lightning_cloud.openapi.models.pipelines_id_body1 import PipelinesIdBody1
177
182
  from lightning_sdk.lightning_cloud.openapi.models.pipelinetemplates_id_body import PipelinetemplatesIdBody
178
183
  from lightning_sdk.lightning_cloud.openapi.models.profiler_captures_body import ProfilerCapturesBody
179
184
  from lightning_sdk.lightning_cloud.openapi.models.profiler_enabled_body import ProfilerEnabledBody
@@ -275,6 +280,8 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_cpu_system_metrics import V
275
280
  from lightning_sdk.lightning_cloud.openapi.models.v1_cancel_cloud_space_instance_switch_response import V1CancelCloudSpaceInstanceSwitchResponse
276
281
  from lightning_sdk.lightning_cloud.openapi.models.v1_cancellation_metadata import V1CancellationMetadata
277
282
  from lightning_sdk.lightning_cloud.openapi.models.v1_capacity_block_offering import V1CapacityBlockOffering
283
+ from lightning_sdk.lightning_cloud.openapi.models.v1_check_cluster_name_availability_request import V1CheckClusterNameAvailabilityRequest
284
+ from lightning_sdk.lightning_cloud.openapi.models.v1_check_cluster_name_availability_response import V1CheckClusterNameAvailabilityResponse
278
285
  from lightning_sdk.lightning_cloud.openapi.models.v1_check_external_service_status_response import V1CheckExternalServiceStatusResponse
279
286
  from lightning_sdk.lightning_cloud.openapi.models.v1_check_snowflake_connection_response import V1CheckSnowflakeConnectionResponse
280
287
  from lightning_sdk.lightning_cloud.openapi.models.v1_checkbox import V1Checkbox
@@ -305,10 +312,12 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_publication_typ
305
312
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_seed_file import V1CloudSpaceSeedFile
306
313
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_session import V1CloudSpaceSession
307
314
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_source_type import V1CloudSpaceSourceType
315
+ from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_specialized_view import V1CloudSpaceSpecializedView
308
316
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_state import V1CloudSpaceState
309
317
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_version import V1CloudSpaceVersion
310
318
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloud_space_version_publication import V1CloudSpaceVersionPublication
311
319
  from lightning_sdk.lightning_cloud.openapi.models.v1_cloudflare_v1 import V1CloudflareV1
320
+ from lightning_sdk.lightning_cloud.openapi.models.v1_cloudy_expert import V1CloudyExpert
312
321
  from lightning_sdk.lightning_cloud.openapi.models.v1_cluster_accelerator import V1ClusterAccelerator
313
322
  from lightning_sdk.lightning_cloud.openapi.models.v1_cluster_availability import V1ClusterAvailability
314
323
  from lightning_sdk.lightning_cloud.openapi.models.v1_cluster_capacity_reservation import V1ClusterCapacityReservation
@@ -499,6 +508,8 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_execute_in_cloud_space_sess
499
508
  from lightning_sdk.lightning_cloud.openapi.models.v1_execute_snowflake_query_response import V1ExecuteSnowflakeQueryResponse
500
509
  from lightning_sdk.lightning_cloud.openapi.models.v1_experiment import V1Experiment
501
510
  from lightning_sdk.lightning_cloud.openapi.models.v1_export_snowflake_query_response import V1ExportSnowflakeQueryResponse
511
+ from lightning_sdk.lightning_cloud.openapi.models.v1_external_cluster import V1ExternalCluster
512
+ from lightning_sdk.lightning_cloud.openapi.models.v1_external_cluster_spec import V1ExternalClusterSpec
502
513
  from lightning_sdk.lightning_cloud.openapi.models.v1_external_search_user import V1ExternalSearchUser
503
514
  from lightning_sdk.lightning_cloud.openapi.models.v1_file_endpoint import V1FileEndpoint
504
515
  from lightning_sdk.lightning_cloud.openapi.models.v1_filestore_data_connection import V1FilestoreDataConnection
@@ -594,6 +605,8 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_job_type import V1JobType
594
605
  from lightning_sdk.lightning_cloud.openapi.models.v1_joinable_organization import V1JoinableOrganization
595
606
  from lightning_sdk.lightning_cloud.openapi.models.v1_keep_alive_cloud_space_instance_response import V1KeepAliveCloudSpaceInstanceResponse
596
607
  from lightning_sdk.lightning_cloud.openapi.models.v1_knowledge_configuration import V1KnowledgeConfiguration
608
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_direct_v1 import V1KubernetesDirectV1
609
+ from lightning_sdk.lightning_cloud.openapi.models.v1_kubernetes_direct_v1_status import V1KubernetesDirectV1Status
597
610
  from lightning_sdk.lightning_cloud.openapi.models.v1_lambda_labs_direct_v1 import V1LambdaLabsDirectV1
598
611
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_app_user import V1LightningAppUser
599
612
  from lightning_sdk.lightning_cloud.openapi.models.v1_lightning_auth import V1LightningAuth
@@ -629,6 +642,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_cloud_space_tags_respo
629
642
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cloud_space_version_publications_response import V1ListCloudSpaceVersionPublicationsResponse
630
643
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cloud_space_versions_response import V1ListCloudSpaceVersionsResponse
631
644
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cloud_spaces_response import V1ListCloudSpacesResponse
645
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_cloudy_experts_response import V1ListCloudyExpertsResponse
632
646
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cluster_accelerators_response import V1ListClusterAcceleratorsResponse
633
647
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cluster_availabilities_response import V1ListClusterAvailabilitiesResponse
634
648
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_cluster_capacity_reservations_response import V1ListClusterCapacityReservationsResponse
@@ -719,6 +733,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_lit_page_type import V1LitP
719
733
  from lightning_sdk.lightning_cloud.openapi.models.v1_lit_registry_artifact import V1LitRegistryArtifact
720
734
  from lightning_sdk.lightning_cloud.openapi.models.v1_lit_registry_project import V1LitRegistryProject
721
735
  from lightning_sdk.lightning_cloud.openapi.models.v1_lit_repository import V1LitRepository
736
+ from lightning_sdk.lightning_cloud.openapi.models.v1_lite_published_cloud_space_response import V1LitePublishedCloudSpaceResponse
722
737
  from lightning_sdk.lightning_cloud.openapi.models.v1_locked_resource import V1LockedResource
723
738
  from lightning_sdk.lightning_cloud.openapi.models.v1_log_page import V1LogPage
724
739
  from lightning_sdk.lightning_cloud.openapi.models.v1_logger_artifact import V1LoggerArtifact
@@ -898,6 +913,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_system_metrics_aggregated i
898
913
  from lightning_sdk.lightning_cloud.openapi.models.v1_system_metrics_list import V1SystemMetricsList
899
914
  from lightning_sdk.lightning_cloud.openapi.models.v1_telemetry import V1Telemetry
900
915
  from lightning_sdk.lightning_cloud.openapi.models.v1_timestamp_code_telemetry import V1TimestampCodeTelemetry
916
+ from lightning_sdk.lightning_cloud.openapi.models.v1_token_usage import V1TokenUsage
901
917
  from lightning_sdk.lightning_cloud.openapi.models.v1_transaction import V1Transaction
902
918
  from lightning_sdk.lightning_cloud.openapi.models.v1_transfer_cloud_space_response import V1TransferCloudSpaceResponse
903
919
  from lightning_sdk.lightning_cloud.openapi.models.v1_transfer_org_balance_response import V1TransferOrgBalanceResponse
@@ -911,6 +927,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_update_agent_status_respons
911
927
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_billing_subscription_request import V1UpdateBillingSubscriptionRequest
912
928
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_cloud_space_collab_response import V1UpdateCloudSpaceCollabResponse
913
929
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_cloud_space_publication_response import V1UpdateCloudSpacePublicationResponse
930
+ from lightning_sdk.lightning_cloud.openapi.models.v1_update_cloud_space_visibility_response import V1UpdateCloudSpaceVisibilityResponse
914
931
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_cluster_accelerators_request import V1UpdateClusterAcceleratorsRequest
915
932
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_cluster_accelerators_response import V1UpdateClusterAcceleratorsResponse
916
933
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_cluster_availability_request import V1UpdateClusterAvailabilityRequest
@@ -922,9 +939,11 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_update_lit_page_response im
922
939
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_lit_repository_response import V1UpdateLitRepositoryResponse
923
940
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_metrics_stream_visibility_response import V1UpdateMetricsStreamVisibilityResponse
924
941
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_model_visibility_response import V1UpdateModelVisibilityResponse
942
+ from lightning_sdk.lightning_cloud.openapi.models.v1_update_organization_credits_auto_replenish_response import V1UpdateOrganizationCreditsAutoReplenishResponse
925
943
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_project_cluster_accelerators_response import V1UpdateProjectClusterAcceleratorsResponse
926
944
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_shared_metrics_stream_response import V1UpdateSharedMetricsStreamResponse
927
945
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_snowflake_query_response import V1UpdateSnowflakeQueryResponse
946
+ from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_credits_auto_replenish_response import V1UpdateUserCreditsAutoReplenishResponse
928
947
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_request import V1UpdateUserRequest
929
948
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_viewed_new_features_request import V1UpdateUserViewedNewFeaturesRequest
930
949
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_viewed_new_features_response import V1UpdateUserViewedNewFeaturesResponse
@@ -959,6 +978,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_validate_managed_model_resp
959
978
  from lightning_sdk.lightning_cloud.openapi.models.v1_verify_verification_response import V1VerifyVerificationResponse
960
979
  from lightning_sdk.lightning_cloud.openapi.models.v1_voltage_park_direct_v1 import V1VoltageParkDirectV1
961
980
  from lightning_sdk.lightning_cloud.openapi.models.v1_volume import V1Volume
981
+ from lightning_sdk.lightning_cloud.openapi.models.v1_volume_state import V1VolumeState
962
982
  from lightning_sdk.lightning_cloud.openapi.models.v1_vultr_direct_v1 import V1VultrDirectV1
963
983
  from lightning_sdk.lightning_cloud.openapi.models.v1_weka_data_connection import V1WekaDataConnection
964
984
  from lightning_sdk.lightning_cloud.openapi.models.v1_work import V1Work
@@ -11,6 +11,7 @@ from lightning_sdk.lightning_cloud.openapi.api.billing_service_api import Billin
11
11
  from lightning_sdk.lightning_cloud.openapi.api.blog_posts_service_api import BlogPostsServiceApi
12
12
  from lightning_sdk.lightning_cloud.openapi.api.cloud_space_environment_template_service_api import CloudSpaceEnvironmentTemplateServiceApi
13
13
  from lightning_sdk.lightning_cloud.openapi.api.cloud_space_service_api import CloudSpaceServiceApi
14
+ from lightning_sdk.lightning_cloud.openapi.api.cloudy_service_api import CloudyServiceApi
14
15
  from lightning_sdk.lightning_cloud.openapi.api.cluster_service_api import ClusterServiceApi
15
16
  from lightning_sdk.lightning_cloud.openapi.api.data_connection_service_api import DataConnectionServiceApi
16
17
  from lightning_sdk.lightning_cloud.openapi.api.dataset_service_api import DatasetServiceApi