modal 1.5.2.dev10__tar.gz → 1.5.2.dev11__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.5.2.dev10 → modal-1.5.2.dev11}/PKG-INFO +1 -1
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_image.py +1 -1
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/task_command_router_client.py +8 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/client.pyi +2 -2
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/functions.pyi +6 -6
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox.py +48 -9
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox.pyi +65 -3
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_version/__init__.py +1 -1
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/LICENSE +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/README.md +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/__main__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_billing.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_clustered_functions.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_environments.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_function_variants.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_functions.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_grpc_client.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_ipython.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_load_context.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_location.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_logs.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_object.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/manager.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/pty.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/rich.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/status.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_partial_function.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_resolver.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_resources.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_serialization.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_server.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_traceback.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_tunnel.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_tunnel.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_type_manager.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/logger.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/version.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_watcher.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_workspace.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/app.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/app.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/billing.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/billing.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/README.md +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/base-images.json +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/call_graph.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_download.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_help.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_traceback.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/app.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/billing.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/changelog.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/cluster.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/config.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/container.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/curl.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/dashboard.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/dict.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/endpoint.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/entry_point.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/environment.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/image.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/import_refs.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/launch.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/logo.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/profile.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/queues.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/run.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/secret.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/selector.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/shell.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/skills.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/token.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/utils.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/volume.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/workspace.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/client.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cls.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cls.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/config.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/container_process.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/container_process.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/dict.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/dict.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/environments.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/environments.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/exception.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/flash.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/ipython.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_io.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_io.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/functions.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/image.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/image.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/io_streams.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/io_streams.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/mount.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/mount.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/network_file_system.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/network_file_system.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/object.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/object.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/output.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/parallel_map.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/parallel_map.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/partial_function.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/partial_function.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/proxy.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/proxy.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/py.typed +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/queue.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/queue.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/retries.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/runner.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/runner.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/running_app.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox_fs.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/schedule.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/scheduler_placement.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/secret.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/secret.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/server.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/server.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/serving.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/serving.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/snapshot.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/snapshot.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/stream_type.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/token_flow.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/token_flow.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/volume.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/volume.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/workspace.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/workspace.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/__init__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/py.typed +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_version/__main__.py +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/pyproject.toml +0 -0
- {modal-1.5.2.dev10 → modal-1.5.2.dev11}/setup.cfg +0 -0
|
@@ -1022,7 +1022,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1022
1022
|
```
|
|
1023
1023
|
"""
|
|
1024
1024
|
if app.app_id is None:
|
|
1025
|
-
raise InvalidError("App has not been initialized yet. Use the
|
|
1025
|
+
raise InvalidError("App has not been initialized yet. Use the context manager `app.run()` or `App.lookup`")
|
|
1026
1026
|
|
|
1027
1027
|
resolver = Resolver()
|
|
1028
1028
|
async with TaskContext() as tc:
|
|
@@ -811,6 +811,14 @@ class TaskCommandRouterClient:
|
|
|
811
811
|
lambda: self._call_with_auth_retry(self._stub.TaskSetNetworkAccess, request)
|
|
812
812
|
)
|
|
813
813
|
|
|
814
|
+
async def reload_volumes(self, task_id: str) -> sr_pb2.TaskReloadVolumesResponse:
|
|
815
|
+
"""Reload all Volumes mounted in the task to reflect their latest committed state."""
|
|
816
|
+
request = sr_pb2.TaskReloadVolumesRequest(task_id=task_id)
|
|
817
|
+
with grpc_error_converter():
|
|
818
|
+
return await call_with_retries_on_transient_errors(
|
|
819
|
+
lambda: self._call_with_auth_retry(self._stub.TaskReloadVolumes, request)
|
|
820
|
+
)
|
|
821
|
+
|
|
814
822
|
async def _snapshot_with_deadline(self, rpc, request, *, timeout: float, **kwargs):
|
|
815
823
|
# helper method for snapshot_directory and snapshot_filesystem to handle grpc
|
|
816
824
|
# deadlines in a consistent way, converting any error to TimeoutError after passing
|
|
@@ -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.5.2.
|
|
38
|
+
version: str = "1.5.2.dev11",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -205,7 +205,7 @@ class Client:
|
|
|
205
205
|
server_url: str,
|
|
206
206
|
client_type: int,
|
|
207
207
|
credentials: typing.Optional[tuple[str, str]],
|
|
208
|
-
version: str = "1.5.2.
|
|
208
|
+
version: str = "1.5.2.dev11",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -491,7 +491,7 @@ class Function(
|
|
|
491
491
|
|
|
492
492
|
_call_generator: ___call_generator_spec
|
|
493
493
|
|
|
494
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
494
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
495
495
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
496
496
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
497
497
|
|
|
@@ -516,7 +516,7 @@ class Function(
|
|
|
516
516
|
"""
|
|
517
517
|
...
|
|
518
518
|
|
|
519
|
-
remote: __remote_spec[modal._functions.
|
|
519
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
520
520
|
|
|
521
521
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
522
522
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -566,7 +566,7 @@ class Function(
|
|
|
566
566
|
"""
|
|
567
567
|
...
|
|
568
568
|
|
|
569
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
569
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
570
570
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
571
571
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
572
572
|
|
|
@@ -599,7 +599,7 @@ class Function(
|
|
|
599
599
|
"""
|
|
600
600
|
...
|
|
601
601
|
|
|
602
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
602
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
603
603
|
|
|
604
604
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
605
605
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -607,7 +607,7 @@ class Function(
|
|
|
607
607
|
|
|
608
608
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
609
609
|
|
|
610
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
610
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
611
611
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
612
612
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
613
613
|
|
|
@@ -640,7 +640,7 @@ class Function(
|
|
|
640
640
|
"""
|
|
641
641
|
...
|
|
642
642
|
|
|
643
|
-
spawn: __spawn_spec[modal._functions.
|
|
643
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
644
644
|
|
|
645
645
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
646
646
|
"""Return the inner Python object wrapped by this Modal Function.
|
|
@@ -39,7 +39,12 @@ from ._resolver import Resolver
|
|
|
39
39
|
from ._resources import convert_fn_config_to_resources_config
|
|
40
40
|
from ._utils.async_utils import TaskContext, synchronize_api
|
|
41
41
|
from ._utils.deprecation import deprecation_warning
|
|
42
|
-
from ._utils.mount_utils import
|
|
42
|
+
from ._utils.mount_utils import (
|
|
43
|
+
validate_network_file_systems,
|
|
44
|
+
validate_only_modal_volumes,
|
|
45
|
+
validate_volumes,
|
|
46
|
+
validate_volumes_by_object_id,
|
|
47
|
+
)
|
|
43
48
|
from ._utils.name_utils import check_object_name
|
|
44
49
|
from ._utils.task_command_router_client import TaskCommandRouterClient
|
|
45
50
|
from .client import _Client
|
|
@@ -1638,13 +1643,16 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1638
1643
|
Added in v1.1.0.
|
|
1639
1644
|
|
|
1640
1645
|
"""
|
|
1641
|
-
self._ensure_v1("reload_volumes")
|
|
1642
1646
|
task_id = await self._get_task_id()
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1647
|
+
if self._is_v2:
|
|
1648
|
+
command_router_client = await self._get_command_router_client(task_id)
|
|
1649
|
+
await command_router_client.reload_volumes(task_id)
|
|
1650
|
+
else:
|
|
1651
|
+
await self._client.stub.ContainerReloadVolumes(
|
|
1652
|
+
api_pb2.ContainerReloadVolumesRequest(
|
|
1653
|
+
task_id=task_id,
|
|
1654
|
+
),
|
|
1655
|
+
)
|
|
1648
1656
|
|
|
1649
1657
|
@overload
|
|
1650
1658
|
async def terminate(
|
|
@@ -2538,13 +2546,34 @@ class _SidecarManager:
|
|
|
2538
2546
|
env: dict[str, str] | None = None,
|
|
2539
2547
|
secrets: Collection[_Secret] | None = None,
|
|
2540
2548
|
workdir: str | None = None,
|
|
2549
|
+
volumes: dict[str | os.PathLike, _Volume] | None = None,
|
|
2541
2550
|
) -> _SidecarContainer:
|
|
2551
|
+
"""Create a sidecar container running alongside the Sandbox's main container.
|
|
2552
|
+
|
|
2553
|
+
Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
|
|
2554
|
+
can be used to run auxiliary processes, such as a database or a service the main container
|
|
2555
|
+
depends on.
|
|
2556
|
+
|
|
2557
|
+
Args:
|
|
2558
|
+
*args: Command and arguments to run inside the sidecar container.
|
|
2559
|
+
name: Unique name for the sidecar container. The name ``"main"`` is reserved.
|
|
2560
|
+
image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
|
|
2561
|
+
env: Environment variables to set in the sidecar container.
|
|
2562
|
+
secrets: Secrets to inject as environment variables in the sidecar container.
|
|
2563
|
+
workdir: Working directory for the command; must be absolute if set.
|
|
2564
|
+
volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
|
|
2565
|
+
|
|
2566
|
+
Returns:
|
|
2567
|
+
A `SidecarContainer` handle for the running container.
|
|
2568
|
+
"""
|
|
2542
2569
|
if name == _MAIN_CONTAINER_NAME:
|
|
2543
2570
|
raise InvalidError(f"The name {_MAIN_CONTAINER_NAME!r} is reserved for the sandbox's main container.")
|
|
2544
2571
|
if workdir is not None and not workdir.startswith("/"):
|
|
2545
2572
|
raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
|
|
2546
2573
|
_validate_exec_args(args)
|
|
2547
2574
|
|
|
2575
|
+
validated_volumes = validate_only_modal_volumes(volumes, "Sandbox._experimental_sidecars.create(volumes=...)")
|
|
2576
|
+
|
|
2548
2577
|
if image._mount_layers:
|
|
2549
2578
|
raise InvalidError(
|
|
2550
2579
|
"Sandbox._experimental_sidecars.create(image=...) only supports pre-built images. "
|
|
@@ -2564,8 +2593,17 @@ class _SidecarManager:
|
|
|
2564
2593
|
)
|
|
2565
2594
|
|
|
2566
2595
|
secrets = secrets or []
|
|
2567
|
-
|
|
2568
|
-
|
|
2596
|
+
hydrate_coros = [secret.hydrate(client=self._sandbox._client) for secret in secrets] + [
|
|
2597
|
+
volume.hydrate(client=self._sandbox._client) for _, volume in validated_volumes
|
|
2598
|
+
]
|
|
2599
|
+
await TaskContext.gather(*hydrate_coros)
|
|
2600
|
+
|
|
2601
|
+
# Validate that the same volume (by object_id) isn't mounted at multiple paths. This relies on
|
|
2602
|
+
# the volumes being hydrated above, since it compares object_ids.
|
|
2603
|
+
validate_volumes_by_object_id(validated_volumes)
|
|
2604
|
+
|
|
2605
|
+
# Relies on dicts being ordered (true as of Python 3.6).
|
|
2606
|
+
volume_mounts = [_volume_to_mount_proto(path, volume) for path, volume in validated_volumes]
|
|
2569
2607
|
|
|
2570
2608
|
task_id, command_router_client = await self._get_command_router()
|
|
2571
2609
|
|
|
@@ -2577,6 +2615,7 @@ class _SidecarManager:
|
|
|
2577
2615
|
env=env or {},
|
|
2578
2616
|
workdir=workdir or "",
|
|
2579
2617
|
secret_ids=[secret.object_id for secret in secrets],
|
|
2618
|
+
volume_mounts=volume_mounts,
|
|
2580
2619
|
)
|
|
2581
2620
|
create_resp = await command_router_client.container_create(create_req)
|
|
2582
2621
|
container_id = create_resp.container_id
|
|
@@ -1046,7 +1046,28 @@ class _SidecarManager:
|
|
|
1046
1046
|
env: typing.Optional[dict[str, str]] = None,
|
|
1047
1047
|
secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
|
|
1048
1048
|
workdir: typing.Optional[str] = None,
|
|
1049
|
-
|
|
1049
|
+
volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume._Volume]] = None,
|
|
1050
|
+
) -> _SidecarContainer:
|
|
1051
|
+
"""Create a sidecar container running alongside the Sandbox's main container.
|
|
1052
|
+
|
|
1053
|
+
Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
|
|
1054
|
+
can be used to run auxiliary processes, such as a database or a service the main container
|
|
1055
|
+
depends on.
|
|
1056
|
+
|
|
1057
|
+
Args:
|
|
1058
|
+
*args: Command and arguments to run inside the sidecar container.
|
|
1059
|
+
name: Unique name for the sidecar container. The name ``"main"`` is reserved.
|
|
1060
|
+
image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
|
|
1061
|
+
env: Environment variables to set in the sidecar container.
|
|
1062
|
+
secrets: Secrets to inject as environment variables in the sidecar container.
|
|
1063
|
+
workdir: Working directory for the command; must be absolute if set.
|
|
1064
|
+
volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
|
|
1065
|
+
|
|
1066
|
+
Returns:
|
|
1067
|
+
A `SidecarContainer` handle for the running container.
|
|
1068
|
+
"""
|
|
1069
|
+
...
|
|
1070
|
+
|
|
1050
1071
|
async def get(self, *, name: str, include_terminated: bool = False) -> _SidecarContainer: ...
|
|
1051
1072
|
async def list(self, include_terminated: bool = False) -> list[_SidecarContainer]: ...
|
|
1052
1073
|
|
|
@@ -1201,7 +1222,28 @@ class SidecarManager:
|
|
|
1201
1222
|
env: typing.Optional[dict[str, str]] = None,
|
|
1202
1223
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
1203
1224
|
workdir: typing.Optional[str] = None,
|
|
1204
|
-
|
|
1225
|
+
volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume.Volume]] = None,
|
|
1226
|
+
) -> SidecarContainer:
|
|
1227
|
+
"""Create a sidecar container running alongside the Sandbox's main container.
|
|
1228
|
+
|
|
1229
|
+
Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
|
|
1230
|
+
can be used to run auxiliary processes, such as a database or a service the main container
|
|
1231
|
+
depends on.
|
|
1232
|
+
|
|
1233
|
+
Args:
|
|
1234
|
+
*args: Command and arguments to run inside the sidecar container.
|
|
1235
|
+
name: Unique name for the sidecar container. The name ``"main"`` is reserved.
|
|
1236
|
+
image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
|
|
1237
|
+
env: Environment variables to set in the sidecar container.
|
|
1238
|
+
secrets: Secrets to inject as environment variables in the sidecar container.
|
|
1239
|
+
workdir: Working directory for the command; must be absolute if set.
|
|
1240
|
+
volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
|
|
1241
|
+
|
|
1242
|
+
Returns:
|
|
1243
|
+
A `SidecarContainer` handle for the running container.
|
|
1244
|
+
"""
|
|
1245
|
+
...
|
|
1246
|
+
|
|
1205
1247
|
async def aio(
|
|
1206
1248
|
self,
|
|
1207
1249
|
/,
|
|
@@ -1211,7 +1253,27 @@ class SidecarManager:
|
|
|
1211
1253
|
env: typing.Optional[dict[str, str]] = None,
|
|
1212
1254
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
1213
1255
|
workdir: typing.Optional[str] = None,
|
|
1214
|
-
|
|
1256
|
+
volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume.Volume]] = None,
|
|
1257
|
+
) -> SidecarContainer:
|
|
1258
|
+
"""Create a sidecar container running alongside the Sandbox's main container.
|
|
1259
|
+
|
|
1260
|
+
Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
|
|
1261
|
+
can be used to run auxiliary processes, such as a database or a service the main container
|
|
1262
|
+
depends on.
|
|
1263
|
+
|
|
1264
|
+
Args:
|
|
1265
|
+
*args: Command and arguments to run inside the sidecar container.
|
|
1266
|
+
name: Unique name for the sidecar container. The name ``"main"`` is reserved.
|
|
1267
|
+
image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
|
|
1268
|
+
env: Environment variables to set in the sidecar container.
|
|
1269
|
+
secrets: Secrets to inject as environment variables in the sidecar container.
|
|
1270
|
+
workdir: Working directory for the command; must be absolute if set.
|
|
1271
|
+
volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
|
|
1272
|
+
|
|
1273
|
+
Returns:
|
|
1274
|
+
A `SidecarContainer` handle for the running container.
|
|
1275
|
+
"""
|
|
1276
|
+
...
|
|
1215
1277
|
|
|
1216
1278
|
create: __create_spec
|
|
1217
1279
|
|
|
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
|
|
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
|