modal 1.5.4.dev8__tar.gz → 1.5.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.5.4.dev8 → modal-1.5.4.dev9}/PKG-INFO +1 -1
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/rich.py +12 -2
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/task_command_router_client.py +13 -3
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/client.pyi +2 -2
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/functions.pyi +6 -6
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox.py +11 -1
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox.pyi +2 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_grpc.py +16 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2.py +912 -902
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2.pyi +54 -9
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2_grpc.py +33 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2_grpc.pyi +10 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/modal_api_grpc.py +1 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_version/__init__.py +1 -1
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/LICENSE +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/README.md +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/__main__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_billing.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_clustered_functions.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_environments.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_function_variants.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_functions.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_grpc_client.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_image.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_ipython.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_load_context.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_location.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs_manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs_manager.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_object.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/pty.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/status.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_partial_function.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_resolver.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_resources.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_serialization.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_server.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_supports_logs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_traceback.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_tunnel.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_tunnel.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_type_manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/display_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/logger.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/version.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_watcher.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_workspace.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/app.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/app.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/billing.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/billing.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/README.md +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/base-images.json +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/call_graph.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_download.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_help.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_traceback.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/app.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/billing.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/changelog.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/cluster.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/config.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/container.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/curl.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/dashboard.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/dict.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/endpoint.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/entry_point.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/environment.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/image.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/import_refs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/launch.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/logo.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/profile.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/queues.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/run.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/secret.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/selector.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/shell.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/skills.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/token.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/utils.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/volume.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/workspace.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/client.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cls.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cls.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/config.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/container_process.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/container_process.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/dict.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/dict.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/environments.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/environments.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/exception.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/flash.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/ipython.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_io.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_io.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/functions.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/image.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/image.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/io_streams.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/io_streams.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/mount.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/mount.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/network_file_system.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/network_file_system.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/object.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/object.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/output.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/parallel_map.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/parallel_map.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/partial_function.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/partial_function.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/proxy.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/proxy.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/py.typed +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/queue.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/queue.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/retries.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/runner.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/runner.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/running_app.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox_fs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/schedule.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/scheduler_placement.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/secret.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/secret.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/server.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/server.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/serving.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/serving.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/snapshot.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/snapshot.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/stream_type.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/token_flow.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/token_flow.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/types.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/volume.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/volume.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/workspace.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/workspace.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/reference_intro.md +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/__init__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/py.typed +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_version/__main__.py +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/pyproject.toml +0 -0
- {modal-1.5.4.dev8 → modal-1.5.4.dev9}/setup.cfg +0 -0
|
@@ -37,6 +37,7 @@ from rich.progress import (
|
|
|
37
37
|
)
|
|
38
38
|
from rich.spinner import Spinner
|
|
39
39
|
from rich.status import Status
|
|
40
|
+
from rich.table import Column
|
|
40
41
|
from rich.text import Text
|
|
41
42
|
from rich.tree import Tree
|
|
42
43
|
|
|
@@ -476,7 +477,10 @@ class RichOutputManager(OutputManager):
|
|
|
476
477
|
and adds it to the current render group."""
|
|
477
478
|
if not self._function_queueing_progress:
|
|
478
479
|
self._function_queueing_progress = Progress(
|
|
479
|
-
TextColumn(
|
|
480
|
+
TextColumn(
|
|
481
|
+
"[progress.description]{task.description}",
|
|
482
|
+
table_column=Column(no_wrap=False, overflow="fold"),
|
|
483
|
+
),
|
|
480
484
|
FunctionQueuingColumn(),
|
|
481
485
|
console=self._console,
|
|
482
486
|
transient=True,
|
|
@@ -581,11 +585,17 @@ class RichOutputManager(OutputManager):
|
|
|
581
585
|
"""Handle queueing updates, ignoring completion updates for functions that have no queue progress bar."""
|
|
582
586
|
task_key = (function_id, api_pb2.FUNCTION_QUEUED)
|
|
583
587
|
task_description = description or f"'{function_id}' function waiting on worker"
|
|
588
|
+
task_description = escape(task_description)
|
|
584
589
|
task_desc = f"[yellow]{task_description}. Time in queue:"
|
|
585
590
|
if task_key in self._task_progress_items:
|
|
586
591
|
progress_task_id = self._task_progress_items[task_key]
|
|
587
592
|
try:
|
|
588
|
-
self._function_queueing_progress_bar.update(
|
|
593
|
+
self._function_queueing_progress_bar.update(
|
|
594
|
+
progress_task_id,
|
|
595
|
+
description=task_desc if description else None,
|
|
596
|
+
completed=completed,
|
|
597
|
+
total=total,
|
|
598
|
+
)
|
|
589
599
|
if completed == total:
|
|
590
600
|
del self._task_progress_items[task_key]
|
|
591
601
|
self._function_queueing_progress_bar.remove_task(progress_task_id)
|
|
@@ -288,11 +288,21 @@ class TaskCommandRouterClient:
|
|
|
288
288
|
server_client,
|
|
289
289
|
sandbox_id: str,
|
|
290
290
|
task_id: str,
|
|
291
|
+
access: api_pb2.CommandRouterAccess | None = None,
|
|
291
292
|
) -> "TaskCommandRouterClient":
|
|
292
|
-
"""Initialize a TaskCommandRouterClient for a V2 sandbox.
|
|
293
|
-
|
|
293
|
+
"""Initialize a TaskCommandRouterClient for a V2 sandbox.
|
|
294
|
+
|
|
295
|
+
`access` is the router access returned by SandboxCreateV2, which lets a
|
|
296
|
+
freshly created sandbox connect without a round-trip. When it is absent —
|
|
297
|
+
a re-attached sandbox, or the server could not mint a token — we ask for it.
|
|
298
|
+
"""
|
|
299
|
+
if access is not None:
|
|
300
|
+
url, jwt = access.url, access.jwt
|
|
301
|
+
else:
|
|
302
|
+
resp = await fetch_command_router_access_v2(server_client, sandbox_id=sandbox_id)
|
|
303
|
+
url, jwt = resp.url, resp.jwt
|
|
294
304
|
logger.debug(f"Using command router access for sandbox {sandbox_id}")
|
|
295
|
-
return await cls._connect(server_client, task_id,
|
|
305
|
+
return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id)
|
|
296
306
|
|
|
297
307
|
@classmethod
|
|
298
308
|
async def init_v2_by_task_id(
|
|
@@ -37,7 +37,7 @@ class _Client:
|
|
|
37
37
|
server_url: str,
|
|
38
38
|
client_type: int,
|
|
39
39
|
credentials: typing.Optional[tuple[str, str]],
|
|
40
|
-
version: str = "1.5.4.
|
|
40
|
+
version: str = "1.5.4.dev9",
|
|
41
41
|
):
|
|
42
42
|
"""mdmd:hidden
|
|
43
43
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -207,7 +207,7 @@ class Client:
|
|
|
207
207
|
server_url: str,
|
|
208
208
|
client_type: int,
|
|
209
209
|
credentials: typing.Optional[tuple[str, str]],
|
|
210
|
-
version: str = "1.5.4.
|
|
210
|
+
version: str = "1.5.4.dev9",
|
|
211
211
|
):
|
|
212
212
|
"""mdmd:hidden
|
|
213
213
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -546,7 +546,7 @@ class Function(
|
|
|
546
546
|
|
|
547
547
|
_call_generator: ___call_generator_spec
|
|
548
548
|
|
|
549
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
549
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
550
550
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
551
551
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
552
552
|
|
|
@@ -571,7 +571,7 @@ class Function(
|
|
|
571
571
|
"""
|
|
572
572
|
...
|
|
573
573
|
|
|
574
|
-
remote: __remote_spec[modal._functions.
|
|
574
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
|
|
575
575
|
|
|
576
576
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
577
577
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -621,7 +621,7 @@ class Function(
|
|
|
621
621
|
"""
|
|
622
622
|
...
|
|
623
623
|
|
|
624
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
624
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
625
625
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
626
626
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
627
627
|
|
|
@@ -654,7 +654,7 @@ class Function(
|
|
|
654
654
|
"""
|
|
655
655
|
...
|
|
656
656
|
|
|
657
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
657
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
658
658
|
|
|
659
659
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
660
660
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -662,7 +662,7 @@ class Function(
|
|
|
662
662
|
|
|
663
663
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
664
664
|
|
|
665
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
665
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
666
666
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
667
667
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
668
668
|
|
|
@@ -695,7 +695,7 @@ class Function(
|
|
|
695
695
|
"""
|
|
696
696
|
...
|
|
697
697
|
|
|
698
|
-
spawn: __spawn_spec[modal._functions.
|
|
698
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
699
699
|
|
|
700
700
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
701
701
|
"""Return the inner Python object wrapped by this Modal Function.
|
|
@@ -333,6 +333,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
333
333
|
_tunnels: dict[int, Tunnel] | None
|
|
334
334
|
_enable_snapshot: bool
|
|
335
335
|
_command_router_client: TaskCommandRouterClient | None
|
|
336
|
+
_init_command_router_access: api_pb2.CommandRouterAccess | None
|
|
336
337
|
_attached: bool
|
|
337
338
|
_filesystem: _SandboxFilesystem | None
|
|
338
339
|
_is_v2: bool = False
|
|
@@ -1034,6 +1035,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1034
1035
|
self._hydrate(sandbox_id, load_context.client, create_resp.metadata)
|
|
1035
1036
|
self._is_v2 = True
|
|
1036
1037
|
self._task_id = create_resp.task_id
|
|
1038
|
+
# An unset proto message reads as an empty one rather than None, so the
|
|
1039
|
+
# presence check is what distinguishes "no access" from "empty access".
|
|
1040
|
+
if create_resp.HasField("command_router_access"):
|
|
1041
|
+
self._init_command_router_access = create_resp.command_router_access
|
|
1037
1042
|
self._hydrate_metadata_v2()
|
|
1038
1043
|
# Unencrypted tunnel endpoints are not known at create time. Only
|
|
1039
1044
|
# cache a complete set so tunnels() fetches the rest otherwise.
|
|
@@ -1121,6 +1126,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1121
1126
|
self._tunnels = None
|
|
1122
1127
|
self._enable_snapshot = False
|
|
1123
1128
|
self._command_router_client = None
|
|
1129
|
+
self._init_command_router_access = None
|
|
1124
1130
|
self._filesystem = None
|
|
1125
1131
|
self._is_v2 = _is_v2_sandbox_id(self.object_id)
|
|
1126
1132
|
if self._is_v2:
|
|
@@ -1912,8 +1918,12 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1912
1918
|
if self._command_router_client is None:
|
|
1913
1919
|
try:
|
|
1914
1920
|
if self._is_v2:
|
|
1921
|
+
# Consume the seeded access, so if connecting with it fails the
|
|
1922
|
+
# retry falls back to the authoritative RPC instead of
|
|
1923
|
+
# re-trying the same credentials forever.
|
|
1924
|
+
access, self._init_command_router_access = self._init_command_router_access, None
|
|
1915
1925
|
self._command_router_client = await TaskCommandRouterClient.init_v2_by_sandbox_id(
|
|
1916
|
-
self._client, self.object_id, task_id
|
|
1926
|
+
self._client, self.object_id, task_id, access
|
|
1917
1927
|
)
|
|
1918
1928
|
else:
|
|
1919
1929
|
self._command_router_client = await TaskCommandRouterClient.init(self._client, task_id)
|
|
@@ -147,6 +147,7 @@ class _Sandbox(modal._object._Object):
|
|
|
147
147
|
_tunnels: typing.Optional[dict[int, modal._tunnel.Tunnel]]
|
|
148
148
|
_enable_snapshot: bool
|
|
149
149
|
_command_router_client: typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]
|
|
150
|
+
_init_command_router_access: typing.Optional[modal_proto.api_pb2.CommandRouterAccess]
|
|
150
151
|
_attached: bool
|
|
151
152
|
_filesystem: typing.Optional[modal.sandbox_fs._SandboxFilesystem]
|
|
152
153
|
_is_v2: bool
|
|
@@ -1454,6 +1455,7 @@ class Sandbox(modal.object.Object):
|
|
|
1454
1455
|
_tunnels: typing.Optional[dict[int, modal._tunnel.Tunnel]]
|
|
1455
1456
|
_enable_snapshot: bool
|
|
1456
1457
|
_command_router_client: typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]
|
|
1458
|
+
_init_command_router_access: typing.Optional[modal_proto.api_pb2.CommandRouterAccess]
|
|
1457
1459
|
_attached: bool
|
|
1458
1460
|
_filesystem: typing.Optional[modal.sandbox_fs.SandboxFilesystem]
|
|
1459
1461
|
_is_v2: bool
|
|
@@ -327,6 +327,10 @@ class ModalClientBase(abc.ABC):
|
|
|
327
327
|
async def EnvironmentSetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetBudgetRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
328
328
|
pass
|
|
329
329
|
|
|
330
|
+
@abc.abstractmethod
|
|
331
|
+
async def EnvironmentSetDefaultMemberRole(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
332
|
+
pass
|
|
333
|
+
|
|
330
334
|
@abc.abstractmethod
|
|
331
335
|
async def EnvironmentSetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetManagedRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
332
336
|
pass
|
|
@@ -1419,6 +1423,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1419
1423
|
modal_proto.api_pb2.EnvironmentSetBudgetRequest,
|
|
1420
1424
|
google.protobuf.empty_pb2.Empty,
|
|
1421
1425
|
),
|
|
1426
|
+
'/modal.client.ModalClient/EnvironmentSetDefaultMemberRole': grpclib.const.Handler(
|
|
1427
|
+
self.EnvironmentSetDefaultMemberRole,
|
|
1428
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1429
|
+
modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest,
|
|
1430
|
+
google.protobuf.empty_pb2.Empty,
|
|
1431
|
+
),
|
|
1422
1432
|
'/modal.client.ModalClient/EnvironmentSetManaged': grpclib.const.Handler(
|
|
1423
1433
|
self.EnvironmentSetManaged,
|
|
1424
1434
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -2829,6 +2839,12 @@ class ModalClientStub:
|
|
|
2829
2839
|
modal_proto.api_pb2.EnvironmentSetBudgetRequest,
|
|
2830
2840
|
google.protobuf.empty_pb2.Empty,
|
|
2831
2841
|
)
|
|
2842
|
+
self.EnvironmentSetDefaultMemberRole = grpclib.client.UnaryUnaryMethod(
|
|
2843
|
+
channel,
|
|
2844
|
+
'/modal.client.ModalClient/EnvironmentSetDefaultMemberRole',
|
|
2845
|
+
modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest,
|
|
2846
|
+
google.protobuf.empty_pb2.Empty,
|
|
2847
|
+
)
|
|
2832
2848
|
self.EnvironmentSetManaged = grpclib.client.UnaryUnaryMethod(
|
|
2833
2849
|
channel,
|
|
2834
2850
|
'/modal.client.ModalClient/EnvironmentSetManaged',
|