modAL 1.3.6.dev5__tar.gz → 1.3.6.dev7__tar.gz
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.
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/PKG-INFO +1 -1
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/client.pyi +2 -2
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/__init__.py +0 -128
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox.py +10 -4
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox.pyi +5 -5
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox_fs.py +5 -9
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_grpc.py +64 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2.py +2 -2
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2_grpc.py +132 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2_grpc.pyi +40 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/modal_api_grpc.py +4 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_version/__init__.py +1 -1
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/LICENSE +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/README.md +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/__main__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_billing.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_clustered_functions.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_clustered_functions.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_container_entrypoint.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_functions.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_grpc_client.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_ipython.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_load_context.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_location.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_object.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/manager.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/pty.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/rich.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/status.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_partial_function.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_resolver.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_resources.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/asgi.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/execution_context.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/telemetry.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_serialization.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_server.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_traceback.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_tunnel.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_tunnel.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_type_manager.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/app_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/async_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/blob_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/browser_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/deprecation.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/docker_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/function_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/git_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/hash_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/http_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/logger.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/mount_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/name_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/package_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/shell_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/time_utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/tblib.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/version.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_watcher.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/app.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/app.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/billing.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2023.12.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2024.04.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2024.10.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2025.06.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/README.md +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/base-images.json +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/call_graph.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/_download.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/_traceback.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/app.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/billing.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/changelog.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/cluster.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/config.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/container.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/dashboard.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/dict.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/entry_point.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/environment.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/import_refs.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/launch.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/network_file_system.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/profile.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/vscode.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/queues.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/run.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/secret.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/selector.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/shell.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/token.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/utils.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/volume.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/client.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cls.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cls.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/config.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/container_process.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/container_process.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/dict.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/dict.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/environments.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/environments.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/exception.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/flash.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/flash.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/ipython.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_io.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_io.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_pattern_matcher.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/functions.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/functions.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/gpu.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/image.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/image.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/io_streams.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/io_streams.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/mount.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/mount.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/network_file_system.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/network_file_system.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/object.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/object.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/output.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/parallel_map.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/parallel_map.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/partial_function.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/partial_function.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/proxy.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/proxy.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/py.typed +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/queue.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/queue.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/retries.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/runner.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/runner.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/running_app.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox_fs.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/schedule.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/scheduler_placement.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/secret.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/secret.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/server.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/server.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/serving.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/serving.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/snapshot.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/snapshot.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/stream_type.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/token_flow.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/token_flow.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/volume.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/volume.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/requires.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/top_level.txt +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/__init__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/py.typed +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_version/__main__.py +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/pyproject.toml +0 -0
- {modal-1.3.6.dev5 → modal-1.3.6.dev7}/setup.cfg +0 -0
|
@@ -35,7 +35,7 @@ class _Client:
|
|
|
35
35
|
server_url: str,
|
|
36
36
|
client_type: int,
|
|
37
37
|
credentials: typing.Optional[tuple[str, str]],
|
|
38
|
-
version: str = "1.3.6.
|
|
38
|
+
version: str = "1.3.6.dev7",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -171,7 +171,7 @@ class Client:
|
|
|
171
171
|
server_url: str,
|
|
172
172
|
client_type: int,
|
|
173
173
|
credentials: typing.Optional[tuple[str, str]],
|
|
174
|
-
version: str = "1.3.6.
|
|
174
|
+
version: str = "1.3.6.dev7",
|
|
175
175
|
):
|
|
176
176
|
"""mdmd:hidden
|
|
177
177
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# Copyright Modal Labs 2025
|
|
2
2
|
import os
|
|
3
|
-
import shlex
|
|
4
3
|
from dataclasses import dataclass
|
|
5
4
|
from pathlib import Path
|
|
6
5
|
from typing import Literal, Optional, Union
|
|
@@ -229,133 +228,6 @@ async def raw_registry_image(
|
|
|
229
228
|
)
|
|
230
229
|
|
|
231
230
|
|
|
232
|
-
def _install_cuda_command() -> str:
|
|
233
|
-
"""Command to install CUDA Toolkit (nvcc) inside a container."""
|
|
234
|
-
arch = "x86_64" # instruction set architecture for the CPU, all Modal machines are x86_64
|
|
235
|
-
distro = "debian12" # the distribution and version number of our OS (GNU/Linux)
|
|
236
|
-
filename = "cuda-keyring_1.1-1_all.deb" # NVIDIA signing key file
|
|
237
|
-
cuda_keyring_url = f"https://developer.download.nvidia.com/compute/cuda/repos/{distro}/{arch}/{filename}"
|
|
238
|
-
|
|
239
|
-
major, minor = 12, 8
|
|
240
|
-
max_cuda_version = f"{major}-{minor}"
|
|
241
|
-
|
|
242
|
-
return (
|
|
243
|
-
f"wget {cuda_keyring_url} && "
|
|
244
|
-
+ f"dpkg -i {filename} && "
|
|
245
|
-
+ f"rm -f {filename} && "
|
|
246
|
-
+ f"apt-get update && apt-get install -y cuda-nvcc-{max_cuda_version}"
|
|
247
|
-
)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
@synchronizer.create_blocking
|
|
251
|
-
async def notebook_base_image(*, python_version: Optional[str] = None, force_build: bool = False) -> _Image:
|
|
252
|
-
"""Default image used for Modal notebook kernels, with common libraries.
|
|
253
|
-
|
|
254
|
-
This can be used to bootstrap development workflows quickly. We don't
|
|
255
|
-
recommend using this image for production Modal Functions though, as it may
|
|
256
|
-
change at any time in the future.
|
|
257
|
-
"""
|
|
258
|
-
# Include several common packages, as well as kernelshim dependencies (except 'modal').
|
|
259
|
-
# These packages aren't pinned, so they may change over time with builds.
|
|
260
|
-
#
|
|
261
|
-
# We plan to use `--exclude-newer` in the future, with date-specific image builds.
|
|
262
|
-
base_image = _Image.debian_slim(python_version=python_version)
|
|
263
|
-
|
|
264
|
-
environment_packages: list[str] = [
|
|
265
|
-
"accelerate",
|
|
266
|
-
"aiohttp",
|
|
267
|
-
"altair",
|
|
268
|
-
"anthropic",
|
|
269
|
-
"asyncpg",
|
|
270
|
-
"beautifulsoup4",
|
|
271
|
-
"bokeh",
|
|
272
|
-
"boto3[crt]",
|
|
273
|
-
"click",
|
|
274
|
-
"diffusers[torch,flax]",
|
|
275
|
-
"dm-sonnet",
|
|
276
|
-
"flax",
|
|
277
|
-
"ftfy",
|
|
278
|
-
"h5py",
|
|
279
|
-
"urllib3",
|
|
280
|
-
"httpx",
|
|
281
|
-
"huggingface-hub",
|
|
282
|
-
"ipywidgets",
|
|
283
|
-
"jax[cuda12]",
|
|
284
|
-
"keras",
|
|
285
|
-
"matplotlib",
|
|
286
|
-
"nbformat",
|
|
287
|
-
"numba",
|
|
288
|
-
"numpy",
|
|
289
|
-
"openai",
|
|
290
|
-
"optax",
|
|
291
|
-
"pandas",
|
|
292
|
-
"plotly[express]",
|
|
293
|
-
"polars",
|
|
294
|
-
"psycopg2",
|
|
295
|
-
"requests",
|
|
296
|
-
"safetensors",
|
|
297
|
-
"scikit-image",
|
|
298
|
-
"scikit-learn",
|
|
299
|
-
"scipy",
|
|
300
|
-
"seaborn",
|
|
301
|
-
"sentencepiece",
|
|
302
|
-
"sqlalchemy",
|
|
303
|
-
"statsmodels",
|
|
304
|
-
"sympy",
|
|
305
|
-
"tabulate",
|
|
306
|
-
"tensorboard",
|
|
307
|
-
"toml",
|
|
308
|
-
"transformers",
|
|
309
|
-
"triton",
|
|
310
|
-
"typer",
|
|
311
|
-
"vega-datasets",
|
|
312
|
-
"watchfiles",
|
|
313
|
-
"websockets",
|
|
314
|
-
]
|
|
315
|
-
|
|
316
|
-
# Kernelshim dependencies. (see NOTEBOOK_KERNELSHIM_DEPENDENCIES)
|
|
317
|
-
kernelshim_packages: list[str] = [
|
|
318
|
-
"authlib>=1.3",
|
|
319
|
-
"basedpyright>=1.28",
|
|
320
|
-
"fastapi>=0.100",
|
|
321
|
-
"ipykernel>=6",
|
|
322
|
-
"pydantic>=2",
|
|
323
|
-
"pyzmq>=26",
|
|
324
|
-
"ruff>=0.11",
|
|
325
|
-
"uvicorn>=0.32",
|
|
326
|
-
]
|
|
327
|
-
|
|
328
|
-
commands: list[str] = [
|
|
329
|
-
"apt-get update",
|
|
330
|
-
"apt-get install -y "
|
|
331
|
-
+ "libpq-dev pkg-config cmake git curl wget unzip zip libsqlite3-dev openssh-server vim ffmpeg",
|
|
332
|
-
_install_cuda_command(),
|
|
333
|
-
# Install uv since it's faster than pip for installing packages.
|
|
334
|
-
"pip install uv",
|
|
335
|
-
# https://github.com/astral-sh/uv/issues/11480
|
|
336
|
-
"pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu129",
|
|
337
|
-
f"uv pip install --system {shlex.join(sorted(environment_packages))}",
|
|
338
|
-
f"uv pip install --system {shlex.join(sorted(kernelshim_packages))}",
|
|
339
|
-
]
|
|
340
|
-
|
|
341
|
-
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
|
342
|
-
return DockerfileSpec(
|
|
343
|
-
commands=[
|
|
344
|
-
"FROM base",
|
|
345
|
-
*(f"RUN {cmd}" for cmd in commands),
|
|
346
|
-
"ENV PATH=/usr/local/cuda/bin:$PATH",
|
|
347
|
-
],
|
|
348
|
-
context_files={},
|
|
349
|
-
)
|
|
350
|
-
|
|
351
|
-
return _Image._from_args(
|
|
352
|
-
base_images={"base": base_image},
|
|
353
|
-
dockerfile_function=build_dockerfile,
|
|
354
|
-
force_build=force_build,
|
|
355
|
-
_namespace=api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL,
|
|
356
|
-
)
|
|
357
|
-
|
|
358
|
-
|
|
359
231
|
@synchronizer.create_blocking
|
|
360
232
|
async def image_delete(
|
|
361
233
|
image_id: str,
|
|
@@ -35,7 +35,7 @@ from ._utils.name_utils import check_object_name
|
|
|
35
35
|
from ._utils.task_command_router_client import TaskCommandRouterClient
|
|
36
36
|
from .client import _Client
|
|
37
37
|
from .container_process import _ContainerProcess
|
|
38
|
-
from .exception import ClientClosed, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
|
|
38
|
+
from .exception import ClientClosed, Error, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
|
|
39
39
|
from .file_io import FileWatchEvent, FileWatchEventType, _FileIO, ls, mkdir, rm, watch
|
|
40
40
|
from .gpu import GPU_T
|
|
41
41
|
from .image import _Image
|
|
@@ -549,7 +549,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
549
549
|
self._attached = False
|
|
550
550
|
|
|
551
551
|
@property
|
|
552
|
-
def _client(self):
|
|
552
|
+
def _client(self) -> _Client:
|
|
553
553
|
self._ensure_attached()
|
|
554
554
|
return self.__client
|
|
555
555
|
|
|
@@ -883,9 +883,15 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
883
883
|
|
|
884
884
|
return self.returncode
|
|
885
885
|
|
|
886
|
-
async def _get_task_id(self) -> str:
|
|
886
|
+
async def _get_task_id(self, raise_if_task_complete=False) -> str:
|
|
887
887
|
while not self._task_id:
|
|
888
888
|
resp = await self._client.stub.SandboxGetTaskId(api_pb2.SandboxGetTaskIdRequest(sandbox_id=self.object_id))
|
|
889
|
+
# If the sandbox is terminated before it gets scheduled it can have a task result without a task_id
|
|
890
|
+
if not resp.task_id and raise_if_task_complete and resp.HasField("task_result"):
|
|
891
|
+
# When task_result is set, the task has finished, which could be any GenericResult.
|
|
892
|
+
# For now, we'll raise a generic Error and not be specific about the error type
|
|
893
|
+
msg = resp.task_result.exception or "Sandbox already finished"
|
|
894
|
+
raise Error(msg)
|
|
889
895
|
self._task_id = resp.task_id
|
|
890
896
|
if not self._task_id:
|
|
891
897
|
await asyncio.sleep(0.5)
|
|
@@ -1017,7 +1023,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1017
1023
|
secret_coros = [secret.hydrate(client=self._client) for secret in secrets]
|
|
1018
1024
|
await TaskContext.gather(*secret_coros)
|
|
1019
1025
|
|
|
1020
|
-
task_id = await self._get_task_id()
|
|
1026
|
+
task_id = await self._get_task_id(raise_if_task_complete=True)
|
|
1021
1027
|
kwargs = {
|
|
1022
1028
|
"task_id": task_id,
|
|
1023
1029
|
"pty_info": pty_info,
|
|
@@ -237,7 +237,7 @@ class _Sandbox(modal._object._Object):
|
|
|
237
237
|
...
|
|
238
238
|
|
|
239
239
|
@property
|
|
240
|
-
def _client(self): ...
|
|
240
|
+
def _client(self) -> modal.client._Client: ...
|
|
241
241
|
@_client.setter
|
|
242
242
|
def _client(self, value): ...
|
|
243
243
|
def _ensure_attached(self): ...
|
|
@@ -377,7 +377,7 @@ class _Sandbox(modal._object._Object):
|
|
|
377
377
|
"""
|
|
378
378
|
...
|
|
379
379
|
|
|
380
|
-
async def _get_task_id(self) -> str: ...
|
|
380
|
+
async def _get_task_id(self, raise_if_task_complete=False) -> str: ...
|
|
381
381
|
async def _get_command_router_client(
|
|
382
382
|
self, task_id: str
|
|
383
383
|
) -> typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]: ...
|
|
@@ -844,7 +844,7 @@ class Sandbox(modal.object.Object):
|
|
|
844
844
|
detach: __detach_spec
|
|
845
845
|
|
|
846
846
|
@property
|
|
847
|
-
def _client(self): ...
|
|
847
|
+
def _client(self) -> modal.client.Client: ...
|
|
848
848
|
@_client.setter
|
|
849
849
|
def _client(self, value): ...
|
|
850
850
|
def _ensure_attached(self): ...
|
|
@@ -1164,8 +1164,8 @@ class Sandbox(modal.object.Object):
|
|
|
1164
1164
|
poll: __poll_spec
|
|
1165
1165
|
|
|
1166
1166
|
class ___get_task_id_spec(typing_extensions.Protocol):
|
|
1167
|
-
def __call__(self,
|
|
1168
|
-
async def aio(self,
|
|
1167
|
+
def __call__(self, /, raise_if_task_complete=False) -> str: ...
|
|
1168
|
+
async def aio(self, /, raise_if_task_complete=False) -> str: ...
|
|
1169
1169
|
|
|
1170
1170
|
_get_task_id: ___get_task_id_spec
|
|
1171
1171
|
|
|
@@ -5,7 +5,6 @@ import random
|
|
|
5
5
|
import string
|
|
6
6
|
import time
|
|
7
7
|
import weakref
|
|
8
|
-
from contextlib import suppress
|
|
9
8
|
from pathlib import Path
|
|
10
9
|
from typing import Union, cast
|
|
11
10
|
|
|
@@ -284,14 +283,11 @@ class _SandboxFilesystem:
|
|
|
284
283
|
with translate_exec_errors("copy_from_local", remote_path):
|
|
285
284
|
process = await self._sandbox.exec(_SANDBOX_FS_TOOLS_PATH, make_write_file_command(remote_path))
|
|
286
285
|
while True:
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
process.stdin.write_eof()
|
|
293
|
-
await process.stdin.drain()
|
|
294
|
-
raise
|
|
286
|
+
# TODO(saltzm): If this fails, the ContainerProcess will remain alive indefinitely since
|
|
287
|
+
# stdin will remain open. Unfortunately we can't just call write_eof either, since that
|
|
288
|
+
# would lead to a partially written file being persisted. We should catch exceptions
|
|
289
|
+
# from this and kill the ContainerProcess when we have a way to do this.
|
|
290
|
+
chunk = file_obj.read(TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE)
|
|
295
291
|
if not chunk:
|
|
296
292
|
break
|
|
297
293
|
total_bytes += len(chunk)
|
|
@@ -519,10 +519,18 @@ class ModalClientBase(abc.ABC):
|
|
|
519
519
|
async def SandboxGetTaskId(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTaskIdRequest, modal_proto.api_pb2.SandboxGetTaskIdResponse]') -> None:
|
|
520
520
|
pass
|
|
521
521
|
|
|
522
|
+
@abc.abstractmethod
|
|
523
|
+
async def SandboxGetTaskIdV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTaskIdRequest, modal_proto.api_pb2.SandboxGetTaskIdResponse]') -> None:
|
|
524
|
+
pass
|
|
525
|
+
|
|
522
526
|
@abc.abstractmethod
|
|
523
527
|
async def SandboxGetTunnels(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTunnelsRequest, modal_proto.api_pb2.SandboxGetTunnelsResponse]') -> None:
|
|
524
528
|
pass
|
|
525
529
|
|
|
530
|
+
@abc.abstractmethod
|
|
531
|
+
async def SandboxGetTunnelsV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTunnelsRequest, modal_proto.api_pb2.SandboxGetTunnelsResponse]') -> None:
|
|
532
|
+
pass
|
|
533
|
+
|
|
526
534
|
@abc.abstractmethod
|
|
527
535
|
async def SandboxList(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxListRequest, modal_proto.api_pb2.SandboxListResponse]') -> None:
|
|
528
536
|
pass
|
|
@@ -571,10 +579,18 @@ class ModalClientBase(abc.ABC):
|
|
|
571
579
|
async def SandboxTerminate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxTerminateRequest, modal_proto.api_pb2.SandboxTerminateResponse]') -> None:
|
|
572
580
|
pass
|
|
573
581
|
|
|
582
|
+
@abc.abstractmethod
|
|
583
|
+
async def SandboxTerminateV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxTerminateRequest, modal_proto.api_pb2.SandboxTerminateResponse]') -> None:
|
|
584
|
+
pass
|
|
585
|
+
|
|
574
586
|
@abc.abstractmethod
|
|
575
587
|
async def SandboxWait(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxWaitRequest, modal_proto.api_pb2.SandboxWaitResponse]') -> None:
|
|
576
588
|
pass
|
|
577
589
|
|
|
590
|
+
@abc.abstractmethod
|
|
591
|
+
async def SandboxWaitV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxWaitRequest, modal_proto.api_pb2.SandboxWaitResponse]') -> None:
|
|
592
|
+
pass
|
|
593
|
+
|
|
578
594
|
@abc.abstractmethod
|
|
579
595
|
async def SecretDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SecretDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
580
596
|
pass
|
|
@@ -1503,12 +1519,24 @@ class ModalClientBase(abc.ABC):
|
|
|
1503
1519
|
modal_proto.api_pb2.SandboxGetTaskIdRequest,
|
|
1504
1520
|
modal_proto.api_pb2.SandboxGetTaskIdResponse,
|
|
1505
1521
|
),
|
|
1522
|
+
'/modal.client.ModalClient/SandboxGetTaskIdV2': grpclib.const.Handler(
|
|
1523
|
+
self.SandboxGetTaskIdV2,
|
|
1524
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1525
|
+
modal_proto.api_pb2.SandboxGetTaskIdRequest,
|
|
1526
|
+
modal_proto.api_pb2.SandboxGetTaskIdResponse,
|
|
1527
|
+
),
|
|
1506
1528
|
'/modal.client.ModalClient/SandboxGetTunnels': grpclib.const.Handler(
|
|
1507
1529
|
self.SandboxGetTunnels,
|
|
1508
1530
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1509
1531
|
modal_proto.api_pb2.SandboxGetTunnelsRequest,
|
|
1510
1532
|
modal_proto.api_pb2.SandboxGetTunnelsResponse,
|
|
1511
1533
|
),
|
|
1534
|
+
'/modal.client.ModalClient/SandboxGetTunnelsV2': grpclib.const.Handler(
|
|
1535
|
+
self.SandboxGetTunnelsV2,
|
|
1536
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1537
|
+
modal_proto.api_pb2.SandboxGetTunnelsRequest,
|
|
1538
|
+
modal_proto.api_pb2.SandboxGetTunnelsResponse,
|
|
1539
|
+
),
|
|
1512
1540
|
'/modal.client.ModalClient/SandboxList': grpclib.const.Handler(
|
|
1513
1541
|
self.SandboxList,
|
|
1514
1542
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1581,12 +1609,24 @@ class ModalClientBase(abc.ABC):
|
|
|
1581
1609
|
modal_proto.api_pb2.SandboxTerminateRequest,
|
|
1582
1610
|
modal_proto.api_pb2.SandboxTerminateResponse,
|
|
1583
1611
|
),
|
|
1612
|
+
'/modal.client.ModalClient/SandboxTerminateV2': grpclib.const.Handler(
|
|
1613
|
+
self.SandboxTerminateV2,
|
|
1614
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1615
|
+
modal_proto.api_pb2.SandboxTerminateRequest,
|
|
1616
|
+
modal_proto.api_pb2.SandboxTerminateResponse,
|
|
1617
|
+
),
|
|
1584
1618
|
'/modal.client.ModalClient/SandboxWait': grpclib.const.Handler(
|
|
1585
1619
|
self.SandboxWait,
|
|
1586
1620
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1587
1621
|
modal_proto.api_pb2.SandboxWaitRequest,
|
|
1588
1622
|
modal_proto.api_pb2.SandboxWaitResponse,
|
|
1589
1623
|
),
|
|
1624
|
+
'/modal.client.ModalClient/SandboxWaitV2': grpclib.const.Handler(
|
|
1625
|
+
self.SandboxWaitV2,
|
|
1626
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1627
|
+
modal_proto.api_pb2.SandboxWaitRequest,
|
|
1628
|
+
modal_proto.api_pb2.SandboxWaitResponse,
|
|
1629
|
+
),
|
|
1590
1630
|
'/modal.client.ModalClient/SecretDelete': grpclib.const.Handler(
|
|
1591
1631
|
self.SecretDelete,
|
|
1592
1632
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -2607,12 +2647,24 @@ class ModalClientStub:
|
|
|
2607
2647
|
modal_proto.api_pb2.SandboxGetTaskIdRequest,
|
|
2608
2648
|
modal_proto.api_pb2.SandboxGetTaskIdResponse,
|
|
2609
2649
|
)
|
|
2650
|
+
self.SandboxGetTaskIdV2 = grpclib.client.UnaryUnaryMethod(
|
|
2651
|
+
channel,
|
|
2652
|
+
'/modal.client.ModalClient/SandboxGetTaskIdV2',
|
|
2653
|
+
modal_proto.api_pb2.SandboxGetTaskIdRequest,
|
|
2654
|
+
modal_proto.api_pb2.SandboxGetTaskIdResponse,
|
|
2655
|
+
)
|
|
2610
2656
|
self.SandboxGetTunnels = grpclib.client.UnaryUnaryMethod(
|
|
2611
2657
|
channel,
|
|
2612
2658
|
'/modal.client.ModalClient/SandboxGetTunnels',
|
|
2613
2659
|
modal_proto.api_pb2.SandboxGetTunnelsRequest,
|
|
2614
2660
|
modal_proto.api_pb2.SandboxGetTunnelsResponse,
|
|
2615
2661
|
)
|
|
2662
|
+
self.SandboxGetTunnelsV2 = grpclib.client.UnaryUnaryMethod(
|
|
2663
|
+
channel,
|
|
2664
|
+
'/modal.client.ModalClient/SandboxGetTunnelsV2',
|
|
2665
|
+
modal_proto.api_pb2.SandboxGetTunnelsRequest,
|
|
2666
|
+
modal_proto.api_pb2.SandboxGetTunnelsResponse,
|
|
2667
|
+
)
|
|
2616
2668
|
self.SandboxList = grpclib.client.UnaryUnaryMethod(
|
|
2617
2669
|
channel,
|
|
2618
2670
|
'/modal.client.ModalClient/SandboxList',
|
|
@@ -2685,12 +2737,24 @@ class ModalClientStub:
|
|
|
2685
2737
|
modal_proto.api_pb2.SandboxTerminateRequest,
|
|
2686
2738
|
modal_proto.api_pb2.SandboxTerminateResponse,
|
|
2687
2739
|
)
|
|
2740
|
+
self.SandboxTerminateV2 = grpclib.client.UnaryUnaryMethod(
|
|
2741
|
+
channel,
|
|
2742
|
+
'/modal.client.ModalClient/SandboxTerminateV2',
|
|
2743
|
+
modal_proto.api_pb2.SandboxTerminateRequest,
|
|
2744
|
+
modal_proto.api_pb2.SandboxTerminateResponse,
|
|
2745
|
+
)
|
|
2688
2746
|
self.SandboxWait = grpclib.client.UnaryUnaryMethod(
|
|
2689
2747
|
channel,
|
|
2690
2748
|
'/modal.client.ModalClient/SandboxWait',
|
|
2691
2749
|
modal_proto.api_pb2.SandboxWaitRequest,
|
|
2692
2750
|
modal_proto.api_pb2.SandboxWaitResponse,
|
|
2693
2751
|
)
|
|
2752
|
+
self.SandboxWaitV2 = grpclib.client.UnaryUnaryMethod(
|
|
2753
|
+
channel,
|
|
2754
|
+
'/modal.client.ModalClient/SandboxWaitV2',
|
|
2755
|
+
modal_proto.api_pb2.SandboxWaitRequest,
|
|
2756
|
+
modal_proto.api_pb2.SandboxWaitResponse,
|
|
2757
|
+
)
|
|
2694
2758
|
self.SecretDelete = grpclib.client.UnaryUnaryMethod(
|
|
2695
2759
|
channel,
|
|
2696
2760
|
'/modal.client.ModalClient/SecretDelete',
|