modal 1.5.2.dev3__tar.gz → 1.5.2.dev5__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.dev3 → modal-1.5.2.dev5}/PKG-INFO +1 -1
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/container_io_manager.py +1 -1
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/blob_utils.py +7 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/client.pyi +2 -2
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/functions.pyi +6 -6
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/sandbox.py +56 -1
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/sandbox.pyi +55 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_version/__init__.py +1 -1
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/LICENSE +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/README.md +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/__main__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_billing.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_clustered_functions.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_environments.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_function_variants.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_functions.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_grpc_client.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_image.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_ipython.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_load_context.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_location.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_logs.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_object.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_output/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_output/manager.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_output/pty.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_output/rich.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_output/status.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_partial_function.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_resolver.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_resources.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_serialization.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_server.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_traceback.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_tunnel.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_tunnel.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_type_manager.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/logger.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_vendor/version.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_watcher.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/_workspace.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/app.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/app.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/billing.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/billing.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/README.md +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/builder/base-images.json +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/call_graph.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/_download.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/_help.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/_traceback.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/app.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/billing.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/changelog.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/cluster.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/config.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/container.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/curl.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/dashboard.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/dict.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/endpoint.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/entry_point.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/environment.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/image.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/import_refs.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/launch.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/logo.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/profile.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/queues.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/run.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/secret.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/selector.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/shell.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/skills.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/token.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/utils.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/volume.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cli/workspace.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/client.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cls.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/cls.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/config.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/container_process.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/container_process.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/dict.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/dict.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/environments.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/environments.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/exception.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/experimental/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/experimental/flash.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/experimental/ipython.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/file_io.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/file_io.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/functions.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/image.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/image.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/io_streams.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/io_streams.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/mount.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/mount.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/network_file_system.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/network_file_system.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/object.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/object.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/output.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/parallel_map.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/parallel_map.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/partial_function.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/partial_function.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/proxy.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/proxy.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/py.typed +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/queue.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/queue.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/retries.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/runner.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/runner.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/running_app.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/sandbox_fs.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/schedule.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/scheduler_placement.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/secret.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/secret.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/server.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/server.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/serving.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/serving.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/snapshot.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/snapshot.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/stream_type.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/token_flow.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/token_flow.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/volume.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/volume.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/workspace.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal/workspace.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/__init__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/py.typed +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/modal_version/__main__.py +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/pyproject.toml +0 -0
- {modal-1.5.2.dev3 → modal-1.5.2.dev5}/setup.cfg +0 -0
|
@@ -264,7 +264,7 @@ class IOContext:
|
|
|
264
264
|
if not inspect.isasyncgen(expected_async_gen):
|
|
265
265
|
raise InvalidError(f"Async generator function returned value of type {type(expected_async_gen)}")
|
|
266
266
|
|
|
267
|
-
async with aclosing(expected_async_gen) as gen:
|
|
267
|
+
async with aclosing(cast(AsyncGenerator[Any, None], expected_async_gen)) as gen:
|
|
268
268
|
async for result in gen:
|
|
269
269
|
yield result
|
|
270
270
|
logger.debug(f"Finished generator input {self.input_ids}")
|
|
@@ -138,6 +138,13 @@ async def _upload_to_s3_url(
|
|
|
138
138
|
text = await resp.text()
|
|
139
139
|
except Exception:
|
|
140
140
|
text = "<no body>"
|
|
141
|
+
|
|
142
|
+
if "The Content-MD5 you specified did not match what we received." in text:
|
|
143
|
+
raise ExecutionError(
|
|
144
|
+
"Hash mismatch during upload. This may be caused by files changing while an upload is in "
|
|
145
|
+
"progress. Please try again."
|
|
146
|
+
)
|
|
147
|
+
|
|
141
148
|
raise ExecutionError(f"Put to url {upload_url} failed with status {resp.status}: {text}")
|
|
142
149
|
|
|
143
150
|
# client side ETag checksum verification
|
|
@@ -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.dev5",
|
|
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.dev5",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -490,7 +490,7 @@ class Function(
|
|
|
490
490
|
|
|
491
491
|
_call_generator: ___call_generator_spec
|
|
492
492
|
|
|
493
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
493
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
494
494
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
495
495
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
496
496
|
|
|
@@ -515,7 +515,7 @@ class Function(
|
|
|
515
515
|
"""
|
|
516
516
|
...
|
|
517
517
|
|
|
518
|
-
remote: __remote_spec[modal._functions.
|
|
518
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
519
519
|
|
|
520
520
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
521
521
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -565,7 +565,7 @@ class Function(
|
|
|
565
565
|
"""
|
|
566
566
|
...
|
|
567
567
|
|
|
568
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
568
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
569
569
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
570
570
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
571
571
|
|
|
@@ -598,7 +598,7 @@ class Function(
|
|
|
598
598
|
"""
|
|
599
599
|
...
|
|
600
600
|
|
|
601
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
601
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
602
602
|
|
|
603
603
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
604
604
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -606,7 +606,7 @@ class Function(
|
|
|
606
606
|
|
|
607
607
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
608
608
|
|
|
609
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
609
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
610
610
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
611
611
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
612
612
|
|
|
@@ -639,7 +639,7 @@ class Function(
|
|
|
639
639
|
"""
|
|
640
640
|
...
|
|
641
641
|
|
|
642
|
-
spawn: __spawn_spec[modal._functions.
|
|
642
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
643
643
|
|
|
644
644
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
645
645
|
"""Return the inner Python object wrapped by this Modal Function.
|
|
@@ -2056,7 +2056,6 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2056
2056
|
Returns:
|
|
2057
2057
|
A `SandboxFilesystem` helper bound to this sandbox.
|
|
2058
2058
|
"""
|
|
2059
|
-
self._ensure_v1("filesystem")
|
|
2060
2059
|
self._ensure_attached()
|
|
2061
2060
|
if self._filesystem is None:
|
|
2062
2061
|
self._filesystem = _SandboxFilesystem(self)
|
|
@@ -2283,6 +2282,62 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2283
2282
|
# Fetch the next batch starting from the end of the current one.
|
|
2284
2283
|
before_timestamp = resp.sandboxes[-1].created_at
|
|
2285
2284
|
|
|
2285
|
+
@staticmethod
|
|
2286
|
+
async def _experimental_list(
|
|
2287
|
+
*, app_id: str | None = None, client: _Client | None = None
|
|
2288
|
+
) -> AsyncGenerator["_Sandbox", None]:
|
|
2289
|
+
"""List v2 Sandboxes in an App.
|
|
2290
|
+
|
|
2291
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2292
|
+
Filtering based on tags is not yet supported.
|
|
2293
|
+
|
|
2294
|
+
Args:
|
|
2295
|
+
app_id: The App to list Sandboxes under.
|
|
2296
|
+
client: Optional client to use for the session.
|
|
2297
|
+
|
|
2298
|
+
Yields:
|
|
2299
|
+
`Sandbox` objects that are currently running in the App.
|
|
2300
|
+
"""
|
|
2301
|
+
if not app_id:
|
|
2302
|
+
raise InvalidError(
|
|
2303
|
+
"Sandbox._experimental_list requires an `app_id`:\n\n"
|
|
2304
|
+
'app = modal.App.lookup("my-app")\n'
|
|
2305
|
+
"Sandbox._experimental_list(app_id=app.app_id)"
|
|
2306
|
+
)
|
|
2307
|
+
|
|
2308
|
+
before_timestamp = None
|
|
2309
|
+
if client is None:
|
|
2310
|
+
client = await _Client.from_env()
|
|
2311
|
+
|
|
2312
|
+
assert client._auth_token_manager
|
|
2313
|
+
while True:
|
|
2314
|
+
req = api_pb2.SandboxListRequest(
|
|
2315
|
+
app_id=app_id,
|
|
2316
|
+
before_timestamp=before_timestamp,
|
|
2317
|
+
include_finished=False,
|
|
2318
|
+
)
|
|
2319
|
+
|
|
2320
|
+
# Fetches a batch of sandboxes. SandboxListV2 authenticates via the
|
|
2321
|
+
# auth-token metadata, like the other V2 sandbox RPCs.
|
|
2322
|
+
auth_token = await client._auth_token_manager.get_token()
|
|
2323
|
+
resp = await client.stub.SandboxListV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2324
|
+
|
|
2325
|
+
if not resp.sandboxes:
|
|
2326
|
+
return
|
|
2327
|
+
|
|
2328
|
+
for sandbox_info in resp.sandboxes:
|
|
2329
|
+
sandbox_info: api_pb2.SandboxInfo
|
|
2330
|
+
obj = _Sandbox._new_hydrated(sandbox_info.id, client, None)
|
|
2331
|
+
# SandboxListV2 only returns V2 sandboxes; mark them as such so
|
|
2332
|
+
# operations like wait/terminate/exec use the V2 RPCs and stdio.
|
|
2333
|
+
obj._is_v2 = True
|
|
2334
|
+
obj._hydrate_metadata_v2()
|
|
2335
|
+
obj._result = sandbox_info.task_info.result
|
|
2336
|
+
yield obj
|
|
2337
|
+
|
|
2338
|
+
# Fetch the next batch starting from the end of the current one.
|
|
2339
|
+
before_timestamp = resp.sandboxes[-1].created_at
|
|
2340
|
+
|
|
2286
2341
|
|
|
2287
2342
|
class _SidecarContainer:
|
|
2288
2343
|
"""Handle to an additional container running in a Sandbox."""
|
|
@@ -942,6 +942,24 @@ class _Sandbox(modal._object._Object):
|
|
|
942
942
|
"""
|
|
943
943
|
...
|
|
944
944
|
|
|
945
|
+
@staticmethod
|
|
946
|
+
def _experimental_list(
|
|
947
|
+
*, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client._Client] = None
|
|
948
|
+
) -> collections.abc.AsyncGenerator[_Sandbox, None]:
|
|
949
|
+
"""List v2 Sandboxes in an App.
|
|
950
|
+
|
|
951
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
952
|
+
Filtering based on tags is not yet supported.
|
|
953
|
+
|
|
954
|
+
Args:
|
|
955
|
+
app_id: The App to list Sandboxes under.
|
|
956
|
+
client: Optional client to use for the session.
|
|
957
|
+
|
|
958
|
+
Yields:
|
|
959
|
+
`Sandbox` objects that are currently running in the App.
|
|
960
|
+
"""
|
|
961
|
+
...
|
|
962
|
+
|
|
945
963
|
class _SidecarContainer:
|
|
946
964
|
"""Handle to an additional container running in a Sandbox."""
|
|
947
965
|
|
|
@@ -2790,6 +2808,43 @@ class Sandbox(modal.object.Object):
|
|
|
2790
2808
|
|
|
2791
2809
|
list: typing.ClassVar[__list_spec]
|
|
2792
2810
|
|
|
2811
|
+
class ___experimental_list_spec(typing_extensions.Protocol):
|
|
2812
|
+
def __call__(
|
|
2813
|
+
self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
|
|
2814
|
+
) -> typing.Generator[Sandbox, None, None]:
|
|
2815
|
+
"""List v2 Sandboxes in an App.
|
|
2816
|
+
|
|
2817
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2818
|
+
Filtering based on tags is not yet supported.
|
|
2819
|
+
|
|
2820
|
+
Args:
|
|
2821
|
+
app_id: The App to list Sandboxes under.
|
|
2822
|
+
client: Optional client to use for the session.
|
|
2823
|
+
|
|
2824
|
+
Yields:
|
|
2825
|
+
`Sandbox` objects that are currently running in the App.
|
|
2826
|
+
"""
|
|
2827
|
+
...
|
|
2828
|
+
|
|
2829
|
+
def aio(
|
|
2830
|
+
self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
|
|
2831
|
+
) -> collections.abc.AsyncGenerator[Sandbox, None]:
|
|
2832
|
+
"""List v2 Sandboxes in an App.
|
|
2833
|
+
|
|
2834
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2835
|
+
Filtering based on tags is not yet supported.
|
|
2836
|
+
|
|
2837
|
+
Args:
|
|
2838
|
+
app_id: The App to list Sandboxes under.
|
|
2839
|
+
client: Optional client to use for the session.
|
|
2840
|
+
|
|
2841
|
+
Yields:
|
|
2842
|
+
`Sandbox` objects that are currently running in the App.
|
|
2843
|
+
"""
|
|
2844
|
+
...
|
|
2845
|
+
|
|
2846
|
+
_experimental_list: typing.ClassVar[___experimental_list_spec]
|
|
2847
|
+
|
|
2793
2848
|
_default_image: modal._image._Image
|
|
2794
2849
|
|
|
2795
2850
|
_MAIN_CONTAINER_NAME: str
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|