modal 1.5.2.dev9__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.dev9 → modal-1.5.2.dev11}/PKG-INFO +1 -1
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_function_variants.py +4 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_functions.py +2 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_image.py +1 -1
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/task_command_router_client.py +8 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/client.pyi +2 -2
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/functions.pyi +1 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox.py +48 -9
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox.pyi +65 -3
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_version/__init__.py +1 -1
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/LICENSE +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/README.md +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/__main__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_billing.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_clustered_functions.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_environments.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_grpc_client.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_ipython.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_load_context.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_location.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_logs.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_object.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/manager.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/pty.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/rich.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/status.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_partial_function.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_resolver.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_resources.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_serialization.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_server.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_traceback.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_tunnel.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_tunnel.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_type_manager.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/logger.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/version.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_watcher.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_workspace.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/app.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/app.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/billing.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/billing.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/README.md +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/base-images.json +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/call_graph.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_download.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_help.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_traceback.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/app.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/billing.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/changelog.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/cluster.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/config.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/container.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/curl.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/dashboard.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/dict.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/endpoint.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/entry_point.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/environment.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/image.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/import_refs.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/launch.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/logo.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/profile.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/queues.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/run.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/secret.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/selector.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/shell.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/skills.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/token.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/utils.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/volume.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/workspace.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/client.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cls.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cls.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/config.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/container_process.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/container_process.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/dict.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/dict.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/environments.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/environments.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/exception.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/flash.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/ipython.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_io.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_io.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/functions.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/image.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/image.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/io_streams.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/io_streams.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/mount.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/mount.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/network_file_system.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/network_file_system.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/object.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/object.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/output.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/parallel_map.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/parallel_map.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/partial_function.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/partial_function.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/proxy.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/proxy.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/py.typed +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/queue.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/queue.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/retries.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/runner.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/runner.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/running_app.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox_fs.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/schedule.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/scheduler_placement.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/secret.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/secret.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/server.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/server.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/serving.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/serving.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/snapshot.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/snapshot.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/stream_type.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/token_flow.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/token_flow.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/volume.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/volume.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/workspace.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/workspace.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/__init__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/py.typed +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_version/__main__.py +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/pyproject.toml +0 -0
- {modal-1.5.2.dev9 → modal-1.5.2.dev11}/setup.cfg +0 -0
|
@@ -51,6 +51,7 @@ class _FunctionOptions:
|
|
|
51
51
|
target_concurrent_inputs: int | None = None
|
|
52
52
|
batch_max_size: int | None = None
|
|
53
53
|
batch_wait_ms: int | None = None
|
|
54
|
+
routing_region: str | None = None
|
|
54
55
|
|
|
55
56
|
@classmethod
|
|
56
57
|
def new(
|
|
@@ -73,6 +74,7 @@ class _FunctionOptions:
|
|
|
73
74
|
target_concurrent_inputs: int | None = None,
|
|
74
75
|
batch_max_size: int | None = None,
|
|
75
76
|
batch_wait_ms: int | None = None,
|
|
77
|
+
routing_region: str | None = None,
|
|
76
78
|
) -> "_FunctionOptions":
|
|
77
79
|
"""Internal constructor that validates and normalizes public parameters."""
|
|
78
80
|
retry_policy = _parse_retries(retries)
|
|
@@ -119,6 +121,7 @@ class _FunctionOptions:
|
|
|
119
121
|
target_concurrent_inputs=target_concurrent_inputs,
|
|
120
122
|
batch_max_size=batch_max_size,
|
|
121
123
|
batch_wait_ms=batch_wait_ms,
|
|
124
|
+
routing_region=routing_region,
|
|
122
125
|
)
|
|
123
126
|
|
|
124
127
|
def merge_options(self, new_options: "_FunctionOptions") -> "_FunctionOptions":
|
|
@@ -182,6 +185,7 @@ class _FunctionOptions:
|
|
|
182
185
|
batch_linger_ms=self.batch_wait_ms,
|
|
183
186
|
scheduler_placement=self.scheduler_placement,
|
|
184
187
|
cloud_provider_str=self.cloud,
|
|
188
|
+
routing_region=self.routing_region,
|
|
185
189
|
)
|
|
186
190
|
|
|
187
191
|
|
|
@@ -1519,6 +1519,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1519
1519
|
timeout: int | None = None,
|
|
1520
1520
|
region: str | Sequence[str] | None = None,
|
|
1521
1521
|
cloud: str | None = None,
|
|
1522
|
+
routing_region: str | None = None,
|
|
1522
1523
|
) -> "_Function[P, ReturnType, OriginalReturnType]":
|
|
1523
1524
|
"""Dynamically override the static Function configuration with invocation-specific values.
|
|
1524
1525
|
|
|
@@ -1567,6 +1568,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1567
1568
|
timeout=timeout,
|
|
1568
1569
|
region=region,
|
|
1569
1570
|
cloud=cloud,
|
|
1571
|
+
routing_region=routing_region,
|
|
1570
1572
|
)
|
|
1571
1573
|
|
|
1572
1574
|
return self._apply_dynamic_config(options, "with_options")
|
|
@@ -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.
|
|
@@ -371,6 +371,7 @@ class Function(
|
|
|
371
371
|
timeout: typing.Optional[int] = None,
|
|
372
372
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
373
373
|
cloud: typing.Optional[str] = None,
|
|
374
|
+
routing_region: typing.Optional[str] = None,
|
|
374
375
|
) -> Function[modal._functions.P, modal._functions.ReturnType, modal._functions.OriginalReturnType]:
|
|
375
376
|
"""Dynamically override the static Function configuration with invocation-specific values.
|
|
376
377
|
|
|
@@ -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
|