modal 1.5.1.dev1__tar.gz → 1.5.1.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.1.dev1 → modal-1.5.1.dev3}/PKG-INFO +1 -1
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_functions.py +4 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_server.py +9 -1
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/app.py +6 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/app.pyi +4 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/shell.py +1 -1
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/client.pyi +2 -2
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/functions.pyi +3 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/server.pyi +8 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2.py +245 -232
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2.pyi +41 -4
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_grpc.py +5 -5
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2.py +93 -93
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2.pyi +10 -5
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2_grpc.py +6 -6
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +4 -4
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_version/__init__.py +1 -1
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/LICENSE +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/README.md +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/__main__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_billing.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_clustered_functions.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_environments.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_function_variants.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_grpc_client.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_image.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_ipython.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_load_context.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_location.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_logs.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_object.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/manager.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/pty.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/rich.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/status.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_partial_function.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_resolver.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_resources.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_serialization.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_traceback.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_tunnel.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_tunnel.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_type_manager.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/logger.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/version.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_watcher.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_workspace.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/billing.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/README.md +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/base-images.json +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/call_graph.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_download.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_help.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_traceback.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/app.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/billing.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/changelog.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/cluster.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/config.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/container.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/dashboard.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/dict.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/entry_point.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/environment.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/image.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/import_refs.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/launch.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/logo.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/profile.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/queues.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/run.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/secret.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/selector.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/skills.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/token.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/utils.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/volume.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/client.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cls.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cls.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/config.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/container_process.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/container_process.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/dict.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/dict.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/environments.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/environments.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/exception.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/flash.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/ipython.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_io.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_io.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/functions.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/image.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/image.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/io_streams.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/io_streams.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/mount.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/mount.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/network_file_system.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/network_file_system.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/object.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/object.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/output.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/parallel_map.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/parallel_map.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/partial_function.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/partial_function.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/proxy.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/proxy.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/py.typed +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/queue.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/queue.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/retries.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/runner.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/runner.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/running_app.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox_fs.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/schedule.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/scheduler_placement.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/secret.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/secret.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/server.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/serving.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/serving.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/snapshot.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/snapshot.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/stream_type.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/token_flow.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/token_flow.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/volume.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/volume.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/workspace.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/workspace.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/__init__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/py.typed +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_version/__main__.py +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/pyproject.toml +0 -0
- {modal-1.5.1.dev1 → modal-1.5.1.dev3}/setup.cfg +0 -0
|
@@ -661,6 +661,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
661
661
|
min_containers: int | None = None,
|
|
662
662
|
max_containers: int | None = None,
|
|
663
663
|
buffer_containers: int | None = None,
|
|
664
|
+
scaleup_window: int | None = None,
|
|
664
665
|
scaledown_window: int | None = None,
|
|
665
666
|
max_concurrent_inputs: int | None = None,
|
|
666
667
|
target_concurrent_inputs: int | None = None,
|
|
@@ -766,6 +767,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
766
767
|
min_containers=min_containers,
|
|
767
768
|
max_containers=max_containers,
|
|
768
769
|
buffer_containers=buffer_containers,
|
|
770
|
+
scaleup_window=scaleup_window,
|
|
769
771
|
scaledown_window=scaledown_window,
|
|
770
772
|
)
|
|
771
773
|
|
|
@@ -1157,6 +1159,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1157
1159
|
min_containers: int | None = None,
|
|
1158
1160
|
max_containers: int | None = None,
|
|
1159
1161
|
buffer_containers: int | None = None,
|
|
1162
|
+
scaleup_window: int | None = None,
|
|
1160
1163
|
scaledown_window: int | None = None,
|
|
1161
1164
|
target_concurrency: int | None = None,
|
|
1162
1165
|
) -> None:
|
|
@@ -1164,6 +1167,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1164
1167
|
min_containers=min_containers,
|
|
1165
1168
|
max_containers=max_containers,
|
|
1166
1169
|
buffer_containers=buffer_containers,
|
|
1170
|
+
scaleup_window=scaleup_window,
|
|
1167
1171
|
scaledown_window=scaledown_window,
|
|
1168
1172
|
target_concurrency=target_concurrency,
|
|
1169
1173
|
)
|
|
@@ -31,7 +31,10 @@ def validate_http_server_config(
|
|
|
31
31
|
raise InvalidError("The `startup_timeout` argument must be positive.")
|
|
32
32
|
if exit_grace_period is not None and exit_grace_period < 0:
|
|
33
33
|
raise InvalidError("The `exit_grace_period` argument must be non-negative.")
|
|
34
|
-
if
|
|
34
|
+
if is_server:
|
|
35
|
+
if exit_grace_period is not None and exit_grace_period > 3600:
|
|
36
|
+
raise InvalidError("The `exit_grace_period` argument must not exceed 3600 seconds (1 hour).")
|
|
37
|
+
elif exit_grace_period is not None and exit_grace_period > 25:
|
|
35
38
|
raise InvalidError("The `exit_grace_period` argument must not exceed 25 seconds.")
|
|
36
39
|
|
|
37
40
|
if not proxy_regions or not proxy_regions[0]:
|
|
@@ -101,6 +104,7 @@ class _Server:
|
|
|
101
104
|
min_containers: int | None = None,
|
|
102
105
|
max_containers: int | None = None,
|
|
103
106
|
buffer_containers: int | None = None,
|
|
107
|
+
scaleup_window: int | None = None,
|
|
104
108
|
scaledown_window: int | None = None,
|
|
105
109
|
target_concurrency: int | None = None,
|
|
106
110
|
) -> None:
|
|
@@ -118,6 +122,9 @@ class _Server:
|
|
|
118
122
|
# Limit this Server to avoid spinning up more than 5 containers
|
|
119
123
|
server.update_autoscaler(max_containers=5)
|
|
120
124
|
|
|
125
|
+
# Require 30 seconds of sustained demand before scaling up
|
|
126
|
+
server.update_autoscaler(scaleup_window=30)
|
|
127
|
+
|
|
121
128
|
# Adjust Server autoscaling to target 20 concurrent requests per replica
|
|
122
129
|
server.update_autoscaler(target_concurrency=20)
|
|
123
130
|
|
|
@@ -129,6 +136,7 @@ class _Server:
|
|
|
129
136
|
return await self._get_service_function()._update_autoscaler(
|
|
130
137
|
min_containers=min_containers,
|
|
131
138
|
max_containers=max_containers,
|
|
139
|
+
scaleup_window=scaleup_window,
|
|
132
140
|
scaledown_window=scaledown_window,
|
|
133
141
|
buffer_containers=buffer_containers,
|
|
134
142
|
target_concurrency=target_concurrency,
|
|
@@ -1284,6 +1284,7 @@ class _App:
|
|
|
1284
1284
|
min_containers: int | None = None, # Minimum number of containers to keep warm
|
|
1285
1285
|
max_containers: int | None = None, # Maximum number of containers
|
|
1286
1286
|
buffer_containers: int | None = None, # Additional idle containers under active load
|
|
1287
|
+
scaleup_window: int | None = None, # Stabilization window (seconds) of sustained demand before scaling up
|
|
1287
1288
|
scaledown_window: int | None = None, # Max idle time before scaling down (seconds)
|
|
1288
1289
|
proxy: _Proxy | None = None, # Modal Proxy to use in front of this server
|
|
1289
1290
|
port: int = 8000, # Port the HTTP server listens on
|
|
@@ -1326,6 +1327,7 @@ class _App:
|
|
|
1326
1327
|
min_containers: Minimum number of containers to keep warm.
|
|
1327
1328
|
max_containers: Maximum number of containers.
|
|
1328
1329
|
buffer_containers: Additional idle containers under active load.
|
|
1330
|
+
scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
|
|
1329
1331
|
scaledown_window: Max idle time before scaling down (seconds).
|
|
1330
1332
|
proxy: Modal Proxy to use in front of this server.
|
|
1331
1333
|
port: Port the HTTP server listens on.
|
|
@@ -1371,6 +1373,9 @@ class _App:
|
|
|
1371
1373
|
if not isinstance(target_concurrency, int) or target_concurrency < 0:
|
|
1372
1374
|
raise InvalidError("The `target_concurrency` argument must be a non-negative integer.")
|
|
1373
1375
|
|
|
1376
|
+
if scaleup_window is not None and scaleup_window <= 0:
|
|
1377
|
+
raise InvalidError("`scaleup_window` must be > 0")
|
|
1378
|
+
|
|
1374
1379
|
http_config = api_pb2.HTTPConfig(
|
|
1375
1380
|
port=port,
|
|
1376
1381
|
proxy_regions=[routing_region],
|
|
@@ -1420,6 +1425,7 @@ class _App:
|
|
|
1420
1425
|
min_containers=min_containers,
|
|
1421
1426
|
max_containers=max_containers,
|
|
1422
1427
|
buffer_containers=buffer_containers,
|
|
1428
|
+
scaleup_window=scaleup_window,
|
|
1423
1429
|
scaledown_window=scaledown_window,
|
|
1424
1430
|
proxy=proxy,
|
|
1425
1431
|
retries=None, # No support for Server level retries
|
|
@@ -747,6 +747,7 @@ class _App:
|
|
|
747
747
|
min_containers: typing.Optional[int] = None,
|
|
748
748
|
max_containers: typing.Optional[int] = None,
|
|
749
749
|
buffer_containers: typing.Optional[int] = None,
|
|
750
|
+
scaleup_window: typing.Optional[int] = None,
|
|
750
751
|
scaledown_window: typing.Optional[int] = None,
|
|
751
752
|
proxy: typing.Optional[modal.proxy._Proxy] = None,
|
|
752
753
|
port: int = 8000,
|
|
@@ -789,6 +790,7 @@ class _App:
|
|
|
789
790
|
min_containers: Minimum number of containers to keep warm.
|
|
790
791
|
max_containers: Maximum number of containers.
|
|
791
792
|
buffer_containers: Additional idle containers under active load.
|
|
793
|
+
scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
|
|
792
794
|
scaledown_window: Max idle time before scaling down (seconds).
|
|
793
795
|
proxy: Modal Proxy to use in front of this server.
|
|
794
796
|
port: Port the HTTP server listens on.
|
|
@@ -1745,6 +1747,7 @@ class App:
|
|
|
1745
1747
|
min_containers: typing.Optional[int] = None,
|
|
1746
1748
|
max_containers: typing.Optional[int] = None,
|
|
1747
1749
|
buffer_containers: typing.Optional[int] = None,
|
|
1750
|
+
scaleup_window: typing.Optional[int] = None,
|
|
1748
1751
|
scaledown_window: typing.Optional[int] = None,
|
|
1749
1752
|
proxy: typing.Optional[modal.proxy.Proxy] = None,
|
|
1750
1753
|
port: int = 8000,
|
|
@@ -1785,6 +1788,7 @@ class App:
|
|
|
1785
1788
|
min_containers: Minimum number of containers to keep warm.
|
|
1786
1789
|
max_containers: Maximum number of containers.
|
|
1787
1790
|
buffer_containers: Additional idle containers under active load.
|
|
1791
|
+
scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
|
|
1788
1792
|
scaledown_window: Max idle time before scaling down (seconds).
|
|
1789
1793
|
proxy: Modal Proxy to use in front of this server.
|
|
1790
1794
|
port: Port the HTTP server listens on.
|
|
@@ -78,7 +78,7 @@ def _is_valid_modal_id(ref: str, prefix: str) -> bool:
|
|
|
78
78
|
def _parse_sandbox_container_ref(ref: str) -> tuple[str, str | None]:
|
|
79
79
|
"""Parse a sandbox:container reference into (sandbox_id, container_name).
|
|
80
80
|
|
|
81
|
-
Supports the pattern `sb-xyz:container_name` for accessing sandbox
|
|
81
|
+
Supports the pattern `sb-xyz:container_name` for accessing sandbox sidecars.
|
|
82
82
|
Returns (ref, None) if no container name is specified.
|
|
83
83
|
"""
|
|
84
84
|
if _is_valid_modal_id(ref, "sb-"):
|
|
@@ -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.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.1.
|
|
208
|
+
version: str = "1.5.1.dev3",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -90,6 +90,7 @@ class Function(
|
|
|
90
90
|
min_containers: typing.Optional[int] = None,
|
|
91
91
|
max_containers: typing.Optional[int] = None,
|
|
92
92
|
buffer_containers: typing.Optional[int] = None,
|
|
93
|
+
scaleup_window: typing.Optional[int] = None,
|
|
93
94
|
scaledown_window: typing.Optional[int] = None,
|
|
94
95
|
max_concurrent_inputs: typing.Optional[int] = None,
|
|
95
96
|
target_concurrent_inputs: typing.Optional[int] = None,
|
|
@@ -129,6 +130,7 @@ class Function(
|
|
|
129
130
|
min_containers: typing.Optional[int] = None,
|
|
130
131
|
max_containers: typing.Optional[int] = None,
|
|
131
132
|
buffer_containers: typing.Optional[int] = None,
|
|
133
|
+
scaleup_window: typing.Optional[int] = None,
|
|
132
134
|
scaledown_window: typing.Optional[int] = None,
|
|
133
135
|
target_concurrency: typing.Optional[int] = None,
|
|
134
136
|
) -> None: ...
|
|
@@ -139,6 +141,7 @@ class Function(
|
|
|
139
141
|
min_containers: typing.Optional[int] = None,
|
|
140
142
|
max_containers: typing.Optional[int] = None,
|
|
141
143
|
buffer_containers: typing.Optional[int] = None,
|
|
144
|
+
scaleup_window: typing.Optional[int] = None,
|
|
142
145
|
scaledown_window: typing.Optional[int] = None,
|
|
143
146
|
target_concurrency: typing.Optional[int] = None,
|
|
144
147
|
) -> None: ...
|
|
@@ -52,6 +52,7 @@ class Server:
|
|
|
52
52
|
min_containers: typing.Optional[int] = None,
|
|
53
53
|
max_containers: typing.Optional[int] = None,
|
|
54
54
|
buffer_containers: typing.Optional[int] = None,
|
|
55
|
+
scaleup_window: typing.Optional[int] = None,
|
|
55
56
|
scaledown_window: typing.Optional[int] = None,
|
|
56
57
|
target_concurrency: typing.Optional[int] = None,
|
|
57
58
|
) -> None:
|
|
@@ -69,6 +70,9 @@ class Server:
|
|
|
69
70
|
# Limit this Server to avoid spinning up more than 5 containers
|
|
70
71
|
server.update_autoscaler(max_containers=5)
|
|
71
72
|
|
|
73
|
+
# Require 30 seconds of sustained demand before scaling up
|
|
74
|
+
server.update_autoscaler(scaleup_window=30)
|
|
75
|
+
|
|
72
76
|
# Adjust Server autoscaling to target 20 concurrent requests per replica
|
|
73
77
|
server.update_autoscaler(target_concurrency=20)
|
|
74
78
|
|
|
@@ -85,6 +89,7 @@ class Server:
|
|
|
85
89
|
min_containers: typing.Optional[int] = None,
|
|
86
90
|
max_containers: typing.Optional[int] = None,
|
|
87
91
|
buffer_containers: typing.Optional[int] = None,
|
|
92
|
+
scaleup_window: typing.Optional[int] = None,
|
|
88
93
|
scaledown_window: typing.Optional[int] = None,
|
|
89
94
|
target_concurrency: typing.Optional[int] = None,
|
|
90
95
|
) -> None:
|
|
@@ -102,6 +107,9 @@ class Server:
|
|
|
102
107
|
# Limit this Server to avoid spinning up more than 5 containers
|
|
103
108
|
server.update_autoscaler(max_containers=5)
|
|
104
109
|
|
|
110
|
+
# Require 30 seconds of sustained demand before scaling up
|
|
111
|
+
server.update_autoscaler(scaleup_window=30)
|
|
112
|
+
|
|
105
113
|
# Adjust Server autoscaling to target 20 concurrent requests per replica
|
|
106
114
|
server.update_autoscaler(target_concurrency=20)
|
|
107
115
|
|