lightning-sdk 0.2.12__py3-none-any.whl → 0.2.14__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 (34) hide show
  1. lightning_sdk/__init__.py +1 -1
  2. lightning_sdk/api/llm_api.py +28 -5
  3. lightning_sdk/api/studio_api.py +17 -0
  4. lightning_sdk/cli/entrypoint.py +1 -1
  5. lightning_sdk/cli/serve.py +149 -39
  6. lightning_sdk/deployment/deployment.py +2 -2
  7. lightning_sdk/lightning_cloud/openapi/__init__.py +6 -0
  8. lightning_sdk/lightning_cloud/openapi/api/__init__.py +1 -0
  9. lightning_sdk/lightning_cloud/openapi/api/git_credentials_service_api.py +497 -0
  10. lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +14 -5
  11. lightning_sdk/lightning_cloud/openapi/models/__init__.py +5 -0
  12. lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py +27 -1
  13. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +27 -1
  14. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +27 -1
  15. lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +79 -1
  16. lightning_sdk/lightning_cloud/openapi/models/v1_create_git_credentials_request.py +175 -0
  17. lightning_sdk/lightning_cloud/openapi/models/v1_delete_git_credentials_response.py +97 -0
  18. lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py +27 -1
  19. lightning_sdk/lightning_cloud/openapi/models/v1_deployment_state.py +2 -0
  20. lightning_sdk/lightning_cloud/openapi/models/v1_git_credentials.py +227 -0
  21. lightning_sdk/lightning_cloud/openapi/models/v1_list_git_credentials_response.py +123 -0
  22. lightning_sdk/lightning_cloud/openapi/models/v1_list_job_resources_response.py +15 -15
  23. lightning_sdk/lightning_cloud/openapi/models/v1_nebius_direct_v1.py +149 -0
  24. lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +53 -1
  25. lightning_sdk/llm/llm.py +134 -30
  26. lightning_sdk/plugin.py +19 -0
  27. lightning_sdk/studio.py +33 -0
  28. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/METADATA +1 -1
  29. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/RECORD +34 -28
  30. /lightning_sdk/cli/{docker.py → docker_cli.py} +0 -0
  31. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/LICENSE +0 -0
  32. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/WHEEL +0 -0
  33. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/entry_points.txt +0 -0
  34. {lightning_sdk-0.2.12.dist-info → lightning_sdk-0.2.14.dist-info}/top_level.txt +0 -0
lightning_sdk/__init__.py CHANGED
@@ -31,6 +31,6 @@ __all__ = [
31
31
  "User",
32
32
  ]
33
33
 
34
- __version__ = "0.2.12"
34
+ __version__ = "0.2.14"
35
35
  _check_version_and_prompt_upgrade(__version__)
36
36
  _set_tqdm_envvars_noninteractive()
@@ -8,16 +8,25 @@ class LLMApi:
8
8
  def __init__(self) -> None:
9
9
  self._client = LightningClient(retry=False, max_tries=0)
10
10
 
11
- def list_models(self) -> List[str]:
12
- result = self._client.assistants_service_list_assistant_managed_endpoints()
13
- return result.endpoints
14
-
15
11
  def get_public_models(self) -> List[str]:
16
12
  result = self._client.assistants_service_list_assistants(published=True)
17
13
  return result.assistants
18
14
 
15
+ def get_org_models(self, org_id: str) -> List[str]:
16
+ result = self._client.assistants_service_list_assistants(org_id=org_id)
17
+ return result.assistants
18
+
19
+ def get_user_models(self, user_id: str) -> List[str]:
20
+ result = self._client.assistants_service_list_assistants(user_id=user_id)
21
+ return result.assistants
22
+
19
23
  def start_conversation(
20
- self, prompt: str, system_prompt: Optional[str], assistant_id: str
24
+ self,
25
+ prompt: str,
26
+ system_prompt: Optional[str],
27
+ max_completion_tokens: Optional[int],
28
+ assistant_id: str,
29
+ conversation_id: Optional[str],
21
30
  ) -> V1ConversationResponseChunk:
22
31
  body = {
23
32
  "message": {
@@ -29,6 +38,20 @@ class LLMApi:
29
38
  }
30
39
  ],
31
40
  },
41
+ "max_completion_tokens": max_completion_tokens,
32
42
  }
43
+ if conversation_id:
44
+ body["conversation_id"] = conversation_id
33
45
  result = self._client.assistants_service_start_conversation(body, assistant_id)
34
46
  return result.result
47
+
48
+ def list_conversations(self, assistant_id: str) -> List[str]:
49
+ result = self._client.assistants_service_list_conversations(assistant_id)
50
+ return result.conversations
51
+
52
+ def get_conversation(self, assistant_id: str, conversation_id: str) -> V1ConversationResponseChunk:
53
+ result = self._client.assistants_service_get_conversation(assistant_id, conversation_id)
54
+ return result.messages
55
+
56
+ def reset_conversation(self, assistant_id: str, conversation_id: str) -> None:
57
+ self._client.assistants_service_delete_conversation(assistant_id, conversation_id)
@@ -36,13 +36,16 @@ from lightning_sdk.lightning_cloud.openapi import (
36
36
  V1CloudSpaceInstanceConfig,
37
37
  V1CloudSpaceSeedFile,
38
38
  V1CloudSpaceState,
39
+ V1EndpointType,
39
40
  V1GetCloudSpaceInstanceStatusResponse,
40
41
  V1GetLongRunningCommandInCloudSpaceResponse,
41
42
  V1LoginRequest,
42
43
  V1Plugin,
43
44
  V1PluginsListResponse,
45
+ V1UpstreamCloudSpace,
44
46
  V1UserRequestedComputeConfig,
45
47
  )
48
+ from lightning_sdk.lightning_cloud.openapi.models import ProjectIdEndpointsBody
46
49
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
47
50
  from lightning_sdk.machine import Machine
48
51
 
@@ -668,6 +671,20 @@ class StudioApi:
668
671
  interruptible=interruptible,
669
672
  )
670
673
 
674
+ def start_new_port(self, teamspace_id: str, studio_id: str, name: str, port: int, auto_start: bool = False) -> str:
675
+ """Starts a new port to the given Studio."""
676
+ endpoint = self._client.endpoint_service_create_endpoint(
677
+ project_id=teamspace_id,
678
+ body=ProjectIdEndpointsBody(
679
+ name=name,
680
+ ports=[str(port)],
681
+ cloudspace=V1UpstreamCloudSpace(
682
+ cloudspace_id=studio_id, port=str(port), type=V1EndpointType.PLUGIN_PORT, auto_start=auto_start
683
+ ),
684
+ ),
685
+ )
686
+ return endpoint.urls[0]
687
+
671
688
  def _create_app(
672
689
  self, studio_id: str, teamspace_id: str, cloud_account: str, plugin_type: str, **other_arguments: Any
673
690
  ) -> Externalv1LightningappInstance:
@@ -14,7 +14,7 @@ from lightning_sdk.cli.configure import configure
14
14
  from lightning_sdk.cli.connect import connect
15
15
  from lightning_sdk.cli.create import create
16
16
  from lightning_sdk.cli.delete import delete
17
- from lightning_sdk.cli.docker import dockerize
17
+ from lightning_sdk.cli.docker_cli import dockerize
18
18
  from lightning_sdk.cli.download import download
19
19
  from lightning_sdk.cli.generate import generate
20
20
  from lightning_sdk.cli.inspect import inspect
@@ -1,3 +1,4 @@
1
+ import concurrent.futures
1
2
  import os
2
3
  import socket
3
4
  import subprocess
@@ -7,7 +8,7 @@ from datetime import datetime
7
8
  from enum import Enum
8
9
  from pathlib import Path
9
10
  from threading import Thread
10
- from typing import List, Optional, TypedDict, Union
11
+ from typing import Dict, List, Optional, TypedDict, Union
11
12
  from urllib.parse import urlencode
12
13
 
13
14
  import click
@@ -20,12 +21,18 @@ from lightning_sdk.api import UserApi
20
21
  from lightning_sdk.api.lit_container_api import LitContainerApi
21
22
  from lightning_sdk.api.utils import _get_registry_url
22
23
  from lightning_sdk.cli.teamspace_menu import _TeamspacesMenu
24
+ from lightning_sdk.cli.upload import (
25
+ _dump_current_upload_state,
26
+ _resolve_previous_upload_state,
27
+ _start_parallel_upload,
28
+ )
23
29
  from lightning_sdk.lightning_cloud import env
24
30
  from lightning_sdk.lightning_cloud.login import Auth, AuthServer
25
31
  from lightning_sdk.lightning_cloud.openapi import V1CloudSpace
26
32
  from lightning_sdk.lightning_cloud.rest_client import LightningClient
27
33
  from lightning_sdk.serve import _LitServeDeployer
28
- from lightning_sdk.utils.resolve import _get_authed_user, _resolve_teamspace
34
+ from lightning_sdk.studio import Studio
35
+ from lightning_sdk.utils.resolve import _get_authed_user, _get_studio_url, _resolve_teamspace
29
36
 
30
37
  _MACHINE_VALUES = tuple([machine.name for machine in Machine.__dict__.values() if isinstance(machine, Machine)])
31
38
  _POLL_TIMEOUT = 600
@@ -86,7 +93,14 @@ def deploy() -> None:
86
93
  default="CPU",
87
94
  show_default=True,
88
95
  type=click.Choice(_MACHINE_VALUES),
89
- help="The machine type to deploy the API on.",
96
+ help="Machine type to deploy the API on. Defaults to CPU.",
97
+ )
98
+ @click.option(
99
+ "--devbox",
100
+ default=None,
101
+ show_default=True,
102
+ type=click.Choice(_MACHINE_VALUES),
103
+ help="Machine type to build the API on. Setting this argument will open the server in a Studio.",
90
104
  )
91
105
  @click.option(
92
106
  "--interruptible",
@@ -134,7 +148,8 @@ def api(
134
148
  local: bool,
135
149
  name: Optional[str],
136
150
  non_interactive: bool,
137
- machine: str,
151
+ machine: Optional[str],
152
+ devbox: Optional[str],
138
153
  interruptible: bool,
139
154
  teamspace: Optional[str],
140
155
  org: Optional[str],
@@ -151,9 +166,10 @@ def api(
151
166
  script_path=script_path,
152
167
  easy=easy,
153
168
  local=local,
154
- repository=name,
169
+ name=name,
155
170
  non_interactive=non_interactive,
156
171
  machine=machine,
172
+ devbox=devbox,
157
173
  interruptible=interruptible,
158
174
  teamspace=teamspace,
159
175
  org=org,
@@ -171,10 +187,11 @@ def api_impl(
171
187
  script_path: Union[str, Path],
172
188
  easy: bool = False,
173
189
  local: bool = False,
174
- repository: [str] = None,
190
+ name: Optional[str] = None,
175
191
  tag: Optional[str] = None,
176
192
  non_interactive: bool = False,
177
193
  machine: str = "CPU",
194
+ devbox: Optional[str] = None,
178
195
  interruptible: bool = False,
179
196
  teamspace: Optional[str] = None,
180
197
  org: Optional[str] = None,
@@ -196,41 +213,44 @@ def api_impl(
196
213
 
197
214
  _LitServeDeployer.generate_client() if easy else None
198
215
 
199
- if not repository:
216
+ if not name:
200
217
  timestr = datetime.now().strftime("%b-%d-%H_%M")
201
- repository = f"litserve-{timestr}".lower()
202
-
203
- if not local:
204
- repository = repository or "litserve-model"
205
- machine = Machine.from_str(machine)
206
- return _handle_cloud(
207
- script_path,
208
- console,
209
- repository=repository,
210
- tag=tag,
211
- non_interactive=non_interactive,
212
- machine=machine,
213
- interruptible=interruptible,
214
- teamspace=teamspace,
215
- org=org,
216
- user=user,
217
- cloud_account=cloud_account,
218
- port=port,
219
- min_replica=min_replica,
220
- max_replica=max_replica,
221
- replicas=replicas,
222
- include_credentials=include_credentials,
223
- )
218
+ name = f"litserve-{timestr}".lower()
224
219
 
225
- try:
226
- subprocess.run(
227
- ["python", str(script_path)],
228
- check=True,
229
- text=True,
230
- )
231
- except subprocess.CalledProcessError as e:
232
- error_msg = f"Script execution failed with exit code {e.returncode}\nstdout: {e.stdout}\nstderr: {e.stderr}"
233
- raise RuntimeError(error_msg) from None
220
+ if local:
221
+ try:
222
+ subprocess.run(
223
+ ["python", str(script_path)],
224
+ check=True,
225
+ text=True,
226
+ )
227
+ return None
228
+ except subprocess.CalledProcessError as e:
229
+ error_msg = f"Script execution failed with exit code {e.returncode}\nstdout: {e.stdout}\nstderr: {e.stderr}"
230
+ raise RuntimeError(error_msg) from None
231
+
232
+ if devbox:
233
+ return _handle_devbox(name, script_path, console, non_interactive, devbox, interruptible, teamspace, org, user)
234
+
235
+ machine = Machine.from_str(machine)
236
+ return _handle_cloud(
237
+ script_path,
238
+ console,
239
+ repository=name,
240
+ tag=tag,
241
+ non_interactive=non_interactive,
242
+ machine=machine,
243
+ interruptible=interruptible,
244
+ teamspace=teamspace,
245
+ org=org,
246
+ user=user,
247
+ cloud_account=cloud_account,
248
+ port=port,
249
+ min_replica=min_replica,
250
+ max_replica=max_replica,
251
+ replicas=replicas,
252
+ include_credentials=include_credentials,
253
+ )
234
254
 
235
255
 
236
256
  class _AuthServer(AuthServer):
@@ -433,6 +453,96 @@ def _upload_container(
433
453
  return True
434
454
 
435
455
 
456
+ # TODO: Move the rest of the devbox logic here
457
+ class _LitServeDevbox:
458
+ """Build LitServe API in a Studio."""
459
+
460
+ def resolve_previous_upload(self, studio: Studio, folder: str) -> Dict[str, str]:
461
+ remote_path = "."
462
+ pairs = {}
463
+ for root, _, files in os.walk(folder):
464
+ rel_root = os.path.relpath(root, folder)
465
+ for f in files:
466
+ pairs[os.path.join(root, f)] = os.path.join(remote_path, rel_root, f)
467
+ return _resolve_previous_upload_state(studio, remote_path, pairs)
468
+
469
+ def upload_folder(self, studio: Studio, folder: str, upload_state: Dict[str, str]) -> None:
470
+ with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
471
+ futures = _start_parallel_upload(executor, studio, upload_state)
472
+ total_files = len(upload_state)
473
+
474
+ with Progress(
475
+ SpinnerColumn(),
476
+ TextColumn("[progress.description]{task.description}"),
477
+ TimeElapsedColumn(),
478
+ console=Console(),
479
+ transient=True,
480
+ ) as progress:
481
+ upload_task = progress.add_task(f"[cyan]Uploading {total_files} files to Studio...", total=total_files)
482
+ for f in concurrent.futures.as_completed(futures):
483
+ upload_state.pop(f.result())
484
+ _dump_current_upload_state(studio, ".", upload_state)
485
+ progress.update(upload_task, advance=1)
486
+
487
+
488
+ def _handle_devbox(
489
+ name: str,
490
+ script_path: Path,
491
+ console: Console,
492
+ non_interactive: bool = False,
493
+ devbox: Machine = "CPU",
494
+ interruptible: bool = False,
495
+ teamspace: Optional[str] = None,
496
+ org: Optional[str] = None,
497
+ user: Optional[str] = None,
498
+ ) -> None:
499
+ if script_path.suffix != ".py":
500
+ console.print("❌ Error: Only Python files (.py) are supported for development servers", style="red")
501
+ return
502
+
503
+ resolved_teamspace = select_teamspace(teamspace, org, user)
504
+ studio = Studio(name=name, teamspace=resolved_teamspace)
505
+ lit_devbox = _LitServeDevbox()
506
+
507
+ studio_url = _get_studio_url(studio, turn_on=True)
508
+ pathlib_path = Path(script_path).resolve()
509
+ ok = False
510
+ studio_path = f"{studio.owner.name}/{studio.teamspace.name}/{studio.name}"
511
+
512
+ console.print("\n=== Lightning Studio Setup ===")
513
+ console.print(f"🔧 [bold]Setting up Studio:[/bold] {studio_path}")
514
+ console.print(f"📁 [bold]Local project:[/bold] {pathlib_path.parent}")
515
+
516
+ upload_state = lit_devbox.resolve_previous_upload(studio, pathlib_path.parent)
517
+ if non_interactive:
518
+ console.print(f"🌐 [bold]Opening Studio:[/bold] [link={studio_url}]{studio_url}[/link]")
519
+ ok = webbrowser.open(studio_url)
520
+ else:
521
+ if Confirm.ask("Would you like to open your Studio in the browser?", default=True):
522
+ console.print(f"🌐 [bold]Opening Studio:[/bold] [link={studio_url}]{studio_url}[/link]")
523
+ ok = webbrowser.open(studio_url)
524
+
525
+ if not ok:
526
+ console.print(f"🔗 [bold]Access Studio:[/bold] [link={studio_url}]{studio_url}[/link]")
527
+
528
+ console.print("\n⚡ Initializing Studio (this typically takes 1-2 minutes)...")
529
+ studio.start(machine=devbox, interruptible=interruptible)
530
+ studio.install_plugin("custom-port")
531
+ console.print("🔌 Configuring server port...")
532
+ studio.run_plugin("custom-port", port=8000) # TODO: Remove hardcoded port and fetch from LitServe
533
+
534
+ console.print("📤 Syncing project files to Studio...")
535
+ lit_devbox.upload_folder(studio, pathlib_path.parent, upload_state)
536
+
537
+ # Add completion message with next steps
538
+ console.print("\n✅ Studio ready!")
539
+ console.print("\n📋 [bold]Next steps:[/bold]")
540
+ console.print(" [bold]1.[/bold] Server code will be available in the Studio")
541
+ console.print(" [bold]2.[/bold] The Studio is now running with the specified configuration")
542
+ console.print(" [bold]3.[/bold] Modify and run your server directly in the Studio")
543
+ # TODO: Once server running is implemented
544
+
545
+
436
546
  def _handle_cloud(
437
547
  script_path: Union[str, Path],
438
548
  console: Console,
@@ -283,7 +283,7 @@ class Deployment:
283
283
  health_check=health_check,
284
284
  release_strategy=release_strategy,
285
285
  quantity=quantity,
286
- include_credentials=include_credentials if include_credentials is not None else True,
286
+ include_credentials=include_credentials,
287
287
  )
288
288
 
289
289
  def stop(self) -> None:
@@ -362,7 +362,7 @@ class Deployment:
362
362
  return None
363
363
 
364
364
  @property
365
- def env(self) -> Optional[AutoScaleConfig]:
365
+ def env(self) -> Optional[List[Union[Secret, Env]]]:
366
366
  """The env configuration of the deployment."""
367
367
  if self._deployment:
368
368
  self._deployment = self._deployment_api.get_deployment_by_name(self._name, self._teamspace.id)
@@ -36,6 +36,7 @@ from lightning_sdk.lightning_cloud.openapi.api.deployment_templates_service_api
36
36
  from lightning_sdk.lightning_cloud.openapi.api.endpoint_service_api import EndpointServiceApi
37
37
  from lightning_sdk.lightning_cloud.openapi.api.experiments_service_api import ExperimentsServiceApi
38
38
  from lightning_sdk.lightning_cloud.openapi.api.file_system_service_api import FileSystemServiceApi
39
+ from lightning_sdk.lightning_cloud.openapi.api.git_credentials_service_api import GitCredentialsServiceApi
39
40
  from lightning_sdk.lightning_cloud.openapi.api.jobs_service_api import JobsServiceApi
40
41
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_instance_service_api import LightningappInstanceServiceApi
41
42
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_v2_service_api import LightningappV2ServiceApi
@@ -345,6 +346,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_create_cluster_request impo
345
346
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_cluster_response import V1CreateClusterResponse
346
347
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_deployment_request import V1CreateDeploymentRequest
347
348
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_deployment_template_request import V1CreateDeploymentTemplateRequest
349
+ from lightning_sdk.lightning_cloud.openapi.models.v1_create_git_credentials_request import V1CreateGitCredentialsRequest
348
350
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_job_request import V1CreateJobRequest
349
351
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_lit_dataset_multi_part_upload_response import V1CreateLitDatasetMultiPartUploadResponse
350
352
  from lightning_sdk.lightning_cloud.openapi.models.v1_create_lit_page_request import V1CreateLitPageRequest
@@ -391,6 +393,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_deployment_release_r
391
393
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_deployment_response import V1DeleteDeploymentResponse
392
394
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_endpoint_response import V1DeleteEndpointResponse
393
395
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_file_endpoint_response import V1DeleteFileEndpointResponse
396
+ from lightning_sdk.lightning_cloud.openapi.models.v1_delete_git_credentials_response import V1DeleteGitCredentialsResponse
394
397
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_index_response import V1DeleteIndexResponse
395
398
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_job_response import V1DeleteJobResponse
396
399
  from lightning_sdk.lightning_cloud.openapi.models.v1_delete_lightning_run_response import V1DeleteLightningRunResponse
@@ -534,6 +537,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_get_user_notification_prefe
534
537
  from lightning_sdk.lightning_cloud.openapi.models.v1_get_user_response import V1GetUserResponse
535
538
  from lightning_sdk.lightning_cloud.openapi.models.v1_get_user_storage_breakdown_response import V1GetUserStorageBreakdownResponse
536
539
  from lightning_sdk.lightning_cloud.openapi.models.v1_get_user_storage_response import V1GetUserStorageResponse
540
+ from lightning_sdk.lightning_cloud.openapi.models.v1_git_credentials import V1GitCredentials
537
541
  from lightning_sdk.lightning_cloud.openapi.models.v1_google_cloud_direct_v1 import V1GoogleCloudDirectV1
538
542
  from lightning_sdk.lightning_cloud.openapi.models.v1_google_cloud_direct_v1_status import V1GoogleCloudDirectV1Status
539
543
  from lightning_sdk.lightning_cloud.openapi.models.v1_header import V1Header
@@ -625,6 +629,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_slurm_jobs_
625
629
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_filesystem_snowflake_response import V1ListFilesystemSnowflakeResponse
626
630
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_gallery_components_response import V1ListGalleryComponentsResponse
627
631
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_gallery_lightningapps_response import V1ListGalleryLightningappsResponse
632
+ from lightning_sdk.lightning_cloud.openapi.models.v1_list_git_credentials_response import V1ListGitCredentialsResponse
628
633
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_job_files_response import V1ListJobFilesResponse
629
634
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_job_resources_response import V1ListJobResourcesResponse
630
635
  from lightning_sdk.lightning_cloud.openapi.models.v1_list_jobs_response import V1ListJobsResponse
@@ -720,6 +725,7 @@ from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_fault_tol
720
725
  from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_state import V1MultiMachineJobState
721
726
  from lightning_sdk.lightning_cloud.openapi.models.v1_multi_machine_job_status import V1MultiMachineJobStatus
722
727
  from lightning_sdk.lightning_cloud.openapi.models.v1_named_get_logger_metrics import V1NamedGetLoggerMetrics
728
+ from lightning_sdk.lightning_cloud.openapi.models.v1_nebius_direct_v1 import V1NebiusDirectV1
723
729
  from lightning_sdk.lightning_cloud.openapi.models.v1_network_config import V1NetworkConfig
724
730
  from lightning_sdk.lightning_cloud.openapi.models.v1_new_feature import V1NewFeature
725
731
  from lightning_sdk.lightning_cloud.openapi.models.v1_notification_preference import V1NotificationPreference
@@ -17,6 +17,7 @@ from lightning_sdk.lightning_cloud.openapi.api.deployment_templates_service_api
17
17
  from lightning_sdk.lightning_cloud.openapi.api.endpoint_service_api import EndpointServiceApi
18
18
  from lightning_sdk.lightning_cloud.openapi.api.experiments_service_api import ExperimentsServiceApi
19
19
  from lightning_sdk.lightning_cloud.openapi.api.file_system_service_api import FileSystemServiceApi
20
+ from lightning_sdk.lightning_cloud.openapi.api.git_credentials_service_api import GitCredentialsServiceApi
20
21
  from lightning_sdk.lightning_cloud.openapi.api.jobs_service_api import JobsServiceApi
21
22
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_instance_service_api import LightningappInstanceServiceApi
22
23
  from lightning_sdk.lightning_cloud.openapi.api.lightningapp_v2_service_api import LightningappV2ServiceApi