lightning-sdk 0.2.10__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.
- lightning_sdk/__init__.py +1 -1
- lightning_sdk/api/deployment_api.py +37 -3
- lightning_sdk/api/lit_container_api.py +13 -7
- lightning_sdk/api/llm_api.py +34 -0
- lightning_sdk/api/teamspace_api.py +29 -4
- lightning_sdk/cli/serve.py +87 -36
- lightning_sdk/deployment/deployment.py +55 -6
- lightning_sdk/lightning_cloud/openapi/__init__.py +5 -1
- lightning_sdk/lightning_cloud/openapi/api/cloud_space_environment_template_service_api.py +4 -4
- lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +13 -1
- lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +4 -4
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +115 -0
- lightning_sdk/lightning_cloud/openapi/models/__init__.py +5 -1
- lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/update.py +65 -195
- lightning_sdk/lightning_cloud/openapi/models/update1.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_provider.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_template.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_environment_template_response.py +1 -53
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_job_resource.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_type.py +108 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +55 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py +29 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_reservation_billing_session.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_resources.py +55 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_usage.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +105 -1
- lightning_sdk/llm/__init__.py +3 -0
- lightning_sdk/llm/llm.py +56 -0
- lightning_sdk/models.py +17 -1
- lightning_sdk/serve.py +7 -6
- lightning_sdk/teamspace.py +14 -2
- {lightning_sdk-0.2.10.dist-info → lightning_sdk-0.2.12.dist-info}/METADATA +1 -1
- {lightning_sdk-0.2.10.dist-info → lightning_sdk-0.2.12.dist-info}/RECORD +45 -38
- lightning_sdk/lightning_cloud/openapi/models/environmenttemplates_id_body.py +0 -253
- {lightning_sdk-0.2.10.dist-info → lightning_sdk-0.2.12.dist-info}/LICENSE +0 -0
- {lightning_sdk-0.2.10.dist-info → lightning_sdk-0.2.12.dist-info}/WHEEL +0 -0
- {lightning_sdk-0.2.10.dist-info → lightning_sdk-0.2.12.dist-info}/entry_points.txt +0 -0
- {lightning_sdk-0.2.10.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,
|
|
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
|
lightning_sdk/llm/llm.py
ADDED
|
@@ -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/models.py
CHANGED
|
@@ -4,6 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
|
|
5
5
|
|
|
6
6
|
from lightning_sdk.api import OrgApi, TeamspaceApi, UserApi
|
|
7
|
+
from lightning_sdk.lightning_cloud.openapi import V1ModelVersionArchive
|
|
7
8
|
from lightning_sdk.lightning_cloud.openapi.models import V1Membership, V1OwnerType
|
|
8
9
|
from lightning_sdk.lightning_cloud.openapi.rest import ApiException
|
|
9
10
|
from lightning_sdk.user import User
|
|
@@ -184,4 +185,19 @@ def delete_model(
|
|
|
184
185
|
name = _extend_model_name_with_teamspace(name)
|
|
185
186
|
org_name, teamspace_name, model_name, version = _parse_org_teamspace_model_version(name)
|
|
186
187
|
teamspace = _get_teamspace(name=teamspace_name, organization=org_name)
|
|
187
|
-
teamspace.delete_model(name=model_name)
|
|
188
|
+
teamspace.delete_model(name=f"{model_name}:{version}" if version else model_name)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def list_model_versions(
|
|
192
|
+
name: str,
|
|
193
|
+
) -> List[V1ModelVersionArchive]:
|
|
194
|
+
"""List all versions of a model.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
name: The name of the model you want to list versions for.
|
|
198
|
+
This should have the format <ORGANIZATION-NAME>/<TEAMSPACE-NAME>/<MODEL-NAME>.
|
|
199
|
+
"""
|
|
200
|
+
name = _extend_model_name_with_teamspace(name)
|
|
201
|
+
org_name, teamspace_name, model_name, _ = _parse_org_teamspace_model_version(name)
|
|
202
|
+
teamspace = _get_teamspace(name=teamspace_name, organization=org_name)
|
|
203
|
+
return teamspace.list_model_versions(name=model_name)
|
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
|
|
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
|
-
|
|
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",
|
|
@@ -249,6 +246,7 @@ Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additio
|
|
|
249
246
|
port: Optional[int] = 8000,
|
|
250
247
|
include_credentials: Optional[bool] = True,
|
|
251
248
|
cloudspace_id: Optional[str] = None,
|
|
249
|
+
from_onboarding: bool = False,
|
|
252
250
|
) -> dict:
|
|
253
251
|
"""Run a deployment on the cloud. If the deployment already exists, it will be updated.
|
|
254
252
|
|
|
@@ -266,6 +264,7 @@ Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additio
|
|
|
266
264
|
port: The port to run the deployment on. Defaults to 8000.
|
|
267
265
|
include_credentials: Whether to include credentials in the deployment. Defaults to True.
|
|
268
266
|
cloudspace_id: Connect to a Studio.
|
|
267
|
+
from_onboarding: Deployment created during onboarding.
|
|
269
268
|
|
|
270
269
|
Returns:
|
|
271
270
|
dict: The deployment and the URL of the deployment.
|
|
@@ -300,6 +299,8 @@ Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additio
|
|
|
300
299
|
ports=[port],
|
|
301
300
|
include_credentials=include_credentials,
|
|
302
301
|
cloudspace_id=cloudspace_id,
|
|
302
|
+
from_onboarding=from_onboarding,
|
|
303
|
+
command="",
|
|
303
304
|
)
|
|
304
305
|
|
|
305
306
|
return {"deployment": deployment, "url": url}
|