lightning-sdk 2025.9.10__py3-none-any.whl → 2025.9.16__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.
lightning_sdk/__init__.py CHANGED
@@ -10,7 +10,7 @@ from lightning_sdk.organization import Organization
10
10
  from lightning_sdk.plugin import JobsPlugin, MultiMachineTrainingPlugin, Plugin, SlurmJobsPlugin
11
11
  from lightning_sdk.status import Status
12
12
  from lightning_sdk.studio import Studio
13
- from lightning_sdk.teamspace import Teamspace
13
+ from lightning_sdk.teamspace import FolderLocation, Teamspace
14
14
  from lightning_sdk.user import User
15
15
 
16
16
  __all__ = [
@@ -29,9 +29,10 @@ __all__ = [
29
29
  "Status",
30
30
  "Studio",
31
31
  "Teamspace",
32
+ "FolderLocation",
32
33
  "User",
33
34
  ]
34
35
 
35
- __version__ = "2025.09.10"
36
+ __version__ = "2025.09.16"
36
37
  _check_version_and_prompt_upgrade(__version__)
37
38
  _set_tqdm_envvars_noninteractive()
@@ -1,5 +1,6 @@
1
1
  from lightning_sdk.api.agents_api import AgentApi
2
2
  from lightning_sdk.api.ai_hub_api import AIHubApi
3
+ from lightning_sdk.api.cloud_account_api import CloudAccountApi
3
4
  from lightning_sdk.api.org_api import OrgApi
4
5
  from lightning_sdk.api.studio_api import StudioApi
5
6
  from lightning_sdk.api.teamspace_api import TeamspaceApi
@@ -12,4 +13,5 @@ __all__ = [
12
13
  "UserApi",
13
14
  "AgentApi",
14
15
  "AIHubApi",
16
+ "CloudAccountApi",
15
17
  ]
@@ -131,13 +131,20 @@ class CloudAccountApi:
131
131
  )
132
132
  return list(filtered_cloud_accounts)
133
133
 
134
- def get_cloud_account_provider_mapping(self, teamspace_id: str) -> Dict["CloudProvider", str]:
134
+ def get_cloud_account_provider_mapping(self, teamspace_id: str) -> Dict["CloudProvider", V1ExternalCluster]:
135
135
  """Gets the cloud account <-> provider mapping."""
136
136
  res = self.list_global_cloud_accounts(teamspace_id=teamspace_id)
137
- return {self._get_cloud_account_provider(cloud_account): cloud_account.id for cloud_account in res}
137
+ cloud_accounts = {cloud_account.id: cloud_account for cloud_account in res}
138
+ providers = {cloud_account.id: self._get_cloud_account_provider(cloud_account) for cloud_account in res}
139
+
140
+ mapping = {}
141
+ for cloud_account_id, provider in providers.items():
142
+ if provider is not None:
143
+ mapping[provider] = cloud_accounts[cloud_account_id]
144
+ return mapping
138
145
 
139
146
  @staticmethod
140
- def _get_cloud_account_provider(cloud_account: Optional[V1ExternalCluster]) -> "CloudProvider":
147
+ def _get_cloud_account_provider(cloud_account: Optional[V1ExternalCluster]) -> Optional["CloudProvider"]:
141
148
  """Determines the cloud provider based on the cloud_account configuration.
142
149
 
143
150
  Args:
@@ -172,7 +179,7 @@ class CloudAccountApi:
172
179
  if cloud_account.spec.nebius_v1:
173
180
  return CloudProvider.NEBIUS
174
181
 
175
- return CloudProvider.AWS
182
+ return None
176
183
 
177
184
  def resolve_cloud_account(
178
185
  self,
@@ -201,7 +208,7 @@ class CloudAccountApi:
201
208
  if cloud_provider:
202
209
  cloud_account_mapping = self.get_cloud_account_provider_mapping(teamspace_id=teamspace_id)
203
210
  if cloud_provider and cloud_provider in cloud_account_mapping:
204
- return cloud_account_mapping[cloud_provider]
211
+ return cloud_account_mapping[cloud_provider].id
205
212
 
206
213
  if default_cloud_account:
207
214
  return default_cloud_account
@@ -17,6 +17,7 @@ from lightning_sdk.api.utils import (
17
17
  )
18
18
  from lightning_sdk.lightning_cloud.login import Auth
19
19
  from lightning_sdk.lightning_cloud.openapi import (
20
+ Create,
20
21
  Externalv1LightningappInstance,
21
22
  ModelIdVersionsBody,
22
23
  ModelsStoreApi,
@@ -28,6 +29,8 @@ from lightning_sdk.lightning_cloud.openapi import (
28
29
  V1CloudSpace,
29
30
  V1ClusterAccelerator,
30
31
  V1Endpoint,
32
+ V1ExternalCluster,
33
+ V1GCSFolderDataConnection,
31
34
  V1Job,
32
35
  V1LoginRequest,
33
36
  V1Model,
@@ -36,6 +39,8 @@ from lightning_sdk.lightning_cloud.openapi import (
36
39
  V1Project,
37
40
  V1ProjectClusterBinding,
38
41
  V1PromptSuggestion,
42
+ V1R2DataConnection,
43
+ V1S3FolderDataConnection,
39
44
  V1Secret,
40
45
  V1SecretType,
41
46
  V1UpstreamOpenAI,
@@ -489,3 +494,24 @@ class TeamspaceApi:
489
494
  """
490
495
  pattern = r"^[A-Za-z_][A-Za-z0-9_]*$"
491
496
  return re.match(pattern, name) is not None
497
+
498
+ def new_folder(self, teamspace_id: str, name: str, cluster: Optional[V1ExternalCluster]) -> None:
499
+ create_request = Create(
500
+ name=name,
501
+ create_resources=True,
502
+ force=True,
503
+ writable=True,
504
+ )
505
+
506
+ if cluster is None:
507
+ create_request.r2 = V1R2DataConnection(name=name)
508
+ else:
509
+ create_request.cluster_id = cluster.id
510
+ create_request.access_cluster_ids = [cluster.id]
511
+
512
+ if cluster.spec.aws_v1:
513
+ create_request.s3_folder = V1S3FolderDataConnection()
514
+ elif cluster.spec.google_cloud_v1:
515
+ create_request.gcs_folder = V1GCSFolderDataConnection()
516
+
517
+ self._client.data_connection_service_create_data_connection(create_request, teamspace_id)
@@ -17,6 +17,11 @@ from starlette.background import BackgroundTask
17
17
  from starlette.responses import RedirectResponse
18
18
 
19
19
  from lightning_sdk.lightning_cloud import env
20
+ from lightning_sdk.lightning_cloud.openapi import ApiClient, Configuration
21
+ from lightning_sdk.lightning_cloud.openapi.api import \
22
+ AuthServiceApi
23
+ from lightning_sdk.lightning_cloud.openapi.models.v1_guest_login_request import \
24
+ V1GuestLoginRequest
20
25
 
21
26
  logger = logging.getLogger(__name__)
22
27
 
@@ -132,6 +137,61 @@ class Auth:
132
137
  "We couldn't find any credentials linked to your account. Please try logging in using the CLI command `lightning login`"
133
138
  )
134
139
 
140
+ def guest_login(self) -> Optional[str]:
141
+ """Performs guest user authentication.
142
+ This method sends a request to the guest login endpoint to get temporary
143
+ credentials, saves them, and returns the authorization header.
144
+ Useful to log experiments as a non signed in user, using a guest account
145
+ in the background.
146
+ Returns
147
+ -------
148
+ Optional[str]
149
+ The authorization header to use for subsequent requests.
150
+ Raises
151
+ ------
152
+ RuntimeError
153
+ If the guest login request fails.
154
+ ValueError
155
+ If the response from the server is invalid.
156
+ """
157
+
158
+ config = Configuration()
159
+ config.host = env.LIGHTNING_CLOUD_URL
160
+ api_client = ApiClient(configuration=config)
161
+ auth_api = AuthServiceApi(api_client)
162
+
163
+ logger.debug(f"Attempting guest login to {config.host}")
164
+
165
+ try:
166
+ # The body is an empty object for a guest login.
167
+ body = V1GuestLoginRequest()
168
+ credentials = auth_api.auth_service_guest_login(body)
169
+
170
+ except requests.RequestException as e:
171
+ logger.error(f"Guest login request failed: {e}")
172
+ raise RuntimeError(
173
+ "Failed to connect to the guest login endpoint. "
174
+ "Please check your network connection and the server status."
175
+ ) from e
176
+
177
+ # attributes based on the `V1GuestLoginResponse` model.
178
+ user = getattr(credentials, "user", None)
179
+ user_id = getattr(user, "id", None) if user else None
180
+ api_key = getattr(user, "api_key", None) if user else None
181
+
182
+ if not all([user_id, api_key]):
183
+ logger.error(
184
+ f"Incomplete credentials received from guest login: {credentials}"
185
+ )
186
+ raise ValueError(
187
+ "The guest login response did not contain the required 'user_id' and 'api_key' fields."
188
+ )
189
+
190
+ self.save(user_id=user_id, api_key=api_key)
191
+ logger.info("Successfully authenticated as a guest user.")
192
+
193
+ return self.auth_header
194
+
135
195
 
136
196
  class AuthServer:
137
197
 
@@ -207,6 +207,7 @@ from lightning_sdk.lightning_cloud.openapi.models.project_id_schedules_body impo
207
207
  from lightning_sdk.lightning_cloud.openapi.models.project_id_secrets_body import ProjectIdSecretsBody
208
208
  from lightning_sdk.lightning_cloud.openapi.models.project_id_snowflake_body import ProjectIdSnowflakeBody
209
209
  from lightning_sdk.lightning_cloud.openapi.models.project_id_storage_body import ProjectIdStorageBody
210
+ from lightning_sdk.lightning_cloud.openapi.models.project_tab_management_messages import ProjectTabManagementMessages
210
211
  from lightning_sdk.lightning_cloud.openapi.models.projects_id_body import ProjectsIdBody
211
212
  from lightning_sdk.lightning_cloud.openapi.models.projects_project_id_body import ProjectsProjectIdBody
212
213
  from lightning_sdk.lightning_cloud.openapi.models.protobuf_any import ProtobufAny
@@ -870,6 +871,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_project_membership_invite i
870
871
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_membership_role_binding import V1ProjectMembershipRoleBinding
871
872
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_settings import V1ProjectSettings
872
873
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_storage import V1ProjectStorage
874
+ from lightning_sdk.lightning_cloud.openapi.models.v1_project_tab import V1ProjectTab
873
875
  from lightning_sdk.lightning_cloud.openapi.models.v1_prompt_suggestion import V1PromptSuggestion
874
876
  from lightning_sdk.lightning_cloud.openapi.models.v1_publish_cloud_space_response import V1PublishCloudSpaceResponse
875
877
  from lightning_sdk.lightning_cloud.openapi.models.v1_published_cloud_space_response import V1PublishedCloudSpaceResponse
@@ -1002,6 +1004,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_update_metrics_stream_visib
1002
1004
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_model_visibility_response import V1UpdateModelVisibilityResponse
1003
1005
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_organization_credits_auto_replenish_response import V1UpdateOrganizationCreditsAutoReplenishResponse
1004
1006
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_project_cluster_accelerators_response import V1UpdateProjectClusterAcceleratorsResponse
1007
+ from lightning_sdk.lightning_cloud.openapi.models.v1_update_project_tab_order_response import V1UpdateProjectTabOrderResponse
1005
1008
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_shared_metrics_stream_response import V1UpdateSharedMetricsStreamResponse
1006
1009
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_snowflake_query_response import V1UpdateSnowflakeQueryResponse
1007
1010
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_credits_auto_replenish_response import V1UpdateUserCreditsAutoReplenishResponse
@@ -1965,3 +1965,108 @@ class ProjectsServiceApi(object):
1965
1965
  _preload_content=params.get('_preload_content', True),
1966
1966
  _request_timeout=params.get('_request_timeout'),
1967
1967
  collection_formats=collection_formats)
1968
+
1969
+ def projects_service_update_project_tab_order(self, body: 'ProjectTabManagementMessages', project_id: 'str', **kwargs) -> 'V1UpdateProjectTabOrderResponse': # noqa: E501
1970
+ """Project tab management # noqa: E501
1971
+
1972
+ This method makes a synchronous HTTP request by default. To make an
1973
+ asynchronous HTTP request, please pass async_req=True
1974
+ >>> thread = api.projects_service_update_project_tab_order(body, project_id, async_req=True)
1975
+ >>> result = thread.get()
1976
+
1977
+ :param async_req bool
1978
+ :param ProjectTabManagementMessages body: (required)
1979
+ :param str project_id: (required)
1980
+ :return: V1UpdateProjectTabOrderResponse
1981
+ If the method is called asynchronously,
1982
+ returns the request thread.
1983
+ """
1984
+ kwargs['_return_http_data_only'] = True
1985
+ if kwargs.get('async_req'):
1986
+ return self.projects_service_update_project_tab_order_with_http_info(body, project_id, **kwargs) # noqa: E501
1987
+ else:
1988
+ (data) = self.projects_service_update_project_tab_order_with_http_info(body, project_id, **kwargs) # noqa: E501
1989
+ return data
1990
+
1991
+ def projects_service_update_project_tab_order_with_http_info(self, body: 'ProjectTabManagementMessages', project_id: 'str', **kwargs) -> 'V1UpdateProjectTabOrderResponse': # noqa: E501
1992
+ """Project tab management # noqa: E501
1993
+
1994
+ This method makes a synchronous HTTP request by default. To make an
1995
+ asynchronous HTTP request, please pass async_req=True
1996
+ >>> thread = api.projects_service_update_project_tab_order_with_http_info(body, project_id, async_req=True)
1997
+ >>> result = thread.get()
1998
+
1999
+ :param async_req bool
2000
+ :param ProjectTabManagementMessages body: (required)
2001
+ :param str project_id: (required)
2002
+ :return: V1UpdateProjectTabOrderResponse
2003
+ If the method is called asynchronously,
2004
+ returns the request thread.
2005
+ """
2006
+
2007
+ all_params = ['body', 'project_id'] # noqa: E501
2008
+ all_params.append('async_req')
2009
+ all_params.append('_return_http_data_only')
2010
+ all_params.append('_preload_content')
2011
+ all_params.append('_request_timeout')
2012
+
2013
+ params = locals()
2014
+ for key, val in six.iteritems(params['kwargs']):
2015
+ if key not in all_params:
2016
+ raise TypeError(
2017
+ "Got an unexpected keyword argument '%s'"
2018
+ " to method projects_service_update_project_tab_order" % key
2019
+ )
2020
+ params[key] = val
2021
+ del params['kwargs']
2022
+ # verify the required parameter 'body' is set
2023
+ if ('body' not in params or
2024
+ params['body'] is None):
2025
+ raise ValueError("Missing the required parameter `body` when calling `projects_service_update_project_tab_order`") # noqa: E501
2026
+ # verify the required parameter 'project_id' is set
2027
+ if ('project_id' not in params or
2028
+ params['project_id'] is None):
2029
+ raise ValueError("Missing the required parameter `project_id` when calling `projects_service_update_project_tab_order`") # noqa: E501
2030
+
2031
+ collection_formats = {}
2032
+
2033
+ path_params = {}
2034
+ if 'project_id' in params:
2035
+ path_params['projectId'] = params['project_id'] # noqa: E501
2036
+
2037
+ query_params = []
2038
+
2039
+ header_params = {}
2040
+
2041
+ form_params = []
2042
+ local_var_files = {}
2043
+
2044
+ body_params = None
2045
+ if 'body' in params:
2046
+ body_params = params['body']
2047
+ # HTTP header `Accept`
2048
+ header_params['Accept'] = self.api_client.select_header_accept(
2049
+ ['application/json']) # noqa: E501
2050
+
2051
+ # HTTP header `Content-Type`
2052
+ header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501
2053
+ ['application/json']) # noqa: E501
2054
+
2055
+ # Authentication setting
2056
+ auth_settings = [] # noqa: E501
2057
+
2058
+ return self.api_client.call_api(
2059
+ '/v1/projects/{projectId}/tab-order', 'PUT',
2060
+ path_params,
2061
+ query_params,
2062
+ header_params,
2063
+ body=body_params,
2064
+ post_params=form_params,
2065
+ files=local_var_files,
2066
+ response_type='V1UpdateProjectTabOrderResponse', # noqa: E501
2067
+ auth_settings=auth_settings,
2068
+ async_req=params.get('async_req'),
2069
+ _return_http_data_only=params.get('_return_http_data_only'),
2070
+ _preload_content=params.get('_preload_content', True),
2071
+ _request_timeout=params.get('_request_timeout'),
2072
+ collection_formats=collection_formats)
@@ -159,6 +159,7 @@ from lightning_sdk.lightning_cloud.openapi.models.project_id_schedules_body impo
159
159
  from lightning_sdk.lightning_cloud.openapi.models.project_id_secrets_body import ProjectIdSecretsBody
160
160
  from lightning_sdk.lightning_cloud.openapi.models.project_id_snowflake_body import ProjectIdSnowflakeBody
161
161
  from lightning_sdk.lightning_cloud.openapi.models.project_id_storage_body import ProjectIdStorageBody
162
+ from lightning_sdk.lightning_cloud.openapi.models.project_tab_management_messages import ProjectTabManagementMessages
162
163
  from lightning_sdk.lightning_cloud.openapi.models.projects_id_body import ProjectsIdBody
163
164
  from lightning_sdk.lightning_cloud.openapi.models.projects_project_id_body import ProjectsProjectIdBody
164
165
  from lightning_sdk.lightning_cloud.openapi.models.protobuf_any import ProtobufAny
@@ -822,6 +823,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_project_membership_invite i
822
823
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_membership_role_binding import V1ProjectMembershipRoleBinding
823
824
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_settings import V1ProjectSettings
824
825
  from lightning_sdk.lightning_cloud.openapi.models.v1_project_storage import V1ProjectStorage
826
+ from lightning_sdk.lightning_cloud.openapi.models.v1_project_tab import V1ProjectTab
825
827
  from lightning_sdk.lightning_cloud.openapi.models.v1_prompt_suggestion import V1PromptSuggestion
826
828
  from lightning_sdk.lightning_cloud.openapi.models.v1_publish_cloud_space_response import V1PublishCloudSpaceResponse
827
829
  from lightning_sdk.lightning_cloud.openapi.models.v1_published_cloud_space_response import V1PublishedCloudSpaceResponse
@@ -954,6 +956,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_update_metrics_stream_visib
954
956
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_model_visibility_response import V1UpdateModelVisibilityResponse
955
957
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_organization_credits_auto_replenish_response import V1UpdateOrganizationCreditsAutoReplenishResponse
956
958
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_project_cluster_accelerators_response import V1UpdateProjectClusterAcceleratorsResponse
959
+ from lightning_sdk.lightning_cloud.openapi.models.v1_update_project_tab_order_response import V1UpdateProjectTabOrderResponse
957
960
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_shared_metrics_stream_response import V1UpdateSharedMetricsStreamResponse
958
961
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_snowflake_query_response import V1UpdateSnowflakeQueryResponse
959
962
  from lightning_sdk.lightning_cloud.openapi.models.v1_update_user_credits_auto_replenish_response import V1UpdateUserCreditsAutoReplenishResponse
@@ -0,0 +1,123 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ external/v1/auth_service.proto
5
+
6
+ No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) # noqa: E501
7
+
8
+ OpenAPI spec version: version not set
9
+
10
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
11
+
12
+ NOTE
13
+ ----
14
+ standard swagger-codegen-cli for this python client has been modified
15
+ by custom templates. The purpose of these templates is to include
16
+ typing information in the API and Model code. Please refer to the
17
+ main grid repository for more info
18
+ """
19
+
20
+ import pprint
21
+ import re # noqa: F401
22
+
23
+ from typing import TYPE_CHECKING
24
+
25
+ import six
26
+
27
+ if TYPE_CHECKING:
28
+ from datetime import datetime
29
+ from lightning_sdk.lightning_cloud.openapi.models import *
30
+
31
+ class ProjectTabManagementMessages(object):
32
+ """NOTE: This class is auto generated by the swagger code generator program.
33
+
34
+ Do not edit the class manually.
35
+ """
36
+ """
37
+ Attributes:
38
+ swagger_types (dict): The key is attribute name
39
+ and the value is attribute type.
40
+ attribute_map (dict): The key is attribute name
41
+ and the value is json key in definition.
42
+ """
43
+ swagger_types = {
44
+ 'tabs': 'list[V1ProjectTab]'
45
+ }
46
+
47
+ attribute_map = {
48
+ 'tabs': 'tabs'
49
+ }
50
+
51
+ def __init__(self, tabs: 'list[V1ProjectTab]' =None): # noqa: E501
52
+ """ProjectTabManagementMessages - a model defined in Swagger""" # noqa: E501
53
+ self._tabs = None
54
+ self.discriminator = None
55
+ if tabs is not None:
56
+ self.tabs = tabs
57
+
58
+ @property
59
+ def tabs(self) -> 'list[V1ProjectTab]':
60
+ """Gets the tabs of this ProjectTabManagementMessages. # noqa: E501
61
+
62
+
63
+ :return: The tabs of this ProjectTabManagementMessages. # noqa: E501
64
+ :rtype: list[V1ProjectTab]
65
+ """
66
+ return self._tabs
67
+
68
+ @tabs.setter
69
+ def tabs(self, tabs: 'list[V1ProjectTab]'):
70
+ """Sets the tabs of this ProjectTabManagementMessages.
71
+
72
+
73
+ :param tabs: The tabs of this ProjectTabManagementMessages. # noqa: E501
74
+ :type: list[V1ProjectTab]
75
+ """
76
+
77
+ self._tabs = tabs
78
+
79
+ def to_dict(self) -> dict:
80
+ """Returns the model properties as a dict"""
81
+ result = {}
82
+
83
+ for attr, _ in six.iteritems(self.swagger_types):
84
+ value = getattr(self, attr)
85
+ if isinstance(value, list):
86
+ result[attr] = list(map(
87
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
88
+ value
89
+ ))
90
+ elif hasattr(value, "to_dict"):
91
+ result[attr] = value.to_dict()
92
+ elif isinstance(value, dict):
93
+ result[attr] = dict(map(
94
+ lambda item: (item[0], item[1].to_dict())
95
+ if hasattr(item[1], "to_dict") else item,
96
+ value.items()
97
+ ))
98
+ else:
99
+ result[attr] = value
100
+ if issubclass(ProjectTabManagementMessages, dict):
101
+ for key, value in self.items():
102
+ result[key] = value
103
+
104
+ return result
105
+
106
+ def to_str(self) -> str:
107
+ """Returns the string representation of the model"""
108
+ return pprint.pformat(self.to_dict())
109
+
110
+ def __repr__(self) -> str:
111
+ """For `print` and `pprint`"""
112
+ return self.to_str()
113
+
114
+ def __eq__(self, other: 'ProjectTabManagementMessages') -> bool:
115
+ """Returns true if both objects are equal"""
116
+ if not isinstance(other, ProjectTabManagementMessages):
117
+ return False
118
+
119
+ return self.__dict__ == other.__dict__
120
+
121
+ def __ne__(self, other: 'ProjectTabManagementMessages') -> bool:
122
+ """Returns true if both objects are not equal"""
123
+ return not self == other
@@ -57,6 +57,7 @@ class ProjectsIdBody(object):
57
57
  'default_machine_type': 'str',
58
58
  'description': 'str',
59
59
  'display_name': 'str',
60
+ 'layout_config': 'list[V1ProjectTab]',
60
61
  'name': 'str',
61
62
  'preferred_cluster': 'str',
62
63
  'preferred_deployment_provider': 'str',
@@ -84,6 +85,7 @@ class ProjectsIdBody(object):
84
85
  'default_machine_type': 'defaultMachineType',
85
86
  'description': 'description',
86
87
  'display_name': 'displayName',
88
+ 'layout_config': 'layoutConfig',
87
89
  'name': 'name',
88
90
  'preferred_cluster': 'preferredCluster',
89
91
  'preferred_deployment_provider': 'preferredDeploymentProvider',
@@ -94,7 +96,7 @@ class ProjectsIdBody(object):
94
96
  'switch_to_default_machine_on_idle': 'switchToDefaultMachineOnIdle'
95
97
  }
96
98
 
97
- def __init__(self, allow_aws_saas: 'bool' =None, allow_credits_auto_replenish: 'bool' =None, allow_dgx_saas: 'bool' =None, allow_external_project_duplication: 'bool' =None, allow_gcp_saas: 'bool' =None, allow_lambda_saas: 'bool' =None, allow_lightning_saas: 'bool' =None, allow_nebius_saas: 'bool' =None, allow_voltage_park_saas: 'bool' =None, allow_vultr_saas: 'bool' =None, auto_replenish_amount: 'float' =None, auto_replenish_threshold: 'float' =None, auto_switch_machine: 'bool' =None, default_machine_type: 'str' =None, description: 'str' =None, display_name: 'str' =None, name: 'str' =None, preferred_cluster: 'str' =None, preferred_deployment_provider: 'str' =None, preferred_studio_provider: 'str' =None, quotas: 'V1Quotas' =None, same_compute_on_resume: 'bool' =None, start_studio_on_spot_instance: 'bool' =None, switch_to_default_machine_on_idle: 'bool' =None): # noqa: E501
99
+ def __init__(self, allow_aws_saas: 'bool' =None, allow_credits_auto_replenish: 'bool' =None, allow_dgx_saas: 'bool' =None, allow_external_project_duplication: 'bool' =None, allow_gcp_saas: 'bool' =None, allow_lambda_saas: 'bool' =None, allow_lightning_saas: 'bool' =None, allow_nebius_saas: 'bool' =None, allow_voltage_park_saas: 'bool' =None, allow_vultr_saas: 'bool' =None, auto_replenish_amount: 'float' =None, auto_replenish_threshold: 'float' =None, auto_switch_machine: 'bool' =None, default_machine_type: 'str' =None, description: 'str' =None, display_name: 'str' =None, layout_config: 'list[V1ProjectTab]' =None, name: 'str' =None, preferred_cluster: 'str' =None, preferred_deployment_provider: 'str' =None, preferred_studio_provider: 'str' =None, quotas: 'V1Quotas' =None, same_compute_on_resume: 'bool' =None, start_studio_on_spot_instance: 'bool' =None, switch_to_default_machine_on_idle: 'bool' =None): # noqa: E501
98
100
  """ProjectsIdBody - a model defined in Swagger""" # noqa: E501
99
101
  self._allow_aws_saas = None
100
102
  self._allow_credits_auto_replenish = None
@@ -112,6 +114,7 @@ class ProjectsIdBody(object):
112
114
  self._default_machine_type = None
113
115
  self._description = None
114
116
  self._display_name = None
117
+ self._layout_config = None
115
118
  self._name = None
116
119
  self._preferred_cluster = None
117
120
  self._preferred_deployment_provider = None
@@ -153,6 +156,8 @@ class ProjectsIdBody(object):
153
156
  self.description = description
154
157
  if display_name is not None:
155
158
  self.display_name = display_name
159
+ if layout_config is not None:
160
+ self.layout_config = layout_config
156
161
  if name is not None:
157
162
  self.name = name
158
163
  if preferred_cluster is not None:
@@ -506,6 +511,27 @@ class ProjectsIdBody(object):
506
511
 
507
512
  self._display_name = display_name
508
513
 
514
+ @property
515
+ def layout_config(self) -> 'list[V1ProjectTab]':
516
+ """Gets the layout_config of this ProjectsIdBody. # noqa: E501
517
+
518
+
519
+ :return: The layout_config of this ProjectsIdBody. # noqa: E501
520
+ :rtype: list[V1ProjectTab]
521
+ """
522
+ return self._layout_config
523
+
524
+ @layout_config.setter
525
+ def layout_config(self, layout_config: 'list[V1ProjectTab]'):
526
+ """Sets the layout_config of this ProjectsIdBody.
527
+
528
+
529
+ :param layout_config: The layout_config of this ProjectsIdBody. # noqa: E501
530
+ :type: list[V1ProjectTab]
531
+ """
532
+
533
+ self._layout_config = layout_config
534
+
509
535
  @property
510
536
  def name(self) -> 'str':
511
537
  """Gets the name of this ProjectsIdBody. # noqa: E501
@@ -41,6 +41,7 @@ class V1IncidentType(object):
41
41
  K8S_HIGH_TEMPERATURE = "INCIDENT_TYPE_K8S_HIGH_TEMPERATURE"
42
42
  K8S_UNSCHEDULABLE_GPUS = "INCIDENT_TYPE_K8S_UNSCHEDULABLE_GPUS"
43
43
  K8S_XID_GPU_ERROR = "INCIDENT_TYPE_K8S_XID_GPU_ERROR"
44
+ K8S_UNSCHEDULABLE_NODE = "INCIDENT_TYPE_K8S_UNSCHEDULABLE_NODE"
44
45
  """
45
46
  Attributes:
46
47
  swagger_types (dict): The key is attribute name
@@ -50,6 +50,7 @@ class V1Project(object):
50
50
  'free_storage_bytes': 'str',
51
51
  'id': 'str',
52
52
  'is_default': 'bool',
53
+ 'layout_config': 'list[V1ProjectTab]',
53
54
  'lock_out_uploads': 'bool',
54
55
  'name': 'str',
55
56
  'number_of_files_uploads': 'str',
@@ -73,6 +74,7 @@ class V1Project(object):
73
74
  'free_storage_bytes': 'freeStorageBytes',
74
75
  'id': 'id',
75
76
  'is_default': 'isDefault',
77
+ 'layout_config': 'layoutConfig',
76
78
  'lock_out_uploads': 'lockOutUploads',
77
79
  'name': 'name',
78
80
  'number_of_files_uploads': 'numberOfFilesUploads',
@@ -86,7 +88,7 @@ class V1Project(object):
86
88
  'updated_at': 'updatedAt'
87
89
  }
88
90
 
89
- def __init__(self, abac_enabled: 'bool' =None, created_at: 'datetime' =None, creator_id: 'str' =None, current_storage_bytes: 'str' =None, description: 'str' =None, display_name: 'str' =None, free_storage_bytes: 'str' =None, id: 'str' =None, is_default: 'bool' =None, lock_out_uploads: 'bool' =None, name: 'str' =None, number_of_files_uploads: 'str' =None, owner_id: 'str' =None, owner_type: 'V1OwnerType' =None, private: 'bool' =None, project_settings: 'V1ProjectSettings' =None, quotas: 'V1Quotas' =None, requires_uploads_sync: 'bool' =None, total_size_uploads_bytes: 'str' =None, updated_at: 'datetime' =None): # noqa: E501
91
+ def __init__(self, abac_enabled: 'bool' =None, created_at: 'datetime' =None, creator_id: 'str' =None, current_storage_bytes: 'str' =None, description: 'str' =None, display_name: 'str' =None, free_storage_bytes: 'str' =None, id: 'str' =None, is_default: 'bool' =None, layout_config: 'list[V1ProjectTab]' =None, lock_out_uploads: 'bool' =None, name: 'str' =None, number_of_files_uploads: 'str' =None, owner_id: 'str' =None, owner_type: 'V1OwnerType' =None, private: 'bool' =None, project_settings: 'V1ProjectSettings' =None, quotas: 'V1Quotas' =None, requires_uploads_sync: 'bool' =None, total_size_uploads_bytes: 'str' =None, updated_at: 'datetime' =None): # noqa: E501
90
92
  """V1Project - a model defined in Swagger""" # noqa: E501
91
93
  self._abac_enabled = None
92
94
  self._created_at = None
@@ -97,6 +99,7 @@ class V1Project(object):
97
99
  self._free_storage_bytes = None
98
100
  self._id = None
99
101
  self._is_default = None
102
+ self._layout_config = None
100
103
  self._lock_out_uploads = None
101
104
  self._name = None
102
105
  self._number_of_files_uploads = None
@@ -127,6 +130,8 @@ class V1Project(object):
127
130
  self.id = id
128
131
  if is_default is not None:
129
132
  self.is_default = is_default
133
+ if layout_config is not None:
134
+ self.layout_config = layout_config
130
135
  if lock_out_uploads is not None:
131
136
  self.lock_out_uploads = lock_out_uploads
132
137
  if name is not None:
@@ -339,6 +344,27 @@ class V1Project(object):
339
344
 
340
345
  self._is_default = is_default
341
346
 
347
+ @property
348
+ def layout_config(self) -> 'list[V1ProjectTab]':
349
+ """Gets the layout_config of this V1Project. # noqa: E501
350
+
351
+
352
+ :return: The layout_config of this V1Project. # noqa: E501
353
+ :rtype: list[V1ProjectTab]
354
+ """
355
+ return self._layout_config
356
+
357
+ @layout_config.setter
358
+ def layout_config(self, layout_config: 'list[V1ProjectTab]'):
359
+ """Sets the layout_config of this V1Project.
360
+
361
+
362
+ :param layout_config: The layout_config of this V1Project. # noqa: E501
363
+ :type: list[V1ProjectTab]
364
+ """
365
+
366
+ self._layout_config = layout_config
367
+
342
368
  @property
343
369
  def lock_out_uploads(self) -> 'bool':
344
370
  """Gets the lock_out_uploads of this V1Project. # noqa: E501
@@ -0,0 +1,149 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ external/v1/auth_service.proto
5
+
6
+ No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) # noqa: E501
7
+
8
+ OpenAPI spec version: version not set
9
+
10
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
11
+
12
+ NOTE
13
+ ----
14
+ standard swagger-codegen-cli for this python client has been modified
15
+ by custom templates. The purpose of these templates is to include
16
+ typing information in the API and Model code. Please refer to the
17
+ main grid repository for more info
18
+ """
19
+
20
+ import pprint
21
+ import re # noqa: F401
22
+
23
+ from typing import TYPE_CHECKING
24
+
25
+ import six
26
+
27
+ if TYPE_CHECKING:
28
+ from datetime import datetime
29
+ from lightning_sdk.lightning_cloud.openapi.models import *
30
+
31
+ class V1ProjectTab(object):
32
+ """NOTE: This class is auto generated by the swagger code generator program.
33
+
34
+ Do not edit the class manually.
35
+ """
36
+ """
37
+ Attributes:
38
+ swagger_types (dict): The key is attribute name
39
+ and the value is attribute type.
40
+ attribute_map (dict): The key is attribute name
41
+ and the value is json key in definition.
42
+ """
43
+ swagger_types = {
44
+ 'is_enabled': 'bool',
45
+ 'slug': 'str'
46
+ }
47
+
48
+ attribute_map = {
49
+ 'is_enabled': 'isEnabled',
50
+ 'slug': 'slug'
51
+ }
52
+
53
+ def __init__(self, is_enabled: 'bool' =None, slug: 'str' =None): # noqa: E501
54
+ """V1ProjectTab - a model defined in Swagger""" # noqa: E501
55
+ self._is_enabled = None
56
+ self._slug = None
57
+ self.discriminator = None
58
+ if is_enabled is not None:
59
+ self.is_enabled = is_enabled
60
+ if slug is not None:
61
+ self.slug = slug
62
+
63
+ @property
64
+ def is_enabled(self) -> 'bool':
65
+ """Gets the is_enabled of this V1ProjectTab. # noqa: E501
66
+
67
+
68
+ :return: The is_enabled of this V1ProjectTab. # noqa: E501
69
+ :rtype: bool
70
+ """
71
+ return self._is_enabled
72
+
73
+ @is_enabled.setter
74
+ def is_enabled(self, is_enabled: 'bool'):
75
+ """Sets the is_enabled of this V1ProjectTab.
76
+
77
+
78
+ :param is_enabled: The is_enabled of this V1ProjectTab. # noqa: E501
79
+ :type: bool
80
+ """
81
+
82
+ self._is_enabled = is_enabled
83
+
84
+ @property
85
+ def slug(self) -> 'str':
86
+ """Gets the slug of this V1ProjectTab. # noqa: E501
87
+
88
+
89
+ :return: The slug of this V1ProjectTab. # noqa: E501
90
+ :rtype: str
91
+ """
92
+ return self._slug
93
+
94
+ @slug.setter
95
+ def slug(self, slug: 'str'):
96
+ """Sets the slug of this V1ProjectTab.
97
+
98
+
99
+ :param slug: The slug of this V1ProjectTab. # noqa: E501
100
+ :type: str
101
+ """
102
+
103
+ self._slug = slug
104
+
105
+ def to_dict(self) -> dict:
106
+ """Returns the model properties as a dict"""
107
+ result = {}
108
+
109
+ for attr, _ in six.iteritems(self.swagger_types):
110
+ value = getattr(self, attr)
111
+ if isinstance(value, list):
112
+ result[attr] = list(map(
113
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
114
+ value
115
+ ))
116
+ elif hasattr(value, "to_dict"):
117
+ result[attr] = value.to_dict()
118
+ elif isinstance(value, dict):
119
+ result[attr] = dict(map(
120
+ lambda item: (item[0], item[1].to_dict())
121
+ if hasattr(item[1], "to_dict") else item,
122
+ value.items()
123
+ ))
124
+ else:
125
+ result[attr] = value
126
+ if issubclass(V1ProjectTab, dict):
127
+ for key, value in self.items():
128
+ result[key] = value
129
+
130
+ return result
131
+
132
+ def to_str(self) -> str:
133
+ """Returns the string representation of the model"""
134
+ return pprint.pformat(self.to_dict())
135
+
136
+ def __repr__(self) -> str:
137
+ """For `print` and `pprint`"""
138
+ return self.to_str()
139
+
140
+ def __eq__(self, other: 'V1ProjectTab') -> bool:
141
+ """Returns true if both objects are equal"""
142
+ if not isinstance(other, V1ProjectTab):
143
+ return False
144
+
145
+ return self.__dict__ == other.__dict__
146
+
147
+ def __ne__(self, other: 'V1ProjectTab') -> bool:
148
+ """Returns true if both objects are not equal"""
149
+ return not self == other
@@ -0,0 +1,123 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ external/v1/auth_service.proto
5
+
6
+ No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen) # noqa: E501
7
+
8
+ OpenAPI spec version: version not set
9
+
10
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
11
+
12
+ NOTE
13
+ ----
14
+ standard swagger-codegen-cli for this python client has been modified
15
+ by custom templates. The purpose of these templates is to include
16
+ typing information in the API and Model code. Please refer to the
17
+ main grid repository for more info
18
+ """
19
+
20
+ import pprint
21
+ import re # noqa: F401
22
+
23
+ from typing import TYPE_CHECKING
24
+
25
+ import six
26
+
27
+ if TYPE_CHECKING:
28
+ from datetime import datetime
29
+ from lightning_sdk.lightning_cloud.openapi.models import *
30
+
31
+ class V1UpdateProjectTabOrderResponse(object):
32
+ """NOTE: This class is auto generated by the swagger code generator program.
33
+
34
+ Do not edit the class manually.
35
+ """
36
+ """
37
+ Attributes:
38
+ swagger_types (dict): The key is attribute name
39
+ and the value is attribute type.
40
+ attribute_map (dict): The key is attribute name
41
+ and the value is json key in definition.
42
+ """
43
+ swagger_types = {
44
+ 'tabs': 'list[V1ProjectTab]'
45
+ }
46
+
47
+ attribute_map = {
48
+ 'tabs': 'tabs'
49
+ }
50
+
51
+ def __init__(self, tabs: 'list[V1ProjectTab]' =None): # noqa: E501
52
+ """V1UpdateProjectTabOrderResponse - a model defined in Swagger""" # noqa: E501
53
+ self._tabs = None
54
+ self.discriminator = None
55
+ if tabs is not None:
56
+ self.tabs = tabs
57
+
58
+ @property
59
+ def tabs(self) -> 'list[V1ProjectTab]':
60
+ """Gets the tabs of this V1UpdateProjectTabOrderResponse. # noqa: E501
61
+
62
+
63
+ :return: The tabs of this V1UpdateProjectTabOrderResponse. # noqa: E501
64
+ :rtype: list[V1ProjectTab]
65
+ """
66
+ return self._tabs
67
+
68
+ @tabs.setter
69
+ def tabs(self, tabs: 'list[V1ProjectTab]'):
70
+ """Sets the tabs of this V1UpdateProjectTabOrderResponse.
71
+
72
+
73
+ :param tabs: The tabs of this V1UpdateProjectTabOrderResponse. # noqa: E501
74
+ :type: list[V1ProjectTab]
75
+ """
76
+
77
+ self._tabs = tabs
78
+
79
+ def to_dict(self) -> dict:
80
+ """Returns the model properties as a dict"""
81
+ result = {}
82
+
83
+ for attr, _ in six.iteritems(self.swagger_types):
84
+ value = getattr(self, attr)
85
+ if isinstance(value, list):
86
+ result[attr] = list(map(
87
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
88
+ value
89
+ ))
90
+ elif hasattr(value, "to_dict"):
91
+ result[attr] = value.to_dict()
92
+ elif isinstance(value, dict):
93
+ result[attr] = dict(map(
94
+ lambda item: (item[0], item[1].to_dict())
95
+ if hasattr(item[1], "to_dict") else item,
96
+ value.items()
97
+ ))
98
+ else:
99
+ result[attr] = value
100
+ if issubclass(V1UpdateProjectTabOrderResponse, dict):
101
+ for key, value in self.items():
102
+ result[key] = value
103
+
104
+ return result
105
+
106
+ def to_str(self) -> str:
107
+ """Returns the string representation of the model"""
108
+ return pprint.pformat(self.to_dict())
109
+
110
+ def __repr__(self) -> str:
111
+ """For `print` and `pprint`"""
112
+ return self.to_str()
113
+
114
+ def __eq__(self, other: 'V1UpdateProjectTabOrderResponse') -> bool:
115
+ """Returns true if both objects are equal"""
116
+ if not isinstance(other, V1UpdateProjectTabOrderResponse):
117
+ return False
118
+
119
+ return self.__dict__ == other.__dict__
120
+
121
+ def __ne__(self, other: 'V1UpdateProjectTabOrderResponse') -> bool:
122
+ """Returns true if both objects are not equal"""
123
+ return not self == other
lightning_sdk/llm/llm.py CHANGED
@@ -117,6 +117,15 @@ class LLM:
117
117
  def metadata(self) -> ModelMetadata:
118
118
  if self._metadata is None:
119
119
  model = self._llm_api.get_model_metadata(self._teamspace_id, self._model_name)
120
+ abilities = (
121
+ model.abilities
122
+ or type(
123
+ "obj",
124
+ (object,),
125
+ {"can_receive_images": False, "can_receive_files": False, "can_call_hub_deployment": False},
126
+ )()
127
+ )
128
+
120
129
  self._metadata = ModelMetadata(
121
130
  name=self._model_name,
122
131
  provider=self._model_provider,
@@ -126,9 +135,9 @@ class LLM:
126
135
  prompt_price=model.prompt_token_price,
127
136
  completion_price=model.completion_token_price,
128
137
  capabilities={
129
- "images": model.abilities.can_receive_images,
130
- "files": model.abilities.can_receive_files,
131
- "hub_deployment": model.abilities.can_call_hub_deployment,
138
+ "images": abilities.can_receive_images,
139
+ "files": abilities.can_receive_files,
140
+ "hub_deployment": abilities.can_call_hub_deployment,
132
141
  },
133
142
  throughput=model.throughput,
134
143
  time_to_first_token=model.time_to_first_token,
@@ -359,7 +368,7 @@ class LLM:
359
368
  metadata: Optional[Dict[str, str]] = None,
360
369
  stream: bool = False,
361
370
  full_response: bool = False,
362
- reasoning_effort: Optional[Literal["low", "medium", "highc"]] = None,
371
+ reasoning_effort: Optional[Literal["none", "low", "medium", "high"]] = None,
363
372
  **kwargs: Any,
364
373
  ) -> Union[str, AsyncGenerator[str, None]]:
365
374
  conversation_id = self._conversations.get(conversation) if conversation else None
@@ -395,13 +404,13 @@ class LLM:
395
404
  stream: bool = False,
396
405
  full_response: bool = False,
397
406
  tools: Optional[List[Dict[str, Any]]] = None,
398
- reasoning_effort: Optional[Literal["low", "medium", "high"]] = None,
407
+ reasoning_effort: Optional[Literal["none", "low", "medium", "high"]] = None,
399
408
  **kwargs: Any,
400
409
  ) -> Union[
401
410
  V1ConversationResponseChunk, Generator[V1ConversationResponseChunk, None, None], str, Generator[str, None, None]
402
411
  ]:
403
- if reasoning_effort is not None and reasoning_effort not in ["low", "medium", "high"]:
404
- raise ValueError("reasoning_effort must be 'low', 'medium', 'high', or None")
412
+ if reasoning_effort is not None and reasoning_effort not in ["none", "low", "medium", "high"]:
413
+ raise ValueError("reasoning_effort must be 'none', 'low', 'medium', 'high', or None")
405
414
 
406
415
  if conversation and conversation not in self._conversations:
407
416
  self._get_conversations()
@@ -1,6 +1,7 @@
1
1
  import glob
2
2
  import os
3
3
  import warnings
4
+ from enum import Enum
4
5
  from pathlib import Path
5
6
  from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Union
6
7
 
@@ -8,9 +9,9 @@ from tqdm.auto import tqdm
8
9
 
9
10
  import lightning_sdk
10
11
  from lightning_sdk.agents import Agent
11
- from lightning_sdk.api import TeamspaceApi
12
- from lightning_sdk.lightning_cloud.openapi import V1Model, V1ModelVersionArchive, V1ProjectClusterBinding
13
- from lightning_sdk.machine import Machine
12
+ from lightning_sdk.api import CloudAccountApi, TeamspaceApi
13
+ from lightning_sdk.lightning_cloud.openapi import V1ClusterType, V1Model, V1ModelVersionArchive, V1ProjectClusterBinding
14
+ from lightning_sdk.machine import CloudProvider, Machine
14
15
  from lightning_sdk.models import UploadedModelInfo
15
16
  from lightning_sdk.organization import Organization
16
17
  from lightning_sdk.owner import Owner
@@ -30,6 +31,16 @@ if TYPE_CHECKING:
30
31
  from lightning_sdk.studio import Studio
31
32
 
32
33
 
34
+ class FolderLocation(Enum):
35
+ AWS = "AWS"
36
+ GCP = "GCP"
37
+ CLOUD_AGNOSTIC = "CLOUD_AGNOSTIC"
38
+
39
+ def __str__(self) -> str:
40
+ """Converts the FolderLocation to a str."""
41
+ return self.value
42
+
43
+
33
44
  class Teamspace:
34
45
  """A teamspace is a collection of Studios, Clusters, Members and an associated Budget.
35
46
 
@@ -54,6 +65,7 @@ class Teamspace:
54
65
  user: Optional[Union[str, User]] = None,
55
66
  ) -> None:
56
67
  self._teamspace_api = TeamspaceApi()
68
+ self._cloud_account_api = CloudAccountApi()
57
69
 
58
70
  name = _resolve_teamspace_name(name)
59
71
 
@@ -515,6 +527,53 @@ class Teamspace:
515
527
  cloud_account=self.default_cloud_account,
516
528
  )
517
529
 
530
+ def new_folder(
531
+ self, name: str, location: Optional[FolderLocation] = None, cloud_account: Optional[str] = None
532
+ ) -> None:
533
+ """Create a new folder in this Teamspace.
534
+
535
+ Args:
536
+ name: The name of the folder. Folders will be accesible under `/teamspace/folders/<name>`
537
+ location: The location of the folder. Defaults to cloud agnostic.
538
+ cloud_account: The cloud account to create the folder in. Not used for cloud agnostic folders.
539
+ """
540
+ if cloud_account is None:
541
+ cloud_account = self.default_cloud_account
542
+
543
+ cloud_accounts = self._cloud_account_api.list_cloud_accounts(self.id)
544
+ resolved_cloud_accounts = [
545
+ external_cloud for external_cloud in cloud_accounts if external_cloud.id == cloud_account
546
+ ]
547
+
548
+ if len(resolved_cloud_accounts) == 0:
549
+ raise ValueError(f"Cloud account not found: {cloud_account}")
550
+
551
+ resolved_cloud_account = resolved_cloud_accounts[0]
552
+
553
+ # if the cloud account is global, default to agnostic
554
+ if location is None and resolved_cloud_account.spec.cluster_type == V1ClusterType.GLOBAL:
555
+ location = FolderLocation.CLOUD_AGNOSTIC
556
+
557
+ # if it's global, then default to agnostic, and aws / gcp otherwise if set
558
+ if (
559
+ location is not None
560
+ and location != FolderLocation.CLOUD_AGNOSTIC
561
+ and resolved_cloud_account.spec.cluster_type == V1ClusterType.GLOBAL
562
+ ):
563
+ providers = self._cloud_account_api.get_cloud_account_provider_mapping(self.id)
564
+
565
+ if location == FolderLocation.AWS:
566
+ resolved_cloud_account = providers[CloudProvider.AWS]
567
+ elif location == FolderLocation.GCP:
568
+ resolved_cloud_account = providers[CloudProvider.GCP]
569
+
570
+ if location == FolderLocation.CLOUD_AGNOSTIC:
571
+ self._teamspace_api.new_folder(self.id, name, None)
572
+ else:
573
+ self._teamspace_api.new_folder(self.id, name, resolved_cloud_account)
574
+
575
+ return
576
+
518
577
 
519
578
  def _list_files(path: Union[str, Path]) -> Tuple[List[Path], List[str]]:
520
579
  """List all folders in a directory and return them as a list and relative path."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lightning_sdk
3
- Version: 2025.9.10
3
+ Version: 2025.9.16
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=0-c_WY2_YLUW_R6qLukGCbJdb6eOrvkzu7XCp9fEVYI,1145
2
+ lightning_sdk/__init__.py,sha256=1wyKGyM8HKl1zyLHQ97cOY7_jZefa5V89YaxP3-0s08,1183
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/base_studio.py,sha256=_Pwwl37R9GRd7t-f2kO5aQXiLNrP4sUtUNht2ZkP8LE,3678
@@ -15,13 +15,13 @@ lightning_sdk/sandbox.py,sha256=_NvnWotEXW2rBiVFZZ4krKXxVjuAqfNh04qELSM0-Pg,5786
15
15
  lightning_sdk/serve.py,sha256=uW7zLhQ3X90ifetpxzTb8FNxifv5vIs7qZlgfEjVKzk,11794
16
16
  lightning_sdk/status.py,sha256=lLGAuSvXBoXQFEEsEYwdCi0RcSNatUn5OPjJVjDtoM0,386
17
17
  lightning_sdk/studio.py,sha256=3BE44Ya-2HXmDkF58lVQmd7KVzzzPktqX1SV7K3nkfo,31438
18
- lightning_sdk/teamspace.py,sha256=qYpIYgg3eyWj9vcqdfhQN-YCpS47tOc_xB3de07p4Y8,21630
18
+ lightning_sdk/teamspace.py,sha256=fjsbMw_fmAHLldAGT03R8Byp1znR6ZYAh9PXUAzzP8w,24016
19
19
  lightning_sdk/user.py,sha256=TSYh38rxoi7qKOfrK2JYh_Nknya2Kbz2ngDIY85fFOY,1778
20
- lightning_sdk/api/__init__.py,sha256=Qn2VVRvir_gO7w4yxGLkZY-R3T7kdiTPKgQ57BhIA9k,413
20
+ lightning_sdk/api/__init__.py,sha256=xrp_RNECJGQtL5rZHF69WOzEuEIbWSLtjWAJAz4R5K4,500
21
21
  lightning_sdk/api/agents_api.py,sha256=G47TbFo9kYqnBMqdw2RW-lfS1VAUBSXDmzs6fpIEMUs,4059
22
22
  lightning_sdk/api/ai_hub_api.py,sha256=azqDZ-PzasVAcoQHno7k7OO_xFOHQ4NDozxF8jEh83Y,7864
23
23
  lightning_sdk/api/base_studio_api.py,sha256=3R8tucZX2e9yKHBcY2rWFRP4dxqLrC6H75vdBDkH0ck,3617
24
- lightning_sdk/api/cloud_account_api.py,sha256=b_Egg5yhDh5G39g1cqA3ZxBDmU9iuDs2PlBMmW0HVnA,8417
24
+ lightning_sdk/api/cloud_account_api.py,sha256=pPeNUcl_7qE0BsrLfmvG0dH0rCJfHiSFexBs4UxWXBM,8732
25
25
  lightning_sdk/api/deployment_api.py,sha256=v2AfoTDkQ-1CBh75FOjFkRpf6yc3U_edDy43uYSn19I,24852
26
26
  lightning_sdk/api/job_api.py,sha256=7spFPyotlSQ0Krx6WymslnpSQaaeOmFkydvhtg6p0Ic,16410
27
27
  lightning_sdk/api/license_api.py,sha256=XV3RhefyPQDYjwY9AaBZe4rByZTEAnsvLDxcdm9q0Wo,2438
@@ -31,7 +31,7 @@ lightning_sdk/api/mmt_api.py,sha256=hIBsGiJ2qn5UjcHDxP5WUyKGT_AIFfpSHrQVwg0afBw,
31
31
  lightning_sdk/api/org_api.py,sha256=Ze3z_ATVrukobujV5YdC42DKj45Vuwl7X52q_Vr-o3U,803
32
32
  lightning_sdk/api/pipeline_api.py,sha256=rJYp_FN7uUjC5xbc6K67l2eRSmVuOkijd5i8Nm5BF7I,4621
33
33
  lightning_sdk/api/studio_api.py,sha256=Aji8lke2jGeef-1lh6wV7EQ15iuiw1Cn_IuBNnEb8SA,39492
34
- lightning_sdk/api/teamspace_api.py,sha256=ygQAGG5W4EqcXv2PO2cYPdAN5fGj75R-1IZkNq7Z9gU,18416
34
+ lightning_sdk/api/teamspace_api.py,sha256=XPyUtpL5iyt9BpXw5WM-_hT2R3OzuC1GcumnI2ktVhQ,19333
35
35
  lightning_sdk/api/user_api.py,sha256=FQFgdZOopEvtFJcJT1mRRuStqKKYmg4iuVUYDSQfDVM,4514
36
36
  lightning_sdk/api/utils.py,sha256=1NJgW4HCfzMqgnAqbMA7RRr2v3iM3KTuPIUQK5klDeQ,27127
37
37
  lightning_sdk/cli/__init__.py,sha256=lksw08t_ZIuHOH47LCIqSVHeZ8cUXI2aJWHYhyujYHM,32
@@ -99,11 +99,11 @@ lightning_sdk/job/work.py,sha256=aRknNDja-96qQaYw0fNboEGtOZCmvztYEzUPxLNAt8g,245
99
99
  lightning_sdk/lightning_cloud/__init__.py,sha256=o91SMAlwr4Ke5ESe8fHjqXcj31_h7rT-MlFoXA-n2EI,173
100
100
  lightning_sdk/lightning_cloud/__version__.py,sha256=lOfmWHtjmiuSG28TbKQqd2B3nwmSGOlKVFwhaj_cRJk,23
101
101
  lightning_sdk/lightning_cloud/env.py,sha256=XZXpF4sD9jlB8DY0herTy_8XiUJuDVjxy5APjRD2_aU,1379
102
- lightning_sdk/lightning_cloud/login.py,sha256=29iN6evpk04SAkBQmjUsRbaoKUcj9ynZDX8uRbGcYPw,7313
102
+ lightning_sdk/lightning_cloud/login.py,sha256=qbIBbyS_6pFUaHXQTuQBkSlTJjoFFPsh4Op3TQw8WVM,9670
103
103
  lightning_sdk/lightning_cloud/rest_client.py,sha256=K2J_QXihpbp5tVzs9PzffgMCQY1NeH5tRpuJBYj27vU,7125
104
104
  lightning_sdk/lightning_cloud/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  lightning_sdk/lightning_cloud/cli/__main__.py,sha256=aHrigVV0qIp74MuYTdN6uO8a9Xp6E1aOwdR8w1fG-7c,688
106
- lightning_sdk/lightning_cloud/openapi/__init__.py,sha256=P93ksZAoghPRbjIKPr-Cl1EHv1b0VWnwJBXR-3_p--I,114751
106
+ lightning_sdk/lightning_cloud/openapi/__init__.py,sha256=khIUajnC_mZ_nwIoiQQ_z0IZPTOC_jxfv8OSHZ8nWyc,115080
107
107
  lightning_sdk/lightning_cloud/openapi/api_client.py,sha256=pUTQMNcZmH4BhpnuAXuT7wnegaxaX26bzdEWjdoLeTo,25630
108
108
  lightning_sdk/lightning_cloud/openapi/configuration.py,sha256=SkBPJ3WZ9SF1LxxWeGKa4UwbGRsk9p3-yL_Kn7l5CSM,7866
109
109
  lightning_sdk/lightning_cloud/openapi/rest.py,sha256=ZPPr6ZkBp6LtuAsiUU7D8Pz8Dt9ECbEM_26Ov74tdpw,13322
@@ -140,7 +140,7 @@ lightning_sdk/lightning_cloud/openapi/api/pipeline_templates_service_api.py,sha2
140
140
  lightning_sdk/lightning_cloud/openapi/api/pipelines_service_api.py,sha256=X7StCd6q68-JUMwOAULiOhUhZFWem4cptwPyG9tRNlY,33446
141
141
  lightning_sdk/lightning_cloud/openapi/api/product_license_service_api.py,sha256=Ht484M-ChZ3Ddlrv16kHU1HAM75WKieYrj488VwKDtM,21439
142
142
  lightning_sdk/lightning_cloud/openapi/api/profiler_service_api.py,sha256=hM2vTawBBuOYZrxN1SjZ6mU5ldvB_jUXRcLb0as0F4M,28286
143
- lightning_sdk/lightning_cloud/openapi/api/projects_service_api.py,sha256=E7PM1ZlmuXMLNnIQ2aEc_AUi2ssSOi-eWA9IS2hbRbI,84822
143
+ lightning_sdk/lightning_cloud/openapi/api/projects_service_api.py,sha256=gBzdjzpz5NU6VJyO1qMQgH00NAoClBeiEG0N3QH6Tik,89477
144
144
  lightning_sdk/lightning_cloud/openapi/api/quest_service_api.py,sha256=IQppAcHoy8J99xdnZVDfyr-yzmFIkolMN3caF-wm7D0,16318
145
145
  lightning_sdk/lightning_cloud/openapi/api/schedules_service_api.py,sha256=x2j9pSInKp3jYvQkcNn_DUrA2gvwVU0IVP3ynvlTYw8,40368
146
146
  lightning_sdk/lightning_cloud/openapi/api/secret_service_api.py,sha256=-oTJJ_XbfGAKle82anvK2XKSYE9OxRedCmUfJFjB9O0,41339
@@ -151,7 +151,7 @@ lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py,sha256=7gbiF09P
151
151
  lightning_sdk/lightning_cloud/openapi/api/studio_jobs_service_api.py,sha256=VJ7VcSvdmGbPkgmQZhaOSR47olcNPMzRlmT5J5uKsng,27877
152
152
  lightning_sdk/lightning_cloud/openapi/api/user_service_api.py,sha256=bUCDZf1P16juI8-J_dpE-MvRt3x8x5HBJpluxix6Vzc,68363
153
153
  lightning_sdk/lightning_cloud/openapi/api/volume_service_api.py,sha256=pg1aaSuYJUAlUDKLN07l8wC-poU_HFxZ_98QZHty74I,10344
154
- lightning_sdk/lightning_cloud/openapi/models/__init__.py,sha256=VlFkVO8jLs6CJ6Q2Td1Y2I4vqE8TsgvuXeS7XmheNqM,108659
154
+ lightning_sdk/lightning_cloud/openapi/models/__init__.py,sha256=Ff1usNXo7_GF33G7TXsJeePhAdu0Xgr0cftPni37c4s,108988
155
155
  lightning_sdk/lightning_cloud/openapi/models/affiliatelinks_id_body.py,sha256=X087AkCafKp2g8E2MR5ghU3pxCNNcoehZJttvuVfdC8,4274
156
156
  lightning_sdk/lightning_cloud/openapi/models/agentmanagedendpoints_id_body.py,sha256=5HIzKC2DGqxIJIdZbs6KGh9pnBe9ik8FyxlXGUSc1HQ,10233
157
157
  lightning_sdk/lightning_cloud/openapi/models/agents_id_body.py,sha256=jKg8Q5cJ3iY9DpDHvig6rgezR_qYYPIAr5Cez2pSifs,22374
@@ -290,7 +290,8 @@ lightning_sdk/lightning_cloud/openapi/models/project_id_schedules_body.py,sha256
290
290
  lightning_sdk/lightning_cloud/openapi/models/project_id_secrets_body.py,sha256=jV7ztO03VzSC55pGFNGFsjRZEyIMOXvTIBcu4zNFXg8,4981
291
291
  lightning_sdk/lightning_cloud/openapi/models/project_id_snowflake_body.py,sha256=GvWXA_I6HvvCszRlKefxVDk29Mbxk1Ka2VbVCVsbgw8,3840
292
292
  lightning_sdk/lightning_cloud/openapi/models/project_id_storage_body.py,sha256=VbfbhZRW9XwXT4sowVt9cWzY67VIscv9Uh14PZ_9eIc,6037
293
- lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py,sha256=plKm1fIxKO7wcG2ZsefHQnJMLaaOX9jBAbRbnAwwDkE,25137
293
+ lightning_sdk/lightning_cloud/openapi/models/project_tab_management_messages.py,sha256=1FtC6UdmLELZ7phmv5kqKEPsUBwwXnheAoAbp4MFWso,3811
294
+ lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py,sha256=S-mizpFoWU9kiB-zbr0GRHXExsWW6xxWAMs7vwvrbEM,26015
294
295
  lightning_sdk/lightning_cloud/openapi/models/projects_project_id_body.py,sha256=9KEoSAXY-v0XckFv6K0Kfk12BkoMK1kObPKQS52bjPE,5139
295
296
  lightning_sdk/lightning_cloud/openapi/models/protobuf_any.py,sha256=I4a5W5zqZprIP8eTbU-LdYvIj7b2r2B4qPMNIgSCEwk,7143
296
297
  lightning_sdk/lightning_cloud/openapi/models/protobuf_null_value.py,sha256=LOQFanGx6mzOYVjlDFd2olKTBfWkhF7vfnHUmZ8lCWI,3063
@@ -696,7 +697,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_image_spec.py,sha256=-EtWhl0QjWN
696
697
  lightning_sdk/lightning_cloud/openapi/models/v1_image_state.py,sha256=CJBTG9zdzN6yPn9dHMIbO5p5EeVFHYv2vw6zWnRJNaA,3157
697
698
  lightning_sdk/lightning_cloud/openapi/models/v1_incident_event.py,sha256=kVyFjR_vt6rOPXQF6FypgZFuow1q1hQEEJGp0P7GraQ,16106
698
699
  lightning_sdk/lightning_cloud/openapi/models/v1_incident_severity.py,sha256=viNzi7aeD9XwmBiZeAHzZyFz1qc_Y0C0DVN48TsxyKg,3211
699
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_type.py,sha256=bpm9P0jhZyg2lTtpFu6s3QsvC1arwH-ref8aBeaEfls,3251
700
+ lightning_sdk/lightning_cloud/openapi/models/v1_incident_type.py,sha256=6G0aM_thfSi5sg3zoqt-oYB0Tgv6SLlnJrOCVvLiR0Y,3319
700
701
  lightning_sdk/lightning_cloud/openapi/models/v1_index.py,sha256=xAYTbs8W6J9T6AMXEDdHAK7RrUU1wF2h7V1OIymnNNs,4390
701
702
  lightning_sdk/lightning_cloud/openapi/models/v1_input.py,sha256=fdtyBWeSC3knH_bHz8Wlsh9gxXVWIZjqzaekNFyeeV0,5012
702
703
  lightning_sdk/lightning_cloud/openapi/models/v1_instance_overprovisioning_spec.py,sha256=4iVO8U1L65qdbgrQN72SLbrt-Ns2Oy6mpTU7YRc-C1g,9026
@@ -943,7 +944,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_product_license.py,sha256=XSAezL
943
944
  lightning_sdk/lightning_cloud/openapi/models/v1_product_license_check_response.py,sha256=YM5WnVoNLg6kxxkNEGOosmfzBWqiS4WyxgOJvOdZTVk,3757
944
945
  lightning_sdk/lightning_cloud/openapi/models/v1_profiler_capture.py,sha256=vtZLSdmLUawWwUHgfGwW6-zNgOCN6GOs7rGU99I8Yxk,10312
945
946
  lightning_sdk/lightning_cloud/openapi/models/v1_profiler_enabled_response.py,sha256=z-5iw130qv54DZFTAXE4t9VeMsME_2aoKC1zXi4koQA,3757
946
- lightning_sdk/lightning_cloud/openapi/models/v1_project.py,sha256=wfE_1Yy8QpUR8Qn1yBxKPrSfE5HakKzbVdWhGhza1Pg,18371
947
+ lightning_sdk/lightning_cloud/openapi/models/v1_project.py,sha256=KmR2KrIOSYU3zs2WItVLBww06V-1K0cGegU9ApecQSg,19229
947
948
  lightning_sdk/lightning_cloud/openapi/models/v1_project_artifact.py,sha256=jMg7BHIX29bYQUK5VPHS7OXJlsZ8RvdIE9trNH5YXHU,6642
948
949
  lightning_sdk/lightning_cloud/openapi/models/v1_project_cluster_binding.py,sha256=jv2wkiEm5u2VhpTeRcd27dur5wnyt1QTb1ae0tzSfwg,10335
949
950
  lightning_sdk/lightning_cloud/openapi/models/v1_project_compute_daily_usage.py,sha256=92qqkHCx9gfZCg7FGVn7TDMQjuHw5E0POtLC7HoQ9pE,6565
@@ -953,6 +954,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_project_membership_invite.py,sha
953
954
  lightning_sdk/lightning_cloud/openapi/models/v1_project_membership_role_binding.py,sha256=pS5454riAOUNeB7B3Y8ChEj9RJQYaroelZuJQs8w2yM,7727
954
955
  lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py,sha256=-clOSaYx-h_m_kumy7ezagqiOwSywS6h2unZZD0rDOE,24012
955
956
  lightning_sdk/lightning_cloud/openapi/models/v1_project_storage.py,sha256=u3crPf64VU2hxYqTsyR1OV5s3VgJghzdfftC5WhpZx4,17470
957
+ lightning_sdk/lightning_cloud/openapi/models/v1_project_tab.py,sha256=9cAsBIsmu-Pj2eLfujSLGipRGVXIioAnBwEKTZUJw7s,4287
956
958
  lightning_sdk/lightning_cloud/openapi/models/v1_prompt_suggestion.py,sha256=e6oennqdamYVWCVMyagRp3ma2oEJjrG5YSPl9A5WqMY,4326
957
959
  lightning_sdk/lightning_cloud/openapi/models/v1_publish_cloud_space_response.py,sha256=5-M8nxZXcc949C6CwFw9pkV2RXcvFO3C3ocK_0YGPLQ,3052
958
960
  lightning_sdk/lightning_cloud/openapi/models/v1_published_cloud_space_response.py,sha256=1z3MjGRAyUMWaQOAy73fh3YLxm_XDqKf3CYhqC19HtQ,22692
@@ -1085,6 +1087,7 @@ lightning_sdk/lightning_cloud/openapi/models/v1_update_metrics_stream_visibility
1085
1087
  lightning_sdk/lightning_cloud/openapi/models/v1_update_model_visibility_response.py,sha256=y9piacBOLGt-OlLcYjFEyqRzPdqaHSI1tXxZfxwQlqE,3973
1086
1088
  lightning_sdk/lightning_cloud/openapi/models/v1_update_organization_credits_auto_replenish_response.py,sha256=Ad-xyR_4qwYTzrqhYMA1ToU3vE7zWTKt0ny5mmTTIiA,3178
1087
1089
  lightning_sdk/lightning_cloud/openapi/models/v1_update_project_cluster_accelerators_response.py,sha256=9NujcwHJzLFuj66q_AZVdyyZrFiy7_5pwOx89eFdS_U,3142
1090
+ lightning_sdk/lightning_cloud/openapi/models/v1_update_project_tab_order_response.py,sha256=3HkdhezPxsAQWqao5WF69sUHfqqQAV_tsNjhlFoPcHA,3841
1088
1091
  lightning_sdk/lightning_cloud/openapi/models/v1_update_shared_metrics_stream_response.py,sha256=mQaPeGjhJ6EohqmF9MFqRR1NKqvznWmvzBAXgMKlW98,3100
1089
1092
  lightning_sdk/lightning_cloud/openapi/models/v1_update_snowflake_query_response.py,sha256=NzTD_--qCS5GsJTcnYO2UNRlaQfJyJxB2BApVNGHoEk,3070
1090
1093
  lightning_sdk/lightning_cloud/openapi/models/v1_update_user_credits_auto_replenish_response.py,sha256=fx6-ivkHzIT5wBhN63v9-1QKaJjms1KyL4HbvAzmF50,3130
@@ -1149,7 +1152,7 @@ lightning_sdk/lightning_cloud/utils/dataset.py,sha256=4nUspe8iAaRPgSYpXA2uAQCgyd
1149
1152
  lightning_sdk/lightning_cloud/utils/name_generator.py,sha256=MkciuA10332V0mcE2PxLIiwWomWE0Fm_gNGK01vwRr4,58046
1150
1153
  lightning_sdk/lightning_cloud/utils/network.py,sha256=axPgl8rhyPcPjxiztDxyksfxax3VNg2OXL5F5Uc81b4,406
1151
1154
  lightning_sdk/llm/__init__.py,sha256=ErZva0HqN2iPtK_6hI6GN7A_HPGNrHo3wYh7vyFdO3Q,57
1152
- lightning_sdk/llm/llm.py,sha256=VIjmIXFw4YLTdS5luLdvgP3lJC1hUSj6NBseqBEO5dc,20534
1155
+ lightning_sdk/llm/llm.py,sha256=pjBs8fbGZjs0tQRKHx-WdfTmeECKAwI_T1ShVBgdyO4,20836
1153
1156
  lightning_sdk/llm/public_assistants.py,sha256=k0yc41AyrKImnRa8Fv-ow9javnlrRQeP63507p2VybA,1579
1154
1157
  lightning_sdk/mmt/__init__.py,sha256=ExMu90-96bGBnyp5h0CErQszUGB1-PcjC4-R8_NYbeY,117
1155
1158
  lightning_sdk/mmt/base.py,sha256=iqVudKDxazomuezj6l7pa-m9I1EQnM82OKs4ZQbo4Ck,16434
@@ -1174,9 +1177,9 @@ lightning_sdk/utils/enum.py,sha256=h2JRzqoBcSlUdanFHmkj_j5DleBHAu1esQYUsdNI-hU,4
1174
1177
  lightning_sdk/utils/names.py,sha256=1EuXbIh7wldkDp1FG10oz9vIOyWrpGWeFFVy-DQBgzA,18162
1175
1178
  lightning_sdk/utils/progress.py,sha256=IXfEcUF-rL5jIw0Hir6eSxN7VBZfR--1O2LaEhGAU70,12698
1176
1179
  lightning_sdk/utils/resolve.py,sha256=4TyEnIgIrvkSvYk5i5PmcIogD_5Y9pBhiphRLfLMttc,10477
1177
- lightning_sdk-2025.9.10.dist-info/LICENSE,sha256=uFIuZwj5z-4TeF2UuacPZ1o17HkvKObT8fY50qN84sg,1064
1178
- lightning_sdk-2025.9.10.dist-info/METADATA,sha256=xP6igZQ-ZO_B8yz4O5jCqDSZ56HxE4SAqxa67RA1EAA,4130
1179
- lightning_sdk-2025.9.10.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1180
- lightning_sdk-2025.9.10.dist-info/entry_points.txt,sha256=OoZa4Fc8NMs6GSN0cdA1J8e6couzAcL82CbM1yo4f_M,122
1181
- lightning_sdk-2025.9.10.dist-info/top_level.txt,sha256=ps8doKILFXmN7F1mHncShmnQoTxKBRPIcchC8TpoBw4,19
1182
- lightning_sdk-2025.9.10.dist-info/RECORD,,
1180
+ lightning_sdk-2025.9.16.dist-info/LICENSE,sha256=uFIuZwj5z-4TeF2UuacPZ1o17HkvKObT8fY50qN84sg,1064
1181
+ lightning_sdk-2025.9.16.dist-info/METADATA,sha256=GR7YQsSApMYI943xTmY0qASB5yv4cUrFub3xlY0gwnI,4130
1182
+ lightning_sdk-2025.9.16.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1183
+ lightning_sdk-2025.9.16.dist-info/entry_points.txt,sha256=OoZa4Fc8NMs6GSN0cdA1J8e6couzAcL82CbM1yo4f_M,122
1184
+ lightning_sdk-2025.9.16.dist-info/top_level.txt,sha256=ps8doKILFXmN7F1mHncShmnQoTxKBRPIcchC8TpoBw4,19
1185
+ lightning_sdk-2025.9.16.dist-info/RECORD,,