modal 1.5.1.dev5__tar.gz → 1.5.1.dev6__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.1.dev5 → modal-1.5.1.dev6}/PKG-INFO +1 -1
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/__init__.py +2 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_server.py +5 -5
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/app.py +7 -4
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/app.pyi +8 -6
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/client.pyi +2 -2
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/sandbox_fs.py +39 -2
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/server.pyi +2 -2
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/api_grpc.py +32 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/api_pb2.py +839 -809
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/api_pb2.pyi +84 -4
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/api_pb2_grpc.py +66 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/api_pb2_grpc.pyi +20 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/modal_api_grpc.py +2 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/task_command_router_grpc.py +16 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/task_command_router_pb2.py +41 -21
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/task_command_router_pb2.pyi +31 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/task_command_router_pb2_grpc.py +34 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +12 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_version/__init__.py +1 -1
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/LICENSE +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/README.md +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/__main__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_billing.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_clustered_functions.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_environments.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_function_variants.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_functions.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_grpc_client.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_image.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_ipython.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_load_context.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_location.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_logs.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_object.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_output/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_output/manager.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_output/pty.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_output/rich.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_output/status.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_partial_function.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_resolver.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_resources.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_serialization.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_traceback.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_tunnel.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_tunnel.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_type_manager.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/logger.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_vendor/version.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_watcher.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/_workspace.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/billing.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/README.md +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/builder/base-images.json +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/call_graph.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/_download.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/_help.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/_traceback.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/app.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/billing.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/changelog.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/cluster.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/config.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/container.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/dashboard.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/dict.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/entry_point.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/environment.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/image.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/import_refs.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/launch.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/logo.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/profile.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/queues.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/run.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/secret.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/selector.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/shell.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/skills.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/token.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/utils.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cli/volume.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/client.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cls.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/cls.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/config.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/container_process.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/container_process.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/dict.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/dict.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/environments.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/environments.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/exception.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/experimental/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/experimental/flash.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/experimental/ipython.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/file_io.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/file_io.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/functions.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/functions.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/image.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/image.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/io_streams.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/io_streams.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/mount.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/mount.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/network_file_system.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/network_file_system.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/object.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/object.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/output.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/parallel_map.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/parallel_map.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/partial_function.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/partial_function.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/proxy.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/proxy.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/py.typed +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/queue.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/queue.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/retries.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/runner.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/runner.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/running_app.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/sandbox.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/sandbox.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/schedule.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/scheduler_placement.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/secret.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/secret.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/server.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/serving.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/serving.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/snapshot.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/snapshot.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/stream_type.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/token_flow.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/token_flow.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/volume.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/volume.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/workspace.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal/workspace.pyi +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/__init__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_proto/py.typed +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/modal_version/__main__.py +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/pyproject.toml +0 -0
- {modal-1.5.1.dev5 → modal-1.5.1.dev6}/setup.cfg +0 -0
|
@@ -43,6 +43,7 @@ try:
|
|
|
43
43
|
from .schedule import Cron, Period
|
|
44
44
|
from .scheduler_placement import SchedulerPlacement
|
|
45
45
|
from .secret import Secret
|
|
46
|
+
from .server import Server
|
|
46
47
|
from .snapshot import SandboxSnapshot
|
|
47
48
|
from .volume import Volume
|
|
48
49
|
from .workspace import Workspace
|
|
@@ -80,6 +81,7 @@ __all__ = [
|
|
|
80
81
|
"SandboxSnapshot",
|
|
81
82
|
"SchedulerPlacement",
|
|
82
83
|
"Secret",
|
|
84
|
+
"Server",
|
|
83
85
|
"Tunnel",
|
|
84
86
|
"Volume",
|
|
85
87
|
"Workspace",
|
|
@@ -23,7 +23,7 @@ def validate_http_server_config(
|
|
|
23
23
|
proxy_regions: list[str], # The regions to proxy the HTTP server to.
|
|
24
24
|
startup_timeout: int, # Maximum number of seconds to wait for the HTTP server to start.
|
|
25
25
|
exit_grace_period: int | None, # The time to wait for the HTTP server to exit gracefully.
|
|
26
|
-
is_server: bool = False, # Whether this validates a `
|
|
26
|
+
is_server: bool = False, # Whether this validates a `server` config.
|
|
27
27
|
):
|
|
28
28
|
if not isinstance(port, int) or port < 1 or port > 65535:
|
|
29
29
|
raise InvalidError("Port must be a positive integer between 1 and 65535.")
|
|
@@ -49,10 +49,10 @@ class _Server:
|
|
|
49
49
|
See [lifecycle hooks](https://modal.com/docs/guide/lifecycle-functions) for more information.
|
|
50
50
|
|
|
51
51
|
Generally, you will not construct a Server directly.
|
|
52
|
-
Instead, use the [`@app.
|
|
52
|
+
Instead, use the [`@app.server()`](https://modal.com/docs/reference/modal.App#server) decorator.
|
|
53
53
|
|
|
54
54
|
```python notest
|
|
55
|
-
@app.
|
|
55
|
+
@app.server(port=8000, routing_region="us-east")
|
|
56
56
|
class MyServer:
|
|
57
57
|
@modal.enter()
|
|
58
58
|
def start_server(self):
|
|
@@ -158,7 +158,7 @@ class _Server:
|
|
|
158
158
|
) -> "_Server":
|
|
159
159
|
"""Create a Server from a local class definition."""
|
|
160
160
|
|
|
161
|
-
# Note: Validation should be done by the caller (app.
|
|
161
|
+
# Note: Validation should be done by the caller (app.server()) BEFORE creating the Server.
|
|
162
162
|
# Extract the underlying class if wrapped in a _PartialFunction (e.g., from @modal.clustered())
|
|
163
163
|
user_cls = _Server._extract_user_cls(wrapped_user_cls)
|
|
164
164
|
|
|
@@ -211,7 +211,7 @@ class _Server:
|
|
|
211
211
|
user_cls = _Server._extract_user_cls(wrapped_user_cls)
|
|
212
212
|
|
|
213
213
|
if not inspect.isclass(user_cls):
|
|
214
|
-
raise TypeError("The @app.
|
|
214
|
+
raise TypeError("The @app.server() decorator must be used on a class.")
|
|
215
215
|
|
|
216
216
|
# Check for modal.parameter() - not allowed on server classes
|
|
217
217
|
params = {k: v for k, v in user_cls.__dict__.items() if is_parameter(v)}
|
|
@@ -1266,7 +1266,10 @@ class _App:
|
|
|
1266
1266
|
|
|
1267
1267
|
return wrapper
|
|
1268
1268
|
|
|
1269
|
-
def _experimental_server(
|
|
1269
|
+
def _experimental_server(self, **kwargs):
|
|
1270
|
+
return self.server(**kwargs)
|
|
1271
|
+
|
|
1272
|
+
def server(
|
|
1270
1273
|
self,
|
|
1271
1274
|
_warn_parentheses_missing=None, # mdmd:line-hidden
|
|
1272
1275
|
*,
|
|
@@ -1334,7 +1337,7 @@ class _App:
|
|
|
1334
1337
|
startup_timeout: Maximum startup time in seconds.
|
|
1335
1338
|
exit_grace_period: Grace period for in-flight requests on shutdown.
|
|
1336
1339
|
routing_region: Region to route Server requests through.
|
|
1337
|
-
h2_enabled: Enable HTTP/2.
|
|
1340
|
+
h2_enabled: Enable HTTP/2 in the container.
|
|
1338
1341
|
target_concurrency: Target concurrency for the server; 0 disables autoscaling.
|
|
1339
1342
|
cloud: Cloud provider (aws, gcp, oci, auto).
|
|
1340
1343
|
region: Region(s) to run on.
|
|
@@ -1346,7 +1349,7 @@ class _App:
|
|
|
1346
1349
|
|
|
1347
1350
|
Examples:
|
|
1348
1351
|
```python
|
|
1349
|
-
@app.
|
|
1352
|
+
@app.server(port=8000, routing_region="us-east")
|
|
1350
1353
|
class MyServer:
|
|
1351
1354
|
@modal.enter()
|
|
1352
1355
|
def start(self):
|
|
@@ -1358,7 +1361,7 @@ class _App:
|
|
|
1358
1361
|
```
|
|
1359
1362
|
"""
|
|
1360
1363
|
if _warn_parentheses_missing:
|
|
1361
|
-
raise InvalidError("Did you forget parentheses? Suggestion: `@app.
|
|
1364
|
+
raise InvalidError("Did you forget parentheses? Suggestion: `@app.server()`.")
|
|
1362
1365
|
|
|
1363
1366
|
# Validate HTTP server config
|
|
1364
1367
|
validate_http_server_config(
|
|
@@ -728,7 +728,8 @@ class _App:
|
|
|
728
728
|
"""
|
|
729
729
|
...
|
|
730
730
|
|
|
731
|
-
def _experimental_server(
|
|
731
|
+
def _experimental_server(self, **kwargs): ...
|
|
732
|
+
def server(
|
|
732
733
|
self,
|
|
733
734
|
_warn_parentheses_missing=None,
|
|
734
735
|
*,
|
|
@@ -797,7 +798,7 @@ class _App:
|
|
|
797
798
|
startup_timeout: Maximum startup time in seconds.
|
|
798
799
|
exit_grace_period: Grace period for in-flight requests on shutdown.
|
|
799
800
|
routing_region: Region to route Server requests through.
|
|
800
|
-
h2_enabled: Enable HTTP/2.
|
|
801
|
+
h2_enabled: Enable HTTP/2 in the container.
|
|
801
802
|
target_concurrency: Target concurrency for the server; 0 disables autoscaling.
|
|
802
803
|
cloud: Cloud provider (aws, gcp, oci, auto).
|
|
803
804
|
region: Region(s) to run on.
|
|
@@ -809,7 +810,7 @@ class _App:
|
|
|
809
810
|
|
|
810
811
|
Examples:
|
|
811
812
|
```python
|
|
812
|
-
@app.
|
|
813
|
+
@app.server(port=8000, routing_region="us-east")
|
|
813
814
|
class MyServer:
|
|
814
815
|
@modal.enter()
|
|
815
816
|
def start(self):
|
|
@@ -1728,7 +1729,8 @@ class App:
|
|
|
1728
1729
|
"""
|
|
1729
1730
|
...
|
|
1730
1731
|
|
|
1731
|
-
def _experimental_server(
|
|
1732
|
+
def _experimental_server(self, **kwargs): ...
|
|
1733
|
+
def server(
|
|
1732
1734
|
self,
|
|
1733
1735
|
_warn_parentheses_missing=None,
|
|
1734
1736
|
*,
|
|
@@ -1795,7 +1797,7 @@ class App:
|
|
|
1795
1797
|
startup_timeout: Maximum startup time in seconds.
|
|
1796
1798
|
exit_grace_period: Grace period for in-flight requests on shutdown.
|
|
1797
1799
|
routing_region: Region to route Server requests through.
|
|
1798
|
-
h2_enabled: Enable HTTP/2.
|
|
1800
|
+
h2_enabled: Enable HTTP/2 in the container.
|
|
1799
1801
|
target_concurrency: Target concurrency for the server; 0 disables autoscaling.
|
|
1800
1802
|
cloud: Cloud provider (aws, gcp, oci, auto).
|
|
1801
1803
|
region: Region(s) to run on.
|
|
@@ -1807,7 +1809,7 @@ class App:
|
|
|
1807
1809
|
|
|
1808
1810
|
Examples:
|
|
1809
1811
|
```python
|
|
1810
|
-
@app.
|
|
1812
|
+
@app.server(port=8000, routing_region="us-east")
|
|
1811
1813
|
class MyServer:
|
|
1812
1814
|
@modal.enter()
|
|
1813
1815
|
def start(self):
|
|
@@ -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.1.
|
|
38
|
+
version: str = "1.5.1.dev6",
|
|
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.1.
|
|
208
|
+
version: str = "1.5.1.dev6",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -180,29 +180,66 @@ class _SandboxFilesystem:
|
|
|
180
180
|
process = await self._container.exec(_SANDBOX_FS_TOOLS_PATH, make_write_file_command(remote_path))
|
|
181
181
|
try:
|
|
182
182
|
while True:
|
|
183
|
+
logger.debug(
|
|
184
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): reading "
|
|
185
|
+
f"{TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE} bytes from {local_path} at offset {total_bytes}"
|
|
186
|
+
)
|
|
183
187
|
# TODO(saltzm): If this fails, the ContainerProcess will remain alive indefinitely since
|
|
184
188
|
# stdin will remain open. Unfortunately we can't just call write_eof either, since that
|
|
185
189
|
# would lead to a partially written file being persisted. We should catch exceptions
|
|
186
190
|
# from this and kill the ContainerProcess when we have a way to do this.
|
|
187
191
|
chunk = file_obj.read(TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE)
|
|
188
192
|
if not chunk:
|
|
193
|
+
logger.debug(
|
|
194
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): read no data from "
|
|
195
|
+
f"{local_path}, finished reading file"
|
|
196
|
+
)
|
|
189
197
|
break
|
|
190
198
|
total_bytes += len(chunk)
|
|
199
|
+
logger.debug(
|
|
200
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): writing {len(chunk)} bytes "
|
|
201
|
+
f"from {local_path} to remote {remote_path}"
|
|
202
|
+
)
|
|
191
203
|
process.stdin.write(chunk)
|
|
192
204
|
await process.stdin.drain()
|
|
205
|
+
logger.debug(
|
|
206
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished writing "
|
|
207
|
+
f"{len(chunk)} bytes from {local_path} to remote {remote_path}"
|
|
208
|
+
)
|
|
209
|
+
logger.debug(
|
|
210
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): writing eof to remote {remote_path}"
|
|
211
|
+
)
|
|
193
212
|
process.stdin.write_eof()
|
|
194
213
|
await process.stdin.drain()
|
|
214
|
+
logger.debug(
|
|
215
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished writing eof to remote "
|
|
216
|
+
f"{remote_path}"
|
|
217
|
+
)
|
|
195
218
|
# When the FS tools binary exits early on an error, the worker
|
|
196
219
|
# reports the dropped stdin write as ConflictError.
|
|
197
220
|
except ConflictError:
|
|
198
221
|
pass
|
|
199
|
-
|
|
222
|
+
|
|
223
|
+
async def read_stderr():
|
|
224
|
+
stderr = await process.stderr.read()
|
|
225
|
+
logger.debug(f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished reading stderr")
|
|
226
|
+
return stderr
|
|
227
|
+
|
|
228
|
+
async def wait_for_process_completion():
|
|
229
|
+
returncode = await process.wait()
|
|
230
|
+
logger.debug(
|
|
231
|
+
f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished waiting for process "
|
|
232
|
+
"completion"
|
|
233
|
+
)
|
|
234
|
+
return returncode
|
|
235
|
+
|
|
236
|
+
stderr, returncode = await asyncio.gather(read_stderr(), wait_for_process_completion())
|
|
200
237
|
|
|
201
238
|
if returncode != 0:
|
|
202
239
|
raise_write_file_error(returncode, stderr, remote_path)
|
|
203
240
|
|
|
204
241
|
dur_s = max(time.monotonic() - t0, 0.001)
|
|
205
|
-
_log_throughput(f"copy_from_local
|
|
242
|
+
_log_throughput(f"copy_from_local('{local_path}', '{remote_path}')", total_bytes, dur_s)
|
|
206
243
|
|
|
207
244
|
async def copy_to_local(self, remote_path: str, local_path: str | os.PathLike) -> None:
|
|
208
245
|
"""Copy a file from the Sandbox to a local path.
|
|
@@ -11,10 +11,10 @@ class Server:
|
|
|
11
11
|
See [lifecycle hooks](https://modal.com/docs/guide/lifecycle-functions) for more information.
|
|
12
12
|
|
|
13
13
|
Generally, you will not construct a Server directly.
|
|
14
|
-
Instead, use the [`@app.
|
|
14
|
+
Instead, use the [`@app.server()`](https://modal.com/docs/reference/modal.App#server) decorator.
|
|
15
15
|
|
|
16
16
|
```python notest
|
|
17
|
-
@app.
|
|
17
|
+
@app.server(port=8000, routing_region="us-east")
|
|
18
18
|
class MyServer:
|
|
19
19
|
@modal.enter()
|
|
20
20
|
def start_server(self):
|
|
@@ -279,6 +279,10 @@ class ModalClientBase(abc.ABC):
|
|
|
279
279
|
async def EnvironmentDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
280
280
|
pass
|
|
281
281
|
|
|
282
|
+
@abc.abstractmethod
|
|
283
|
+
async def EnvironmentGetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetBudgetRequest, modal_proto.api_pb2.EnvironmentGetBudgetResponse]') -> None:
|
|
284
|
+
pass
|
|
285
|
+
|
|
282
286
|
@abc.abstractmethod
|
|
283
287
|
async def EnvironmentGetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetManagedRequest, modal_proto.api_pb2.EnvironmentGetManagedResponse]') -> None:
|
|
284
288
|
pass
|
|
@@ -295,6 +299,10 @@ class ModalClientBase(abc.ABC):
|
|
|
295
299
|
async def EnvironmentRoleSet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentRoleSetRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
296
300
|
pass
|
|
297
301
|
|
|
302
|
+
@abc.abstractmethod
|
|
303
|
+
async def EnvironmentSetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetBudgetRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
304
|
+
pass
|
|
305
|
+
|
|
298
306
|
@abc.abstractmethod
|
|
299
307
|
async def EnvironmentSetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetManagedRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
300
308
|
pass
|
|
@@ -1235,6 +1243,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1235
1243
|
modal_proto.api_pb2.EnvironmentDeleteRequest,
|
|
1236
1244
|
google.protobuf.empty_pb2.Empty,
|
|
1237
1245
|
),
|
|
1246
|
+
'/modal.client.ModalClient/EnvironmentGetBudget': grpclib.const.Handler(
|
|
1247
|
+
self.EnvironmentGetBudget,
|
|
1248
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1249
|
+
modal_proto.api_pb2.EnvironmentGetBudgetRequest,
|
|
1250
|
+
modal_proto.api_pb2.EnvironmentGetBudgetResponse,
|
|
1251
|
+
),
|
|
1238
1252
|
'/modal.client.ModalClient/EnvironmentGetManaged': grpclib.const.Handler(
|
|
1239
1253
|
self.EnvironmentGetManaged,
|
|
1240
1254
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1259,6 +1273,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1259
1273
|
modal_proto.api_pb2.EnvironmentRoleSetRequest,
|
|
1260
1274
|
google.protobuf.empty_pb2.Empty,
|
|
1261
1275
|
),
|
|
1276
|
+
'/modal.client.ModalClient/EnvironmentSetBudget': grpclib.const.Handler(
|
|
1277
|
+
self.EnvironmentSetBudget,
|
|
1278
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1279
|
+
modal_proto.api_pb2.EnvironmentSetBudgetRequest,
|
|
1280
|
+
google.protobuf.empty_pb2.Empty,
|
|
1281
|
+
),
|
|
1262
1282
|
'/modal.client.ModalClient/EnvironmentSetManaged': grpclib.const.Handler(
|
|
1263
1283
|
self.EnvironmentSetManaged,
|
|
1264
1284
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -2477,6 +2497,12 @@ class ModalClientStub:
|
|
|
2477
2497
|
modal_proto.api_pb2.EnvironmentDeleteRequest,
|
|
2478
2498
|
google.protobuf.empty_pb2.Empty,
|
|
2479
2499
|
)
|
|
2500
|
+
self.EnvironmentGetBudget = grpclib.client.UnaryUnaryMethod(
|
|
2501
|
+
channel,
|
|
2502
|
+
'/modal.client.ModalClient/EnvironmentGetBudget',
|
|
2503
|
+
modal_proto.api_pb2.EnvironmentGetBudgetRequest,
|
|
2504
|
+
modal_proto.api_pb2.EnvironmentGetBudgetResponse,
|
|
2505
|
+
)
|
|
2480
2506
|
self.EnvironmentGetManaged = grpclib.client.UnaryUnaryMethod(
|
|
2481
2507
|
channel,
|
|
2482
2508
|
'/modal.client.ModalClient/EnvironmentGetManaged',
|
|
@@ -2501,6 +2527,12 @@ class ModalClientStub:
|
|
|
2501
2527
|
modal_proto.api_pb2.EnvironmentRoleSetRequest,
|
|
2502
2528
|
google.protobuf.empty_pb2.Empty,
|
|
2503
2529
|
)
|
|
2530
|
+
self.EnvironmentSetBudget = grpclib.client.UnaryUnaryMethod(
|
|
2531
|
+
channel,
|
|
2532
|
+
'/modal.client.ModalClient/EnvironmentSetBudget',
|
|
2533
|
+
modal_proto.api_pb2.EnvironmentSetBudgetRequest,
|
|
2534
|
+
google.protobuf.empty_pb2.Empty,
|
|
2535
|
+
)
|
|
2504
2536
|
self.EnvironmentSetManaged = grpclib.client.UnaryUnaryMethod(
|
|
2505
2537
|
channel,
|
|
2506
2538
|
'/modal.client.ModalClient/EnvironmentSetManaged',
|