modal 1.6.2.dev12__tar.gz → 1.6.3.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.2.dev12 → modal-1.6.3.dev0}/PKG-INFO +1 -1
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/auth_token_manager.py +8 -4
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/dict.py +3 -7
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/network_file_system.py +2 -4
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/queues.py +3 -7
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/secret.py +2 -4
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/volume.py +3 -7
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/client.pyi +2 -2
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/functions.pyi +6 -6
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_sandbox.py +11 -5
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/sandbox.pyi +4 -4
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2.py +846 -845
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2.pyi +16 -2
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_version/__init__.py +1 -1
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/LICENSE +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/README.md +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/__main__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_billing.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_cluster.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_cluster.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_container_entrypoint.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_environments.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_function_variants.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_functions.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_grpc_client.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_image.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_ipython.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_load_context.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_location.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs_manager.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs_manager.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_metrics.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_metrics.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_object.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_outbound_policy.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_outbound_policy.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/manager.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/pty.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/rich.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/status.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_partial_function.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_resolver.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_resources.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/asgi.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/execution_context.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/telemetry.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_serialization.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_server.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_server.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_supports_logs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_traceback.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_tunnel.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_tunnel.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_type_manager.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/app_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/async_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/blob_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/browser_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/curl_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/deprecation.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/display_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/docker_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/function_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/git_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/hash_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/http_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/idle_countdown.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/logger.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/mount_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/name_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/package_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/proxy_support.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/shell_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/time_utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/tblib.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/version.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_watcher.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_workspace.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/app.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/app.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/billing.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/billing.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2023.12.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2024.04.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2024.10.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2025.06.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/README.md +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/base-images.json +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/call_graph.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_download.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_help.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_logs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_stats.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_traceback.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/app.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/billing.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/changelog.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/config.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/container.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/curl.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/dashboard.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/endpoint.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/entry_point.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/environment.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/function.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/image.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/import_refs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/logo.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/profile.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/run.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/selector.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/server.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/shell.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/skills.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/token.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/utils.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/workspace.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/client.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cls.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cls.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cluster.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cluster.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/config.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/container_process.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/container_process.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/dict.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/dict.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/environments.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/environments.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/exception.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/_flash_container_entry.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash_server.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash_server.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/ipython.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/file_pattern_matcher.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/functions.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/image.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/image.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/io_streams.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/io_streams.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/mount.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/mount.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/network_file_system.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/network_file_system.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/object.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/object.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/output.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/parallel_map.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/parallel_map.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/partial_function.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/partial_function.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/proxy.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/proxy.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/py.typed +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/queue.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/queue.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/retries.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/runner.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/runner.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/running_app.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_common.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_filesystem.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_sidecar.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_snapshot.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_task_command_router_client.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/sandbox.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/schedule.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/scheduler_placement.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/secret.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/secret.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/server.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/server.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/serving.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/serving.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/stream_type.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/token_flow.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/token_flow.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/types.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/volume.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/volume.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/workspace.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/workspace.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/requires.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/top_level.txt +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/types.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/reference_intro.md +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/__init__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_grpc.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/py.typed +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_version/__main__.py +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/pyproject.toml +0 -0
- {modal-1.6.2.dev12 → modal-1.6.3.dev0}/setup.cfg +0 -0
|
@@ -98,8 +98,9 @@ class _AuthTokenManager:
|
|
|
98
98
|
caller goes away.
|
|
99
99
|
"""
|
|
100
100
|
if self._refresh_task is None:
|
|
101
|
-
# Maybe another coroutine refreshed already, or we're cooling down after a failure.
|
|
102
|
-
|
|
101
|
+
# Maybe another coroutine refreshed already, or we're cooling down after a failure. The cooldown
|
|
102
|
+
# only applies while the cached token is still usable.
|
|
103
|
+
if self._has_valid_token() and not self._should_refresh():
|
|
103
104
|
return
|
|
104
105
|
# Note: the task is created in async code so it binds to the synchronicity event loop.
|
|
105
106
|
self._refresh_task = asyncio.create_task(self._fetch_token())
|
|
@@ -121,12 +122,12 @@ class _AuthTokenManager:
|
|
|
121
122
|
async def _fetch_token(self):
|
|
122
123
|
"""Fetch a new token and cache it, or arm the failure backoff."""
|
|
123
124
|
try:
|
|
124
|
-
#
|
|
125
|
+
# Retry transient errors if the cached token is missing or expired.
|
|
125
126
|
# Otherwise one attempt, and _retry_after handles the cooldown.
|
|
126
127
|
retry = Retry(
|
|
127
128
|
attempt_timeout=self.AUTH_TOKEN_TIMEOUT,
|
|
128
129
|
total_timeout=self.AUTH_TOKEN_RETRY_TOTAL_TIMEOUT,
|
|
129
|
-
max_retries=0 if self.
|
|
130
|
+
max_retries=0 if self._has_valid_token() else DEFAULT_MAX_RETRIES,
|
|
130
131
|
)
|
|
131
132
|
token = await self._fetch(retry)
|
|
132
133
|
if not token:
|
|
@@ -166,6 +167,9 @@ class _AuthTokenManager:
|
|
|
166
167
|
except Exception as e:
|
|
167
168
|
raise ValueError("Internal error: Cannot parse auth token. Please contact Modal support.") from e
|
|
168
169
|
|
|
170
|
+
def _has_valid_token(self):
|
|
171
|
+
return bool(self._token) and not self._is_expired()
|
|
172
|
+
|
|
169
173
|
def _in_backoff(self):
|
|
170
174
|
return time.time() < self._retry_after
|
|
171
175
|
|
|
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
|
|
|
8
8
|
from modal._resolver import Resolver
|
|
9
9
|
from modal._utils.async_utils import TaskContext, synchronizer
|
|
10
10
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
11
|
-
from modal.cli.utils import display_table, env_option, yes_option
|
|
11
|
+
from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
|
|
12
12
|
from modal.client import _Client
|
|
13
13
|
from modal.dict import _Dict
|
|
14
14
|
from modal.output import OutputManager
|
|
@@ -64,10 +64,8 @@ async def clear(name: str, *, yes: bool = False, env: str | None = None):
|
|
|
64
64
|
"""Clear the contents of a named Dict by deleting all of its data."""
|
|
65
65
|
d = _Dict.from_name(name, environment_name=env)
|
|
66
66
|
if not yes:
|
|
67
|
-
|
|
67
|
+
confirm_or_suggest_yes(
|
|
68
68
|
f"Are you sure you want to irrevocably delete the contents of modal.Dict '{name}'?",
|
|
69
|
-
default=False,
|
|
70
|
-
abort=True,
|
|
71
69
|
)
|
|
72
70
|
await d.clear()
|
|
73
71
|
|
|
@@ -87,10 +85,8 @@ async def delete(
|
|
|
87
85
|
):
|
|
88
86
|
"""Delete a named Dict and all of its data."""
|
|
89
87
|
if not yes:
|
|
90
|
-
|
|
88
|
+
confirm_or_suggest_yes(
|
|
91
89
|
f"Are you sure you want to irrevocably delete the modal.Dict '{name}'?",
|
|
92
|
-
default=False,
|
|
93
|
-
abort=True,
|
|
94
90
|
)
|
|
95
91
|
await _Dict.objects.delete(name, environment_name=env, allow_missing=allow_missing)
|
|
96
92
|
|
|
@@ -14,7 +14,7 @@ from modal._location import display_location
|
|
|
14
14
|
from modal._utils.async_utils import synchronizer
|
|
15
15
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
16
16
|
from modal.cli._download import _volume_download
|
|
17
|
-
from modal.cli.utils import display_table, env_option, yes_option
|
|
17
|
+
from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
|
|
18
18
|
from modal.client import _Client
|
|
19
19
|
from modal.network_file_system import _NetworkFileSystem
|
|
20
20
|
from modal.output import OutputManager
|
|
@@ -86,10 +86,8 @@ async def delete(
|
|
|
86
86
|
# Lookup first to validate the name, even though delete is a staticmethod
|
|
87
87
|
await _NetworkFileSystem.from_name(nfs_name, environment_name=env).hydrate()
|
|
88
88
|
if not yes:
|
|
89
|
-
|
|
89
|
+
confirm_or_suggest_yes(
|
|
90
90
|
f"Are you sure you want to irrevocably delete the modal.NetworkFileSystem '{nfs_name}'?",
|
|
91
|
-
default=False,
|
|
92
|
-
abort=True,
|
|
93
91
|
)
|
|
94
92
|
|
|
95
93
|
await _NetworkFileSystem.delete(nfs_name, environment_name=env)
|
|
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
|
|
|
8
8
|
from modal._resolver import Resolver
|
|
9
9
|
from modal._utils.async_utils import TaskContext, synchronizer
|
|
10
10
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
11
|
-
from modal.cli.utils import display_table, env_option, yes_option
|
|
11
|
+
from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
|
|
12
12
|
from modal.client import _Client
|
|
13
13
|
from modal.output import OutputManager
|
|
14
14
|
from modal.queue import _Queue
|
|
@@ -127,10 +127,8 @@ async def clear(
|
|
|
127
127
|
"""Clear the contents of a Queue by removing all of its data."""
|
|
128
128
|
q = _Queue.from_name(name, environment_name=env)
|
|
129
129
|
if not yes:
|
|
130
|
-
|
|
130
|
+
confirm_or_suggest_yes(
|
|
131
131
|
f"Are you sure you want to irrevocably delete the contents of modal.Queue '{name}'?",
|
|
132
|
-
default=False,
|
|
133
|
-
abort=True,
|
|
134
132
|
)
|
|
135
133
|
await q.clear(partition=partition, all=all)
|
|
136
134
|
|
|
@@ -151,10 +149,8 @@ async def delete(
|
|
|
151
149
|
"""Delete a named Queue and all of its data."""
|
|
152
150
|
env = ensure_env(env)
|
|
153
151
|
if not yes:
|
|
154
|
-
|
|
152
|
+
confirm_or_suggest_yes(
|
|
155
153
|
f"Are you sure you want to irrevocably delete the modal.Queue '{name}'?",
|
|
156
|
-
default=False,
|
|
157
|
-
abort=True,
|
|
158
154
|
)
|
|
159
155
|
await _Queue.objects.delete(name, environment_name=env, allow_missing=allow_missing)
|
|
160
156
|
|
|
@@ -13,7 +13,7 @@ from rich.syntax import Syntax
|
|
|
13
13
|
from modal._environments import ensure_env
|
|
14
14
|
from modal._utils.async_utils import synchronizer
|
|
15
15
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
16
|
-
from modal.cli.utils import display_table, env_option, yes_option
|
|
16
|
+
from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
|
|
17
17
|
from modal.client import _Client
|
|
18
18
|
from modal.output import OutputManager
|
|
19
19
|
from modal.secret import _Secret
|
|
@@ -194,10 +194,8 @@ async def delete(
|
|
|
194
194
|
):
|
|
195
195
|
env = ensure_env(env)
|
|
196
196
|
if not yes:
|
|
197
|
-
|
|
197
|
+
confirm_or_suggest_yes(
|
|
198
198
|
f"Are you sure you want to irrevocably delete the modal.Secret '{name}'?",
|
|
199
|
-
default=False,
|
|
200
|
-
abort=True,
|
|
201
199
|
)
|
|
202
200
|
await _Secret.objects.delete(name, environment_name=env, allow_missing=allow_missing)
|
|
203
201
|
|
|
@@ -13,7 +13,7 @@ from modal._utils.async_utils import synchronizer
|
|
|
13
13
|
from modal._utils.browser_utils import open_url_and_display
|
|
14
14
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
15
15
|
from modal.cli._download import _volume_download
|
|
16
|
-
from modal.cli.utils import display_table, env_option, humanize_filesize, yes_option
|
|
16
|
+
from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, humanize_filesize, yes_option
|
|
17
17
|
from modal.output import OutputManager
|
|
18
18
|
from modal.volume import _AbstractVolumeUploadContextManager, _Volume
|
|
19
19
|
from modal_proto import api_pb2
|
|
@@ -81,10 +81,8 @@ async def rename(
|
|
|
81
81
|
env: str | None = None,
|
|
82
82
|
):
|
|
83
83
|
if not yes:
|
|
84
|
-
|
|
84
|
+
confirm_or_suggest_yes(
|
|
85
85
|
f"Are you sure you want rename the modal.Volume '{old_name}'? This may break any Apps currently using it.",
|
|
86
|
-
default=False,
|
|
87
|
-
abort=True,
|
|
88
86
|
)
|
|
89
87
|
|
|
90
88
|
await _Volume.rename(old_name, new_name, environment_name=env)
|
|
@@ -132,10 +130,8 @@ async def delete(
|
|
|
132
130
|
):
|
|
133
131
|
env = ensure_env(env)
|
|
134
132
|
if not yes:
|
|
135
|
-
|
|
133
|
+
confirm_or_suggest_yes(
|
|
136
134
|
f"Are you sure you want to irrevocably delete the modal.Volume '{name}'?",
|
|
137
|
-
default=False,
|
|
138
|
-
abort=True,
|
|
139
135
|
)
|
|
140
136
|
|
|
141
137
|
await _Volume.objects.delete(name, environment_name=env, allow_missing=allow_missing)
|
|
@@ -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.3.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.3.dev0",
|
|
294
294
|
*,
|
|
295
295
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
296
296
|
):
|
|
@@ -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[P_INNER, ReturnType_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.P, modal._functions.ReturnType]
|
|
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[P_INNER, ReturnType_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.P, modal._functions.ReturnType]
|
|
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[P_INNER, ReturnType_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.P, modal._functions.ReturnType]
|
|
772
772
|
|
|
773
773
|
@property
|
|
774
774
|
def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
|
|
@@ -112,6 +112,11 @@ _EXIT_SNAPSHOT_LONG_POLL_TIMEOUT = 10.0
|
|
|
112
112
|
# client-side deadline.
|
|
113
113
|
_EXIT_SNAPSHOT_POLL_DEADLINE_MARGIN = 5.0
|
|
114
114
|
|
|
115
|
+
# `Sandbox.wait` re-polls a server-side long poll of this many seconds. Each poll gets a network deadline
|
|
116
|
+
# with a margin over the hold, so a poll the server never answers fails and is retried instead of hanging.
|
|
117
|
+
_WAIT_LONG_POLL_TIMEOUT = 10.0
|
|
118
|
+
_WAIT_POLL_DEADLINE_MARGIN = 5.0
|
|
119
|
+
|
|
115
120
|
# How long `Sandbox.create` waits for capacity before giving up.
|
|
116
121
|
_SANDBOX_SCHEDULING_TIMEOUT: float = 21 * 60
|
|
117
122
|
|
|
@@ -484,8 +489,8 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
484
489
|
wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
|
|
485
490
|
can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
|
|
486
491
|
inbound_cidr_allowlist:
|
|
487
|
-
List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens).
|
|
488
|
-
all CIDRs are allowed.
|
|
492
|
+
List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
|
|
493
|
+
If None, all CIDRs are allowed.
|
|
489
494
|
_experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
|
|
490
495
|
the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
|
|
491
496
|
visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
|
|
@@ -1682,14 +1687,15 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1682
1687
|
|
|
1683
1688
|
"""
|
|
1684
1689
|
|
|
1690
|
+
poll_retry = Retry(attempt_timeout=_WAIT_LONG_POLL_TIMEOUT + _WAIT_POLL_DEADLINE_MARGIN)
|
|
1685
1691
|
while True:
|
|
1686
|
-
req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=
|
|
1692
|
+
req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=_WAIT_LONG_POLL_TIMEOUT)
|
|
1687
1693
|
# Use the private __client to allow `wait` to work with a detached sandbox
|
|
1688
1694
|
stub = self.__client._stub
|
|
1689
1695
|
if self._is_v2:
|
|
1690
|
-
resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata(self.__client))
|
|
1696
|
+
resp = await stub.SandboxWaitV2(req, retry=poll_retry, metadata=await self._v2_metadata(self.__client))
|
|
1691
1697
|
else:
|
|
1692
|
-
resp = await stub.SandboxWait(req)
|
|
1698
|
+
resp = await stub.SandboxWait(req, retry=poll_retry)
|
|
1693
1699
|
if resp.result.status:
|
|
1694
1700
|
logger.debug(f"Sandbox {self.object_id} wait completed with status {resp.result.status}")
|
|
1695
1701
|
self._result = resp.result
|
|
@@ -1474,8 +1474,8 @@ class Sandbox(modal.object.Object):
|
|
|
1474
1474
|
wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
|
|
1475
1475
|
can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
|
|
1476
1476
|
inbound_cidr_allowlist:
|
|
1477
|
-
List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens).
|
|
1478
|
-
all CIDRs are allowed.
|
|
1477
|
+
List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
|
|
1478
|
+
If None, all CIDRs are allowed.
|
|
1479
1479
|
_experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
|
|
1480
1480
|
the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
|
|
1481
1481
|
visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
|
|
@@ -1598,8 +1598,8 @@ class Sandbox(modal.object.Object):
|
|
|
1598
1598
|
wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
|
|
1599
1599
|
can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
|
|
1600
1600
|
inbound_cidr_allowlist:
|
|
1601
|
-
List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens).
|
|
1602
|
-
all CIDRs are allowed.
|
|
1601
|
+
List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
|
|
1602
|
+
If None, all CIDRs are allowed.
|
|
1603
1603
|
_experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
|
|
1604
1604
|
the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
|
|
1605
1605
|
visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
|