lightning-sdk 0.1.2__py3-none-any.whl → 0.1.46__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 +12 -2
- lightning_sdk/agents.py +46 -0
- lightning_sdk/ai_hub.py +185 -0
- lightning_sdk/api/__init__.py +4 -0
- lightning_sdk/api/agents_api.py +107 -0
- lightning_sdk/api/ai_hub_api.py +130 -0
- lightning_sdk/api/deployment_api.py +574 -0
- lightning_sdk/api/job_api.py +308 -0
- lightning_sdk/api/mmt_api.py +188 -0
- lightning_sdk/api/org_api.py +1 -3
- lightning_sdk/api/studio_api.py +174 -83
- lightning_sdk/api/teamspace_api.py +219 -20
- lightning_sdk/api/user_api.py +24 -9
- lightning_sdk/api/utils.py +429 -47
- lightning_sdk/cli/ai_hub.py +49 -0
- lightning_sdk/cli/download.py +132 -0
- lightning_sdk/cli/entrypoint.py +11 -3
- lightning_sdk/cli/run.py +206 -0
- lightning_sdk/cli/serve.py +218 -0
- lightning_sdk/cli/studios_menu.py +78 -0
- lightning_sdk/cli/upload.py +79 -89
- lightning_sdk/constants.py +29 -1
- lightning_sdk/deployment/__init__.py +25 -0
- lightning_sdk/deployment/deployment.py +389 -0
- lightning_sdk/helpers.py +49 -0
- lightning_sdk/job/__init__.py +5 -0
- lightning_sdk/job/base.py +295 -0
- lightning_sdk/job/job.py +266 -0
- lightning_sdk/job/v1.py +241 -0
- lightning_sdk/job/v2.py +193 -0
- lightning_sdk/job/work.py +72 -0
- lightning_sdk/lightning_cloud/__version__.py +1 -1
- lightning_sdk/lightning_cloud/cli/__main__.py +15 -13
- lightning_sdk/lightning_cloud/env.py +1 -0
- lightning_sdk/lightning_cloud/login.py +12 -8
- lightning_sdk/lightning_cloud/openapi/__init__.py +314 -43
- lightning_sdk/lightning_cloud/openapi/api/__init__.py +10 -0
- lightning_sdk/lightning_cloud/openapi/api/analytics_service_api.py +141 -0
- lightning_sdk/lightning_cloud/openapi/api/assistants_service_api.py +1075 -227
- lightning_sdk/lightning_cloud/openapi/api/billing_service_api.py +9 -1
- lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +3115 -895
- lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +908 -141
- lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +10 -5
- lightning_sdk/lightning_cloud/openapi/api/deployment_templates_service_api.py +756 -0
- lightning_sdk/lightning_cloud/openapi/api/endpoint_service_api.py +1658 -159
- lightning_sdk/lightning_cloud/openapi/api/experiments_service_api.py +242 -0
- lightning_sdk/lightning_cloud/openapi/api/file_system_service_api.py +674 -0
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +3823 -0
- lightning_sdk/lightning_cloud/openapi/api/lightningapp_instance_service_api.py +158 -590
- lightning_sdk/lightning_cloud/openapi/api/lightningapp_v2_service_api.py +0 -1086
- lightning_sdk/lightning_cloud/openapi/api/lightningwork_service_api.py +113 -0
- lightning_sdk/lightning_cloud/openapi/api/lit_logger_service_api.py +1753 -0
- lightning_sdk/lightning_cloud/openapi/api/lit_registry_service_api.py +242 -0
- lightning_sdk/lightning_cloud/openapi/api/models_store_api.py +1423 -108
- lightning_sdk/lightning_cloud/openapi/api/organizations_service_api.py +421 -1
- lightning_sdk/lightning_cloud/openapi/api/profiler_service_api.py +663 -0
- lightning_sdk/lightning_cloud/openapi/api/projects_service_api.py +5 -1
- lightning_sdk/lightning_cloud/openapi/api/secret_service_api.py +478 -1
- lightning_sdk/lightning_cloud/openapi/api/slurm_jobs_user_service_api.py +9 -5
- lightning_sdk/lightning_cloud/openapi/api/snowflake_service_api.py +686 -0
- lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py +1094 -0
- lightning_sdk/lightning_cloud/openapi/api/studio_jobs_service_api.py +4 -4
- lightning_sdk/lightning_cloud/openapi/api/user_service_api.py +1081 -34
- lightning_sdk/lightning_cloud/openapi/models/__init__.py +304 -41
- lightning_sdk/lightning_cloud/openapi/models/affiliatelinks_id_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/agentmanagedendpoints_id_body.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/agents_id_body.py +643 -0
- lightning_sdk/lightning_cloud/openapi/models/app_id_works_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/approveautojoindomain_domain_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/apps_id_body1.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/{v1_get_cluster_health_response.py → captures_id_body.py} +16 -16
- lightning_sdk/lightning_cloud/openapi/models/cloud_space_id_versionpublications_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/cloud_space_id_versionpublications_body1.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/cloud_space_id_versions_body.py +409 -0
- lightning_sdk/lightning_cloud/openapi/models/cloudspace_id_runs_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/cloudspaces_id_body.py +84 -6
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_capacityblock_body.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_capacityreservations_body.py +55 -3
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_proxies_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/clusters_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/create.py +157 -1
- lightning_sdk/lightning_cloud/openapi/models/create_deployment_request_defines_a_spec_for_the_job_that_allows_for_autoscaling_jobs.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py +565 -0
- lightning_sdk/lightning_cloud/openapi/models/deploymenttemplates_id_body.py +513 -0
- lightning_sdk/lightning_cloud/openapi/models/endpoints_id_body.py +43 -17
- lightning_sdk/lightning_cloud/openapi/models/experiment_name_variant_name_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +107 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_lightningapp_instance.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_user_status.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/fileendpoints_id_body.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/id_codeconfig_body.py +29 -55
- lightning_sdk/lightning_cloud/openapi/models/id_complete_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_engage_body.py +3 -29
- lightning_sdk/lightning_cloud/openapi/models/id_engage_body1.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/id_execute_body.py +3 -55
- lightning_sdk/lightning_cloud/openapi/models/id_execute_body1.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_fork_body.py +31 -31
- lightning_sdk/lightning_cloud/openapi/models/id_fork_body1.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_get_body.py +133 -3
- lightning_sdk/lightning_cloud/openapi/models/id_index_body.py +67 -15
- lightning_sdk/lightning_cloud/openapi/models/id_index_body2.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/id_index_body3.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_reportlogsactivity_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/id_start_body.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/id_storage_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_uploads_body1.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_visibility_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body2.py +17 -43
- lightning_sdk/lightning_cloud/openapi/models/jobs_id_body3.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/litloggermetrics_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/litpages_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/loggermetrics_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/metrics_stream_id_loggerartifacts_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/metricsstream_create_body.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_cloud_space_id_list.py → metricsstream_delete_body.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/metricsstream_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_upload_model_response.py → model_id_versions_body.py} +25 -51
- lightning_sdk/lightning_cloud/openapi/models/model_id_visibility_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/models_model_id_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/multimachinejobs_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/org_id_memberships_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +183 -1
- lightning_sdk/lightning_cloud/openapi/models/profiler_captures_body.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/profiler_enabled_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_agentmanagedendpoints_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/{project_id_assistants_body.py → project_id_agents_body.py} +181 -51
- lightning_sdk/lightning_cloud/openapi/models/project_id_cloudspaces_body.py +71 -19
- lightning_sdk/lightning_cloud/openapi/models/project_id_fileendpoints_body.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_jobs_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_litregistry_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_memberships_body.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_upload_model_request.py → project_id_models_body.py} +70 -70
- lightning_sdk/lightning_cloud/openapi/models/project_id_multimachinejobs_body.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_secrets_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_serviceexecution_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/project_id_snowflake_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/query_query_id_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/secrets_id_body1.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/servers_server_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/service_artifact_artifact_kind.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/serviceexecution_id_body.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/slurm_jobs_body.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/snowflake_export_body.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_download_model_response.py → snowflake_query_body.py} +51 -51
- lightning_sdk/lightning_cloud/openapi/models/storage_complete_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/update.py +105 -1
- lightning_sdk/lightning_cloud/openapi/models/upload_id_complete_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/upload_id_parts_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/user_id_affiliatelinks_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_accelerator_quota_info.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ack_user_storage_violation_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_add_job_timing_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_affiliate_link.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_agent_job.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_api_pricing_spec.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_app_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_append_logger_metrics_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_approve_auto_join_domain_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assign_variant_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant.py +157 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_knowledge_item_status.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_knowledge_status.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_model_status.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_auto_join_domain_validation.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_auto_join_org_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_autoscaling_spec.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_autoscaling_target_metric.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_direct_v1.py +133 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_batch_update_lightningwork_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cancellation_metadata.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_capacity_block_offering.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_check_snowflake_connection_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_checkbox.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space.py +162 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_code_version.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_code_version_status.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_instance_config.py +1 -53
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_instance_startup_status.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_log_service.py → v1_cloud_space_session.py} +49 -49
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_version.py +669 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_version_publication.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +445 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py +55 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_names.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_proxy.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_resource_tag.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +157 -107
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_state.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_status.py +17 -43
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_tagging_options.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_type.py +0 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_command_argument.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_complete_model_upload_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_complete_multi_part_upload_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_complete_upload_service_execution_artifact_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_completed_part.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_conversation.py +15 -15
- lightning_sdk/lightning_cloud/openapi/models/v1_conversation_response_chunk.py +26 -26
- lightning_sdk/lightning_cloud/openapi/models/v1_count_metrics_streams_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_checkout_session_request.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_cluster_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_deployment_template_request.py +539 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_multi_part_upload_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_organization_request.py +159 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_create_project_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_shared_metrics_stream_request.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_shared_metrics_stream_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_snowflake_connection_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_user_secret_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_data_connection.py +365 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_performance_profile.py → v1_data_connection_state.py} +11 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_data_path.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_affiliate_link_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_session_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_version_publication_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cloud_space_version_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_cluster_proxy_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_deployment_release_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_azure_cluster_driver_status.py → v1_delete_deployment_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_index_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_byom_cluster_driver.py → v1_delete_job_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/{v1_delete_lightningapp_v2_response.py → v1_delete_logger_artifact_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_managed_endpoint_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_metrics_stream_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_multi_machine_job_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_profiler_capture_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_service_execution_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_delete_lightningapp_release_response.py → v1_delete_shared_metrics_stream_response.py} +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py +617 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_api.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_event.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_event_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_metrics.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_performance.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_release.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_spec.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_state.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_status.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/{appsv2_id_body.py → v1_deployment_strategy.py} +39 -39
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template.py +721 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_engagement_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_gallery_response.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_placement.py +106 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_parameter_type.py +106 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment_template_summary.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/{instance_type_availability.py → v1_deployment_template_type.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/{v1_get_lightningapp_source_code_download_url_response.py → v1_download_job_logs_response.py} +10 -10
- lightning_sdk/lightning_cloud/openapi/models/v1_download_service_execution_artifact_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ebs.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_efs_config.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint.py +53 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint_auth.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_endpoint_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_cloud_space_command_response.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_in_cloud_space_session_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_execute_snowflake_query_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_experiment.py +409 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_export_snowflake_query_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_external_search_user.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_file_endpoint.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_instance_spec.py → v1_filesystem_app.py} +85 -59
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_cloud_space.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_dataset.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_job.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_slurm_job.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_snowflake_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_work.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_find_capacity_block_offering_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_gcp_data_connection.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_gcs_folder_data_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_affiliate_link_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_list_cluster_instance_types_response.py → v1_get_deployment_routing_telemetry_aggregated_response.py} +23 -23
- lightning_sdk/lightning_cloud/openapi/models/v1_get_deployment_routing_telemetry_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_folder_index_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/{v1_cluster_driver_status.py → v1_get_job_stats_response.py} +39 -39
- lightning_sdk/lightning_cloud/openapi/models/v1_get_job_system_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_lightningapp_instance_open_ports_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_logger_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_file_upload_urls_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_file_url_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_response.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_files_url_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_lightningwork_cluster_driver.py → v1_get_project_artifact_response.py} +33 -14
- lightning_sdk/lightning_cloud/openapi/models/v1_get_project_balance_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_project_storage_metadata_response.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_service_execution_status_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_snowflake_query_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_balance_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +105 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_breakdown_response.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_storage_response.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py +163 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1_status.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_header.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_external_kubeconfig.py → v1_health_check_exec.py} +21 -21
- lightning_sdk/lightning_cloud/openapi/models/v1_health_check_http_get.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ids_logger_metrics.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_input.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_interrupt_server_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job.py +697 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_health_check_config.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_log_entry.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_logs_page.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_logs_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_spec.py +669 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job_timing.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_joinable_organization.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_knowledge_configuration.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lambda_labs_direct_v1.py +125 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lightning_run.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_instance_spec.py +105 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_instance_status.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningwork_spec.py +27 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningwork_status.py +81 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_list_affiliate_links_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_python_versions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_sessions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_tags_response.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_version_publications_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cloud_space_versions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_availabilities_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_proxies_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_events_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_releases_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_tags_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployment_templates_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_deployments_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_experiments_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_apps_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_cloud_spaces_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_datasets_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_slurm_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_snowflake_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_list_lightningapps_v2_response.py → v1_list_jobs_response.py} +31 -31
- lightning_sdk/lightning_cloud/openapi/models/v1_list_joinable_organizations_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_logger_artifact_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_metrics_streams_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_job_events_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_multi_machine_jobs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_new_features_for_user_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_profiler_captures_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_project_locked_resources_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_published_cloud_spaces_response.py +3 -29
- lightning_sdk/lightning_cloud/openapi/models/v1_list_published_deployment_templates_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_service_execution_lightningapp_instances_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_service_executions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_page.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_registry_project.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lit_repository.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_locked_resource.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_logger_artifact.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_machines_selector.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_request.py +81 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_response.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_endpoint.py +175 -19
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_model.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_model_abilities.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_membership.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_message.py +138 -8
- lightning_sdk/lightning_cloud/openapi/models/v1_message_content.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_message_content_type.py +103 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metadata.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_metric_value.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +799 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_tags.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_tracker.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_model.py +95 -17
- lightning_sdk/lightning_cloud/openapi/models/v1_model_file.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_model_version_archive.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_mount_target.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job.py +487 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_event.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/{get_cluster_health_response_health_status.py → v1_multi_machine_job_event_type.py} +9 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_fault_tolerance.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_fault_tolerance_strategy.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_state.py +108 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_multi_machine_job_status.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_named_get_logger_metrics.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_new_feature.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_onboarding_event_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_onboarding_event_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +209 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_parameterization_spec.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_path_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_phase_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_profiler_capture.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_profiler_enabled_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_project.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_membership.py +263 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_project_storage.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_published_cloud_space_response.py +188 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_purchase_capacity_block_response.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_param.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_result.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_query_result_row.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_refresh_path_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_regional_load_balancer.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_report_logs_activity_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_request_cluster_access_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_request_cluster_access_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_cloud_space_tag.py → v1_resource_tag.py} +18 -18
- lightning_sdk/lightning_cloud/openapi/models/v1_resource_visibility.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_resources.py +37 -11
- lightning_sdk/lightning_cloud/openapi/models/v1_restore_deployment_release_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_rolling_update_strategy.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_condition.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_resource.py +11 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_s3_folder_data_connection.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_search_job_logs_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_search_users_response.py +6 -6
- lightning_sdk/lightning_cloud/openapi/models/v1_secret.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/{v1_lightningapp_cluster_driver.py → v1_secret_type.py} +10 -9
- lightning_sdk/lightning_cloud/openapi/models/v1_select.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_server_check_in_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_update_cluster_response.py → v1_service_artifact.py} +54 -54
- lightning_sdk/lightning_cloud/openapi/models/v1_service_execution.py +383 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_should_start_syncing_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_signed_url.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_job.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_node.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_slurm_v1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_snowflake_data_connection.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_status_code_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_asset.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_asset_type.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_studio_job_app.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_system_info.py +617 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_telemetry.py +331 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_timestamp_code_telemetry.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_transaction.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_transfer_user_balance_request.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_billing_subscription_request.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_cluster_accelerators_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_index_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_metrics_stream_visibility_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_model_visibility_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_shared_metrics_stream_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_snowflake_query_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_viewed_new_features_request.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_viewed_new_features_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_upload_service_execution_artifact_parts_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_upload_service_execution_artifact_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_upstream_cloud_space.py +97 -19
- lightning_sdk/lightning_cloud/openapi/models/v1_upstream_job.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_usage.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_usage_details.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +1030 -302
- lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_compute_config.py +45 -45
- lightning_sdk/lightning_cloud/openapi/models/v1_user_requested_flow_compute_config.py +29 -29
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_assistant_status_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_auto_join_domain_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_data_connection_response.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_deployment_image_request.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_deployment_image_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_endpoint_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_endpoint_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_managed_model_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_volume.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_vultr_direct_v1.py +125 -0
- lightning_sdk/lightning_cloud/openapi/models/validate.py +97 -19
- lightning_sdk/lightning_cloud/openapi/models/validateautojoindomain_domain_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/version_uploads_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/versions_id_body.py +357 -0
- lightning_sdk/lightning_cloud/rest_client.py +49 -23
- lightning_sdk/lightning_cloud/source_code/logs_socket_api.py +1 -1
- lightning_sdk/lightning_cloud/source_code/tar.py +1 -3
- lightning_sdk/lightning_cloud/utils/data_connection.py +145 -7
- lightning_sdk/machine.py +17 -4
- lightning_sdk/mmt/__init__.py +4 -0
- lightning_sdk/mmt/base.py +288 -0
- lightning_sdk/mmt/mmt.py +282 -0
- lightning_sdk/mmt/v1.py +185 -0
- lightning_sdk/mmt/v2.py +193 -0
- lightning_sdk/models.py +153 -0
- lightning_sdk/organization.py +1 -1
- lightning_sdk/plugin.py +207 -41
- lightning_sdk/services/__init__.py +5 -0
- lightning_sdk/services/file_endpoint.py +223 -0
- lightning_sdk/services/finetune/__init__.py +35 -0
- lightning_sdk/services/utilities.py +111 -0
- lightning_sdk/status.py +2 -1
- lightning_sdk/studio.py +90 -17
- lightning_sdk/teamspace.py +189 -11
- lightning_sdk/user.py +1 -1
- lightning_sdk/utils/__init__.py +0 -0
- lightning_sdk/utils/dynamic.py +61 -0
- lightning_sdk/utils/enum.py +116 -0
- lightning_sdk/{utils.py → utils/resolve.py} +41 -4
- lightning_sdk-0.1.46.dist-info/LICENSE +21 -0
- {lightning_sdk-0.1.2.dist-info → lightning_sdk-0.1.46.dist-info}/METADATA +30 -4
- lightning_sdk-0.1.46.dist-info/RECORD +858 -0
- {lightning_sdk-0.1.2.dist-info → lightning_sdk-0.1.46.dist-info}/WHEEL +1 -1
- lightning_sdk/lightning_cloud/openapi/models/app_id_releases_body.py +0 -541
- lightning_sdk/lightning_cloud/openapi/models/assistants_id_body.py +0 -487
- lightning_sdk/lightning_cloud/openapi/models/id_endpoint_body.py +0 -409
- lightning_sdk/lightning_cloud/openapi/models/id_get_body1.py +0 -333
- lightning_sdk/lightning_cloud/openapi/models/project_id_appsv2_body.py +0 -201
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_cluster_driver_spec.py +0 -1039
- lightning_sdk/lightning_cloud/openapi/models/v1_aws_cluster_secondary_region_spec.py +0 -253
- lightning_sdk/lightning_cloud/openapi/models/v1_azure_cluster_driver_spec.py +0 -227
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_driver.py +0 -175
- lightning_sdk/lightning_cloud/openapi/models/v1_container_resources.py +0 -201
- lightning_sdk/lightning_cloud/openapi/models/v1_eks_custer_driver_status.py +0 -387
- lightning_sdk/lightning_cloud/openapi/models/v1_instance_type.py +0 -305
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_cluster_driver.py +0 -359
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_cluster_status.py +0 -279
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_release.py +0 -697
- lightning_sdk/lightning_cloud/openapi/models/v1_lightningapp_v2.py +0 -331
- lightning_sdk-0.1.2.dist-info/RECORD +0 -550
- {lightning_sdk-0.1.2.dist-info → lightning_sdk-0.1.46.dist-info}/entry_points.txt +0 -0
- {lightning_sdk-0.1.2.dist-info → lightning_sdk-0.1.46.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from lightning_sdk.cli.exceptions import StudioCliError
|
|
7
|
+
from lightning_sdk.cli.studios_menu import _StudiosMenu
|
|
8
|
+
from lightning_sdk.models import download_model
|
|
9
|
+
from lightning_sdk.studio import Studio
|
|
10
|
+
from lightning_sdk.utils.resolve import _get_authed_user, skip_studio_init
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class _Downloads(_StudiosMenu):
|
|
14
|
+
"""Download files and folders from Lightning AI."""
|
|
15
|
+
|
|
16
|
+
def model(self, name: str, download_dir: str = ".") -> None:
|
|
17
|
+
"""Download a Model.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
name: The name of the Model you want to download.
|
|
21
|
+
This should have the format <ORGANIZATION-NAME>/<TEAMSPACE-NAME>/<MODEL-NAME>.
|
|
22
|
+
download_dir: The directory where the Model should be downloaded.
|
|
23
|
+
"""
|
|
24
|
+
download_model(
|
|
25
|
+
name=name,
|
|
26
|
+
download_dir=download_dir,
|
|
27
|
+
progress_bar=True,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def _resolve_studio(self, studio: Optional[str]) -> Studio:
|
|
31
|
+
user = _get_authed_user()
|
|
32
|
+
# if no studio specify suggest/filter only user's studios
|
|
33
|
+
possible_studios = self._get_possible_studios(user, is_owner=studio is None)
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
if studio:
|
|
37
|
+
team_name, studio_name = studio.split("/")
|
|
38
|
+
options = [st for st in possible_studios if st["teamspace"] == team_name and st["name"] == studio_name]
|
|
39
|
+
if len(options) == 1:
|
|
40
|
+
selected_studio = self._get_studio_from_name(studio, possible_studios)
|
|
41
|
+
# user can also use the partial studio name as secondary interactive selection
|
|
42
|
+
else:
|
|
43
|
+
# filter matching simple reg expressions or start with the team and studio name
|
|
44
|
+
possible_studios = filter(
|
|
45
|
+
lambda st: (re.match(team_name, st["teamspace"]) or team_name in st["teamspace"])
|
|
46
|
+
and (re.match(studio_name, st["name"]) or studio_name in st["name"]),
|
|
47
|
+
possible_studios,
|
|
48
|
+
)
|
|
49
|
+
if not possible_studios:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
f"Could not find Studio like '{studio}', please consider update your filtering pattern."
|
|
52
|
+
)
|
|
53
|
+
selected_studio = self._get_studio_from_interactive_menu(list(possible_studios))
|
|
54
|
+
else:
|
|
55
|
+
selected_studio = self._get_studio_from_interactive_menu(possible_studios)
|
|
56
|
+
|
|
57
|
+
except KeyboardInterrupt:
|
|
58
|
+
raise KeyboardInterrupt from None
|
|
59
|
+
|
|
60
|
+
# give user friendlier error message
|
|
61
|
+
except Exception as e:
|
|
62
|
+
raise StudioCliError(
|
|
63
|
+
f"Could not find the given Studio {studio} to upload files to. "
|
|
64
|
+
"Please contact Lightning AI directly to resolve this issue."
|
|
65
|
+
) from e
|
|
66
|
+
|
|
67
|
+
with skip_studio_init():
|
|
68
|
+
return Studio(**selected_studio)
|
|
69
|
+
|
|
70
|
+
def folder(self, path: str = "", studio: Optional[str] = None, local_path: str = ".") -> None:
|
|
71
|
+
"""Download a folder from a Studio.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
path: The relative path within the Studio you want to download.
|
|
75
|
+
If you leave it empty it will download whole studio and locally creates a new folder
|
|
76
|
+
with the same name as the selected studio.
|
|
77
|
+
studio: The name of the studio to upload to. Will show a menu with user's owned studios for selection
|
|
78
|
+
if not specified. If provided, should be in the form of <TEAMSPACE-NAME>/<STUDIO-NAME> where the names
|
|
79
|
+
are case-sensitive. The teamspace and studio names can be regular expressions to match, then a menu
|
|
80
|
+
with filtered studios will be shown for final selection.
|
|
81
|
+
local_path: The path to the directory you want to download the folder to.
|
|
82
|
+
"""
|
|
83
|
+
local_path = Path(local_path)
|
|
84
|
+
if not local_path.is_dir():
|
|
85
|
+
raise NotADirectoryError(f"'{local_path}' is not a directory")
|
|
86
|
+
|
|
87
|
+
resolved_studio = self._resolve_studio(studio)
|
|
88
|
+
|
|
89
|
+
if not path:
|
|
90
|
+
local_path /= resolved_studio.name
|
|
91
|
+
path = ""
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
if not path:
|
|
95
|
+
raise FileNotFoundError()
|
|
96
|
+
resolved_studio.download_folder(remote_path=path, target_path=str(local_path))
|
|
97
|
+
except Exception as e:
|
|
98
|
+
raise StudioCliError(
|
|
99
|
+
f"Could not download the folder from the given Studio {studio}. "
|
|
100
|
+
"Please contact Lightning AI directly to resolve this issue."
|
|
101
|
+
) from e
|
|
102
|
+
|
|
103
|
+
def file(self, path: str = "", studio: Optional[str] = None, local_path: str = ".") -> None:
|
|
104
|
+
"""Download a file from a Studio.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
path: The relative path within the Studio you want to download.
|
|
108
|
+
studio: The name of the studio to upload to. Will show a menu with user's owned studios for selection
|
|
109
|
+
if not specified. If provided, should be in the form of <TEAMSPACE-NAME>/<STUDIO-NAME> where the names
|
|
110
|
+
are case-sensitive. The teamspace and studio names can be regular expressions to match, then a menu
|
|
111
|
+
with filtered studios will be shown for final selection.
|
|
112
|
+
local_path: The path to the directory you want to download the file to.
|
|
113
|
+
"""
|
|
114
|
+
local_path = Path(local_path)
|
|
115
|
+
if not local_path.is_dir():
|
|
116
|
+
raise NotADirectoryError(f"'{local_path}' is not a directory")
|
|
117
|
+
|
|
118
|
+
resolved_studio = self._resolve_studio(studio)
|
|
119
|
+
|
|
120
|
+
if not path:
|
|
121
|
+
local_path /= resolved_studio.name
|
|
122
|
+
path = ""
|
|
123
|
+
|
|
124
|
+
try:
|
|
125
|
+
if not path:
|
|
126
|
+
raise FileNotFoundError()
|
|
127
|
+
resolved_studio.download_file(remote_path=path, file_path=str(local_path / os.path.basename(path)))
|
|
128
|
+
except Exception as e:
|
|
129
|
+
raise StudioCliError(
|
|
130
|
+
f"Could not download the file from the given Studio {studio}. "
|
|
131
|
+
"Please contact Lightning AI directly to resolve this issue."
|
|
132
|
+
) from e
|
lightning_sdk/cli/entrypoint.py
CHANGED
|
@@ -2,19 +2,27 @@ from fire import Fire
|
|
|
2
2
|
from lightning_utilities.core.imports import RequirementCache
|
|
3
3
|
|
|
4
4
|
from lightning_sdk.api.studio_api import _cloud_url
|
|
5
|
+
from lightning_sdk.cli.ai_hub import _AIHub
|
|
6
|
+
from lightning_sdk.cli.download import _Downloads
|
|
5
7
|
from lightning_sdk.cli.legacy import _LegacyLightningCLI
|
|
8
|
+
from lightning_sdk.cli.run import _Run
|
|
9
|
+
from lightning_sdk.cli.serve import _Docker, _LitServe
|
|
6
10
|
from lightning_sdk.cli.upload import _Uploads
|
|
7
11
|
from lightning_sdk.lightning_cloud.login import Auth
|
|
8
12
|
|
|
9
13
|
_LIGHTNING_AVAILABLE = RequirementCache("lightning")
|
|
10
14
|
|
|
11
15
|
|
|
12
|
-
class StudioCLI
|
|
16
|
+
class StudioCLI:
|
|
13
17
|
"""Command line interface (CLI) to interact with/manage Lightning AI Studios."""
|
|
14
18
|
|
|
15
19
|
def __init__(self) -> None:
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
self.download = _Downloads()
|
|
21
|
+
self.upload = _Uploads()
|
|
22
|
+
self.aihub = _AIHub()
|
|
23
|
+
self.run = _Run(legacy_run=_LegacyLightningCLI() if _LIGHTNING_AVAILABLE else None)
|
|
24
|
+
self.serve = _LitServe()
|
|
25
|
+
self.dockerize = _Docker()
|
|
18
26
|
|
|
19
27
|
def login(self) -> None:
|
|
20
28
|
"""Login to Lightning AI Studios."""
|
lightning_sdk/cli/run.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Dict, Optional
|
|
2
|
+
|
|
3
|
+
from lightning_sdk.job import Job
|
|
4
|
+
from lightning_sdk.machine import Machine
|
|
5
|
+
from lightning_sdk.mmt import MMT
|
|
6
|
+
from lightning_sdk.teamspace import Teamspace
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from lightning_sdk.cli.legacy import _LegacyLightningCLI
|
|
10
|
+
|
|
11
|
+
_MACHINE_VALUES = tuple([machine.value for machine in Machine])
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class _Run:
|
|
15
|
+
"""Run async workloads on the Lightning AI platform."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, legacy_run: Optional["_LegacyLightningCLI"] = None) -> None:
|
|
18
|
+
if legacy_run is not None:
|
|
19
|
+
self.app = legacy_run.app
|
|
20
|
+
self.model = legacy_run.model
|
|
21
|
+
|
|
22
|
+
# Need to set the docstring here for f-strings to work.
|
|
23
|
+
# Sadly this is the only way to really show options as f-strings are not allowed as docstrings directly
|
|
24
|
+
# and fire does not show values for literals, just that it is a literal.
|
|
25
|
+
docstr_job = f"""Run async workloads using a docker image or a compute environment from your studio.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
name: The name of the job. Needs to be unique within the teamspace.
|
|
29
|
+
machine: The machine type to run the job on. One of {", ".join(_MACHINE_VALUES)}.
|
|
30
|
+
command: The command to run inside your job. Required if using a studio. Optional if using an image.
|
|
31
|
+
If not provided for images, will run the container entrypoint and default command.
|
|
32
|
+
studio: The studio env to run the job with. Mutually exclusive with image.
|
|
33
|
+
image: The docker image to run the job with. Mutually exclusive with studio.
|
|
34
|
+
teamspace: The teamspace the job should be associated with. Defaults to the current teamspace.
|
|
35
|
+
org: The organization owning the teamspace (if any). Defaults to the current organization.
|
|
36
|
+
user: The user owning the teamspace (if any). Defaults to the current user.
|
|
37
|
+
cloud_account: The cloud account to run the job on.
|
|
38
|
+
Defaults to the studio cloud account if running with studio compute env.
|
|
39
|
+
If not provided will fall back to the teamspaces default cloud account.
|
|
40
|
+
env: Environment variables to set inside the job.
|
|
41
|
+
interruptible: Whether the job should run on interruptible instances. They are cheaper but can be preempted.
|
|
42
|
+
image_credentials: The credentials used to pull the image. Required if the image is private.
|
|
43
|
+
This should be the name of the respective credentials secret created on the Lightning AI platform.
|
|
44
|
+
cloud_account_auth: Whether to authenticate with the cloud account to pull the image.
|
|
45
|
+
Required if the registry is part of a cloud provider (e.g. ECR).
|
|
46
|
+
artifacts_local: The path of inside the docker container, you want to persist images from.
|
|
47
|
+
CAUTION: When setting this to "/", it will effectively erase your container.
|
|
48
|
+
Only supported for jobs with a docker image compute environment.
|
|
49
|
+
artifacts_remote: The remote storage to persist your artifacts to.
|
|
50
|
+
Should be of format <CONNECTION_TYPE>:<CONNECTION_NAME>:<PATH_WITHIN_CONNECTION>.
|
|
51
|
+
PATH_WITHIN_CONNECTION hereby is a path relative to the connection's root.
|
|
52
|
+
E.g. efs:data:some-path would result in an EFS connection named `data` and to the path `some-path`
|
|
53
|
+
within it.
|
|
54
|
+
Note that the connection needs to be added to the teamspace already in order for it to be found.
|
|
55
|
+
Only supported for jobs with a docker image compute environment.
|
|
56
|
+
"""
|
|
57
|
+
# TODO: the docstrings from artifacts_local and artifacts_remote don't show up completely,
|
|
58
|
+
# might need to switch to explicit cli definition
|
|
59
|
+
self.job.__func__.__doc__ = docstr_job
|
|
60
|
+
|
|
61
|
+
# Need to set the docstring here for f-strings to work.
|
|
62
|
+
# Sadly this is the only way to really show options as f-strings are not allowed as docstrings directly
|
|
63
|
+
# and fire does not show values for literals, just that it is a literal.
|
|
64
|
+
docstr_mmt = f"""Run async workloads on multiple machines using a docker image.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
name: The name of the job. Needs to be unique within the teamspace.
|
|
68
|
+
num_machines: The number of Machines to run on. Defaults to 2 Machines
|
|
69
|
+
machine: The machine type to run the job on. One of {", ".join(_MACHINE_VALUES)}. Defaults to CPU
|
|
70
|
+
command: The command to run inside your job. Required if using a studio. Optional if using an image.
|
|
71
|
+
If not provided for images, will run the container entrypoint and default command.
|
|
72
|
+
studio: The studio env to run the job with. Mutually exclusive with image.
|
|
73
|
+
image: The docker image to run the job with. Mutually exclusive with studio.
|
|
74
|
+
teamspace: The teamspace the job should be associated with. Defaults to the current teamspace.
|
|
75
|
+
org: The organization owning the teamspace (if any). Defaults to the current organization.
|
|
76
|
+
user: The user owning the teamspace (if any). Defaults to the current user.
|
|
77
|
+
cloud_account: The cloud account to run the job on.
|
|
78
|
+
Defaults to the studio cloud account if running with studio compute env.
|
|
79
|
+
If not provided will fall back to the teamspaces default cloud account.
|
|
80
|
+
env: Environment variables to set inside the job.
|
|
81
|
+
interruptible: Whether the job should run on interruptible instances. They are cheaper but can be preempted.
|
|
82
|
+
image_credentials: The credentials used to pull the image. Required if the image is private.
|
|
83
|
+
This should be the name of the respective credentials secret created on the Lightning AI platform.
|
|
84
|
+
cloud_account_auth: Whether to authenticate with the cloud account to pull the image.
|
|
85
|
+
Required if the registry is part of a cloud provider (e.g. ECR).
|
|
86
|
+
artifacts_local: The path of inside the docker container, you want to persist images from.
|
|
87
|
+
CAUTION: When setting this to "/", it will effectively erase your container.
|
|
88
|
+
Only supported for jobs with a docker image compute environment.
|
|
89
|
+
artifacts_remote: The remote storage to persist your artifacts to.
|
|
90
|
+
Should be of format <CONNECTION_TYPE>:<CONNECTION_NAME>:<PATH_WITHIN_CONNECTION>.
|
|
91
|
+
PATH_WITHIN_CONNECTION hereby is a path relative to the connection's root.
|
|
92
|
+
E.g. efs:data:some-path would result in an EFS connection named `data` and to the path `some-path`
|
|
93
|
+
within it.
|
|
94
|
+
Note that the connection needs to be added to the teamspace already in order for it to be found.
|
|
95
|
+
Only supported for jobs with a docker image compute environment.
|
|
96
|
+
"""
|
|
97
|
+
# TODO: the docstrings from artifacts_local and artifacts_remote don't show up completely,
|
|
98
|
+
# might need to switch to explicit cli definition
|
|
99
|
+
self.mmt.__func__.__doc__ = docstr_mmt
|
|
100
|
+
|
|
101
|
+
# TODO: sadly, fire displays both Optional[type] and Union[type, None] as Optional[Optional]
|
|
102
|
+
# see https://github.com/google/python-fire/pull/513
|
|
103
|
+
# might need to move to different cli library
|
|
104
|
+
def job(
|
|
105
|
+
self,
|
|
106
|
+
name: str,
|
|
107
|
+
machine: Optional[str] = None,
|
|
108
|
+
command: Optional[str] = None,
|
|
109
|
+
studio: Optional[str] = None,
|
|
110
|
+
image: Optional[str] = None,
|
|
111
|
+
teamspace: Optional[str] = None,
|
|
112
|
+
org: Optional[str] = None,
|
|
113
|
+
user: Optional[str] = None,
|
|
114
|
+
cloud_account: Optional[str] = None,
|
|
115
|
+
env: Optional[Dict[str, str]] = None,
|
|
116
|
+
interruptible: bool = False,
|
|
117
|
+
image_credentials: Optional[str] = None,
|
|
118
|
+
cloud_account_auth: bool = False,
|
|
119
|
+
artifacts_local: Optional[str] = None,
|
|
120
|
+
artifacts_remote: Optional[str] = None,
|
|
121
|
+
) -> None:
|
|
122
|
+
if machine is None:
|
|
123
|
+
# TODO: infer from studio
|
|
124
|
+
machine = "CPU"
|
|
125
|
+
machine_enum = Machine(machine.upper())
|
|
126
|
+
|
|
127
|
+
resolved_teamspace = Teamspace(name=teamspace, org=org, user=user)
|
|
128
|
+
|
|
129
|
+
if cloud_account is None:
|
|
130
|
+
cloud_account = resolved_teamspace.default_cloud_account
|
|
131
|
+
machine_enum = Machine(machine.upper())
|
|
132
|
+
Job.run(
|
|
133
|
+
name=name,
|
|
134
|
+
machine=machine_enum,
|
|
135
|
+
command=command,
|
|
136
|
+
studio=studio,
|
|
137
|
+
image=image,
|
|
138
|
+
teamspace=resolved_teamspace,
|
|
139
|
+
org=org,
|
|
140
|
+
user=user,
|
|
141
|
+
cloud_account=cloud_account,
|
|
142
|
+
env=env,
|
|
143
|
+
interruptible=interruptible,
|
|
144
|
+
image_credentials=image_credentials,
|
|
145
|
+
cloud_account_auth=cloud_account_auth,
|
|
146
|
+
artifacts_local=artifacts_local,
|
|
147
|
+
artifacts_remote=artifacts_remote,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# TODO: sadly, fire displays both Optional[type] and Union[type, None] as Optional[Optional]
|
|
151
|
+
# see https://github.com/google/python-fire/pull/513
|
|
152
|
+
# might need to move to different cli library
|
|
153
|
+
def mmt(
|
|
154
|
+
self,
|
|
155
|
+
name: Optional[str] = None,
|
|
156
|
+
num_machines: int = 2,
|
|
157
|
+
machine: Optional[str] = None,
|
|
158
|
+
command: Optional[str] = None,
|
|
159
|
+
image: Optional[str] = None,
|
|
160
|
+
teamspace: Optional[str] = None,
|
|
161
|
+
org: Optional[str] = None,
|
|
162
|
+
user: Optional[str] = None,
|
|
163
|
+
cloud_account: Optional[str] = None,
|
|
164
|
+
env: Optional[Dict[str, str]] = None,
|
|
165
|
+
interruptible: bool = False,
|
|
166
|
+
image_credentials: Optional[str] = None,
|
|
167
|
+
cloud_account_auth: bool = False,
|
|
168
|
+
artifacts_local: Optional[str] = None,
|
|
169
|
+
artifacts_remote: Optional[str] = None,
|
|
170
|
+
) -> None:
|
|
171
|
+
if name is None:
|
|
172
|
+
from datetime import datetime
|
|
173
|
+
|
|
174
|
+
timestr = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
|
|
175
|
+
name = f"mmt-{timestr}"
|
|
176
|
+
|
|
177
|
+
if machine is None:
|
|
178
|
+
# TODO: infer from studio
|
|
179
|
+
machine = "CPU"
|
|
180
|
+
machine_enum = Machine(machine.upper())
|
|
181
|
+
|
|
182
|
+
resolved_teamspace = Teamspace(name=teamspace, org=org, user=user)
|
|
183
|
+
if cloud_account is None:
|
|
184
|
+
cloud_account = resolved_teamspace.default_cloud_account
|
|
185
|
+
|
|
186
|
+
if image is None:
|
|
187
|
+
raise RuntimeError("Image needs to be specified to run a multi-machine job")
|
|
188
|
+
|
|
189
|
+
MMT.run(
|
|
190
|
+
name=name,
|
|
191
|
+
num_machines=num_machines,
|
|
192
|
+
machine=machine_enum,
|
|
193
|
+
command=command,
|
|
194
|
+
studio=None,
|
|
195
|
+
image=image,
|
|
196
|
+
teamspace=resolved_teamspace,
|
|
197
|
+
org=org,
|
|
198
|
+
user=user,
|
|
199
|
+
cloud_account=cloud_account,
|
|
200
|
+
env=env,
|
|
201
|
+
interruptible=interruptible,
|
|
202
|
+
image_credentials=image_credentials,
|
|
203
|
+
cloud_account_auth=cloud_account_auth,
|
|
204
|
+
artifacts_local=artifacts_local,
|
|
205
|
+
artifacts_remote=artifacts_remote,
|
|
206
|
+
)
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess
|
|
3
|
+
import warnings
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Optional, Union
|
|
6
|
+
|
|
7
|
+
from rich.console import Console
|
|
8
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn, TimeElapsedColumn
|
|
9
|
+
from rich.prompt import Confirm
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class _LitServe:
|
|
13
|
+
"""Serve a LitServe model.
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
lightning serve api server.py # serve locally
|
|
17
|
+
lightning serve api server.py --cloud # deploy to the cloud
|
|
18
|
+
|
|
19
|
+
You can deploy the API to the cloud by running `lightning serve api server.py --cloud`.
|
|
20
|
+
This will generate a Dockerfile, build the image, and push it to the image registry.
|
|
21
|
+
Deploying to the cloud requires pre-login to the docker registry.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def api(
|
|
25
|
+
self,
|
|
26
|
+
script_path: Union[str, Path],
|
|
27
|
+
easy: bool = False,
|
|
28
|
+
cloud: bool = False,
|
|
29
|
+
repository: Optional[str] = None,
|
|
30
|
+
non_interactive: bool = False,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""Deploy a LitServe model script.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
script_path: Path to the script to serve
|
|
36
|
+
easy: If True, generates a client for the model
|
|
37
|
+
cloud: If True, deploy the model to the Lightning Studio
|
|
38
|
+
repository: Optional Docker repository name (e.g., 'username/model-name')
|
|
39
|
+
non_interactive: If True, do not prompt for confirmation
|
|
40
|
+
Raises:
|
|
41
|
+
FileNotFoundError: If script_path doesn't exist
|
|
42
|
+
ImportError: If litserve is not installed
|
|
43
|
+
subprocess.CalledProcessError: If the script fails to run
|
|
44
|
+
IOError: If client.py generation fails
|
|
45
|
+
"""
|
|
46
|
+
console = Console()
|
|
47
|
+
script_path = Path(script_path)
|
|
48
|
+
if not script_path.exists():
|
|
49
|
+
raise FileNotFoundError(f"Script not found: {script_path}")
|
|
50
|
+
if not script_path.is_file():
|
|
51
|
+
raise ValueError(f"Path is not a file: {script_path}")
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
from litserve.python_client import client_template
|
|
55
|
+
except ImportError:
|
|
56
|
+
raise ImportError(
|
|
57
|
+
"litserve is not installed. Please install it with `pip install lightning_sdk[serve]`"
|
|
58
|
+
) from None
|
|
59
|
+
|
|
60
|
+
if easy:
|
|
61
|
+
client_path = Path("client.py")
|
|
62
|
+
if client_path.exists():
|
|
63
|
+
console.print("Skipping client generation: client.py already exists", style="blue")
|
|
64
|
+
else:
|
|
65
|
+
try:
|
|
66
|
+
client_path.write_text(client_template)
|
|
67
|
+
console.print("✅ Client generated at client.py", style="bold green")
|
|
68
|
+
except OSError as e:
|
|
69
|
+
raise OSError(f"Failed to generate client.py: {e!s}") from None
|
|
70
|
+
|
|
71
|
+
if cloud:
|
|
72
|
+
tag = repository if repository else "litserve-model"
|
|
73
|
+
return self._handle_cloud(script_path, console, tag=tag, non_interactive=non_interactive)
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
subprocess.run(
|
|
77
|
+
["python", str(script_path)],
|
|
78
|
+
check=True,
|
|
79
|
+
text=True,
|
|
80
|
+
)
|
|
81
|
+
except subprocess.CalledProcessError as e:
|
|
82
|
+
error_msg = f"Script execution failed with exit code {e.returncode}\nstdout: {e.stdout}\nstderr: {e.stderr}"
|
|
83
|
+
raise RuntimeError(error_msg) from None
|
|
84
|
+
|
|
85
|
+
def _handle_cloud(
|
|
86
|
+
self,
|
|
87
|
+
script_path: Union[str, Path],
|
|
88
|
+
console: Console,
|
|
89
|
+
tag: str = "litserve-model",
|
|
90
|
+
non_interactive: bool = False,
|
|
91
|
+
) -> None:
|
|
92
|
+
try:
|
|
93
|
+
import docker
|
|
94
|
+
except ImportError:
|
|
95
|
+
raise ImportError("docker-py is not installed. Please install it with `pip install docker`") from None
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
client = docker.from_env()
|
|
99
|
+
client.ping()
|
|
100
|
+
except docker.errors.DockerException as e:
|
|
101
|
+
raise RuntimeError(f"Failed to connect to Docker daemon: {e!s}. Is Docker running?") from None
|
|
102
|
+
|
|
103
|
+
dockerizer = _Docker()
|
|
104
|
+
path = dockerizer.api(script_path, port=8000, gpu=False, tag=tag)
|
|
105
|
+
|
|
106
|
+
console.clear()
|
|
107
|
+
if non_interactive:
|
|
108
|
+
console.print("[italic]non-interactive[/italic] mode enabled, skipping confirmation prompts", style="blue")
|
|
109
|
+
|
|
110
|
+
console.print(f"\nPlease review the Dockerfile at [u]{path}[/u] and make sure it is correct.", style="bold")
|
|
111
|
+
correct_dockerfile = True if non_interactive else Confirm.ask("Is the Dockerfile correct?", default=True)
|
|
112
|
+
if not correct_dockerfile:
|
|
113
|
+
console.print("Please fix the Dockerfile and try again.", style="red")
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
with Progress(
|
|
117
|
+
SpinnerColumn(),
|
|
118
|
+
TextColumn("[progress.description]{task.description}"),
|
|
119
|
+
TimeElapsedColumn(),
|
|
120
|
+
console=console,
|
|
121
|
+
transient=False,
|
|
122
|
+
) as progress:
|
|
123
|
+
build_task = progress.add_task("Building Docker image", total=None)
|
|
124
|
+
build_status = client.api.build(
|
|
125
|
+
path=os.path.dirname(path), dockerfile=path, tag=tag, decode=True, quiet=False
|
|
126
|
+
)
|
|
127
|
+
for line in build_status:
|
|
128
|
+
if "error" in line:
|
|
129
|
+
progress.stop()
|
|
130
|
+
console.print(f"\n[red]{line}[/red]")
|
|
131
|
+
return
|
|
132
|
+
if "stream" in line and line["stream"].strip():
|
|
133
|
+
console.print(line["stream"].strip(), style="bright_black")
|
|
134
|
+
progress.update(build_task, description="Building Docker image")
|
|
135
|
+
|
|
136
|
+
progress.update(build_task, description="[green]Build completed![/green]")
|
|
137
|
+
|
|
138
|
+
push_task = progress.add_task("Pushing to registry", total=None)
|
|
139
|
+
console.print("\nPushing image...", style="bold blue")
|
|
140
|
+
push_status = client.api.push(tag, stream=True, decode=True)
|
|
141
|
+
for line in push_status:
|
|
142
|
+
if "error" in line:
|
|
143
|
+
progress.stop()
|
|
144
|
+
console.print(f"\n[red]{line}[/red]")
|
|
145
|
+
return
|
|
146
|
+
if "status" in line:
|
|
147
|
+
console.print(line["status"], style="bright_black")
|
|
148
|
+
progress.update(push_task, description="Pushing to registry")
|
|
149
|
+
|
|
150
|
+
progress.update(push_task, description="[green]Push completed![/green]")
|
|
151
|
+
|
|
152
|
+
console.print(f"\n✅ Image pushed to {tag}", style="bold green")
|
|
153
|
+
console.print(
|
|
154
|
+
"Soon you will be able to deploy this model to the Lightning Studio!",
|
|
155
|
+
)
|
|
156
|
+
# TODO: Deploy to the cloud
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class _Docker:
|
|
160
|
+
"""Generate a Dockerfile for a LitServe model."""
|
|
161
|
+
|
|
162
|
+
def api(self, server_filename: str, port: int = 8000, gpu: bool = False, tag: str = "litserve-model") -> str:
|
|
163
|
+
"""Generate a Dockerfile for the given server code.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
server_filename: The path to the server file. Example sever.py or app.py.
|
|
167
|
+
port: The port to expose in the Docker container.
|
|
168
|
+
gpu: Whether to use a GPU-enabled Docker image.
|
|
169
|
+
tag: Docker image tag to use in examples.
|
|
170
|
+
"""
|
|
171
|
+
import litserve as ls
|
|
172
|
+
from litserve import docker_builder
|
|
173
|
+
|
|
174
|
+
console = Console()
|
|
175
|
+
requirements = ""
|
|
176
|
+
if os.path.exists("requirements.txt"):
|
|
177
|
+
requirements = "-r requirements.txt"
|
|
178
|
+
else:
|
|
179
|
+
warnings.warn(
|
|
180
|
+
f"requirements.txt not found at {os.getcwd()}. "
|
|
181
|
+
f"Make sure to install the required packages in the Dockerfile.",
|
|
182
|
+
UserWarning,
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
current_dir = Path.cwd()
|
|
186
|
+
if not (current_dir / server_filename).is_file():
|
|
187
|
+
raise FileNotFoundError(f"Server file `{server_filename}` must be in the current directory: {os.getcwd()}")
|
|
188
|
+
|
|
189
|
+
version = ls.__version__
|
|
190
|
+
if gpu:
|
|
191
|
+
run_cmd = f"docker run --gpus all -p {port}:{port} {tag}:latest"
|
|
192
|
+
docker_template = docker_builder.CUDA_DOCKER_TEMPLATE
|
|
193
|
+
else:
|
|
194
|
+
run_cmd = f"docker run -p {port}:{port} {tag}:latest"
|
|
195
|
+
docker_template = docker_builder.DOCKERFILE_TEMPLATE
|
|
196
|
+
dockerfile_content = docker_template.format(
|
|
197
|
+
server_filename=server_filename,
|
|
198
|
+
port=port,
|
|
199
|
+
version=version,
|
|
200
|
+
requirements=requirements,
|
|
201
|
+
)
|
|
202
|
+
with open("Dockerfile", "w") as f:
|
|
203
|
+
f.write(dockerfile_content)
|
|
204
|
+
|
|
205
|
+
success_msg = f"""[bold]Dockerfile created successfully[/bold]
|
|
206
|
+
Update [underline]{os.path.abspath("Dockerfile")}[/underline] to add any additional dependencies or commands.
|
|
207
|
+
|
|
208
|
+
[bold]Build the container with:[/bold]
|
|
209
|
+
> [underline]docker build -t {tag} .[/underline]
|
|
210
|
+
|
|
211
|
+
[bold]To run the Docker container on the machine:[/bold]
|
|
212
|
+
> [underline]{run_cmd}[/underline]
|
|
213
|
+
|
|
214
|
+
[bold]To push the container to a registry:[/bold]
|
|
215
|
+
> [underline]docker push {tag}[/underline]
|
|
216
|
+
"""
|
|
217
|
+
console.print(success_msg)
|
|
218
|
+
return os.path.abspath("Dockerfile")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from typing import Dict, List, Optional
|
|
2
|
+
|
|
3
|
+
from simple_term_menu import TerminalMenu
|
|
4
|
+
|
|
5
|
+
from lightning_sdk.api import OrgApi, TeamspaceApi
|
|
6
|
+
from lightning_sdk.user import User
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class _StudiosMenu:
|
|
10
|
+
def _get_studio_from_interactive_menu(self, possible_studios: List[Dict[str, str]]) -> Dict[str, str]:
|
|
11
|
+
terminal_menu = self._prepare_terminal_menu_list_studios(possible_studios)
|
|
12
|
+
terminal_menu.show()
|
|
13
|
+
return possible_studios[terminal_menu.chosen_menu_index]
|
|
14
|
+
|
|
15
|
+
def _get_studio_from_name(self, studio: str, possible_studios: List[Dict[str, str]]) -> Dict[str, str]:
|
|
16
|
+
teamspace, name = studio.split("/", maxsplit=1)
|
|
17
|
+
for st in possible_studios:
|
|
18
|
+
if st["teamspace"] == teamspace and name == st["name"]:
|
|
19
|
+
return st
|
|
20
|
+
|
|
21
|
+
print("Could not find Studio {studio}, please select it from the list:")
|
|
22
|
+
return self._get_studio_from_interactive_menu(possible_studios)
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def _prepare_terminal_menu_list_studios(
|
|
26
|
+
possible_studios: List[Dict[str, str]], title: Optional[str] = None
|
|
27
|
+
) -> TerminalMenu:
|
|
28
|
+
if title is None:
|
|
29
|
+
title = "Please select a Studio of the following studios:"
|
|
30
|
+
|
|
31
|
+
return TerminalMenu(
|
|
32
|
+
[f"{s['teamspace']}/{s['name']}" for s in possible_studios], title=title, clear_menu_on_exit=True
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def _get_possible_studios(user: User, is_owner: bool = True) -> List[Dict[str, str]]:
|
|
37
|
+
teamspace_api = TeamspaceApi()
|
|
38
|
+
org_api = OrgApi()
|
|
39
|
+
user_api = user._user_api
|
|
40
|
+
possible_studios = []
|
|
41
|
+
|
|
42
|
+
user_api._get_organizations_for_authed_user()
|
|
43
|
+
memberships = user_api._get_all_teamspace_memberships(user_id=user.id)
|
|
44
|
+
|
|
45
|
+
teamspaces = {}
|
|
46
|
+
# get all teamspace memberships
|
|
47
|
+
for membership in memberships:
|
|
48
|
+
teamspace_id = membership.project_id
|
|
49
|
+
|
|
50
|
+
if is_owner:
|
|
51
|
+
# get all studios for teamspace when user is owner
|
|
52
|
+
all_studios = user._user_api._get_cloudspaces_for_user(user_id=user.id, project_id=teamspace_id)
|
|
53
|
+
else:
|
|
54
|
+
all_studios = user._user_api._get_cloudspaces_for_user(project_id=teamspace_id)
|
|
55
|
+
|
|
56
|
+
for st in all_studios:
|
|
57
|
+
# populate teamspace info if necessary
|
|
58
|
+
if teamspace_id not in teamspaces:
|
|
59
|
+
ts = teamspace_api._get_teamspace_by_id(teamspace_id)
|
|
60
|
+
ts_name = ts.name
|
|
61
|
+
|
|
62
|
+
# get organization if necessary
|
|
63
|
+
if ts.owner_type == "organization":
|
|
64
|
+
org_name = org_api._get_org_by_id(ts.owner_id).name
|
|
65
|
+
user_name = None
|
|
66
|
+
else:
|
|
67
|
+
org_name = None
|
|
68
|
+
|
|
69
|
+
# don't do a request if not necessary
|
|
70
|
+
if ts.owner_id == user.id:
|
|
71
|
+
user_name = user.name
|
|
72
|
+
else:
|
|
73
|
+
user_name = user_api._get_user_by_id(ts.owner_id).username
|
|
74
|
+
|
|
75
|
+
teamspaces[teamspace_id] = {"user": user_name, "org": org_name, "teamspace": ts_name}
|
|
76
|
+
possible_studios.append({"name": st.name, **teamspaces[teamspace_id]})
|
|
77
|
+
|
|
78
|
+
return possible_studios
|