modal 1.6.1.dev3__tar.gz → 1.6.2.dev0__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.1.dev3 → modal-1.6.2.dev0}/PKG-INFO +1 -1
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/task_command_router_client.py +29 -8
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/client.pyi +2 -2
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/functions.pyi +6 -6
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/sandbox.py +24 -40
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/sandbox.pyi +7 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_version/__init__.py +1 -1
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/LICENSE +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/README.md +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/__main__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_billing.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_cluster.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_cluster.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_container_entrypoint.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_environments.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_function_variants.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_functions.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_grpc_client.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_image.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_ipython.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_load_context.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_location.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_logs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_logs_manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_logs_manager.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_object.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_outbound_policy.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_outbound_policy.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_output/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_output/manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_output/pty.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_output/rich.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_output/status.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_partial_function.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_resolver.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_resources.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/asgi.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/execution_context.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/telemetry.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_serialization.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_server.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_server.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_supports_logs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_traceback.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_tunnel.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_tunnel.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_type_manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/app_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/async_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/blob_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/browser_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/curl_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/deprecation.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/display_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/docker_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/function_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/git_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/hash_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/http_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/idle_countdown.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/logger.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/mount_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/name_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/package_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/proxy_support.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/shell_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_utils/time_utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_vendor/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_vendor/tblib.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_vendor/version.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_watcher.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/_workspace.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/app.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/app.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/billing.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/billing.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/2023.12.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/2024.04.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/2024.10.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/2025.06.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/README.md +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/builder/base-images.json +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/call_graph.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/_download.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/_help.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/_logs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/_stats.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/_traceback.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/app.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/billing.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/changelog.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/config.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/container.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/curl.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/dashboard.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/dict.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/endpoint.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/entry_point.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/environment.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/function.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/image.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/import_refs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/logo.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/network_file_system.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/profile.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/queues.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/run.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/secret.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/selector.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/server.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/shell.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/skills.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/token.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/utils.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/volume.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cli/workspace.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/client.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cls.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cls.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cluster.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/cluster.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/config.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/container_process.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/container_process.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/dict.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/dict.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/environments.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/environments.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/exception.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/_flash_container_entry.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/flash.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/flash.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/flash_server.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/flash_server.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/experimental/ipython.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/file_pattern_matcher.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/functions.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/image.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/image.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/io_streams.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/io_streams.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/mount.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/mount.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/network_file_system.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/network_file_system.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/object.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/object.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/output.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/parallel_map.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/parallel_map.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/partial_function.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/partial_function.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/proxy.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/proxy.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/py.typed +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/queue.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/queue.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/retries.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/runner.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/runner.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/running_app.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/sandbox_fs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/sandbox_fs.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/schedule.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/scheduler_placement.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/secret.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/secret.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/server.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/server.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/serving.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/serving.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/snapshot.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/snapshot.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/stream_type.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/token_flow.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/token_flow.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/types.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/volume.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/volume.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/workspace.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal/workspace.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/requires.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal.egg-info/top_level.txt +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/mdmd/types.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_docs/reference_intro.md +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/__init__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/api_grpc.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/api_pb2.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/py.typed +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/modal_version/__main__.py +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/pyproject.toml +0 -0
- {modal-1.6.1.dev3 → modal-1.6.2.dev0}/setup.cfg +0 -0
|
@@ -226,6 +226,7 @@ async def fetch_command_router_access_v2(
|
|
|
226
226
|
*,
|
|
227
227
|
sandbox_id: str | None = None,
|
|
228
228
|
task_id: str | None = None,
|
|
229
|
+
sandbox_token: str | None = None,
|
|
229
230
|
) -> api_pb2.SandboxGetCommandRouterAccessResponse:
|
|
230
231
|
"""Fetch direct command router access info from Modal server for a V2 sandbox."""
|
|
231
232
|
if sandbox_id is not None:
|
|
@@ -236,10 +237,10 @@ async def fetch_command_router_access_v2(
|
|
|
236
237
|
raise ValueError("Either sandbox_id or task_id must be provided")
|
|
237
238
|
assert server_client._auth_token_manager
|
|
238
239
|
auth_token = await server_client._auth_token_manager.get_token()
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
metadata
|
|
242
|
-
)
|
|
240
|
+
metadata = [("x-modal-auth-token", auth_token)]
|
|
241
|
+
if sandbox_token:
|
|
242
|
+
metadata.append(("x-modal-sandbox-token", sandbox_token))
|
|
243
|
+
return await server_client._stub.SandboxGetCommandRouterAccess(request, metadata=metadata)
|
|
243
244
|
|
|
244
245
|
|
|
245
246
|
def _finalize_channel(loop, channel):
|
|
@@ -267,6 +268,7 @@ class TaskCommandRouterClient:
|
|
|
267
268
|
jwt: str,
|
|
268
269
|
*,
|
|
269
270
|
sandbox_id: str | None = None,
|
|
271
|
+
sandbox_token: str | None = None,
|
|
270
272
|
) -> "TaskCommandRouterClient":
|
|
271
273
|
"""Build a connected client from a jwt and url."""
|
|
272
274
|
o = urllib.parse.urlparse(url)
|
|
@@ -315,7 +317,17 @@ class TaskCommandRouterClient:
|
|
|
315
317
|
loop = asyncio.get_running_loop()
|
|
316
318
|
jwt_refresh_lock = asyncio.Lock()
|
|
317
319
|
|
|
318
|
-
client = cls(
|
|
320
|
+
client = cls(
|
|
321
|
+
server_client,
|
|
322
|
+
task_id,
|
|
323
|
+
url,
|
|
324
|
+
jwt,
|
|
325
|
+
channel,
|
|
326
|
+
loop,
|
|
327
|
+
jwt_refresh_lock,
|
|
328
|
+
sandbox_id=sandbox_id,
|
|
329
|
+
sandbox_token=sandbox_token,
|
|
330
|
+
)
|
|
319
331
|
# An unused client releases its connection too.
|
|
320
332
|
client._arm_idle_release()
|
|
321
333
|
return client
|
|
@@ -337,6 +349,8 @@ class TaskCommandRouterClient:
|
|
|
337
349
|
sandbox_id: str,
|
|
338
350
|
task_id: str,
|
|
339
351
|
access: api_pb2.CommandRouterAccess | None = None,
|
|
352
|
+
*,
|
|
353
|
+
sandbox_token: str | None = None,
|
|
340
354
|
) -> "TaskCommandRouterClient":
|
|
341
355
|
"""Initialize a TaskCommandRouterClient for a V2 sandbox.
|
|
342
356
|
|
|
@@ -348,10 +362,12 @@ class TaskCommandRouterClient:
|
|
|
348
362
|
if access is not None:
|
|
349
363
|
url, jwt = access.url, access.jwt
|
|
350
364
|
else:
|
|
351
|
-
resp = await fetch_command_router_access_v2(
|
|
365
|
+
resp = await fetch_command_router_access_v2(
|
|
366
|
+
server_client, sandbox_id=sandbox_id, sandbox_token=sandbox_token
|
|
367
|
+
)
|
|
352
368
|
url, jwt = resp.url, resp.jwt
|
|
353
369
|
logger.debug(f"Using command router access for sandbox {sandbox_id}")
|
|
354
|
-
return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id)
|
|
370
|
+
return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id, sandbox_token=sandbox_token)
|
|
355
371
|
|
|
356
372
|
@classmethod
|
|
357
373
|
async def init_v2_by_task_id(
|
|
@@ -375,6 +391,7 @@ class TaskCommandRouterClient:
|
|
|
375
391
|
jwt_refresh_lock: asyncio.Lock,
|
|
376
392
|
*,
|
|
377
393
|
sandbox_id: str | None = None,
|
|
394
|
+
sandbox_token: str | None = None,
|
|
378
395
|
stream_stdio_retry_delay_secs: float = 0.01,
|
|
379
396
|
stream_stdio_retry_delay_factor: float = 2,
|
|
380
397
|
stream_stdio_max_retries: int = 10,
|
|
@@ -388,6 +405,7 @@ class TaskCommandRouterClient:
|
|
|
388
405
|
self._server_client = server_client
|
|
389
406
|
self._task_id = task_id
|
|
390
407
|
self._sandbox_id = sandbox_id
|
|
408
|
+
self._sandbox_token = sandbox_token
|
|
391
409
|
self._server_url = server_url
|
|
392
410
|
self._jwt = jwt
|
|
393
411
|
self._channel = channel
|
|
@@ -902,7 +920,10 @@ class TaskCommandRouterClient:
|
|
|
902
920
|
if self._is_v2_sandbox:
|
|
903
921
|
logger.debug(f"Refreshing JWT for V2 exec with task ID {self._task_id}")
|
|
904
922
|
v2_resp = await fetch_command_router_access_v2(
|
|
905
|
-
self._server_client,
|
|
923
|
+
self._server_client,
|
|
924
|
+
sandbox_id=self._sandbox_id,
|
|
925
|
+
task_id=self._task_id,
|
|
926
|
+
sandbox_token=self._sandbox_token,
|
|
906
927
|
)
|
|
907
928
|
logger.debug(f"Finished refreshing JWT for V2 exec with task ID {self._task_id}")
|
|
908
929
|
jwt, url = v2_resp.jwt, v2_resp.url
|
|
@@ -80,7 +80,7 @@ class _Client:
|
|
|
80
80
|
server_url: str,
|
|
81
81
|
client_type: int,
|
|
82
82
|
credentials: typing.Optional[tuple[str, str]],
|
|
83
|
-
version: str = "1.6.
|
|
83
|
+
version: str = "1.6.2.dev0",
|
|
84
84
|
*,
|
|
85
85
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
86
86
|
):
|
|
@@ -290,7 +290,7 @@ class Client:
|
|
|
290
290
|
server_url: str,
|
|
291
291
|
client_type: int,
|
|
292
292
|
credentials: typing.Optional[tuple[str, str]],
|
|
293
|
-
version: str = "1.6.
|
|
293
|
+
version: str = "1.6.2.dev0",
|
|
294
294
|
*,
|
|
295
295
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
296
296
|
):
|
|
@@ -613,7 +613,7 @@ class Function(
|
|
|
613
613
|
|
|
614
614
|
_call_generator: ___call_generator_spec
|
|
615
615
|
|
|
616
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
616
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
617
617
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
618
618
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
619
619
|
|
|
@@ -638,7 +638,7 @@ class Function(
|
|
|
638
638
|
"""
|
|
639
639
|
...
|
|
640
640
|
|
|
641
|
-
remote: __remote_spec[modal._functions.
|
|
641
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
642
642
|
|
|
643
643
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
644
644
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -688,7 +688,7 @@ class Function(
|
|
|
688
688
|
"""
|
|
689
689
|
...
|
|
690
690
|
|
|
691
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
691
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
692
692
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
693
693
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
694
694
|
|
|
@@ -721,7 +721,7 @@ class Function(
|
|
|
721
721
|
"""
|
|
722
722
|
...
|
|
723
723
|
|
|
724
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
724
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
725
725
|
|
|
726
726
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
727
727
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -729,7 +729,7 @@ class Function(
|
|
|
729
729
|
|
|
730
730
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
731
731
|
|
|
732
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
732
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
733
733
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
734
734
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
735
735
|
|
|
@@ -762,7 +762,7 @@ class Function(
|
|
|
762
762
|
"""
|
|
763
763
|
...
|
|
764
764
|
|
|
765
|
-
spawn: __spawn_spec[modal._functions.
|
|
765
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
766
766
|
|
|
767
767
|
@property
|
|
768
768
|
def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
|
|
@@ -1180,6 +1180,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1180
1180
|
self._hydrate(sandbox_id, load_context.client, create_resp.metadata)
|
|
1181
1181
|
self._is_v2 = True
|
|
1182
1182
|
self._task_id = create_resp.task_id
|
|
1183
|
+
self._sandbox_token = create_resp.sandbox_token or None
|
|
1183
1184
|
# An unset proto message reads as an empty one rather than None, so the
|
|
1184
1185
|
# presence check is what distinguishes "no access" from "empty access".
|
|
1185
1186
|
if create_resp.HasField("command_router_access"):
|
|
@@ -1208,6 +1209,15 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1208
1209
|
await resolver.load(obj, load_context)
|
|
1209
1210
|
return obj
|
|
1210
1211
|
|
|
1212
|
+
async def _v2_metadata(self, client: _Client | None = None) -> list[tuple[str, str]]:
|
|
1213
|
+
client = client if client is not None else self._client
|
|
1214
|
+
assert client._auth_token_manager
|
|
1215
|
+
auth_token = await client._auth_token_manager.get_token()
|
|
1216
|
+
metadata = [("x-modal-auth-token", auth_token)]
|
|
1217
|
+
if self._sandbox_token:
|
|
1218
|
+
metadata.append(("x-modal-sandbox-token", self._sandbox_token))
|
|
1219
|
+
return metadata
|
|
1220
|
+
|
|
1211
1221
|
def _get_metadata(self) -> api_pb2.SandboxHandleMetadata:
|
|
1212
1222
|
metadata = api_pb2.SandboxHandleMetadata(app_id=self._app_id or "")
|
|
1213
1223
|
if hasattr(self, "_result") and self._result is not None:
|
|
@@ -1242,6 +1252,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1242
1252
|
)
|
|
1243
1253
|
self._stdin = StreamWriter(_StreamWriterThroughServerParams(object_id=self.object_id, client=self._client))
|
|
1244
1254
|
self._task_id = None
|
|
1255
|
+
self._sandbox_token = None
|
|
1245
1256
|
self._tunnels = None
|
|
1246
1257
|
self._enable_snapshot = False
|
|
1247
1258
|
self._command_router_client = None
|
|
@@ -1463,9 +1474,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1463
1474
|
req = api_pb2.SandboxTagsGetRequest(sandbox_id=self.object_id)
|
|
1464
1475
|
stub = self._client._stub
|
|
1465
1476
|
if self._is_v2:
|
|
1466
|
-
|
|
1467
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
1468
|
-
resp = await stub.SandboxTagsGetV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1477
|
+
resp = await stub.SandboxTagsGetV2(req, metadata=await self._v2_metadata())
|
|
1469
1478
|
else:
|
|
1470
1479
|
resp = await stub.SandboxTagsGet(req)
|
|
1471
1480
|
|
|
@@ -1491,10 +1500,8 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1491
1500
|
tags_list = [api_pb2.SandboxTag(tag_name=name, tag_value=value) for name, value in tags.items()]
|
|
1492
1501
|
stub = self._client._stub
|
|
1493
1502
|
if self._is_v2:
|
|
1494
|
-
assert self._client._auth_token_manager
|
|
1495
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
1496
1503
|
req = api_pb2.SandboxTagsSetRequest(sandbox_id=self.object_id, tags=tags_list)
|
|
1497
|
-
await stub.SandboxTagsSetV2(req, metadata=
|
|
1504
|
+
await stub.SandboxTagsSetV2(req, metadata=await self._v2_metadata())
|
|
1498
1505
|
else:
|
|
1499
1506
|
req = api_pb2.SandboxTagsSetRequest(
|
|
1500
1507
|
environment_name=_get_environment_name(),
|
|
@@ -1526,9 +1533,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1526
1533
|
check_object_name(name, "Sandbox")
|
|
1527
1534
|
|
|
1528
1535
|
req = api_pb2.SandboxSetNameRequest(sandbox_id=self.object_id, name=name)
|
|
1529
|
-
|
|
1530
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
1531
|
-
await self._client._stub.SandboxSetName(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1536
|
+
await self._client._stub.SandboxSetName(req, metadata=await self._v2_metadata())
|
|
1532
1537
|
|
|
1533
1538
|
async def _experimental_set_outbound_network_policy(
|
|
1534
1539
|
self,
|
|
@@ -1643,13 +1648,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1643
1648
|
total_timeout=remaining,
|
|
1644
1649
|
)
|
|
1645
1650
|
resp: api_pb2.SandboxGetExitSnapshotResponse
|
|
1646
|
-
if self._is_v2:
|
|
1647
|
-
assert client._auth_token_manager
|
|
1648
|
-
auth_token = await client._auth_token_manager.get_token()
|
|
1649
1651
|
try:
|
|
1650
1652
|
if self._is_v2:
|
|
1651
1653
|
resp = await client._stub.SandboxGetExitSnapshotV2(
|
|
1652
|
-
req, retry=poll_retry, metadata=
|
|
1654
|
+
req, retry=poll_retry, metadata=await self._v2_metadata(client)
|
|
1653
1655
|
)
|
|
1654
1656
|
else:
|
|
1655
1657
|
resp = await client._stub.SandboxGetExitSnapshot(req, retry=poll_retry)
|
|
@@ -1876,9 +1878,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1876
1878
|
# Use the private __client to allow `wait` to work with a detached sandbox
|
|
1877
1879
|
stub = self.__client._stub
|
|
1878
1880
|
if self._is_v2:
|
|
1879
|
-
|
|
1880
|
-
auth_token = await self.__client._auth_token_manager.get_token()
|
|
1881
|
-
resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1881
|
+
resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata(self.__client))
|
|
1882
1882
|
else:
|
|
1883
1883
|
resp = await stub.SandboxWait(req)
|
|
1884
1884
|
if resp.result.status:
|
|
@@ -1947,9 +1947,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1947
1947
|
req = api_pb2.SandboxGetTunnelsRequest(sandbox_id=self.object_id, timeout=timeout)
|
|
1948
1948
|
stub = self._client._stub
|
|
1949
1949
|
if self._is_v2:
|
|
1950
|
-
|
|
1951
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
1952
|
-
resp = await stub.SandboxGetTunnelsV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
1950
|
+
resp = await stub.SandboxGetTunnelsV2(req, metadata=await self._v2_metadata())
|
|
1953
1951
|
else:
|
|
1954
1952
|
resp = await stub.SandboxGetTunnels(req)
|
|
1955
1953
|
|
|
@@ -1993,11 +1991,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1993
1991
|
sandbox_id=self.object_id, user_metadata=user_metadata, port=port
|
|
1994
1992
|
)
|
|
1995
1993
|
if self._is_v2:
|
|
1996
|
-
|
|
1997
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
1998
|
-
resp = await self._client._stub.SandboxCreateConnectTokenV2(
|
|
1999
|
-
req, metadata=[("x-modal-auth-token", auth_token)]
|
|
2000
|
-
)
|
|
1994
|
+
resp = await self._client._stub.SandboxCreateConnectTokenV2(req, metadata=await self._v2_metadata())
|
|
2001
1995
|
else:
|
|
2002
1996
|
resp = await self._client._stub.SandboxCreateConnectToken(req)
|
|
2003
1997
|
return SandboxConnectCredentials(resp.url, resp.token)
|
|
@@ -2055,9 +2049,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2055
2049
|
req = api_pb2.SandboxTerminateRequest(sandbox_id=self.object_id)
|
|
2056
2050
|
stub = self._client._stub
|
|
2057
2051
|
if self._is_v2:
|
|
2058
|
-
|
|
2059
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
2060
|
-
await stub.SandboxTerminateV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2052
|
+
await stub.SandboxTerminateV2(req, metadata=await self._v2_metadata())
|
|
2061
2053
|
else:
|
|
2062
2054
|
await stub.SandboxTerminate(req)
|
|
2063
2055
|
if wait:
|
|
@@ -2074,9 +2066,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2074
2066
|
req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=0)
|
|
2075
2067
|
stub = self._client._stub
|
|
2076
2068
|
if self._is_v2:
|
|
2077
|
-
|
|
2078
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
2079
|
-
resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2069
|
+
resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata())
|
|
2080
2070
|
else:
|
|
2081
2071
|
resp = await stub.SandboxWait(req)
|
|
2082
2072
|
|
|
@@ -2094,9 +2084,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2094
2084
|
stub = self._client._stub
|
|
2095
2085
|
try:
|
|
2096
2086
|
if self._is_v2:
|
|
2097
|
-
|
|
2098
|
-
auth_token = await self._client._auth_token_manager.get_token()
|
|
2099
|
-
resp = await stub.SandboxGetTaskIdV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2087
|
+
resp = await stub.SandboxGetTaskIdV2(req, metadata=await self._v2_metadata())
|
|
2100
2088
|
else:
|
|
2101
2089
|
resp = await stub.SandboxGetTaskId(req)
|
|
2102
2090
|
except (ServiceError, InternalError, ConnectionError) as exc:
|
|
@@ -2136,9 +2124,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2136
2124
|
req = api_pb2.SandboxGetTaskIdRequest(sandbox_id=self.object_id)
|
|
2137
2125
|
stub = self.__client._stub
|
|
2138
2126
|
if self._is_v2:
|
|
2139
|
-
|
|
2140
|
-
auth_token = await self.__client._auth_token_manager.get_token()
|
|
2141
|
-
resp = await stub.SandboxGetTaskIdV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2127
|
+
resp = await stub.SandboxGetTaskIdV2(req, metadata=await self._v2_metadata(self.__client))
|
|
2142
2128
|
else:
|
|
2143
2129
|
resp = await stub.SandboxGetTaskId(req)
|
|
2144
2130
|
if not resp.task_id:
|
|
@@ -2165,7 +2151,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2165
2151
|
# re-trying the same credentials forever.
|
|
2166
2152
|
access, self._init_command_router_access = self._init_command_router_access, None
|
|
2167
2153
|
command_router_client = await TaskCommandRouterClient.init_v2_by_sandbox_id(
|
|
2168
|
-
self._client, self.object_id, task_id, access
|
|
2154
|
+
self._client, self.object_id, task_id, access, sandbox_token=self._sandbox_token
|
|
2169
2155
|
)
|
|
2170
2156
|
else:
|
|
2171
2157
|
command_router_client = await TaskCommandRouterClient.init(self._client, task_id)
|
|
@@ -3289,10 +3275,8 @@ class _SidecarManager:
|
|
|
3289
3275
|
cloud_bucket_mount_credentials=cloud_bucket_credentials,
|
|
3290
3276
|
)
|
|
3291
3277
|
client = self._sandbox._client
|
|
3292
|
-
assert client._auth_token_manager
|
|
3293
|
-
auth_token = await client._auth_token_manager.get_token()
|
|
3294
3278
|
create_resp = await client._stub.SandboxContainerCreateV2(
|
|
3295
|
-
create_req, metadata=
|
|
3279
|
+
create_req, metadata=await self._sandbox._v2_metadata(client)
|
|
3296
3280
|
)
|
|
3297
3281
|
else:
|
|
3298
3282
|
task_id, command_router_client = await self._get_command_router()
|
|
@@ -466,6 +466,7 @@ class _Sandbox(modal._object._Object):
|
|
|
466
466
|
"""
|
|
467
467
|
...
|
|
468
468
|
|
|
469
|
+
async def _v2_metadata(self, client: typing.Optional[modal.client._Client] = None) -> list[tuple[str, str]]: ...
|
|
469
470
|
def _get_metadata(self) -> modal_proto.api_pb2.SandboxHandleMetadata: ...
|
|
470
471
|
def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]) -> None: ...
|
|
471
472
|
def _hydrate_metadata_v2(self) -> None:
|
|
@@ -2492,6 +2493,12 @@ class Sandbox(modal.object.Object):
|
|
|
2492
2493
|
|
|
2493
2494
|
_experimental_create: typing.ClassVar[___experimental_create_spec]
|
|
2494
2495
|
|
|
2496
|
+
class ___v2_metadata_spec(typing_extensions.Protocol):
|
|
2497
|
+
def __call__(self, /, client: typing.Optional[modal.client.Client] = None) -> list[tuple[str, str]]: ...
|
|
2498
|
+
async def aio(self, /, client: typing.Optional[modal.client.Client] = None) -> list[tuple[str, str]]: ...
|
|
2499
|
+
|
|
2500
|
+
_v2_metadata: ___v2_metadata_spec
|
|
2501
|
+
|
|
2495
2502
|
def _get_metadata(self) -> modal_proto.api_pb2.SandboxHandleMetadata: ...
|
|
2496
2503
|
def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]) -> None: ...
|
|
2497
2504
|
def _hydrate_metadata_v2(self) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|