modal 1.5.3.dev2__tar.gz → 1.5.3.dev3__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.3.dev2 → modal-1.5.3.dev3}/PKG-INFO +1 -1
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_functions.py +26 -3
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/grpc_utils.py +1 -1
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/client.pyi +2 -2
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cls.py +3 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/config.py +2 -1
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/functions.pyi +22 -6
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/sandbox.py +7 -3
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/sandbox.pyi +20 -8
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/api_grpc.py +16 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/api_pb2.py +933 -900
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/api_pb2.pyi +56 -3
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/api_pb2_grpc.py +33 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/api_pb2_grpc.pyi +10 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/modal_api_grpc.py +1 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_version/__init__.py +1 -1
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/LICENSE +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/README.md +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/__main__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_billing.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_clustered_functions.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_environments.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_function_variants.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_grpc_client.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_image.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_ipython.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_load_context.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_location.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_logs.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_object.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_output/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_output/manager.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_output/pty.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_output/rich.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_output/status.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_partial_function.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_resolver.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_resources.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_serialization.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_server.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_traceback.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_tunnel.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_tunnel.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_type_manager.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/logger.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_vendor/version.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_watcher.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/_workspace.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/app.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/app.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/billing.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/billing.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/README.md +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/builder/base-images.json +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/call_graph.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/_download.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/_help.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/_traceback.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/app.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/billing.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/changelog.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/cluster.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/config.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/container.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/curl.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/dashboard.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/dict.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/endpoint.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/entry_point.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/environment.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/image.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/import_refs.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/launch.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/logo.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/profile.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/queues.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/run.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/secret.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/selector.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/shell.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/skills.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/token.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/utils.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/volume.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cli/workspace.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/client.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/cls.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/container_process.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/container_process.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/dict.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/dict.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/environments.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/environments.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/exception.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/experimental/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/experimental/flash.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/experimental/ipython.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/file_io.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/file_io.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/functions.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/image.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/image.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/io_streams.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/io_streams.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/mount.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/mount.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/network_file_system.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/network_file_system.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/object.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/object.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/output.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/parallel_map.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/parallel_map.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/partial_function.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/partial_function.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/proxy.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/proxy.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/py.typed +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/queue.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/queue.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/retries.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/runner.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/runner.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/running_app.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/sandbox_fs.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/schedule.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/scheduler_placement.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/secret.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/secret.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/server.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/server.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/serving.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/serving.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/snapshot.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/snapshot.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/stream_type.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/token_flow.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/token_flow.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/types.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/volume.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/volume.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/workspace.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal/workspace.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/__init__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/py.typed +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/modal_version/__main__.py +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/pyproject.toml +0 -0
- {modal-1.5.3.dev2 → modal-1.5.3.dev3}/setup.cfg +0 -0
|
@@ -627,6 +627,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
627
627
|
_metadata: api_pb2.FunctionHandleMetadata | None = None
|
|
628
628
|
_options: _FunctionOptions
|
|
629
629
|
_base_function: "_Function | None" = None
|
|
630
|
+
_app_id: str | None = None
|
|
630
631
|
|
|
631
632
|
@staticmethod
|
|
632
633
|
def from_local(
|
|
@@ -1403,6 +1404,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1403
1404
|
metadata.max_object_size_bytes if metadata.HasField("max_object_size_bytes") else MAX_OBJECT_SIZE_BYTES
|
|
1404
1405
|
)
|
|
1405
1406
|
self._experimental_flash_urls = metadata._experimental_flash_urls
|
|
1407
|
+
self._app_id = metadata.app_id or None
|
|
1406
1408
|
|
|
1407
1409
|
# Invalidate the Function variant cache when we load new metadata, since the base Function handle
|
|
1408
1410
|
# is now in sync with the server but any previously-cached variants may be stale.
|
|
@@ -1412,6 +1414,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1412
1414
|
# Overridden concrete implementation of base class method
|
|
1413
1415
|
assert self._function_name, f"Function name must be set before metadata can be retrieved for {self}"
|
|
1414
1416
|
return api_pb2.FunctionHandleMetadata(
|
|
1417
|
+
app_id=self._app_id or "",
|
|
1415
1418
|
function_name=self._function_name,
|
|
1416
1419
|
function_type=get_function_type(self._is_generator),
|
|
1417
1420
|
web_url=self._web_url or "",
|
|
@@ -1673,6 +1676,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1673
1676
|
)
|
|
1674
1677
|
fc: _FunctionCall[ReturnType] = _FunctionCall._new_hydrated(function_call_id, self.client, None)
|
|
1675
1678
|
fc._num_inputs = num_inputs # set the cached value of num_inputs
|
|
1679
|
+
fc._app_id = self._app_id
|
|
1680
|
+
fc._function_id = self.object_id
|
|
1676
1681
|
return fc
|
|
1677
1682
|
|
|
1678
1683
|
async def _call_function(self, args, kwargs) -> ReturnType:
|
|
@@ -1884,6 +1889,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1884
1889
|
invocation.function_call_id, invocation.client, None
|
|
1885
1890
|
)
|
|
1886
1891
|
fc._is_generator = self._is_generator if self._is_generator else False
|
|
1892
|
+
fc._app_id = self._app_id
|
|
1893
|
+
fc._function_id = self.object_id
|
|
1887
1894
|
return fc
|
|
1888
1895
|
|
|
1889
1896
|
@synchronizer.no_input_translation
|
|
@@ -1920,6 +1927,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1920
1927
|
fc: _FunctionCall[ReturnType] = _FunctionCall._new_hydrated(
|
|
1921
1928
|
invocation.function_call_id, invocation.client, None
|
|
1922
1929
|
)
|
|
1930
|
+
fc._app_id = self._app_id
|
|
1931
|
+
fc._function_id = self.object_id
|
|
1923
1932
|
return fc
|
|
1924
1933
|
|
|
1925
1934
|
def get_raw_f(self) -> Callable[..., Any]:
|
|
@@ -1979,10 +1988,18 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
|
|
|
1979
1988
|
|
|
1980
1989
|
_is_generator: bool = False
|
|
1981
1990
|
_num_inputs: int | None = None
|
|
1991
|
+
_app_id: str | None = None
|
|
1992
|
+
_function_id: str | None = None
|
|
1982
1993
|
|
|
1983
1994
|
def _invocation(self):
|
|
1984
1995
|
return _Invocation(self.client.stub, self.object_id, self.client)
|
|
1985
1996
|
|
|
1997
|
+
async def _hydrate_from_id_metadata(self) -> None:
|
|
1998
|
+
"""Hydrate metadata only when needed for FunctionCall fields."""
|
|
1999
|
+
request = api_pb2.FunctionCallFromIdRequest(function_call_id=self.object_id)
|
|
2000
|
+
resp = await self.client.stub.FunctionCallFromId(request)
|
|
2001
|
+
self._hydrate_metadata(resp)
|
|
2002
|
+
|
|
1986
2003
|
@live_method
|
|
1987
2004
|
async def num_inputs(self) -> int:
|
|
1988
2005
|
"""Get the number of inputs in the function call.
|
|
@@ -1991,9 +2008,8 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
|
|
|
1991
2008
|
How many inputs this function call includes (e.g. `1` for `.spawn()`, more for `.spawn_map()`).
|
|
1992
2009
|
"""
|
|
1993
2010
|
if self._num_inputs is None:
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
self._num_inputs = resp.num_inputs # cached
|
|
2011
|
+
await self._hydrate_from_id_metadata()
|
|
2012
|
+
assert self._num_inputs is not None
|
|
1997
2013
|
return self._num_inputs
|
|
1998
2014
|
|
|
1999
2015
|
@live_method
|
|
@@ -2135,6 +2151,13 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
|
|
|
2135
2151
|
)
|
|
2136
2152
|
return typing.cast("modal.functions.FunctionCall[Any]", synchronizer._translate_out(impl_instance))
|
|
2137
2153
|
|
|
2154
|
+
def _hydrate_metadata(self, metadata: Message | None):
|
|
2155
|
+
# Overridden concrete implementation of base class method
|
|
2156
|
+
if isinstance(metadata, api_pb2.FunctionCallFromIdResponse):
|
|
2157
|
+
self._num_inputs = metadata.num_inputs
|
|
2158
|
+
self._app_id = metadata.metadata.app_id or None
|
|
2159
|
+
self._function_id = metadata.metadata.function_id or None
|
|
2160
|
+
|
|
2138
2161
|
@staticmethod
|
|
2139
2162
|
async def gather(*function_calls: "_FunctionCall[T]") -> typing.Sequence[T]:
|
|
2140
2163
|
"""Wait until all Modal FunctionCall objects have results before returning.
|
|
@@ -325,7 +325,7 @@ def create_channel(
|
|
|
325
325
|
async def create_channel_with_fallbacks(
|
|
326
326
|
server_url: str,
|
|
327
327
|
metadata: dict[str, str] = {},
|
|
328
|
-
stagger_delay: float =
|
|
328
|
+
stagger_delay: float = 3.0,
|
|
329
329
|
) -> grpclib.client.Channel:
|
|
330
330
|
"""Create a connected channel, supporting comma-separated fallback URLs.
|
|
331
331
|
|
|
@@ -35,7 +35,7 @@ class _Client:
|
|
|
35
35
|
server_url: str,
|
|
36
36
|
client_type: int,
|
|
37
37
|
credentials: typing.Optional[tuple[str, str]],
|
|
38
|
-
version: str = "1.5.3.
|
|
38
|
+
version: str = "1.5.3.dev3",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -205,7 +205,7 @@ class Client:
|
|
|
205
205
|
server_url: str,
|
|
206
206
|
client_type: int,
|
|
207
207
|
credentials: typing.Optional[tuple[str, str]],
|
|
208
|
-
version: str = "1.5.3.
|
|
208
|
+
version: str = "1.5.3.dev3",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -86,6 +86,8 @@ def _bind_instance_method(cls: "_Cls", service_function: _Function, method_name:
|
|
|
86
86
|
|
|
87
87
|
method_metadata = service_function._method_handle_metadata[method_name]
|
|
88
88
|
new_function._hydrate(service_function.object_id, service_function.client, method_metadata)
|
|
89
|
+
if not new_function._app_id:
|
|
90
|
+
new_function._app_id = service_function._app_id
|
|
89
91
|
|
|
90
92
|
async def _load(fun: "_Function", resolver: Resolver, load_context: LoadContext, existing_object_id: str | None):
|
|
91
93
|
# there is currently no actual loading logic executed to create each method on
|
|
@@ -426,6 +428,7 @@ class _Obj:
|
|
|
426
428
|
)
|
|
427
429
|
await resolver.load(method_function, load_context) # get the appropriate method handle (lazy)
|
|
428
430
|
fun._hydrate_from_other(method_function)
|
|
431
|
+
fun._app_id = method_function._app_id
|
|
429
432
|
|
|
430
433
|
# The reason we don't *always* use this lazy loader is because it precludes attribute access
|
|
431
434
|
# on local classes.
|
|
@@ -106,7 +106,8 @@ from modal_proto import api_pb2
|
|
|
106
106
|
from ._utils.logger import configure_logger
|
|
107
107
|
from .exception import InvalidError, NotFoundError
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
# By default, try api.modal.com and fail over to api.modal2.com
|
|
110
|
+
DEFAULT_SERVER_URL = "https://api.modal.com,https://api.modal2.com"
|
|
110
111
|
|
|
111
112
|
|
|
112
113
|
# Locate config file and read it
|
|
@@ -58,6 +58,7 @@ class Function(
|
|
|
58
58
|
_metadata: typing.Optional[modal_proto.api_pb2.FunctionHandleMetadata]
|
|
59
59
|
_options: modal._function_variants._FunctionOptions
|
|
60
60
|
_base_function: typing.Optional[Function]
|
|
61
|
+
_app_id: typing.Optional[str]
|
|
61
62
|
|
|
62
63
|
def __init__(self, *args, **kwargs):
|
|
63
64
|
"""mdmd:hidden"""
|
|
@@ -492,7 +493,7 @@ class Function(
|
|
|
492
493
|
|
|
493
494
|
_call_generator: ___call_generator_spec
|
|
494
495
|
|
|
495
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
496
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
496
497
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
497
498
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
498
499
|
|
|
@@ -517,7 +518,7 @@ class Function(
|
|
|
517
518
|
"""
|
|
518
519
|
...
|
|
519
520
|
|
|
520
|
-
remote: __remote_spec[modal._functions.
|
|
521
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
|
|
521
522
|
|
|
522
523
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
523
524
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -567,7 +568,7 @@ class Function(
|
|
|
567
568
|
"""
|
|
568
569
|
...
|
|
569
570
|
|
|
570
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
571
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
571
572
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
572
573
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
573
574
|
|
|
@@ -600,7 +601,7 @@ class Function(
|
|
|
600
601
|
"""
|
|
601
602
|
...
|
|
602
603
|
|
|
603
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
604
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
604
605
|
|
|
605
606
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
606
607
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -608,7 +609,7 @@ class Function(
|
|
|
608
609
|
|
|
609
610
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
610
611
|
|
|
611
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
612
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
612
613
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
613
614
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
614
615
|
|
|
@@ -641,7 +642,7 @@ class Function(
|
|
|
641
642
|
"""
|
|
642
643
|
...
|
|
643
644
|
|
|
644
|
-
spawn: __spawn_spec[modal._functions.
|
|
645
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
645
646
|
|
|
646
647
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
647
648
|
"""Return the inner Python object wrapped by this Modal Function.
|
|
@@ -892,6 +893,8 @@ class FunctionCall(typing.Generic[modal._functions.ReturnType], modal.object.Obj
|
|
|
892
893
|
|
|
893
894
|
_is_generator: bool
|
|
894
895
|
_num_inputs: typing.Optional[int]
|
|
896
|
+
_app_id: typing.Optional[str]
|
|
897
|
+
_function_id: typing.Optional[str]
|
|
895
898
|
|
|
896
899
|
def __init__(self, *args, **kwargs):
|
|
897
900
|
"""mdmd:hidden"""
|
|
@@ -899,6 +902,17 @@ class FunctionCall(typing.Generic[modal._functions.ReturnType], modal.object.Obj
|
|
|
899
902
|
|
|
900
903
|
def _invocation(self): ...
|
|
901
904
|
|
|
905
|
+
class ___hydrate_from_id_metadata_spec(typing_extensions.Protocol):
|
|
906
|
+
def __call__(self, /) -> None:
|
|
907
|
+
"""Hydrate metadata only when needed for FunctionCall fields."""
|
|
908
|
+
...
|
|
909
|
+
|
|
910
|
+
async def aio(self, /) -> None:
|
|
911
|
+
"""Hydrate metadata only when needed for FunctionCall fields."""
|
|
912
|
+
...
|
|
913
|
+
|
|
914
|
+
_hydrate_from_id_metadata: ___hydrate_from_id_metadata_spec
|
|
915
|
+
|
|
902
916
|
class __num_inputs_spec(typing_extensions.Protocol):
|
|
903
917
|
def __call__(self, /) -> int:
|
|
904
918
|
"""Get the number of inputs in the function call.
|
|
@@ -1115,6 +1129,8 @@ class FunctionCall(typing.Generic[modal._functions.ReturnType], modal.object.Obj
|
|
|
1115
1129
|
|
|
1116
1130
|
from_id: typing.ClassVar[__from_id_spec]
|
|
1117
1131
|
|
|
1132
|
+
def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
|
|
1133
|
+
|
|
1118
1134
|
class __gather_spec(typing_extensions.Protocol):
|
|
1119
1135
|
def __call__(self, /, *function_calls: FunctionCall[modal._functions.T]) -> typing.Sequence[modal._functions.T]:
|
|
1120
1136
|
"""Wait until all Modal FunctionCall objects have results before returning.
|
|
@@ -349,7 +349,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
349
349
|
gpu: str | None = None,
|
|
350
350
|
cloud: str | None = None,
|
|
351
351
|
region: str | Sequence[str] | None = None,
|
|
352
|
-
cpu: float | None = None,
|
|
352
|
+
cpu: float | tuple[float, float] | None = None,
|
|
353
353
|
memory: int | tuple[int, int] | None = None,
|
|
354
354
|
mounts: Sequence[_Mount] = (),
|
|
355
355
|
network_file_systems: dict[str | os.PathLike, _NetworkFileSystem] = {},
|
|
@@ -823,8 +823,8 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
823
823
|
timeout: int = 300,
|
|
824
824
|
idle_timeout: int | None = None,
|
|
825
825
|
workdir: str | None = None,
|
|
826
|
-
cpu: float | None = None,
|
|
827
|
-
memory: int | None = None,
|
|
826
|
+
cpu: float | tuple[float, float] | None = None,
|
|
827
|
+
memory: int | tuple[int, int] | None = None,
|
|
828
828
|
cloud: str | None = None,
|
|
829
829
|
region: str | Sequence[str] | None = None,
|
|
830
830
|
block_network: bool = False,
|
|
@@ -852,6 +852,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
852
852
|
`secret=...` or `oidc_auth_role_arn`), OIDC identity tokens, proxies, and
|
|
853
853
|
filesystem snapshots.
|
|
854
854
|
|
|
855
|
+
`cpu` and `memory` accept either a scalar request or a `(request, limit)`
|
|
856
|
+
tuple that additionally sets a hard limit (fractional CPU cores; memory
|
|
857
|
+
in MiB), matching `Sandbox.create()`.
|
|
858
|
+
|
|
855
859
|
Features like memory snapshots, network file systems, GPUs, and custom
|
|
856
860
|
domains are not supported.
|
|
857
861
|
|
|
@@ -165,7 +165,7 @@ class _Sandbox(modal._object._Object):
|
|
|
165
165
|
gpu: typing.Optional[str] = None,
|
|
166
166
|
cloud: typing.Optional[str] = None,
|
|
167
167
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
168
|
-
cpu: typing.
|
|
168
|
+
cpu: typing.Union[float, tuple[float, float], None] = None,
|
|
169
169
|
memory: typing.Union[int, tuple[int, int], None] = None,
|
|
170
170
|
mounts: collections.abc.Sequence[modal.mount._Mount] = (),
|
|
171
171
|
network_file_systems: dict[typing.Union[str, os.PathLike], modal.network_file_system._NetworkFileSystem] = {},
|
|
@@ -368,8 +368,8 @@ class _Sandbox(modal._object._Object):
|
|
|
368
368
|
timeout: int = 300,
|
|
369
369
|
idle_timeout: typing.Optional[int] = None,
|
|
370
370
|
workdir: typing.Optional[str] = None,
|
|
371
|
-
cpu: typing.
|
|
372
|
-
memory: typing.
|
|
371
|
+
cpu: typing.Union[float, tuple[float, float], None] = None,
|
|
372
|
+
memory: typing.Union[int, tuple[int, int], None] = None,
|
|
373
373
|
cloud: typing.Optional[str] = None,
|
|
374
374
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
375
375
|
block_network: bool = False,
|
|
@@ -400,6 +400,10 @@ class _Sandbox(modal._object._Object):
|
|
|
400
400
|
`secret=...` or `oidc_auth_role_arn`), OIDC identity tokens, proxies, and
|
|
401
401
|
filesystem snapshots.
|
|
402
402
|
|
|
403
|
+
`cpu` and `memory` accept either a scalar request or a `(request, limit)`
|
|
404
|
+
tuple that additionally sets a hard limit (fractional CPU cores; memory
|
|
405
|
+
in MiB), matching `Sandbox.create()`.
|
|
406
|
+
|
|
403
407
|
Features like memory snapshots, network file systems, GPUs, and custom
|
|
404
408
|
domains are not supported.
|
|
405
409
|
|
|
@@ -1337,7 +1341,7 @@ class Sandbox(modal.object.Object):
|
|
|
1337
1341
|
gpu: typing.Optional[str] = None,
|
|
1338
1342
|
cloud: typing.Optional[str] = None,
|
|
1339
1343
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
1340
|
-
cpu: typing.
|
|
1344
|
+
cpu: typing.Union[float, tuple[float, float], None] = None,
|
|
1341
1345
|
memory: typing.Union[int, tuple[int, int], None] = None,
|
|
1342
1346
|
mounts: collections.abc.Sequence[modal.mount.Mount] = (),
|
|
1343
1347
|
network_file_systems: dict[typing.Union[str, os.PathLike], modal.network_file_system.NetworkFileSystem] = {},
|
|
@@ -1721,8 +1725,8 @@ class Sandbox(modal.object.Object):
|
|
|
1721
1725
|
timeout: int = 300,
|
|
1722
1726
|
idle_timeout: typing.Optional[int] = None,
|
|
1723
1727
|
workdir: typing.Optional[str] = None,
|
|
1724
|
-
cpu: typing.
|
|
1725
|
-
memory: typing.
|
|
1728
|
+
cpu: typing.Union[float, tuple[float, float], None] = None,
|
|
1729
|
+
memory: typing.Union[int, tuple[int, int], None] = None,
|
|
1726
1730
|
cloud: typing.Optional[str] = None,
|
|
1727
1731
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
1728
1732
|
block_network: bool = False,
|
|
@@ -1753,6 +1757,10 @@ class Sandbox(modal.object.Object):
|
|
|
1753
1757
|
`secret=...` or `oidc_auth_role_arn`), OIDC identity tokens, proxies, and
|
|
1754
1758
|
filesystem snapshots.
|
|
1755
1759
|
|
|
1760
|
+
`cpu` and `memory` accept either a scalar request or a `(request, limit)`
|
|
1761
|
+
tuple that additionally sets a hard limit (fractional CPU cores; memory
|
|
1762
|
+
in MiB), matching `Sandbox.create()`.
|
|
1763
|
+
|
|
1756
1764
|
Features like memory snapshots, network file systems, GPUs, and custom
|
|
1757
1765
|
domains are not supported.
|
|
1758
1766
|
|
|
@@ -1783,8 +1791,8 @@ class Sandbox(modal.object.Object):
|
|
|
1783
1791
|
timeout: int = 300,
|
|
1784
1792
|
idle_timeout: typing.Optional[int] = None,
|
|
1785
1793
|
workdir: typing.Optional[str] = None,
|
|
1786
|
-
cpu: typing.
|
|
1787
|
-
memory: typing.
|
|
1794
|
+
cpu: typing.Union[float, tuple[float, float], None] = None,
|
|
1795
|
+
memory: typing.Union[int, tuple[int, int], None] = None,
|
|
1788
1796
|
cloud: typing.Optional[str] = None,
|
|
1789
1797
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
|
1790
1798
|
block_network: bool = False,
|
|
@@ -1815,6 +1823,10 @@ class Sandbox(modal.object.Object):
|
|
|
1815
1823
|
`secret=...` or `oidc_auth_role_arn`), OIDC identity tokens, proxies, and
|
|
1816
1824
|
filesystem snapshots.
|
|
1817
1825
|
|
|
1826
|
+
`cpu` and `memory` accept either a scalar request or a `(request, limit)`
|
|
1827
|
+
tuple that additionally sets a hard limit (fractional CPU cores; memory
|
|
1828
|
+
in MiB), matching `Sandbox.create()`.
|
|
1829
|
+
|
|
1818
1830
|
Features like memory snapshots, network file systems, GPUs, and custom
|
|
1819
1831
|
domains are not supported.
|
|
1820
1832
|
|
|
@@ -639,6 +639,10 @@ class ModalClientBase(abc.ABC):
|
|
|
639
639
|
async def SandboxRestore(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxRestoreRequest, modal_proto.api_pb2.SandboxRestoreResponse]') -> None:
|
|
640
640
|
pass
|
|
641
641
|
|
|
642
|
+
@abc.abstractmethod
|
|
643
|
+
async def SandboxSetName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSetNameRequest, modal_proto.api_pb2.SandboxSetNameResponse]') -> None:
|
|
644
|
+
pass
|
|
645
|
+
|
|
642
646
|
@abc.abstractmethod
|
|
643
647
|
async def SandboxSnapshot(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSnapshotRequest, modal_proto.api_pb2.SandboxSnapshotResponse]') -> None:
|
|
644
648
|
pass
|
|
@@ -1871,6 +1875,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1871
1875
|
modal_proto.api_pb2.SandboxRestoreRequest,
|
|
1872
1876
|
modal_proto.api_pb2.SandboxRestoreResponse,
|
|
1873
1877
|
),
|
|
1878
|
+
'/modal.client.ModalClient/SandboxSetName': grpclib.const.Handler(
|
|
1879
|
+
self.SandboxSetName,
|
|
1880
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1881
|
+
modal_proto.api_pb2.SandboxSetNameRequest,
|
|
1882
|
+
modal_proto.api_pb2.SandboxSetNameResponse,
|
|
1883
|
+
),
|
|
1874
1884
|
'/modal.client.ModalClient/SandboxSnapshot': grpclib.const.Handler(
|
|
1875
1885
|
self.SandboxSnapshot,
|
|
1876
1886
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -3257,6 +3267,12 @@ class ModalClientStub:
|
|
|
3257
3267
|
modal_proto.api_pb2.SandboxRestoreRequest,
|
|
3258
3268
|
modal_proto.api_pb2.SandboxRestoreResponse,
|
|
3259
3269
|
)
|
|
3270
|
+
self.SandboxSetName = grpclib.client.UnaryUnaryMethod(
|
|
3271
|
+
channel,
|
|
3272
|
+
'/modal.client.ModalClient/SandboxSetName',
|
|
3273
|
+
modal_proto.api_pb2.SandboxSetNameRequest,
|
|
3274
|
+
modal_proto.api_pb2.SandboxSetNameResponse,
|
|
3275
|
+
)
|
|
3260
3276
|
self.SandboxSnapshot = grpclib.client.UnaryUnaryMethod(
|
|
3261
3277
|
channel,
|
|
3262
3278
|
'/modal.client.ModalClient/SandboxSnapshot',
|