modal 1.5.6.dev4__tar.gz → 1.5.6.dev6__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.6.dev4 → modal-1.5.6.dev6}/PKG-INFO +1 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/grpc_utils.py +30 -7
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/task_command_router_client.py +1 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/client.pyi +2 -2
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/mount.py +6 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox.py +1 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_version/__init__.py +1 -1
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/LICENSE +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/README.md +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/__main__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_billing.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_clustered_functions.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_environments.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_function_variants.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_functions.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_grpc_client.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_image.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_ipython.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_load_context.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_location.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs_manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs_manager.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_object.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/pty.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/rich.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/status.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_partial_function.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_resolver.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_resources.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_serialization.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_server.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_supports_logs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_traceback.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_tunnel.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_tunnel.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_type_manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/display_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/logger.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/version.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_watcher.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_workspace.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/app.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/app.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/billing.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/billing.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/README.md +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/base-images.json +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/call_graph.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_download.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_help.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_traceback.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/app.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/billing.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/changelog.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/cluster.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/config.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/container.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/curl.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/dashboard.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/dict.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/endpoint.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/entry_point.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/environment.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/image.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/import_refs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/launch.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/logo.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/profile.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/queues.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/run.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/secret.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/selector.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/shell.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/skills.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/token.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/utils.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/volume.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/workspace.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/client.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cls.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cls.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/config.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/container_process.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/container_process.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/dict.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/dict.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/environments.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/environments.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/exception.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/flash.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/ipython.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_io.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_io.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/functions.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/functions.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/image.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/image.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/io_streams.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/io_streams.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/mount.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/network_file_system.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/network_file_system.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/object.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/object.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/output.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/parallel_map.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/parallel_map.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/partial_function.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/partial_function.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/proxy.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/proxy.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/py.typed +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/queue.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/queue.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/retries.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/runner.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/runner.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/running_app.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox_fs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/schedule.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/scheduler_placement.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/secret.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/secret.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/server.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/server.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/serving.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/serving.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/snapshot.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/snapshot.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/stream_type.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/token_flow.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/token_flow.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/types.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/volume.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/volume.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/workspace.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/workspace.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/reference_intro.md +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/__init__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/py.typed +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_version/__main__.py +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/pyproject.toml +0 -0
- {modal-1.5.6.dev4 → modal-1.5.6.dev6}/setup.cfg +0 -0
|
@@ -199,16 +199,23 @@ class ConnectionManager:
|
|
|
199
199
|
self._client = client
|
|
200
200
|
# This metadata is injected into all requests on all channels created by this manager.
|
|
201
201
|
self._metadata = metadata
|
|
202
|
-
self._channels: dict[str, grpclib.client.Channel] = {}
|
|
202
|
+
self._channels: dict[str, asyncio.Future[grpclib.client.Channel]] = {}
|
|
203
203
|
|
|
204
204
|
async def get_or_create_channel(self, server_url: str) -> grpclib.client.Channel:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
205
|
+
fut = self._channels.get(server_url)
|
|
206
|
+
if fut is None or (fut.done() and (fut.cancelled() or fut.exception() is not None)):
|
|
207
|
+
# Cache the attempt rather than the channel, so callers racing to connect share one.
|
|
208
|
+
fut = asyncio.ensure_future(create_channel_with_fallbacks(server_url, self._metadata))
|
|
209
|
+
self._channels[server_url] = fut
|
|
210
|
+
# Shielded so one caller giving up doesn't cancel the connection for the others.
|
|
211
|
+
return await asyncio.shield(fut)
|
|
208
212
|
|
|
209
213
|
def close(self):
|
|
210
|
-
for
|
|
211
|
-
|
|
214
|
+
for fut in self._channels.values():
|
|
215
|
+
if fut.done() and not fut.cancelled() and fut.exception() is None:
|
|
216
|
+
fut.result().close()
|
|
217
|
+
else:
|
|
218
|
+
fut.cancel()
|
|
212
219
|
self._channels.clear()
|
|
213
220
|
|
|
214
221
|
|
|
@@ -265,18 +272,34 @@ class CustomProtoStatusDetailsCodec(StatusDetailsCodecBase):
|
|
|
265
272
|
custom_detail_codec = CustomProtoStatusDetailsCodec()
|
|
266
273
|
|
|
267
274
|
|
|
268
|
-
def create_channel_config() -> grpclib.config.Configuration:
|
|
275
|
+
def create_channel_config(*, sustained_keepalive: bool = False) -> grpclib.config.Configuration:
|
|
269
276
|
"""Shared grpclib channel settings for Modal client connections.
|
|
270
277
|
|
|
271
278
|
HTTP/2 keepalive probes keep idle transports warm through stateful
|
|
272
279
|
middleboxes and surface dead connections before retries reuse them.
|
|
280
|
+
|
|
281
|
+
`sustained_keepalive` clears the two grpclib defaults such that a probe
|
|
282
|
+
actually goes out every `_keepalive_time`, for as long as the connection is
|
|
283
|
+
open.
|
|
273
284
|
"""
|
|
285
|
+
ping_throttle_overrides: dict[str, Any] = {}
|
|
286
|
+
if sustained_keepalive:
|
|
287
|
+
ping_throttle_overrides = {
|
|
288
|
+
# Default 2: probing stops after two probes with no request sent in
|
|
289
|
+
# between. Requests reset the count, acks don't. 0 = no cap.
|
|
290
|
+
"_http2_max_pings_without_data": 0,
|
|
291
|
+
# Default 300s floor between probes, applied regardless of data
|
|
292
|
+
# despite the name, so it has to stay under `_keepalive_time`.
|
|
293
|
+
"_http2_min_sent_ping_interval_without_data": GRPC_KEEPALIVE_TIME_SECS / 2,
|
|
294
|
+
}
|
|
295
|
+
|
|
274
296
|
return grpclib.config.Configuration(
|
|
275
297
|
_keepalive_time=GRPC_KEEPALIVE_TIME_SECS,
|
|
276
298
|
_keepalive_timeout=GRPC_KEEPALIVE_TIMEOUT_SECS,
|
|
277
299
|
_keepalive_permit_without_calls=True,
|
|
278
300
|
http2_connection_window_size=GRPC_WINDOW_SIZE,
|
|
279
301
|
http2_stream_window_size=GRPC_WINDOW_SIZE,
|
|
302
|
+
**ping_throttle_overrides,
|
|
280
303
|
)
|
|
281
304
|
|
|
282
305
|
|
|
@@ -251,7 +251,7 @@ class TaskCommandRouterClient:
|
|
|
251
251
|
host,
|
|
252
252
|
port,
|
|
253
253
|
ssl=ssl_context,
|
|
254
|
-
config=create_channel_config(),
|
|
254
|
+
config=create_channel_config(sustained_keepalive=True),
|
|
255
255
|
closed_error_message="Unable to perform operation on a detached sandbox",
|
|
256
256
|
)
|
|
257
257
|
|
|
@@ -77,7 +77,7 @@ class _Client:
|
|
|
77
77
|
server_url: str,
|
|
78
78
|
client_type: int,
|
|
79
79
|
credentials: typing.Optional[tuple[str, str]],
|
|
80
|
-
version: str = "1.5.6.
|
|
80
|
+
version: str = "1.5.6.dev6",
|
|
81
81
|
*,
|
|
82
82
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
83
83
|
):
|
|
@@ -277,7 +277,7 @@ class Client:
|
|
|
277
277
|
server_url: str,
|
|
278
278
|
client_type: int,
|
|
279
279
|
credentials: typing.Optional[tuple[str, str]],
|
|
280
|
-
version: str = "1.5.6.
|
|
280
|
+
version: str = "1.5.6.dev6",
|
|
281
281
|
*,
|
|
282
282
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
283
283
|
):
|
|
@@ -851,7 +851,7 @@ async def _create_single_client_dependency_mount(
|
|
|
851
851
|
print(f"📦 Building {mount_name}.") # noqa: T201
|
|
852
852
|
requirements = os.path.join(os.path.dirname(__file__), f"builder/{builder_version}.txt")
|
|
853
853
|
cmd = [
|
|
854
|
-
"uv",
|
|
854
|
+
os.environ.get("MODAL_UV_PATH", "uv"),
|
|
855
855
|
"pip",
|
|
856
856
|
"install",
|
|
857
857
|
"--strict",
|
|
@@ -867,6 +867,11 @@ async def _create_single_client_dependency_mount(
|
|
|
867
867
|
"--python",
|
|
868
868
|
python_version,
|
|
869
869
|
]
|
|
870
|
+
# A directory holding wheels for every pin in the requirements file, for
|
|
871
|
+
# building mounts where no package index is reachable.
|
|
872
|
+
find_links = os.environ.get("MODAL_BUILDER_WHEEL_DIR")
|
|
873
|
+
if find_links:
|
|
874
|
+
cmd += ["--no-index", "--find-links", find_links]
|
|
870
875
|
# Retry uv pip install on transient failures (e.g. network blips,
|
|
871
876
|
# resource contention). uv exits with non-zero on recoverable errors
|
|
872
877
|
# like rate limits or connection resets.
|
|
@@ -2279,7 +2279,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2279
2279
|
command_router_client = await self._get_command_router_client(task_id)
|
|
2280
2280
|
snap_v2_resp = await command_router_client.snapshot_memory(
|
|
2281
2281
|
sr_pb2.TaskSnapshotMemoryRequest(task_id=task_id, idempotency_key=str(uuid.uuid4())),
|
|
2282
|
-
timeout=
|
|
2282
|
+
timeout=165.0,
|
|
2283
2283
|
)
|
|
2284
2284
|
snapshot_id = snap_v2_resp.snapshot_id
|
|
2285
2285
|
else:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|