lightning-sdk 0.2.11__py3-none-any.whl → 0.2.12__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 (43) hide show
  1. lightning_sdk/__init__.py +1 -1
  2. lightning_sdk/api/deployment_api.py +35 -3
  3. lightning_sdk/api/lit_container_api.py +13 -7
  4. lightning_sdk/api/llm_api.py +34 -0
  5. lightning_sdk/cli/serve.py +72 -23
  6. lightning_sdk/deployment/deployment.py +51 -5
  7. lightning_sdk/lightning_cloud/openapi/__init__.py +5 -1
  8. lightning_sdk/lightning_cloud/openapi/api/cloud_space_environment_template_service_api.py +4 -4
  9. lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +13 -1
  10. lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +4 -4
  11. lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +115 -0
  12. lightning_sdk/lightning_cloud/openapi/models/__init__.py +5 -1
  13. lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +27 -1
  14. lightning_sdk/lightning_cloud/openapi/models/create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs.py +27 -1
  15. lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +27 -1
  16. lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py +27 -1
  17. lightning_sdk/lightning_cloud/openapi/models/update.py +65 -195
  18. lightning_sdk/lightning_cloud/openapi/models/update1.py +357 -0
  19. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_provider.py +1 -0
  20. lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_template.py +27 -1
  21. lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_request.py +27 -1
  22. lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_environment_template_response.py +1 -53
  23. lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +1 -27
  24. lightning_sdk/lightning_cloud/openapi/models/v1_job_resource.py +279 -0
  25. lightning_sdk/lightning_cloud/openapi/models/v1_job_type.py +108 -0
  26. lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py +123 -0
  27. lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +55 -1
  28. lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py +29 -1
  29. lightning_sdk/lightning_cloud/openapi/models/v1_reservation_billing_session.py +279 -0
  30. lightning_sdk/lightning_cloud/openapi/models/v1_resources.py +55 -3
  31. lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +1 -27
  32. lightning_sdk/lightning_cloud/openapi/models/v1_usage.py +27 -1
  33. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +105 -1
  34. lightning_sdk/llm/__init__.py +3 -0
  35. lightning_sdk/llm/llm.py +56 -0
  36. lightning_sdk/serve.py +4 -6
  37. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/METADATA +1 -1
  38. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/RECORD +42 -35
  39. lightning_sdk/lightning_cloud/openapi/models/environmenttemplates_id_body.py +0 -253
  40. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/LICENSE +0 -0
  41. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/WHEEL +0 -0
  42. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/entry_points.txt +0 -0
  43. {lightning_sdk-0.2.11.dist-info → lightning_sdk-0.2.12.dist-info}/top_level.txt +0 -0
@@ -46,8 +46,10 @@ class V1Resources(object):
46
46
  'extra': 'dict(str, str)',
47
47
  'gpu': 'int',
48
48
  'gpu_type': 'str',
49
+ 'iops': 'str',
49
50
  'memory_mb': 'str',
50
- 'storage_gb': 'str'
51
+ 'storage_gb': 'str',
52
+ 'throughput': 'str'
51
53
  }
52
54
 
53
55
  attribute_map = {
@@ -56,19 +58,23 @@ class V1Resources(object):
56
58
  'extra': 'extra',
57
59
  'gpu': 'gpu',
58
60
  'gpu_type': 'gpuType',
61
+ 'iops': 'iops',
59
62
  'memory_mb': 'memoryMb',
60
- 'storage_gb': 'storageGb'
63
+ 'storage_gb': 'storageGb',
64
+ 'throughput': 'throughput'
61
65
  }
62
66
 
63
- def __init__(self, cpu: 'int' =None, cpus: 'str' =None, extra: 'dict(str, str)' =None, gpu: 'int' =None, gpu_type: 'str' =None, memory_mb: 'str' =None, storage_gb: 'str' =None): # noqa: E501
67
+ def __init__(self, cpu: 'int' =None, cpus: 'str' =None, extra: 'dict(str, str)' =None, gpu: 'int' =None, gpu_type: 'str' =None, iops: 'str' =None, memory_mb: 'str' =None, storage_gb: 'str' =None, throughput: 'str' =None): # noqa: E501
64
68
  """V1Resources - a model defined in Swagger""" # noqa: E501
65
69
  self._cpu = None
66
70
  self._cpus = None
67
71
  self._extra = None
68
72
  self._gpu = None
69
73
  self._gpu_type = None
74
+ self._iops = None
70
75
  self._memory_mb = None
71
76
  self._storage_gb = None
77
+ self._throughput = None
72
78
  self.discriminator = None
73
79
  if cpu is not None:
74
80
  self.cpu = cpu
@@ -80,10 +86,14 @@ class V1Resources(object):
80
86
  self.gpu = gpu
81
87
  if gpu_type is not None:
82
88
  self.gpu_type = gpu_type
89
+ if iops is not None:
90
+ self.iops = iops
83
91
  if memory_mb is not None:
84
92
  self.memory_mb = memory_mb
85
93
  if storage_gb is not None:
86
94
  self.storage_gb = storage_gb
95
+ if throughput is not None:
96
+ self.throughput = throughput
87
97
 
88
98
  @property
89
99
  def cpu(self) -> 'int':
@@ -190,6 +200,27 @@ class V1Resources(object):
190
200
 
191
201
  self._gpu_type = gpu_type
192
202
 
203
+ @property
204
+ def iops(self) -> 'str':
205
+ """Gets the iops of this V1Resources. # noqa: E501
206
+
207
+
208
+ :return: The iops of this V1Resources. # noqa: E501
209
+ :rtype: str
210
+ """
211
+ return self._iops
212
+
213
+ @iops.setter
214
+ def iops(self, iops: 'str'):
215
+ """Sets the iops of this V1Resources.
216
+
217
+
218
+ :param iops: The iops of this V1Resources. # noqa: E501
219
+ :type: str
220
+ """
221
+
222
+ self._iops = iops
223
+
193
224
  @property
194
225
  def memory_mb(self) -> 'str':
195
226
  """Gets the memory_mb of this V1Resources. # noqa: E501
@@ -232,6 +263,27 @@ class V1Resources(object):
232
263
 
233
264
  self._storage_gb = storage_gb
234
265
 
266
+ @property
267
+ def throughput(self) -> 'str':
268
+ """Gets the throughput of this V1Resources. # noqa: E501
269
+
270
+
271
+ :return: The throughput of this V1Resources. # noqa: E501
272
+ :rtype: str
273
+ """
274
+ return self._throughput
275
+
276
+ @throughput.setter
277
+ def throughput(self, throughput: 'str'):
278
+ """Sets the throughput of this V1Resources.
279
+
280
+
281
+ :param throughput: The throughput of this V1Resources. # noqa: E501
282
+ :type: str
283
+ """
284
+
285
+ self._throughput = throughput
286
+
235
287
  def to_dict(self) -> dict:
236
288
  """Returns the model properties as a dict"""
237
289
  result = {}
@@ -50,7 +50,6 @@ class V1UpdateUserRequest(object):
50
50
  'experimentation_id': 'str',
51
51
  'first_name': 'str',
52
52
  'general_audience_mode': 'bool',
53
- 'git_credentials_id': 'str',
54
53
  'last_name': 'str',
55
54
  'non_developer_mode': 'bool',
56
55
  'opted_in_marketing_emails': 'bool',
@@ -78,7 +77,6 @@ class V1UpdateUserRequest(object):
78
77
  'experimentation_id': 'experimentationId',
79
78
  'first_name': 'firstName',
80
79
  'general_audience_mode': 'generalAudienceMode',
81
- 'git_credentials_id': 'gitCredentialsId',
82
80
  'last_name': 'lastName',
83
81
  'non_developer_mode': 'nonDeveloperMode',
84
82
  'opted_in_marketing_emails': 'optedInMarketingEmails',
@@ -96,7 +94,7 @@ class V1UpdateUserRequest(object):
96
94
  'website': 'website'
97
95
  }
98
96
 
99
- def __init__(self, agree_to_terms_and_conditions: 'bool' =None, complete_sign_up: 'bool' =None, completed_project_onboarding: 'bool' =None, country: 'str' =None, discounted_pro_plan: 'bool' =None, email: 'str' =None, experimentation_id: 'str' =None, first_name: 'str' =None, general_audience_mode: 'bool' =None, git_credentials_id: 'str' =None, last_name: 'str' =None, non_developer_mode: 'bool' =None, opted_in_marketing_emails: 'bool' =None, organization: 'str' =None, preferred_color_scheme: 'str' =None, preferred_ide: 'str' =None, preferred_shell: 'str' =None, preferred_vscode_marketplace: 'str' =None, role: 'str' =None, saw_create_first_project_dialog: 'bool' =None, saw_forums_login_merge_dialog: 'bool' =None, saw_free_credits_notification: 'bool' =None, user_metadata: 'str' =None, username: 'str' =None, website: 'str' =None): # noqa: E501
97
+ def __init__(self, agree_to_terms_and_conditions: 'bool' =None, complete_sign_up: 'bool' =None, completed_project_onboarding: 'bool' =None, country: 'str' =None, discounted_pro_plan: 'bool' =None, email: 'str' =None, experimentation_id: 'str' =None, first_name: 'str' =None, general_audience_mode: 'bool' =None, last_name: 'str' =None, non_developer_mode: 'bool' =None, opted_in_marketing_emails: 'bool' =None, organization: 'str' =None, preferred_color_scheme: 'str' =None, preferred_ide: 'str' =None, preferred_shell: 'str' =None, preferred_vscode_marketplace: 'str' =None, role: 'str' =None, saw_create_first_project_dialog: 'bool' =None, saw_forums_login_merge_dialog: 'bool' =None, saw_free_credits_notification: 'bool' =None, user_metadata: 'str' =None, username: 'str' =None, website: 'str' =None): # noqa: E501
100
98
  """V1UpdateUserRequest - a model defined in Swagger""" # noqa: E501
101
99
  self._agree_to_terms_and_conditions = None
102
100
  self._complete_sign_up = None
@@ -107,7 +105,6 @@ class V1UpdateUserRequest(object):
107
105
  self._experimentation_id = None
108
106
  self._first_name = None
109
107
  self._general_audience_mode = None
110
- self._git_credentials_id = None
111
108
  self._last_name = None
112
109
  self._non_developer_mode = None
113
110
  self._opted_in_marketing_emails = None
@@ -142,8 +139,6 @@ class V1UpdateUserRequest(object):
142
139
  self.first_name = first_name
143
140
  if general_audience_mode is not None:
144
141
  self.general_audience_mode = general_audience_mode
145
- if git_credentials_id is not None:
146
- self.git_credentials_id = git_credentials_id
147
142
  if last_name is not None:
148
143
  self.last_name = last_name
149
144
  if non_developer_mode is not None:
@@ -364,27 +359,6 @@ class V1UpdateUserRequest(object):
364
359
 
365
360
  self._general_audience_mode = general_audience_mode
366
361
 
367
- @property
368
- def git_credentials_id(self) -> 'str':
369
- """Gets the git_credentials_id of this V1UpdateUserRequest. # noqa: E501
370
-
371
-
372
- :return: The git_credentials_id of this V1UpdateUserRequest. # noqa: E501
373
- :rtype: str
374
- """
375
- return self._git_credentials_id
376
-
377
- @git_credentials_id.setter
378
- def git_credentials_id(self, git_credentials_id: 'str'):
379
- """Sets the git_credentials_id of this V1UpdateUserRequest.
380
-
381
-
382
- :param git_credentials_id: The git_credentials_id of this V1UpdateUserRequest. # noqa: E501
383
- :type: str
384
- """
385
-
386
- self._git_credentials_id = git_credentials_id
387
-
388
362
  @property
389
363
  def last_name(self) -> 'str':
390
364
  """Gets the last_name of this V1UpdateUserRequest. # noqa: E501
@@ -50,6 +50,7 @@ class V1Usage(object):
50
50
  'id': 'str',
51
51
  'name': 'str',
52
52
  'project_id': 'str',
53
+ 'reservations': 'list[V1ReservationBillingSession]',
53
54
  'resource_type': 'str',
54
55
  'saved_cost': 'float',
55
56
  'session_ended_at': 'datetime',
@@ -68,6 +69,7 @@ class V1Usage(object):
68
69
  'id': 'id',
69
70
  'name': 'name',
70
71
  'project_id': 'projectId',
72
+ 'reservations': 'reservations',
71
73
  'resource_type': 'resourceType',
72
74
  'saved_cost': 'savedCost',
73
75
  'session_ended_at': 'sessionEndedAt',
@@ -76,7 +78,7 @@ class V1Usage(object):
76
78
  'user_id': 'userId'
77
79
  }
78
80
 
79
- def __init__(self, billed_time_seconds: 'str' =None, cluster_id: 'str' =None, cost: 'float' =None, created_at: 'datetime' =None, deleted_at: 'datetime' =None, free: 'bool' =None, id: 'str' =None, name: 'str' =None, project_id: 'str' =None, resource_type: 'str' =None, saved_cost: 'float' =None, session_ended_at: 'datetime' =None, session_started_at: 'datetime' =None, spot: 'bool' =None, user_id: 'str' =None): # noqa: E501
81
+ def __init__(self, billed_time_seconds: 'str' =None, cluster_id: 'str' =None, cost: 'float' =None, created_at: 'datetime' =None, deleted_at: 'datetime' =None, free: 'bool' =None, id: 'str' =None, name: 'str' =None, project_id: 'str' =None, reservations: 'list[V1ReservationBillingSession]' =None, resource_type: 'str' =None, saved_cost: 'float' =None, session_ended_at: 'datetime' =None, session_started_at: 'datetime' =None, spot: 'bool' =None, user_id: 'str' =None): # noqa: E501
80
82
  """V1Usage - a model defined in Swagger""" # noqa: E501
81
83
  self._billed_time_seconds = None
82
84
  self._cluster_id = None
@@ -87,6 +89,7 @@ class V1Usage(object):
87
89
  self._id = None
88
90
  self._name = None
89
91
  self._project_id = None
92
+ self._reservations = None
90
93
  self._resource_type = None
91
94
  self._saved_cost = None
92
95
  self._session_ended_at = None
@@ -112,6 +115,8 @@ class V1Usage(object):
112
115
  self.name = name
113
116
  if project_id is not None:
114
117
  self.project_id = project_id
118
+ if reservations is not None:
119
+ self.reservations = reservations
115
120
  if resource_type is not None:
116
121
  self.resource_type = resource_type
117
122
  if saved_cost is not None:
@@ -314,6 +319,27 @@ class V1Usage(object):
314
319
 
315
320
  self._project_id = project_id
316
321
 
322
+ @property
323
+ def reservations(self) -> 'list[V1ReservationBillingSession]':
324
+ """Gets the reservations of this V1Usage. # noqa: E501
325
+
326
+
327
+ :return: The reservations of this V1Usage. # noqa: E501
328
+ :rtype: list[V1ReservationBillingSession]
329
+ """
330
+ return self._reservations
331
+
332
+ @reservations.setter
333
+ def reservations(self, reservations: 'list[V1ReservationBillingSession]'):
334
+ """Sets the reservations of this V1Usage.
335
+
336
+
337
+ :param reservations: The reservations of this V1Usage. # noqa: E501
338
+ :type: list[V1ReservationBillingSession]
339
+ """
340
+
341
+ self._reservations = reservations
342
+
317
343
  @property
318
344
  def resource_type(self) -> 'str':
319
345
  """Gets the resource_type of this V1Usage. # noqa: E501
@@ -56,6 +56,7 @@ class V1UserFeatures(object):
56
56
  'cloud_space_environment_templates': 'bool',
57
57
  'code_tab': 'bool',
58
58
  'collab_screen_sharing': 'bool',
59
+ 'concurrent_gpu_limit': 'bool',
59
60
  'cost_attribution_settings': 'bool',
60
61
  'custom_app_domain': 'bool',
61
62
  'custom_instance_types': 'bool',
@@ -72,6 +73,7 @@ class V1UserFeatures(object):
72
73
  'fair_share': 'bool',
73
74
  'featured_studios_admin': 'bool',
74
75
  'filestore': 'bool',
76
+ 'gcp_local_disk_binding': 'bool',
75
77
  'inactive_notify_delete': 'bool',
76
78
  'instant_capacity_reservation': 'bool',
77
79
  'job_artifacts_v2': 'bool',
@@ -98,6 +100,7 @@ class V1UserFeatures(object):
98
100
  'product_generator': 'bool',
99
101
  'project_selector': 'bool',
100
102
  'publish_pipelines': 'bool',
103
+ 'r2_data_connections': 'bool',
101
104
  'restartable_jobs': 'bool',
102
105
  'runnable_public_studio_page': 'bool',
103
106
  'security_docs': 'bool',
@@ -114,6 +117,7 @@ class V1UserFeatures(object):
114
117
  'teamspace_storage_tab': 'bool',
115
118
  'trainium2': 'bool',
116
119
  'use_rclone_mounts_only': 'bool',
120
+ 'voltage_park': 'bool',
117
121
  'vultr': 'bool',
118
122
  'weka': 'bool'
119
123
  }
@@ -134,6 +138,7 @@ class V1UserFeatures(object):
134
138
  'cloud_space_environment_templates': 'cloudSpaceEnvironmentTemplates',
135
139
  'code_tab': 'codeTab',
136
140
  'collab_screen_sharing': 'collabScreenSharing',
141
+ 'concurrent_gpu_limit': 'concurrentGpuLimit',
137
142
  'cost_attribution_settings': 'costAttributionSettings',
138
143
  'custom_app_domain': 'customAppDomain',
139
144
  'custom_instance_types': 'customInstanceTypes',
@@ -150,6 +155,7 @@ class V1UserFeatures(object):
150
155
  'fair_share': 'fairShare',
151
156
  'featured_studios_admin': 'featuredStudiosAdmin',
152
157
  'filestore': 'filestore',
158
+ 'gcp_local_disk_binding': 'gcpLocalDiskBinding',
153
159
  'inactive_notify_delete': 'inactiveNotifyDelete',
154
160
  'instant_capacity_reservation': 'instantCapacityReservation',
155
161
  'job_artifacts_v2': 'jobArtifactsV2',
@@ -176,6 +182,7 @@ class V1UserFeatures(object):
176
182
  'product_generator': 'productGenerator',
177
183
  'project_selector': 'projectSelector',
178
184
  'publish_pipelines': 'publishPipelines',
185
+ 'r2_data_connections': 'r2DataConnections',
179
186
  'restartable_jobs': 'restartableJobs',
180
187
  'runnable_public_studio_page': 'runnablePublicStudioPage',
181
188
  'security_docs': 'securityDocs',
@@ -192,11 +199,12 @@ class V1UserFeatures(object):
192
199
  'teamspace_storage_tab': 'teamspaceStorageTab',
193
200
  'trainium2': 'trainium2',
194
201
  'use_rclone_mounts_only': 'useRcloneMountsOnly',
202
+ 'voltage_park': 'voltagePark',
195
203
  'vultr': 'vultr',
196
204
  'weka': 'weka'
197
205
  }
198
206
 
199
- def __init__(self, affiliate_links: 'bool' =None, agents_v2: 'bool' =None, ai_hub_monetization: 'bool' =None, auto_fast_load: 'bool' =None, auto_join_orgs: 'bool' =None, b2c_experience: 'bool' =None, byoc_litcr: 'bool' =None, cap_add: 'list[str]' =None, cap_drop: 'list[str]' =None, capacity_reservation_byoc: 'bool' =None, capacity_reservation_dry_run: 'bool' =None, chat_models: 'bool' =None, cloud_space_environment_templates: 'bool' =None, code_tab: 'bool' =None, collab_screen_sharing: 'bool' =None, cost_attribution_settings: 'bool' =None, custom_app_domain: 'bool' =None, custom_instance_types: 'bool' =None, datasets: 'bool' =None, default_one_cluster: 'bool' =None, deployment_alerts: 'bool' =None, deployment_persistent_disk: 'bool' =None, dgx_cloud: 'bool' =None, doc_helper_chat: 'bool' =None, docs_agent: 'bool' =None, drive_v2: 'bool' =None, enable_storage_limits: 'bool' =None, enterprise_compute_admin: 'bool' =None, fair_share: 'bool' =None, featured_studios_admin: 'bool' =None, filestore: 'bool' =None, inactive_notify_delete: 'bool' =None, instant_capacity_reservation: 'bool' =None, job_artifacts_v2: 'bool' =None, lambda_labs: 'bool' =None, landing_studios: 'bool' =None, lit_logger: 'bool' =None, marketplace: 'bool' =None, mmt_fault_tolerance: 'bool' =None, mmt_strategy_selector: 'bool' =None, multicloud_saas: 'bool' =None, multiple_studio_versions: 'bool' =None, org_admin_alerts: 'bool' =None, org_level_member_permissions: 'bool' =None, org_usage_limits: 'bool' =None, pipelines: 'bool' =None, plugin_distributed: 'bool' =None, plugin_inference: 'bool' =None, plugin_label_studio: 'bool' =None, plugin_langflow: 'bool' =None, plugin_python_profiler: 'bool' =None, plugin_service: 'bool' =None, plugin_sweeps: 'bool' =None, pricing_updates: 'bool' =None, product_generator: 'bool' =None, project_selector: 'bool' =None, publish_pipelines: 'bool' =None, restartable_jobs: 'bool' =None, runnable_public_studio_page: 'bool' =None, security_docs: 'bool' =None, show_dev_admin: 'bool' =None, single_wallet: 'bool' =None, slurm: 'bool' =None, slurm_machine_selector: 'bool' =None, stop_ide_container_on_shutdown: 'bool' =None, studio_config: 'bool' =None, studio_on_stop: 'bool' =None, studio_version_visibility: 'bool' =None, studios_dashboard: 'bool' =None, studios_dashboard_system_metrics: 'bool' =None, teamspace_storage_tab: 'bool' =None, trainium2: 'bool' =None, use_rclone_mounts_only: 'bool' =None, vultr: 'bool' =None, weka: 'bool' =None): # noqa: E501
207
+ def __init__(self, affiliate_links: 'bool' =None, agents_v2: 'bool' =None, ai_hub_monetization: 'bool' =None, auto_fast_load: 'bool' =None, auto_join_orgs: 'bool' =None, b2c_experience: 'bool' =None, byoc_litcr: 'bool' =None, cap_add: 'list[str]' =None, cap_drop: 'list[str]' =None, capacity_reservation_byoc: 'bool' =None, capacity_reservation_dry_run: 'bool' =None, chat_models: 'bool' =None, cloud_space_environment_templates: 'bool' =None, code_tab: 'bool' =None, collab_screen_sharing: 'bool' =None, concurrent_gpu_limit: 'bool' =None, cost_attribution_settings: 'bool' =None, custom_app_domain: 'bool' =None, custom_instance_types: 'bool' =None, datasets: 'bool' =None, default_one_cluster: 'bool' =None, deployment_alerts: 'bool' =None, deployment_persistent_disk: 'bool' =None, dgx_cloud: 'bool' =None, doc_helper_chat: 'bool' =None, docs_agent: 'bool' =None, drive_v2: 'bool' =None, enable_storage_limits: 'bool' =None, enterprise_compute_admin: 'bool' =None, fair_share: 'bool' =None, featured_studios_admin: 'bool' =None, filestore: 'bool' =None, gcp_local_disk_binding: 'bool' =None, inactive_notify_delete: 'bool' =None, instant_capacity_reservation: 'bool' =None, job_artifacts_v2: 'bool' =None, lambda_labs: 'bool' =None, landing_studios: 'bool' =None, lit_logger: 'bool' =None, marketplace: 'bool' =None, mmt_fault_tolerance: 'bool' =None, mmt_strategy_selector: 'bool' =None, multicloud_saas: 'bool' =None, multiple_studio_versions: 'bool' =None, org_admin_alerts: 'bool' =None, org_level_member_permissions: 'bool' =None, org_usage_limits: 'bool' =None, pipelines: 'bool' =None, plugin_distributed: 'bool' =None, plugin_inference: 'bool' =None, plugin_label_studio: 'bool' =None, plugin_langflow: 'bool' =None, plugin_python_profiler: 'bool' =None, plugin_service: 'bool' =None, plugin_sweeps: 'bool' =None, pricing_updates: 'bool' =None, product_generator: 'bool' =None, project_selector: 'bool' =None, publish_pipelines: 'bool' =None, r2_data_connections: 'bool' =None, restartable_jobs: 'bool' =None, runnable_public_studio_page: 'bool' =None, security_docs: 'bool' =None, show_dev_admin: 'bool' =None, single_wallet: 'bool' =None, slurm: 'bool' =None, slurm_machine_selector: 'bool' =None, stop_ide_container_on_shutdown: 'bool' =None, studio_config: 'bool' =None, studio_on_stop: 'bool' =None, studio_version_visibility: 'bool' =None, studios_dashboard: 'bool' =None, studios_dashboard_system_metrics: 'bool' =None, teamspace_storage_tab: 'bool' =None, trainium2: 'bool' =None, use_rclone_mounts_only: 'bool' =None, voltage_park: 'bool' =None, vultr: 'bool' =None, weka: 'bool' =None): # noqa: E501
200
208
  """V1UserFeatures - a model defined in Swagger""" # noqa: E501
201
209
  self._affiliate_links = None
202
210
  self._agents_v2 = None
@@ -213,6 +221,7 @@ class V1UserFeatures(object):
213
221
  self._cloud_space_environment_templates = None
214
222
  self._code_tab = None
215
223
  self._collab_screen_sharing = None
224
+ self._concurrent_gpu_limit = None
216
225
  self._cost_attribution_settings = None
217
226
  self._custom_app_domain = None
218
227
  self._custom_instance_types = None
@@ -229,6 +238,7 @@ class V1UserFeatures(object):
229
238
  self._fair_share = None
230
239
  self._featured_studios_admin = None
231
240
  self._filestore = None
241
+ self._gcp_local_disk_binding = None
232
242
  self._inactive_notify_delete = None
233
243
  self._instant_capacity_reservation = None
234
244
  self._job_artifacts_v2 = None
@@ -255,6 +265,7 @@ class V1UserFeatures(object):
255
265
  self._product_generator = None
256
266
  self._project_selector = None
257
267
  self._publish_pipelines = None
268
+ self._r2_data_connections = None
258
269
  self._restartable_jobs = None
259
270
  self._runnable_public_studio_page = None
260
271
  self._security_docs = None
@@ -271,6 +282,7 @@ class V1UserFeatures(object):
271
282
  self._teamspace_storage_tab = None
272
283
  self._trainium2 = None
273
284
  self._use_rclone_mounts_only = None
285
+ self._voltage_park = None
274
286
  self._vultr = None
275
287
  self._weka = None
276
288
  self.discriminator = None
@@ -304,6 +316,8 @@ class V1UserFeatures(object):
304
316
  self.code_tab = code_tab
305
317
  if collab_screen_sharing is not None:
306
318
  self.collab_screen_sharing = collab_screen_sharing
319
+ if concurrent_gpu_limit is not None:
320
+ self.concurrent_gpu_limit = concurrent_gpu_limit
307
321
  if cost_attribution_settings is not None:
308
322
  self.cost_attribution_settings = cost_attribution_settings
309
323
  if custom_app_domain is not None:
@@ -336,6 +350,8 @@ class V1UserFeatures(object):
336
350
  self.featured_studios_admin = featured_studios_admin
337
351
  if filestore is not None:
338
352
  self.filestore = filestore
353
+ if gcp_local_disk_binding is not None:
354
+ self.gcp_local_disk_binding = gcp_local_disk_binding
339
355
  if inactive_notify_delete is not None:
340
356
  self.inactive_notify_delete = inactive_notify_delete
341
357
  if instant_capacity_reservation is not None:
@@ -388,6 +404,8 @@ class V1UserFeatures(object):
388
404
  self.project_selector = project_selector
389
405
  if publish_pipelines is not None:
390
406
  self.publish_pipelines = publish_pipelines
407
+ if r2_data_connections is not None:
408
+ self.r2_data_connections = r2_data_connections
391
409
  if restartable_jobs is not None:
392
410
  self.restartable_jobs = restartable_jobs
393
411
  if runnable_public_studio_page is not None:
@@ -420,6 +438,8 @@ class V1UserFeatures(object):
420
438
  self.trainium2 = trainium2
421
439
  if use_rclone_mounts_only is not None:
422
440
  self.use_rclone_mounts_only = use_rclone_mounts_only
441
+ if voltage_park is not None:
442
+ self.voltage_park = voltage_park
423
443
  if vultr is not None:
424
444
  self.vultr = vultr
425
445
  if weka is not None:
@@ -740,6 +760,27 @@ class V1UserFeatures(object):
740
760
 
741
761
  self._collab_screen_sharing = collab_screen_sharing
742
762
 
763
+ @property
764
+ def concurrent_gpu_limit(self) -> 'bool':
765
+ """Gets the concurrent_gpu_limit of this V1UserFeatures. # noqa: E501
766
+
767
+
768
+ :return: The concurrent_gpu_limit of this V1UserFeatures. # noqa: E501
769
+ :rtype: bool
770
+ """
771
+ return self._concurrent_gpu_limit
772
+
773
+ @concurrent_gpu_limit.setter
774
+ def concurrent_gpu_limit(self, concurrent_gpu_limit: 'bool'):
775
+ """Sets the concurrent_gpu_limit of this V1UserFeatures.
776
+
777
+
778
+ :param concurrent_gpu_limit: The concurrent_gpu_limit of this V1UserFeatures. # noqa: E501
779
+ :type: bool
780
+ """
781
+
782
+ self._concurrent_gpu_limit = concurrent_gpu_limit
783
+
743
784
  @property
744
785
  def cost_attribution_settings(self) -> 'bool':
745
786
  """Gets the cost_attribution_settings of this V1UserFeatures. # noqa: E501
@@ -1076,6 +1117,27 @@ class V1UserFeatures(object):
1076
1117
 
1077
1118
  self._filestore = filestore
1078
1119
 
1120
+ @property
1121
+ def gcp_local_disk_binding(self) -> 'bool':
1122
+ """Gets the gcp_local_disk_binding of this V1UserFeatures. # noqa: E501
1123
+
1124
+
1125
+ :return: The gcp_local_disk_binding of this V1UserFeatures. # noqa: E501
1126
+ :rtype: bool
1127
+ """
1128
+ return self._gcp_local_disk_binding
1129
+
1130
+ @gcp_local_disk_binding.setter
1131
+ def gcp_local_disk_binding(self, gcp_local_disk_binding: 'bool'):
1132
+ """Sets the gcp_local_disk_binding of this V1UserFeatures.
1133
+
1134
+
1135
+ :param gcp_local_disk_binding: The gcp_local_disk_binding of this V1UserFeatures. # noqa: E501
1136
+ :type: bool
1137
+ """
1138
+
1139
+ self._gcp_local_disk_binding = gcp_local_disk_binding
1140
+
1079
1141
  @property
1080
1142
  def inactive_notify_delete(self) -> 'bool':
1081
1143
  """Gets the inactive_notify_delete of this V1UserFeatures. # noqa: E501
@@ -1622,6 +1684,27 @@ class V1UserFeatures(object):
1622
1684
 
1623
1685
  self._publish_pipelines = publish_pipelines
1624
1686
 
1687
+ @property
1688
+ def r2_data_connections(self) -> 'bool':
1689
+ """Gets the r2_data_connections of this V1UserFeatures. # noqa: E501
1690
+
1691
+
1692
+ :return: The r2_data_connections of this V1UserFeatures. # noqa: E501
1693
+ :rtype: bool
1694
+ """
1695
+ return self._r2_data_connections
1696
+
1697
+ @r2_data_connections.setter
1698
+ def r2_data_connections(self, r2_data_connections: 'bool'):
1699
+ """Sets the r2_data_connections of this V1UserFeatures.
1700
+
1701
+
1702
+ :param r2_data_connections: The r2_data_connections of this V1UserFeatures. # noqa: E501
1703
+ :type: bool
1704
+ """
1705
+
1706
+ self._r2_data_connections = r2_data_connections
1707
+
1625
1708
  @property
1626
1709
  def restartable_jobs(self) -> 'bool':
1627
1710
  """Gets the restartable_jobs of this V1UserFeatures. # noqa: E501
@@ -1958,6 +2041,27 @@ class V1UserFeatures(object):
1958
2041
 
1959
2042
  self._use_rclone_mounts_only = use_rclone_mounts_only
1960
2043
 
2044
+ @property
2045
+ def voltage_park(self) -> 'bool':
2046
+ """Gets the voltage_park of this V1UserFeatures. # noqa: E501
2047
+
2048
+
2049
+ :return: The voltage_park of this V1UserFeatures. # noqa: E501
2050
+ :rtype: bool
2051
+ """
2052
+ return self._voltage_park
2053
+
2054
+ @voltage_park.setter
2055
+ def voltage_park(self, voltage_park: 'bool'):
2056
+ """Sets the voltage_park of this V1UserFeatures.
2057
+
2058
+
2059
+ :param voltage_park: The voltage_park of this V1UserFeatures. # noqa: E501
2060
+ :type: bool
2061
+ """
2062
+
2063
+ self._voltage_park = voltage_park
2064
+
1961
2065
  @property
1962
2066
  def vultr(self) -> 'bool':
1963
2067
  """Gets the vultr of this V1UserFeatures. # noqa: E501
@@ -0,0 +1,3 @@
1
+ from lightning_sdk.llm.llm import LLM
2
+
3
+ __all__ = ["LLM"]
@@ -0,0 +1,56 @@
1
+ from typing import Dict, List, Optional, Set, Tuple
2
+
3
+ from lightning_sdk.api.llm_api import LLMApi
4
+ from lightning_sdk.lightning_cloud.openapi import V1Assistant
5
+
6
+
7
+ class LLM:
8
+ def __init__(self, name: str) -> None:
9
+ self._name = name
10
+ self._org, self._model_name = self._parse_model_name(name)
11
+ self._llm_api = LLMApi()
12
+ self._models = self._build_model_lookup(self._llm_api.list_models())
13
+ self._model_exists()
14
+ self._public_models = self._build_public_model_lookup(self._get_public_models())
15
+ self._model = self._get_model()
16
+
17
+ def _parse_model_name(self, name: str) -> Tuple[str, str]:
18
+ parts = name.split("/")
19
+ if len(parts) != 2:
20
+ raise ValueError(f"Model name must be in the format `organization/model_name`, but got '{name}'.")
21
+ return parts[0], parts[1]
22
+
23
+ def _build_model_lookup(self, endpoints: List[str]) -> Dict[str, Set[str]]:
24
+ return {endpoint.id: {model.name for model in endpoint.models_metadata} for endpoint in endpoints}
25
+
26
+ def _model_exists(self) -> bool:
27
+ if self._org not in self._models:
28
+ raise ValueError(
29
+ f"Model provider {self._org} not found. Available models providers: {list(self._models.keys())}"
30
+ )
31
+
32
+ if self._model_name not in self._models[self._org]:
33
+ raise ValueError(
34
+ f"Model {self._model_name} not found. Available models by {self._org}: {self._models[self._org]}"
35
+ )
36
+ return True
37
+
38
+ def _build_public_model_lookup(self, endpoints: List[str]) -> Dict[str, Set[str]]:
39
+ result = {}
40
+ for endpoint in endpoints:
41
+ result.setdefault(endpoint.model, []).append(endpoint)
42
+ return result
43
+
44
+ def _get_public_models(self) -> List[str]:
45
+ return self._llm_api.get_public_models()
46
+
47
+ def _get_model(self, public_model: bool = True) -> V1Assistant:
48
+ # TODO figure out how to identify if model is public or not
49
+ if not public_model:
50
+ raise NotImplementedError("Non-public models are not supported yet.")
51
+ # TODO how to handle multiple models with same model type? For now, just use the first one
52
+ return self._public_models.get(self._model_name)[0]
53
+
54
+ def chat(self, prompt: str, system_prompt: Optional[str] = None) -> str:
55
+ output = self._llm_api.start_conversation(prompt, system_prompt, self._model.id)
56
+ return output.choices[0].delta.content
lightning_sdk/serve.py CHANGED
@@ -10,7 +10,7 @@ from rich.console import Console
10
10
  from lightning_sdk import Deployment, Machine, Teamspace
11
11
  from lightning_sdk.api.deployment_api import AutoScaleConfig, DeploymentApi, Env, Secret
12
12
  from lightning_sdk.api.lit_container_api import LitContainerApi
13
- from lightning_sdk.api.utils import _get_cloud_url, _get_registry_url
13
+ from lightning_sdk.api.utils import _get_cloud_url
14
14
  from lightning_sdk.lightning_cloud.env import LIGHTNING_CLOUD_URL
15
15
 
16
16
  _DOCKER_NOT_RUNNING_MSG = (
@@ -189,12 +189,9 @@ Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additio
189
189
  if "status" in line:
190
190
  yield {"status": line["status"].strip()}
191
191
 
192
- registry_url = _get_registry_url()
193
192
  container_basename = repository.split("/")[-1]
194
- repository = (
195
- f"{registry_url}/lit-container{f'-{cloud_account}' if cloud_account is not None else ''}/"
196
- f"{teamspace.owner.name}/{teamspace.name}/{container_basename}"
197
- )
193
+ repository = lit_cr.get_container_url(repository, tag, teamspace, cloud_account)
194
+
198
195
  yield {
199
196
  "finish": True,
200
197
  "status": "Container pushed successfully",
@@ -303,6 +300,7 @@ Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additio
303
300
  include_credentials=include_credentials,
304
301
  cloudspace_id=cloudspace_id,
305
302
  from_onboarding=from_onboarding,
303
+ command="",
306
304
  )
307
305
 
308
306
  return {"deployment": deployment, "url": url}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lightning_sdk
3
- Version: 0.2.11
3
+ Version: 0.2.12
4
4
  Summary: SDK to develop using Lightning AI Studios
5
5
  Author-email: Lightning-AI <justus@lightning.ai>
6
6
  License: MIT License