modal 1.6.4.dev7__tar.gz → 1.6.4.dev9__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.6.4.dev7 → modal-1.6.4.dev9}/PKG-INFO +1 -1
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_image.py +2 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/image.py +123 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/client.pyi +2 -2
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/functions.pyi +6 -6
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/image.pyi +1 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_task_command_router_client.py +33 -5
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/api_grpc.py +32 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/api_pb2.py +575 -531
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/api_pb2.pyi +95 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/api_pb2_grpc.py +67 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/api_pb2_grpc.pyi +22 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/modal_api_grpc.py +2 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_version/__init__.py +1 -1
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/pyproject.toml +1 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/LICENSE +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/README.md +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/__main__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_billing.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_cluster.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_cluster.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_container_entrypoint.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_environments.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_function_variants.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_functions.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_grpc_client.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_ipython.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_load_context.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_location.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_logs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_logs_manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_logs_manager.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_metrics.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_metrics.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_object.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_outbound_policy.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_outbound_policy.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_output/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_output/manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_output/pty.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_output/rich.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_output/status.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_partial_function.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_resolver.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_resources.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/asgi.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/execution_context.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/telemetry.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_serialization.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_server.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_server.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_supports_logs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_traceback.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_tunnel.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_tunnel.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_type_manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/app_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/async_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/blob_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/browser_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/curl_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/deprecation.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/display_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/docker_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/function_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/git_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/hash_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/http_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/idle_countdown.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/logger.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/mount_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/name_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/oauth.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/package_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/proxy_support.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/shell_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_utils/time_utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_vendor/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_vendor/tblib.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_vendor/version.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_watcher.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/_workspace.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/app.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/app.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/billing.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/billing.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2023.12.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2024.04.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2024.10.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2025.06.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/2026.10.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/README.md +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/builder/base-images.json +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/call_graph.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/_download.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/_help.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/_logs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/_stats.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/_traceback.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/app.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/billing.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/changelog.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/config.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/container.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/curl.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/dashboard.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/dict.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/endpoint.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/entry_point.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/environment.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/function.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/import_refs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/logo.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/network_file_system.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/profile.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/queues.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/run.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/secret.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/selector.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/server.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/shell.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/skills.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/token.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/utils.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/volume.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cli/workspace.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/client.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cls.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cls.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cluster.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/cluster.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/config.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/container_process.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/container_process.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/dict.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/dict.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/environments.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/environments.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/exception.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/_flash_container_entry.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/flash.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/flash.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/flash_server.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/flash_server.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/experimental/ipython.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/file_pattern_matcher.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/functions.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/image.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/io_streams.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/io_streams.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/mount.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/mount.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/network_file_system.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/network_file_system.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/object.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/object.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/output.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/parallel_map.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/parallel_map.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/partial_function.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/partial_function.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/proxy.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/proxy.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/py.typed +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/queue.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/queue.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/retries.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/runner.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/runner.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/running_app.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_common.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_filesystem.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_impl_persistent.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_impl_v1.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_impl_v2.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_sandbox.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_sidecar.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/_snapshot.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/sandbox.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/sandbox/sandbox.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/schedule.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/scheduler_placement.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/secret.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/secret.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/server.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/server.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/serving.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/serving.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/stream_type.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/token_flow.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/token_flow.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/types.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/volume.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/volume.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/workspace.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal/workspace.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/requires.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal.egg-info/top_level.txt +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/mdmd/types.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_docs/reference_intro.md +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/__init__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/py.typed +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/modal_version/__main__.py +0 -0
- {modal-1.6.4.dev7 → modal-1.6.4.dev9}/setup.cfg +0 -0
|
@@ -584,6 +584,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
584
584
|
] # added as mounts on any container referencing the Image, see `def _mount_layers`
|
|
585
585
|
_added_python_source_set: frozenset[str] # used to warn about missing mounts during auto-mount deprecation
|
|
586
586
|
_metadata: api_pb2.ImageMetadata | None = None # set on hydration, private for now
|
|
587
|
+
_cache_hit: bool | None = None # set when built, True if an existing build was reused
|
|
587
588
|
_is_empty: bool
|
|
588
589
|
_build_steps: list[api_pb2.ImageBuildStep] | None = None
|
|
589
590
|
# A failed image ID is only queryable through the client that performed the build.
|
|
@@ -832,6 +833,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
832
833
|
result: api_pb2.GenericResult
|
|
833
834
|
metadata: api_pb2.ImageMetadata | None = None
|
|
834
835
|
|
|
836
|
+
self._cache_hit = bool(resp.result.status)
|
|
835
837
|
if resp.result.status:
|
|
836
838
|
# image already built
|
|
837
839
|
result = resp.result
|
|
@@ -42,6 +42,26 @@ def _print_result_summary(count: int) -> None:
|
|
|
42
42
|
OutputManager.get().print(f"Showing {count} {result_label}")
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
async def _build_and_publish(image: _Image, image_ref: str, app: _App, env: str, name: Optional[str]) -> None:
|
|
46
|
+
built_image = await image.build(app)
|
|
47
|
+
|
|
48
|
+
output_mgr = OutputManager.get()
|
|
49
|
+
if built_image._cache_hit:
|
|
50
|
+
message = f"Used a cached pull of [bold]{image_ref}[/bold] as [bold]{built_image.object_id}[/bold]"
|
|
51
|
+
# A digest reference can't change in the registry, so pulling it again would be a no-op
|
|
52
|
+
if "@" not in image_ref:
|
|
53
|
+
message += " [dim](Pass --force-build to pull it from the registry again.)[/dim]"
|
|
54
|
+
output_mgr.step_completed(message)
|
|
55
|
+
else:
|
|
56
|
+
output_mgr.step_completed(f"Pulled [bold]{image_ref}[/bold] as [bold]{built_image.object_id}[/bold]")
|
|
57
|
+
if name:
|
|
58
|
+
upgraded_image_name = _upgrade_image_name(name, fallback_environment_name=env)
|
|
59
|
+
await built_image.publish(upgraded_image_name)
|
|
60
|
+
output_mgr.step_completed(f"Image published as [bold magenta]{upgraded_image_name}[/bold magenta]! 🎉")
|
|
61
|
+
output_mgr.print("\nUse it with:\n")
|
|
62
|
+
output_mgr.print(Syntax(f'modal.Image.from_name("{upgraded_image_name}")', "python"))
|
|
63
|
+
|
|
64
|
+
|
|
45
65
|
async def _registry_secret(
|
|
46
66
|
secret_name: Optional[str], secret_vars: Optional[str], env: str
|
|
47
67
|
) -> tuple[Optional[_Secret], set[str]]:
|
|
@@ -56,6 +76,15 @@ async def _registry_secret(
|
|
|
56
76
|
return _Secret.from_local_environ(keys), set(keys)
|
|
57
77
|
|
|
58
78
|
|
|
79
|
+
def _check_registry_host(image_ref: str) -> None:
|
|
80
|
+
first, sep, _ = image_ref.partition("/")
|
|
81
|
+
# A leading path component is a registry host only if it looks like one; otherwise it's a Docker Hub name
|
|
82
|
+
if not sep or ("." not in first and ":" not in first and first != "localhost"):
|
|
83
|
+
raise click.UsageError(
|
|
84
|
+
f"IMAGE_REF must start with the registry host, e.g. docker.io/{image_ref} for a Docker Hub image."
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
59
88
|
@image_cli.command("build", no_args_is_help=True)
|
|
60
89
|
@click.argument("context_dir", metavar="CONTEXT_DIR")
|
|
61
90
|
@click.option(
|
|
@@ -154,6 +183,100 @@ async def build(
|
|
|
154
183
|
output_mgr.print(Syntax(f'modal.Image.from_name("{tag}")', "python"))
|
|
155
184
|
|
|
156
185
|
|
|
186
|
+
@image_cli.command("pull", no_args_is_help=True)
|
|
187
|
+
@click.argument("image_ref")
|
|
188
|
+
@click.option(
|
|
189
|
+
"--name",
|
|
190
|
+
"name",
|
|
191
|
+
metavar="[ENV/]NAME[:TAG]",
|
|
192
|
+
help="Publish the pulled Image under this name. An ENV/ prefix publishes it to that Environment.",
|
|
193
|
+
)
|
|
194
|
+
@click.option(
|
|
195
|
+
"--registry-secret",
|
|
196
|
+
"registry_secret_name",
|
|
197
|
+
default=None,
|
|
198
|
+
help="Name of a modal.Secret holding registry credentials.",
|
|
199
|
+
)
|
|
200
|
+
@click.option(
|
|
201
|
+
"--registry-secret-from-env",
|
|
202
|
+
"registry_secret_vars",
|
|
203
|
+
default=None,
|
|
204
|
+
metavar="VAR[,VAR...]",
|
|
205
|
+
help=(
|
|
206
|
+
"Comma-separated local environment variable names holding registry credentials. "
|
|
207
|
+
"Cannot be combined with --registry-secret."
|
|
208
|
+
),
|
|
209
|
+
)
|
|
210
|
+
@click.option(
|
|
211
|
+
"--force-build",
|
|
212
|
+
is_flag=True,
|
|
213
|
+
help="Pull the image from the registry again, replacing a cached Image.",
|
|
214
|
+
)
|
|
215
|
+
@env_option
|
|
216
|
+
@synchronizer.create_blocking
|
|
217
|
+
async def pull(
|
|
218
|
+
image_ref: str,
|
|
219
|
+
*,
|
|
220
|
+
name: Optional[str] = None,
|
|
221
|
+
registry_secret_name: Optional[str] = None,
|
|
222
|
+
registry_secret_vars: Optional[str] = None,
|
|
223
|
+
force_build: bool = False,
|
|
224
|
+
env: Optional[str] = None,
|
|
225
|
+
) -> None:
|
|
226
|
+
"""Pull an Image from a container registry into Modal.
|
|
227
|
+
|
|
228
|
+
The `image_ref` is a registry image name (and optional tag), as passed to `modal.Image.from_registry`.
|
|
229
|
+
It must start with the registry host, e.g. `docker.io/node:20` for a Docker Hub image.
|
|
230
|
+
If `--name` is provided, the Modal Image will also be published under that name.
|
|
231
|
+
Use `ENV/NAME` to publish to another Environment; `--env` still selects the Environment
|
|
232
|
+
used for the pull and for looking up `--registry-secret`.
|
|
233
|
+
|
|
234
|
+
Examples:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
modal image pull docker.io/node:20
|
|
238
|
+
modal image pull nvcr.io/nvidia/pytorch:25.01-py3 --name pytorch:25
|
|
239
|
+
modal image pull docker.io/node:20 --name prod/node:20
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Pass `--force-build` to pull a tag again after it changes in the registry, e.g. `latest`.
|
|
243
|
+
|
|
244
|
+
Private registries need credentials from a `modal.Secret`, either one that already exists
|
|
245
|
+
(`--registry-secret`) or one assembled from local environment variables (`--registry-secret-from-env`).
|
|
246
|
+
The kind of authentication follows from the keys in the credentials:
|
|
247
|
+
|
|
248
|
+
- AWS: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` (optionally `AWS_SESSION_TOKEN`),
|
|
249
|
+
or `AWS_ROLE_ARN` and `AWS_REGION` to assume a role with OIDC
|
|
250
|
+
- GCP: `SERVICE_ACCOUNT_JSON`, holding the service account key's JSON
|
|
251
|
+
- Username and password: `REGISTRY_USERNAME` and `REGISTRY_PASSWORD`
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Authenticate with a named Secret
|
|
255
|
+
modal image pull ghcr.io/my-org/my-image --registry-secret my-registry-secret
|
|
256
|
+
|
|
257
|
+
# Authenticate with credentials in environment variables
|
|
258
|
+
modal image pull $AWS_ECR_URL/my-image \\
|
|
259
|
+
--registry-secret-from-env AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_REGION
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
"""
|
|
263
|
+
_check_registry_host(image_ref)
|
|
264
|
+
env = ensure_env(env)
|
|
265
|
+
secret, keys = await _registry_secret(registry_secret_name, registry_secret_vars, env)
|
|
266
|
+
if secret is not None:
|
|
267
|
+
# Fail before creating the app; from_registry runs the same check during the build
|
|
268
|
+
try:
|
|
269
|
+
_infer_registry_auth_type(keys)
|
|
270
|
+
except InvalidError as exc:
|
|
271
|
+
raise click.UsageError(str(exc)) from exc
|
|
272
|
+
image = _Image.from_registry(image_ref, secret, force_build=force_build)
|
|
273
|
+
|
|
274
|
+
app = _App("modal-image-pull")
|
|
275
|
+
async with _run_app(app, environment_name=env, stream_output=False):
|
|
276
|
+
OutputManager.get().print(f"Pulling [bold]{image_ref}[/bold]")
|
|
277
|
+
await _build_and_publish(image, image_ref, app, env, name)
|
|
278
|
+
|
|
279
|
+
|
|
157
280
|
@image_cli.command("logs", no_args_is_help=True)
|
|
158
281
|
@click.argument("image_id")
|
|
159
282
|
@click.option(
|
|
@@ -87,7 +87,7 @@ class _Client:
|
|
|
87
87
|
server_url: str,
|
|
88
88
|
client_type: int,
|
|
89
89
|
credentials: typing.Optional[tuple[str, str]],
|
|
90
|
-
version: str = "1.6.4.
|
|
90
|
+
version: str = "1.6.4.dev9",
|
|
91
91
|
*,
|
|
92
92
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
93
93
|
):
|
|
@@ -304,7 +304,7 @@ class Client:
|
|
|
304
304
|
server_url: str,
|
|
305
305
|
client_type: int,
|
|
306
306
|
credentials: typing.Optional[tuple[str, str]],
|
|
307
|
-
version: str = "1.6.4.
|
|
307
|
+
version: str = "1.6.4.dev9",
|
|
308
308
|
*,
|
|
309
309
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
310
310
|
):
|
|
@@ -619,7 +619,7 @@ class Function(
|
|
|
619
619
|
|
|
620
620
|
_call_generator: ___call_generator_spec
|
|
621
621
|
|
|
622
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
622
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
623
623
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
624
624
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
625
625
|
|
|
@@ -644,7 +644,7 @@ class Function(
|
|
|
644
644
|
"""
|
|
645
645
|
...
|
|
646
646
|
|
|
647
|
-
remote: __remote_spec[modal._functions.
|
|
647
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
|
|
648
648
|
|
|
649
649
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
650
650
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -694,7 +694,7 @@ class Function(
|
|
|
694
694
|
"""
|
|
695
695
|
...
|
|
696
696
|
|
|
697
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
697
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
698
698
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
699
699
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
700
700
|
|
|
@@ -727,7 +727,7 @@ class Function(
|
|
|
727
727
|
"""
|
|
728
728
|
...
|
|
729
729
|
|
|
730
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
730
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
731
731
|
|
|
732
732
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
733
733
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -735,7 +735,7 @@ class Function(
|
|
|
735
735
|
|
|
736
736
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
737
737
|
|
|
738
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
738
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
739
739
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
740
740
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
741
741
|
|
|
@@ -768,7 +768,7 @@ class Function(
|
|
|
768
768
|
"""
|
|
769
769
|
...
|
|
770
770
|
|
|
771
|
-
spawn: __spawn_spec[modal._functions.
|
|
771
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
772
772
|
|
|
773
773
|
@property
|
|
774
774
|
def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
|
|
@@ -32,6 +32,7 @@ class Image(modal.object.Object):
|
|
|
32
32
|
_deferred_mounts: collections.abc.Sequence[modal.mount.Mount]
|
|
33
33
|
_added_python_source_set: frozenset[str]
|
|
34
34
|
_metadata: typing.Optional[modal_proto.api_pb2.ImageMetadata]
|
|
35
|
+
_cache_hit: typing.Optional[bool]
|
|
35
36
|
_is_empty: bool
|
|
36
37
|
_build_steps: typing.Optional[list[modal_proto.api_pb2.ImageBuildStep]]
|
|
37
38
|
_failed_build_attempt: typing.Optional[modal._image._FailedBuildAttempt]
|
|
@@ -55,6 +55,36 @@ _STREAMING_STDIN_RESUMABLE_EXCEPTIONS = (
|
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
_shared_verifying_ssl_context_instance: ssl.SSLContext | None = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _shared_verifying_ssl_context() -> ssl.SSLContext:
|
|
62
|
+
"""Process-wide TLS context that verifies certificates against the system CAs.
|
|
63
|
+
|
|
64
|
+
Creating a context parses the system CA bundle while holding the GIL, so one
|
|
65
|
+
per channel blocks the event loop when many Sandboxes connect at once. Every
|
|
66
|
+
Sandbox's command router channel shares this context, so it must never be
|
|
67
|
+
modified; a change would apply to every connection in the process.
|
|
68
|
+
"""
|
|
69
|
+
global _shared_verifying_ssl_context_instance
|
|
70
|
+
if _shared_verifying_ssl_context_instance is None:
|
|
71
|
+
_shared_verifying_ssl_context_instance = ssl.create_default_context()
|
|
72
|
+
return _shared_verifying_ssl_context_instance
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _unverified_ssl_context() -> ssl.SSLContext:
|
|
76
|
+
"""New TLS context that skips certificate and hostname checks.
|
|
77
|
+
|
|
78
|
+
Only for local e2e servers on localhost, which use self-signed certificates.
|
|
79
|
+
Built per call so that turning verification off cannot reach the shared
|
|
80
|
+
verifying context.
|
|
81
|
+
"""
|
|
82
|
+
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
|
83
|
+
ssl_context.check_hostname = False
|
|
84
|
+
ssl_context.verify_mode = ssl.CERT_NONE
|
|
85
|
+
return ssl_context
|
|
86
|
+
|
|
87
|
+
|
|
58
88
|
@retry(n_attempts=34, base_delay=1, max_delay=10, attempt_timeout=10, total_timeout=310)
|
|
59
89
|
async def _connect_channel(channel: grpclib.client.Channel):
|
|
60
90
|
"""Connect to the command router channel.
|
|
@@ -320,13 +350,11 @@ class TaskCommandRouterClient:
|
|
|
320
350
|
raise ValueError(f"Task router URL must be https, got: {url}")
|
|
321
351
|
ssl_context = None
|
|
322
352
|
elif o.scheme == "https":
|
|
323
|
-
ssl_context = ssl.create_default_context()
|
|
324
353
|
if is_localhost_client:
|
|
325
|
-
# Allow insecure TLS when the Modal server client points to localhost
|
|
326
|
-
# This is typically triggered from local e2e testing
|
|
327
354
|
logger.warning("Using insecure TLS for task command router because server client points to localhost")
|
|
328
|
-
ssl_context
|
|
329
|
-
|
|
355
|
+
ssl_context = _unverified_ssl_context()
|
|
356
|
+
else:
|
|
357
|
+
ssl_context = _shared_verifying_ssl_context()
|
|
330
358
|
else:
|
|
331
359
|
raise ValueError(f"Task router URL must be https, got: {url}")
|
|
332
360
|
|
|
@@ -719,6 +719,14 @@ class ModalClientBase(abc.ABC):
|
|
|
719
719
|
async def SandboxGetResourceUsage(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetResourceUsageRequest, modal_proto.api_pb2.SandboxGetResourceUsageResponse]') -> None:
|
|
720
720
|
pass
|
|
721
721
|
|
|
722
|
+
@abc.abstractmethod
|
|
723
|
+
async def SandboxGetStats(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetStatsRequest, modal_proto.api_pb2.SandboxGetStatsResponse]') -> None:
|
|
724
|
+
pass
|
|
725
|
+
|
|
726
|
+
@abc.abstractmethod
|
|
727
|
+
async def SandboxGetStatsV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetStatsRequest, modal_proto.api_pb2.SandboxGetStatsResponse]') -> None:
|
|
728
|
+
pass
|
|
729
|
+
|
|
722
730
|
@abc.abstractmethod
|
|
723
731
|
async def SandboxGetTaskId(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTaskIdRequest, modal_proto.api_pb2.SandboxGetTaskIdResponse]') -> None:
|
|
724
732
|
pass
|
|
@@ -2175,6 +2183,18 @@ class ModalClientBase(abc.ABC):
|
|
|
2175
2183
|
modal_proto.api_pb2.SandboxGetResourceUsageRequest,
|
|
2176
2184
|
modal_proto.api_pb2.SandboxGetResourceUsageResponse,
|
|
2177
2185
|
),
|
|
2186
|
+
'/modal.client.ModalClient/SandboxGetStats': grpclib.const.Handler(
|
|
2187
|
+
self.SandboxGetStats,
|
|
2188
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2189
|
+
modal_proto.api_pb2.SandboxGetStatsRequest,
|
|
2190
|
+
modal_proto.api_pb2.SandboxGetStatsResponse,
|
|
2191
|
+
),
|
|
2192
|
+
'/modal.client.ModalClient/SandboxGetStatsV2': grpclib.const.Handler(
|
|
2193
|
+
self.SandboxGetStatsV2,
|
|
2194
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2195
|
+
modal_proto.api_pb2.SandboxGetStatsRequest,
|
|
2196
|
+
modal_proto.api_pb2.SandboxGetStatsResponse,
|
|
2197
|
+
),
|
|
2178
2198
|
'/modal.client.ModalClient/SandboxGetTaskId': grpclib.const.Handler(
|
|
2179
2199
|
self.SandboxGetTaskId,
|
|
2180
2200
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -3837,6 +3857,18 @@ class ModalClientStub:
|
|
|
3837
3857
|
modal_proto.api_pb2.SandboxGetResourceUsageRequest,
|
|
3838
3858
|
modal_proto.api_pb2.SandboxGetResourceUsageResponse,
|
|
3839
3859
|
)
|
|
3860
|
+
self.SandboxGetStats = grpclib.client.UnaryUnaryMethod(
|
|
3861
|
+
channel,
|
|
3862
|
+
'/modal.client.ModalClient/SandboxGetStats',
|
|
3863
|
+
modal_proto.api_pb2.SandboxGetStatsRequest,
|
|
3864
|
+
modal_proto.api_pb2.SandboxGetStatsResponse,
|
|
3865
|
+
)
|
|
3866
|
+
self.SandboxGetStatsV2 = grpclib.client.UnaryUnaryMethod(
|
|
3867
|
+
channel,
|
|
3868
|
+
'/modal.client.ModalClient/SandboxGetStatsV2',
|
|
3869
|
+
modal_proto.api_pb2.SandboxGetStatsRequest,
|
|
3870
|
+
modal_proto.api_pb2.SandboxGetStatsResponse,
|
|
3871
|
+
)
|
|
3840
3872
|
self.SandboxGetTaskId = grpclib.client.UnaryUnaryMethod(
|
|
3841
3873
|
channel,
|
|
3842
3874
|
'/modal.client.ModalClient/SandboxGetTaskId',
|