modal 1.4.4.dev7__tar.gz → 1.4.4.dev8__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.4.4.dev7 → modal-1.4.4.dev8}/PKG-INFO +1 -1
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/shell.py +6 -6
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/client.pyi +2 -2
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox.py +34 -20
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox.pyi +23 -21
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox_fs.py +5 -5
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox_fs.pyi +4 -4
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_version/__init__.py +1 -1
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/LICENSE +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/README.md +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/__main__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_billing.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_clustered_functions.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_clustered_functions.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_container_entrypoint.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_environments.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_function_variants.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_functions.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_grpc_client.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_ipython.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_load_context.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_location.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_logs.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_object.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/manager.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/pty.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/rich.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/status.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_partial_function.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_resolver.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_resources.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/asgi.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/execution_context.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/telemetry.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_serialization.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_server.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_traceback.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_tunnel.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_tunnel.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_type_manager.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/app_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/async_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/blob_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/browser_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/deprecation.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/docker_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/function_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/git_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/hash_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/http_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/logger.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/mount_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/name_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/package_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/shell_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/time_utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/tblib.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/version.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_watcher.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/app.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/app.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/billing.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2023.12.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2024.04.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2024.10.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2025.06.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/README.md +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/base-images.json +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/call_graph.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_download.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_help.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_traceback.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/app.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/billing.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/bootstrap.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/changelog.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/cluster.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/config.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/container.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/dashboard.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/dict.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/entry_point.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/environment.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/import_refs.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/launch.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/logo.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/network_file_system.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/profile.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/vscode.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/queues.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/run.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/secret.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/selector.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/token.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/utils.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/volume.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/client.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cls.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cls.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/config.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/container_process.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/container_process.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/dict.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/dict.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/environments.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/environments.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/exception.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/flash.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/flash.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/ipython.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_io.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_io.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_pattern_matcher.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/functions.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/functions.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/image.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/image.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/io_streams.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/io_streams.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/mount.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/mount.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/network_file_system.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/network_file_system.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/object.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/object.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/output.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/parallel_map.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/parallel_map.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/partial_function.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/partial_function.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/proxy.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/proxy.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/py.typed +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/queue.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/queue.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/retries.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/runner.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/runner.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/running_app.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/schedule.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/scheduler_placement.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/secret.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/secret.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/server.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/server.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/serving.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/serving.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/snapshot.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/snapshot.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/stream_type.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/token_flow.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/token_flow.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/volume.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/volume.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/requires.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/top_level.txt +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/__init__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_grpc.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/py.typed +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_version/__main__.py +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/pyproject.toml +0 -0
- {modal-1.4.4.dev7 → modal-1.4.4.dev8}/setup.cfg +0 -0
|
@@ -16,7 +16,7 @@ from ..functions import Function
|
|
|
16
16
|
from ..image import Image
|
|
17
17
|
from ..mount import _Mount
|
|
18
18
|
from ..runner import interactive_shell
|
|
19
|
-
from ..sandbox import Sandbox
|
|
19
|
+
from ..sandbox import _MAIN_CONTAINER_NAME, Sandbox
|
|
20
20
|
from ..secret import Secret
|
|
21
21
|
from ..stream_type import StreamType
|
|
22
22
|
from ..volume import Volume
|
|
@@ -106,8 +106,8 @@ def _is_running_container_ref(ref: Optional[str]) -> bool:
|
|
|
106
106
|
return _is_valid_modal_id(sandbox_id, "sb-") or _is_valid_modal_id(ref, "ta-")
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
def
|
|
110
|
-
"""Shell into a
|
|
109
|
+
def _start_shell_in_sidecar_container(sandbox_id: str, container_name: str, cmd: str, pty: bool) -> None:
|
|
110
|
+
"""Shell into a sidecar container within a sandbox."""
|
|
111
111
|
try:
|
|
112
112
|
sandbox = Sandbox.from_id(sandbox_id)
|
|
113
113
|
except NotFoundError:
|
|
@@ -116,7 +116,7 @@ def _start_shell_in_sandbox_container(sandbox_id: str, container_name: str, cmd:
|
|
|
116
116
|
raise ClickException(f"Error connecting to Sandbox '{sandbox_id}': {str(e)}")
|
|
117
117
|
|
|
118
118
|
try:
|
|
119
|
-
sandbox_container = sandbox.
|
|
119
|
+
sandbox_container = sandbox._experimental_sidecars.get(name=container_name)
|
|
120
120
|
process: Union[ContainerProcess[bytes], ContainerProcess[str]]
|
|
121
121
|
if pty:
|
|
122
122
|
# PTY output is raw terminal bytes, not text; strict UTF-8 decode
|
|
@@ -138,8 +138,8 @@ def _start_shell_in_sandbox_container(sandbox_id: str, container_name: str, cmd:
|
|
|
138
138
|
def _start_shell_in_running_container(ref: str, cmd: str, pty: bool) -> None:
|
|
139
139
|
sandbox_id, container_name = _parse_sandbox_container_ref(ref)
|
|
140
140
|
|
|
141
|
-
if container_name is not None:
|
|
142
|
-
return
|
|
141
|
+
if container_name is not None and container_name != _MAIN_CONTAINER_NAME:
|
|
142
|
+
return _start_shell_in_sidecar_container(sandbox_id, container_name, cmd, pty)
|
|
143
143
|
|
|
144
144
|
if _is_valid_modal_id(sandbox_id, "sb-"):
|
|
145
145
|
try:
|
|
@@ -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.4.4.
|
|
38
|
+
version: str = "1.4.4.dev8",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -175,7 +175,7 @@ class Client:
|
|
|
175
175
|
server_url: str,
|
|
176
176
|
client_type: int,
|
|
177
177
|
credentials: typing.Optional[tuple[str, str]],
|
|
178
|
-
version: str = "1.4.4.
|
|
178
|
+
version: str = "1.4.4.dev8",
|
|
179
179
|
):
|
|
180
180
|
"""mdmd:hidden
|
|
181
181
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -1386,10 +1386,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1386
1386
|
return self._command_router_client
|
|
1387
1387
|
|
|
1388
1388
|
@property
|
|
1389
|
-
def
|
|
1390
|
-
"""Manage
|
|
1389
|
+
def _experimental_sidecars(self) -> "_SidecarManager":
|
|
1390
|
+
"""Manage sidecar containers running in this Sandbox."""
|
|
1391
1391
|
self._ensure_attached()
|
|
1392
|
-
return
|
|
1392
|
+
return _SidecarManager(self)
|
|
1393
1393
|
|
|
1394
1394
|
@overload
|
|
1395
1395
|
async def exec(
|
|
@@ -1854,7 +1854,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1854
1854
|
before_timestamp = resp.sandboxes[-1].created_at
|
|
1855
1855
|
|
|
1856
1856
|
|
|
1857
|
-
class
|
|
1857
|
+
class _SidecarContainer:
|
|
1858
1858
|
"""Handle to an additional container running in a Sandbox."""
|
|
1859
1859
|
|
|
1860
1860
|
_result: Optional[api_pb2.GenericResult]
|
|
@@ -1882,9 +1882,9 @@ class _SandboxContainer:
|
|
|
1882
1882
|
return self._container_name
|
|
1883
1883
|
|
|
1884
1884
|
@staticmethod
|
|
1885
|
-
def _from_container_info(sandbox: "_Sandbox", container_info: sr_pb2.TaskContainerInfo) -> "
|
|
1885
|
+
def _from_container_info(sandbox: "_Sandbox", container_info: sr_pb2.TaskContainerInfo) -> "_SidecarContainer":
|
|
1886
1886
|
result = container_info.result if container_info.HasField("result") else None
|
|
1887
|
-
return
|
|
1887
|
+
return _SidecarContainer(sandbox, container_info.container_id, container_info.container_name, result)
|
|
1888
1888
|
|
|
1889
1889
|
async def _get_command_router(self) -> tuple[str, "TaskCommandRouterClient"]:
|
|
1890
1890
|
"""Get task ID and command router client."""
|
|
@@ -2031,8 +2031,11 @@ class _SandboxContainer:
|
|
|
2031
2031
|
return _result_returncode(self._result)
|
|
2032
2032
|
|
|
2033
2033
|
|
|
2034
|
-
|
|
2035
|
-
|
|
2034
|
+
_MAIN_CONTAINER_NAME: str = "main"
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
class _SidecarManager:
|
|
2038
|
+
"""Creates and manages sidecar containers in a Sandbox."""
|
|
2036
2039
|
|
|
2037
2040
|
def __init__(self, sandbox: _Sandbox) -> None:
|
|
2038
2041
|
self._sandbox = sandbox
|
|
@@ -2051,22 +2054,24 @@ class _SandboxContainerManager:
|
|
|
2051
2054
|
env: Optional[dict[str, str]] = None,
|
|
2052
2055
|
secrets: Optional[Collection[_Secret]] = None,
|
|
2053
2056
|
workdir: Optional[str] = None,
|
|
2054
|
-
) ->
|
|
2057
|
+
) -> _SidecarContainer:
|
|
2058
|
+
if name == _MAIN_CONTAINER_NAME:
|
|
2059
|
+
raise InvalidError(f"The name {_MAIN_CONTAINER_NAME!r} is reserved for the sandbox's main container.")
|
|
2055
2060
|
if workdir is not None and not workdir.startswith("/"):
|
|
2056
2061
|
raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
|
|
2057
2062
|
_validate_exec_args(args)
|
|
2058
2063
|
|
|
2059
2064
|
if image._mount_layers:
|
|
2060
2065
|
raise InvalidError(
|
|
2061
|
-
"Sandbox.
|
|
2066
|
+
"Sandbox._experimental_sidecars.create(image=...) only supports pre-built images. "
|
|
2062
2067
|
"When using `add_local*` methods, specify `copy=True` and call `.build()` before passing "
|
|
2063
|
-
"the image to `.
|
|
2068
|
+
"the image to `._experimental_sidecars.create()`:\n\nE.g.\n"
|
|
2064
2069
|
'img = modal.Image.debian_slim().add_local_file("foo", "/foo", copy=True).build(app)\n'
|
|
2065
|
-
'sandbox.
|
|
2070
|
+
'sandbox._experimental_sidecars.create(name="worker", image=img)'
|
|
2066
2071
|
)
|
|
2067
2072
|
if not image._object_id:
|
|
2068
2073
|
raise InvalidError(
|
|
2069
|
-
"Sandbox.
|
|
2074
|
+
"Sandbox._experimental_sidecars.create(image=...) currently only supports Images that are "
|
|
2070
2075
|
"either:\n"
|
|
2071
2076
|
"- prebuilt using `image.build()`\n"
|
|
2072
2077
|
"- referenced by id, e.g. `Image.from_id()`\n"
|
|
@@ -2092,9 +2097,14 @@ class _SandboxContainerManager:
|
|
|
2092
2097
|
create_resp = await command_router_client.container_create(create_req)
|
|
2093
2098
|
container_id = create_resp.container_id
|
|
2094
2099
|
container_name = create_resp.container_name or name
|
|
2095
|
-
return
|
|
2100
|
+
return _SidecarContainer(self._sandbox, container_id, container_name)
|
|
2096
2101
|
|
|
2097
|
-
async def get(self, *, name: str, include_terminated: bool = False) -> "
|
|
2102
|
+
async def get(self, *, name: str, include_terminated: bool = False) -> "_SidecarContainer":
|
|
2103
|
+
if name == _MAIN_CONTAINER_NAME:
|
|
2104
|
+
raise InvalidError(
|
|
2105
|
+
"Cannot get the main sandbox container through the sidecars API. "
|
|
2106
|
+
"Use Sandbox methods directly to interact with the main container."
|
|
2107
|
+
)
|
|
2098
2108
|
task_id, command_router_client = await self._get_command_router()
|
|
2099
2109
|
resp = await command_router_client.container_get(
|
|
2100
2110
|
sr_pb2.TaskContainerGetRequest(
|
|
@@ -2103,16 +2113,20 @@ class _SandboxContainerManager:
|
|
|
2103
2113
|
include_terminated=include_terminated,
|
|
2104
2114
|
)
|
|
2105
2115
|
)
|
|
2106
|
-
return
|
|
2116
|
+
return _SidecarContainer._from_container_info(self._sandbox, resp.container)
|
|
2107
2117
|
|
|
2108
|
-
async def list(self, include_terminated: bool = False) -> builtins.list[
|
|
2118
|
+
async def list(self, include_terminated: bool = False) -> builtins.list[_SidecarContainer]:
|
|
2109
2119
|
task_id, command_router_client = await self._get_command_router()
|
|
2110
2120
|
resp = await command_router_client.container_list(
|
|
2111
2121
|
sr_pb2.TaskContainerListRequest(task_id=task_id, include_terminated=include_terminated)
|
|
2112
2122
|
)
|
|
2113
|
-
return [
|
|
2123
|
+
return [
|
|
2124
|
+
_SidecarContainer._from_container_info(self._sandbox, container)
|
|
2125
|
+
for container in resp.containers
|
|
2126
|
+
if container.container_name != _MAIN_CONTAINER_NAME
|
|
2127
|
+
]
|
|
2114
2128
|
|
|
2115
2129
|
|
|
2116
|
-
|
|
2117
|
-
|
|
2130
|
+
SidecarContainer = synchronize_api(_SidecarContainer)
|
|
2131
|
+
SidecarManager = synchronize_api(_SidecarManager)
|
|
2118
2132
|
Sandbox = synchronize_api(_Sandbox)
|
|
@@ -533,8 +533,8 @@ class _Sandbox(modal._object._Object):
|
|
|
533
533
|
self, task_id: str
|
|
534
534
|
) -> modal._utils.task_command_router_client.TaskCommandRouterClient: ...
|
|
535
535
|
@property
|
|
536
|
-
def
|
|
537
|
-
"""Manage
|
|
536
|
+
def _experimental_sidecars(self) -> _SidecarManager:
|
|
537
|
+
"""Manage sidecar containers running in this Sandbox."""
|
|
538
538
|
...
|
|
539
539
|
|
|
540
540
|
@typing.overload
|
|
@@ -697,7 +697,7 @@ class _Sandbox(modal._object._Object):
|
|
|
697
697
|
"""
|
|
698
698
|
...
|
|
699
699
|
|
|
700
|
-
class
|
|
700
|
+
class _SidecarContainer:
|
|
701
701
|
"""Handle to an additional container running in a Sandbox."""
|
|
702
702
|
|
|
703
703
|
_result: typing.Optional[modal_proto.api_pb2.GenericResult]
|
|
@@ -720,7 +720,7 @@ class _SandboxContainer:
|
|
|
720
720
|
@staticmethod
|
|
721
721
|
def _from_container_info(
|
|
722
722
|
sandbox: _Sandbox, container_info: modal_proto.task_command_router_pb2.TaskContainerInfo
|
|
723
|
-
) ->
|
|
723
|
+
) -> _SidecarContainer: ...
|
|
724
724
|
async def _get_command_router(self) -> tuple[str, modal._utils.task_command_router_client.TaskCommandRouterClient]:
|
|
725
725
|
"""Get task ID and command router client."""
|
|
726
726
|
...
|
|
@@ -765,8 +765,8 @@ class _SandboxContainer:
|
|
|
765
765
|
@typing.overload
|
|
766
766
|
async def terminate(self, *, wait: typing.Literal[False] = False) -> None: ...
|
|
767
767
|
|
|
768
|
-
class
|
|
769
|
-
"""Creates and manages
|
|
768
|
+
class _SidecarManager:
|
|
769
|
+
"""Creates and manages sidecar containers in a Sandbox."""
|
|
770
770
|
def __init__(self, sandbox: _Sandbox) -> None:
|
|
771
771
|
"""Initialize self. See help(type(self)) for accurate signature."""
|
|
772
772
|
...
|
|
@@ -783,11 +783,11 @@ class _SandboxContainerManager:
|
|
|
783
783
|
env: typing.Optional[dict[str, str]] = None,
|
|
784
784
|
secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
|
|
785
785
|
workdir: typing.Optional[str] = None,
|
|
786
|
-
) ->
|
|
787
|
-
async def get(self, *, name: str, include_terminated: bool = False) ->
|
|
788
|
-
async def list(self, include_terminated: bool = False) -> list[
|
|
786
|
+
) -> _SidecarContainer: ...
|
|
787
|
+
async def get(self, *, name: str, include_terminated: bool = False) -> _SidecarContainer: ...
|
|
788
|
+
async def list(self, include_terminated: bool = False) -> list[_SidecarContainer]: ...
|
|
789
789
|
|
|
790
|
-
class
|
|
790
|
+
class SidecarContainer:
|
|
791
791
|
"""Handle to an additional container running in a Sandbox."""
|
|
792
792
|
|
|
793
793
|
_result: typing.Optional[modal_proto.api_pb2.GenericResult]
|
|
@@ -807,7 +807,7 @@ class SandboxContainer:
|
|
|
807
807
|
@staticmethod
|
|
808
808
|
def _from_container_info(
|
|
809
809
|
sandbox: Sandbox, container_info: modal_proto.task_command_router_pb2.TaskContainerInfo
|
|
810
|
-
) ->
|
|
810
|
+
) -> SidecarContainer: ...
|
|
811
811
|
|
|
812
812
|
class ___get_command_router_spec(typing_extensions.Protocol):
|
|
813
813
|
def __call__(self, /) -> tuple[str, modal._utils.task_command_router_client.TaskCommandRouterClient]:
|
|
@@ -913,8 +913,8 @@ class SandboxContainer:
|
|
|
913
913
|
|
|
914
914
|
terminate: __terminate_spec
|
|
915
915
|
|
|
916
|
-
class
|
|
917
|
-
"""Creates and manages
|
|
916
|
+
class SidecarManager:
|
|
917
|
+
"""Creates and manages sidecar containers in a Sandbox."""
|
|
918
918
|
def __init__(self, sandbox: Sandbox) -> None: ...
|
|
919
919
|
|
|
920
920
|
class ___get_command_router_spec(typing_extensions.Protocol):
|
|
@@ -938,7 +938,7 @@ class SandboxContainerManager:
|
|
|
938
938
|
env: typing.Optional[dict[str, str]] = None,
|
|
939
939
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
940
940
|
workdir: typing.Optional[str] = None,
|
|
941
|
-
) ->
|
|
941
|
+
) -> SidecarContainer: ...
|
|
942
942
|
async def aio(
|
|
943
943
|
self,
|
|
944
944
|
/,
|
|
@@ -948,19 +948,19 @@ class SandboxContainerManager:
|
|
|
948
948
|
env: typing.Optional[dict[str, str]] = None,
|
|
949
949
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
950
950
|
workdir: typing.Optional[str] = None,
|
|
951
|
-
) ->
|
|
951
|
+
) -> SidecarContainer: ...
|
|
952
952
|
|
|
953
953
|
create: __create_spec
|
|
954
954
|
|
|
955
955
|
class __get_spec(typing_extensions.Protocol):
|
|
956
|
-
def __call__(self, /, *, name: str, include_terminated: bool = False) ->
|
|
957
|
-
async def aio(self, /, *, name: str, include_terminated: bool = False) ->
|
|
956
|
+
def __call__(self, /, *, name: str, include_terminated: bool = False) -> SidecarContainer: ...
|
|
957
|
+
async def aio(self, /, *, name: str, include_terminated: bool = False) -> SidecarContainer: ...
|
|
958
958
|
|
|
959
959
|
get: __get_spec
|
|
960
960
|
|
|
961
961
|
class __list_spec(typing_extensions.Protocol):
|
|
962
|
-
def __call__(self, /, include_terminated: bool = False) -> list[
|
|
963
|
-
async def aio(self, /, include_terminated: bool = False) -> list[
|
|
962
|
+
def __call__(self, /, include_terminated: bool = False) -> list[SidecarContainer]: ...
|
|
963
|
+
async def aio(self, /, include_terminated: bool = False) -> list[SidecarContainer]: ...
|
|
964
964
|
|
|
965
965
|
list: __list_spec
|
|
966
966
|
|
|
@@ -1760,8 +1760,8 @@ class Sandbox(modal.object.Object):
|
|
|
1760
1760
|
_get_command_router_client: ___get_command_router_client_spec
|
|
1761
1761
|
|
|
1762
1762
|
@property
|
|
1763
|
-
def
|
|
1764
|
-
"""Manage
|
|
1763
|
+
def _experimental_sidecars(self) -> SidecarManager:
|
|
1764
|
+
"""Manage sidecar containers running in this Sandbox."""
|
|
1765
1765
|
...
|
|
1766
1766
|
|
|
1767
1767
|
class __exec_spec(typing_extensions.Protocol):
|
|
@@ -2113,3 +2113,5 @@ class Sandbox(modal.object.Object):
|
|
|
2113
2113
|
list: typing.ClassVar[__list_spec]
|
|
2114
2114
|
|
|
2115
2115
|
_default_image: modal.image._Image
|
|
2116
|
+
|
|
2117
|
+
_MAIN_CONTAINER_NAME: str
|
|
@@ -87,14 +87,14 @@ class _SandboxFilesystem:
|
|
|
87
87
|
"""mdmd:namespace
|
|
88
88
|
Namespace for Sandbox filesystem APIs."""
|
|
89
89
|
|
|
90
|
-
_container: Union["modal.sandbox._Sandbox", "modal.sandbox.
|
|
90
|
+
_container: Union["modal.sandbox._Sandbox", "modal.sandbox._SidecarContainer"]
|
|
91
91
|
|
|
92
|
-
def __init__(self, container: Union["modal.sandbox._Sandbox", "modal.sandbox.
|
|
92
|
+
def __init__(self, container: Union["modal.sandbox._Sandbox", "modal.sandbox._SidecarContainer"]) -> None:
|
|
93
93
|
"""mdmd:hidden"""
|
|
94
|
-
from modal.sandbox import _Sandbox,
|
|
94
|
+
from modal.sandbox import _Sandbox, _SidecarContainer
|
|
95
95
|
|
|
96
|
-
# Use a weakref proxy to avoid circular references between Sandbox/
|
|
97
|
-
self._container = cast(Union[_Sandbox,
|
|
96
|
+
# Use a weakref proxy to avoid circular references between Sandbox/SidecarContainer and SandboxFilesystem.
|
|
97
|
+
self._container = cast(Union[_Sandbox, _SidecarContainer], weakref.proxy(container))
|
|
98
98
|
|
|
99
99
|
async def copy_from_local(self, local_path: Union[str, os.PathLike], remote_path: str) -> None:
|
|
100
100
|
"""Copy a local file into the Sandbox.
|
|
@@ -80,9 +80,9 @@ class _SandboxFilesystem:
|
|
|
80
80
|
Namespace for Sandbox filesystem APIs.
|
|
81
81
|
"""
|
|
82
82
|
|
|
83
|
-
_container: typing.Union[modal.sandbox._Sandbox, modal.sandbox.
|
|
83
|
+
_container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SidecarContainer]
|
|
84
84
|
|
|
85
|
-
def __init__(self, container: typing.Union[modal.sandbox._Sandbox, modal.sandbox.
|
|
85
|
+
def __init__(self, container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SidecarContainer]) -> None:
|
|
86
86
|
"""mdmd:hidden"""
|
|
87
87
|
...
|
|
88
88
|
|
|
@@ -346,9 +346,9 @@ class SandboxFilesystem:
|
|
|
346
346
|
Namespace for Sandbox filesystem APIs.
|
|
347
347
|
"""
|
|
348
348
|
|
|
349
|
-
_container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.
|
|
349
|
+
_container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SidecarContainer]
|
|
350
350
|
|
|
351
|
-
def __init__(self, container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.
|
|
351
|
+
def __init__(self, container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SidecarContainer]) -> None:
|
|
352
352
|
"""mdmd:hidden"""
|
|
353
353
|
...
|
|
354
354
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|