modal 1.5.4.dev1__tar.gz → 1.5.4.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/PKG-INFO +1 -1
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_functions.py +29 -7
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_server.py +7 -2
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/client.pyi +2 -2
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cls.py +7 -1
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cls.pyi +16 -3
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/functions.pyi +35 -5
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/server.pyi +11 -2
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/types.py +38 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_version/__init__.py +1 -1
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/LICENSE +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/README.md +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/__main__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_billing.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_clustered_functions.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_environments.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_function_variants.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_grpc_client.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_image.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_ipython.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_load_context.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_location.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_logs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_logs_manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_logs_manager.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_object.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_output/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_output/manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_output/pty.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_output/rich.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_output/status.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_partial_function.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_resolver.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_resources.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_serialization.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_supports_logs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_traceback.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_tunnel.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_tunnel.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_type_manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/display_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/logger.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_vendor/version.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_watcher.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/_workspace.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/app.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/app.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/billing.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/billing.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/README.md +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/builder/base-images.json +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/call_graph.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/_download.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/_help.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/_traceback.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/app.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/billing.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/changelog.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/cluster.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/config.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/container.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/curl.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/dashboard.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/dict.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/endpoint.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/entry_point.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/environment.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/image.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/import_refs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/launch.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/logo.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/profile.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/queues.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/run.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/secret.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/selector.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/shell.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/skills.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/token.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/utils.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/volume.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cli/workspace.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/client.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/config.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/container_process.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/container_process.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/dict.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/dict.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/environments.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/environments.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/exception.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/experimental/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/experimental/flash.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/experimental/ipython.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/file_io.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/file_io.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/functions.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/image.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/image.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/io_streams.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/io_streams.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/mount.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/mount.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/network_file_system.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/network_file_system.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/object.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/object.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/output.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/parallel_map.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/parallel_map.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/partial_function.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/partial_function.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/proxy.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/proxy.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/py.typed +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/queue.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/queue.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/retries.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/runner.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/runner.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/running_app.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/sandbox.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/sandbox.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/sandbox_fs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/schedule.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/scheduler_placement.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/secret.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/secret.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/server.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/serving.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/serving.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/snapshot.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/snapshot.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/stream_type.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/token_flow.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/token_flow.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/volume.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/volume.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/workspace.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal/workspace.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_docs/reference_intro.md +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/__init__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/py.typed +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/modal_version/__main__.py +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/pyproject.toml +0 -0
- {modal-1.5.4.dev1 → modal-1.5.4.dev2}/setup.cfg +0 -0
|
@@ -93,7 +93,7 @@ from .proxy import _Proxy
|
|
|
93
93
|
from .retries import Retries, RetryManager
|
|
94
94
|
from .schedule import Schedule
|
|
95
95
|
from .secret import _Secret
|
|
96
|
-
from .types import FunctionStats
|
|
96
|
+
from .types import FunctionAutoscalerSettings, FunctionStats, ServerAutoscalerSettings
|
|
97
97
|
from .volume import _Volume, _volume_to_mount_proto
|
|
98
98
|
|
|
99
99
|
if TYPE_CHECKING:
|
|
@@ -1172,6 +1172,25 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1172
1172
|
return obj
|
|
1173
1173
|
|
|
1174
1174
|
async def _update_autoscaler(
|
|
1175
|
+
self,
|
|
1176
|
+
*,
|
|
1177
|
+
min_containers: int | None = None,
|
|
1178
|
+
max_containers: int | None = None,
|
|
1179
|
+
buffer_containers: int | None = None,
|
|
1180
|
+
scaledown_window: int | None = None,
|
|
1181
|
+
) -> FunctionAutoscalerSettings:
|
|
1182
|
+
settings = api_pb2.AutoscalerSettings(
|
|
1183
|
+
min_containers=min_containers,
|
|
1184
|
+
max_containers=max_containers,
|
|
1185
|
+
buffer_containers=buffer_containers,
|
|
1186
|
+
scaledown_window=scaledown_window,
|
|
1187
|
+
)
|
|
1188
|
+
request = api_pb2.FunctionUpdateSchedulingParamsRequest(function_id=self.object_id, settings=settings)
|
|
1189
|
+
response = await self.client.stub.FunctionUpdateSchedulingParams(request)
|
|
1190
|
+
|
|
1191
|
+
return FunctionAutoscalerSettings._from_proto(response.current_settings)
|
|
1192
|
+
|
|
1193
|
+
async def _update_autoscaler_server(
|
|
1175
1194
|
self,
|
|
1176
1195
|
*,
|
|
1177
1196
|
min_containers: int | None = None,
|
|
@@ -1180,7 +1199,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1180
1199
|
scaleup_window: int | None = None,
|
|
1181
1200
|
scaledown_window: int | None = None,
|
|
1182
1201
|
target_concurrency: int | None = None,
|
|
1183
|
-
) ->
|
|
1202
|
+
) -> ServerAutoscalerSettings:
|
|
1184
1203
|
settings = api_pb2.AutoscalerSettings(
|
|
1185
1204
|
min_containers=min_containers,
|
|
1186
1205
|
max_containers=max_containers,
|
|
@@ -1190,10 +1209,9 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1190
1209
|
target_concurrency=target_concurrency,
|
|
1191
1210
|
)
|
|
1192
1211
|
request = api_pb2.FunctionUpdateSchedulingParamsRequest(function_id=self.object_id, settings=settings)
|
|
1193
|
-
await self.client.stub.FunctionUpdateSchedulingParams(request)
|
|
1212
|
+
response = await self.client.stub.FunctionUpdateSchedulingParams(request)
|
|
1194
1213
|
|
|
1195
|
-
|
|
1196
|
-
# and then we could return them here (would need some ad hoc dataclass, which I don't love)
|
|
1214
|
+
return ServerAutoscalerSettings._from_proto(response.current_settings)
|
|
1197
1215
|
|
|
1198
1216
|
@live_method
|
|
1199
1217
|
async def update_autoscaler(
|
|
@@ -1203,7 +1221,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1203
1221
|
max_containers: int | None = None,
|
|
1204
1222
|
buffer_containers: int | None = None,
|
|
1205
1223
|
scaledown_window: int | None = None,
|
|
1206
|
-
) ->
|
|
1224
|
+
) -> FunctionAutoscalerSettings:
|
|
1207
1225
|
"""Override the current autoscaler behavior for this Function.
|
|
1208
1226
|
|
|
1209
1227
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -1218,6 +1236,10 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1218
1236
|
buffer_containers: Extra containers to keep warm beyond current demand.
|
|
1219
1237
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
1220
1238
|
|
|
1239
|
+
Returns:
|
|
1240
|
+
A `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
1241
|
+
of this Function after the call.
|
|
1242
|
+
|
|
1221
1243
|
Examples:
|
|
1222
1244
|
```python notest
|
|
1223
1245
|
f = modal.Function.from_name("my-app", "function")
|
|
@@ -1237,7 +1259,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1237
1259
|
if self._is_method:
|
|
1238
1260
|
raise InvalidError("Cannot call .update_autoscaler() on a method. Call it on the class instance instead.")
|
|
1239
1261
|
|
|
1240
|
-
await self._update_autoscaler(
|
|
1262
|
+
return await self._update_autoscaler(
|
|
1241
1263
|
min_containers=min_containers,
|
|
1242
1264
|
max_containers=max_containers,
|
|
1243
1265
|
buffer_containers=buffer_containers,
|
|
@@ -15,6 +15,7 @@ from ._supports_logs import _LogQueryData
|
|
|
15
15
|
from .client import _Client
|
|
16
16
|
from .cls import is_parameter
|
|
17
17
|
from .exception import InvalidError
|
|
18
|
+
from .types import ServerAutoscalerSettings
|
|
18
19
|
|
|
19
20
|
if typing.TYPE_CHECKING:
|
|
20
21
|
import modal.app
|
|
@@ -129,7 +130,7 @@ class _Server:
|
|
|
129
130
|
buffer_containers: int | None = None,
|
|
130
131
|
scaleup_window: int | None = None,
|
|
131
132
|
scaledown_window: int | None = None,
|
|
132
|
-
) ->
|
|
133
|
+
) -> ServerAutoscalerSettings:
|
|
133
134
|
"""Override the current autoscaler behavior for this Server.
|
|
134
135
|
|
|
135
136
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -146,6 +147,10 @@ class _Server:
|
|
|
146
147
|
scaleup_window: Seconds of sustained demand required before scaling up new containers.
|
|
147
148
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
148
149
|
|
|
150
|
+
Returns:
|
|
151
|
+
A `ServerAutoscalerSettings` dataclass which contains the current autoscaler settings of
|
|
152
|
+
this Server after the call.
|
|
153
|
+
|
|
149
154
|
Examples:
|
|
150
155
|
```python notest
|
|
151
156
|
server = modal.Server.from_name("my-app", "Server")
|
|
@@ -167,7 +172,7 @@ class _Server:
|
|
|
167
172
|
```
|
|
168
173
|
|
|
169
174
|
"""
|
|
170
|
-
return await self._get_service_function().
|
|
175
|
+
return await self._get_service_function()._update_autoscaler_server(
|
|
171
176
|
min_containers=min_containers,
|
|
172
177
|
max_containers=max_containers,
|
|
173
178
|
scaleup_window=scaleup_window,
|
|
@@ -37,7 +37,7 @@ class _Client:
|
|
|
37
37
|
server_url: str,
|
|
38
38
|
client_type: int,
|
|
39
39
|
credentials: typing.Optional[tuple[str, str]],
|
|
40
|
-
version: str = "1.5.4.
|
|
40
|
+
version: str = "1.5.4.dev2",
|
|
41
41
|
):
|
|
42
42
|
"""mdmd:hidden
|
|
43
43
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -207,7 +207,7 @@ class Client:
|
|
|
207
207
|
server_url: str,
|
|
208
208
|
client_type: int,
|
|
209
209
|
credentials: typing.Optional[tuple[str, str]],
|
|
210
|
-
version: str = "1.5.4.
|
|
210
|
+
version: str = "1.5.4.dev2",
|
|
211
211
|
):
|
|
212
212
|
"""mdmd:hidden
|
|
213
213
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -33,6 +33,7 @@ from .cloud_bucket_mount import _CloudBucketMount
|
|
|
33
33
|
from .exception import ExecutionError, InvalidError, NotFoundError
|
|
34
34
|
from .retries import Retries
|
|
35
35
|
from .secret import _Secret
|
|
36
|
+
from .types import FunctionAutoscalerSettings
|
|
36
37
|
from .volume import _Volume
|
|
37
38
|
|
|
38
39
|
T = TypeVar("T")
|
|
@@ -288,7 +289,7 @@ class _Obj:
|
|
|
288
289
|
max_containers: int | None = None,
|
|
289
290
|
scaledown_window: int | None = None,
|
|
290
291
|
buffer_containers: int | None = None,
|
|
291
|
-
) ->
|
|
292
|
+
) -> FunctionAutoscalerSettings:
|
|
292
293
|
"""Override the current autoscaler behavior for this Cls instance.
|
|
293
294
|
|
|
294
295
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -306,6 +307,10 @@ class _Obj:
|
|
|
306
307
|
scaledown_window: Idle seconds before scaling down a container; omit to leave unchanged.
|
|
307
308
|
buffer_containers: Extra idle containers under load; omit to leave unchanged.
|
|
308
309
|
|
|
310
|
+
Returns:
|
|
311
|
+
An `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
312
|
+
of this Cls instance after the call.
|
|
313
|
+
|
|
309
314
|
Examples:
|
|
310
315
|
```python notest
|
|
311
316
|
Model = modal.Cls.from_name("my-app", "Model")
|
|
@@ -321,6 +326,7 @@ class _Obj:
|
|
|
321
326
|
"""
|
|
322
327
|
if not self._cls.is_hydrated and not self._cls._is_local():
|
|
323
328
|
await self._cls.hydrate()
|
|
329
|
+
|
|
324
330
|
return await self._cached_service_function().update_autoscaler(
|
|
325
331
|
min_containers=min_containers,
|
|
326
332
|
max_containers=max_containers,
|
|
@@ -13,6 +13,7 @@ import modal.object
|
|
|
13
13
|
import modal.partial_function
|
|
14
14
|
import modal.retries
|
|
15
15
|
import modal.secret
|
|
16
|
+
import modal.types
|
|
16
17
|
import modal.volume
|
|
17
18
|
import modal_proto.api_pb2
|
|
18
19
|
import pathlib
|
|
@@ -67,7 +68,7 @@ class _Obj:
|
|
|
67
68
|
max_containers: typing.Optional[int] = None,
|
|
68
69
|
scaledown_window: typing.Optional[int] = None,
|
|
69
70
|
buffer_containers: typing.Optional[int] = None,
|
|
70
|
-
) ->
|
|
71
|
+
) -> modal.types.FunctionAutoscalerSettings:
|
|
71
72
|
"""Override the current autoscaler behavior for this Cls instance.
|
|
72
73
|
|
|
73
74
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -85,6 +86,10 @@ class _Obj:
|
|
|
85
86
|
scaledown_window: Idle seconds before scaling down a container; omit to leave unchanged.
|
|
86
87
|
buffer_containers: Extra idle containers under load; omit to leave unchanged.
|
|
87
88
|
|
|
89
|
+
Returns:
|
|
90
|
+
An `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
91
|
+
of this Cls instance after the call.
|
|
92
|
+
|
|
88
93
|
Examples:
|
|
89
94
|
```python notest
|
|
90
95
|
Model = modal.Cls.from_name("my-app", "Model")
|
|
@@ -150,7 +155,7 @@ class Obj:
|
|
|
150
155
|
max_containers: typing.Optional[int] = None,
|
|
151
156
|
scaledown_window: typing.Optional[int] = None,
|
|
152
157
|
buffer_containers: typing.Optional[int] = None,
|
|
153
|
-
) ->
|
|
158
|
+
) -> modal.types.FunctionAutoscalerSettings:
|
|
154
159
|
"""Override the current autoscaler behavior for this Cls instance.
|
|
155
160
|
|
|
156
161
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -168,6 +173,10 @@ class Obj:
|
|
|
168
173
|
scaledown_window: Idle seconds before scaling down a container; omit to leave unchanged.
|
|
169
174
|
buffer_containers: Extra idle containers under load; omit to leave unchanged.
|
|
170
175
|
|
|
176
|
+
Returns:
|
|
177
|
+
An `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
178
|
+
of this Cls instance after the call.
|
|
179
|
+
|
|
171
180
|
Examples:
|
|
172
181
|
```python notest
|
|
173
182
|
Model = modal.Cls.from_name("my-app", "Model")
|
|
@@ -190,7 +199,7 @@ class Obj:
|
|
|
190
199
|
max_containers: typing.Optional[int] = None,
|
|
191
200
|
scaledown_window: typing.Optional[int] = None,
|
|
192
201
|
buffer_containers: typing.Optional[int] = None,
|
|
193
|
-
) ->
|
|
202
|
+
) -> modal.types.FunctionAutoscalerSettings:
|
|
194
203
|
"""Override the current autoscaler behavior for this Cls instance.
|
|
195
204
|
|
|
196
205
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -208,6 +217,10 @@ class Obj:
|
|
|
208
217
|
scaledown_window: Idle seconds before scaling down a container; omit to leave unchanged.
|
|
209
218
|
buffer_containers: Extra idle containers under load; omit to leave unchanged.
|
|
210
219
|
|
|
220
|
+
Returns:
|
|
221
|
+
An `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
222
|
+
of this Cls instance after the call.
|
|
223
|
+
|
|
211
224
|
Examples:
|
|
212
225
|
```python notest
|
|
213
226
|
Model = modal.Cls.from_name("my-app", "Model")
|
|
@@ -148,6 +148,28 @@ class Function(
|
|
|
148
148
|
...
|
|
149
149
|
|
|
150
150
|
class ___update_autoscaler_spec(typing_extensions.Protocol):
|
|
151
|
+
def __call__(
|
|
152
|
+
self,
|
|
153
|
+
/,
|
|
154
|
+
*,
|
|
155
|
+
min_containers: typing.Optional[int] = None,
|
|
156
|
+
max_containers: typing.Optional[int] = None,
|
|
157
|
+
buffer_containers: typing.Optional[int] = None,
|
|
158
|
+
scaledown_window: typing.Optional[int] = None,
|
|
159
|
+
) -> modal.types.FunctionAutoscalerSettings: ...
|
|
160
|
+
async def aio(
|
|
161
|
+
self,
|
|
162
|
+
/,
|
|
163
|
+
*,
|
|
164
|
+
min_containers: typing.Optional[int] = None,
|
|
165
|
+
max_containers: typing.Optional[int] = None,
|
|
166
|
+
buffer_containers: typing.Optional[int] = None,
|
|
167
|
+
scaledown_window: typing.Optional[int] = None,
|
|
168
|
+
) -> modal.types.FunctionAutoscalerSettings: ...
|
|
169
|
+
|
|
170
|
+
_update_autoscaler: ___update_autoscaler_spec
|
|
171
|
+
|
|
172
|
+
class ___update_autoscaler_server_spec(typing_extensions.Protocol):
|
|
151
173
|
def __call__(
|
|
152
174
|
self,
|
|
153
175
|
/,
|
|
@@ -158,7 +180,7 @@ class Function(
|
|
|
158
180
|
scaleup_window: typing.Optional[int] = None,
|
|
159
181
|
scaledown_window: typing.Optional[int] = None,
|
|
160
182
|
target_concurrency: typing.Optional[int] = None,
|
|
161
|
-
) ->
|
|
183
|
+
) -> modal.types.ServerAutoscalerSettings: ...
|
|
162
184
|
async def aio(
|
|
163
185
|
self,
|
|
164
186
|
/,
|
|
@@ -169,9 +191,9 @@ class Function(
|
|
|
169
191
|
scaleup_window: typing.Optional[int] = None,
|
|
170
192
|
scaledown_window: typing.Optional[int] = None,
|
|
171
193
|
target_concurrency: typing.Optional[int] = None,
|
|
172
|
-
) ->
|
|
194
|
+
) -> modal.types.ServerAutoscalerSettings: ...
|
|
173
195
|
|
|
174
|
-
|
|
196
|
+
_update_autoscaler_server: ___update_autoscaler_server_spec
|
|
175
197
|
|
|
176
198
|
class __update_autoscaler_spec(typing_extensions.Protocol):
|
|
177
199
|
def __call__(
|
|
@@ -182,7 +204,7 @@ class Function(
|
|
|
182
204
|
max_containers: typing.Optional[int] = None,
|
|
183
205
|
buffer_containers: typing.Optional[int] = None,
|
|
184
206
|
scaledown_window: typing.Optional[int] = None,
|
|
185
|
-
) ->
|
|
207
|
+
) -> modal.types.FunctionAutoscalerSettings:
|
|
186
208
|
"""Override the current autoscaler behavior for this Function.
|
|
187
209
|
|
|
188
210
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -197,6 +219,10 @@ class Function(
|
|
|
197
219
|
buffer_containers: Extra containers to keep warm beyond current demand.
|
|
198
220
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
199
221
|
|
|
222
|
+
Returns:
|
|
223
|
+
A `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
224
|
+
of this Function after the call.
|
|
225
|
+
|
|
200
226
|
Examples:
|
|
201
227
|
```python notest
|
|
202
228
|
f = modal.Function.from_name("my-app", "function")
|
|
@@ -221,7 +247,7 @@ class Function(
|
|
|
221
247
|
max_containers: typing.Optional[int] = None,
|
|
222
248
|
buffer_containers: typing.Optional[int] = None,
|
|
223
249
|
scaledown_window: typing.Optional[int] = None,
|
|
224
|
-
) ->
|
|
250
|
+
) -> modal.types.FunctionAutoscalerSettings:
|
|
225
251
|
"""Override the current autoscaler behavior for this Function.
|
|
226
252
|
|
|
227
253
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -236,6 +262,10 @@ class Function(
|
|
|
236
262
|
buffer_containers: Extra containers to keep warm beyond current demand.
|
|
237
263
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
238
264
|
|
|
265
|
+
Returns:
|
|
266
|
+
A `FunctionAutoscalerSettings` dataclass which contains the current autoscaler settings
|
|
267
|
+
of this Function after the call.
|
|
268
|
+
|
|
239
269
|
Examples:
|
|
240
270
|
```python notest
|
|
241
271
|
f = modal.Function.from_name("my-app", "function")
|
|
@@ -4,6 +4,7 @@ import modal.app
|
|
|
4
4
|
import modal.client
|
|
5
5
|
import modal.functions
|
|
6
6
|
import modal.partial_function
|
|
7
|
+
import modal.types
|
|
7
8
|
import typing
|
|
8
9
|
import typing_extensions
|
|
9
10
|
|
|
@@ -86,7 +87,7 @@ class Server:
|
|
|
86
87
|
buffer_containers: typing.Optional[int] = None,
|
|
87
88
|
scaleup_window: typing.Optional[int] = None,
|
|
88
89
|
scaledown_window: typing.Optional[int] = None,
|
|
89
|
-
) ->
|
|
90
|
+
) -> modal.types.ServerAutoscalerSettings:
|
|
90
91
|
"""Override the current autoscaler behavior for this Server.
|
|
91
92
|
|
|
92
93
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -103,6 +104,10 @@ class Server:
|
|
|
103
104
|
scaleup_window: Seconds of sustained demand required before scaling up new containers.
|
|
104
105
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
105
106
|
|
|
107
|
+
Returns:
|
|
108
|
+
A `ServerAutoscalerSettings` dataclass which contains the current autoscaler settings of
|
|
109
|
+
this Server after the call.
|
|
110
|
+
|
|
106
111
|
Examples:
|
|
107
112
|
```python notest
|
|
108
113
|
server = modal.Server.from_name("my-app", "Server")
|
|
@@ -135,7 +140,7 @@ class Server:
|
|
|
135
140
|
buffer_containers: typing.Optional[int] = None,
|
|
136
141
|
scaleup_window: typing.Optional[int] = None,
|
|
137
142
|
scaledown_window: typing.Optional[int] = None,
|
|
138
|
-
) ->
|
|
143
|
+
) -> modal.types.ServerAutoscalerSettings:
|
|
139
144
|
"""Override the current autoscaler behavior for this Server.
|
|
140
145
|
|
|
141
146
|
Unspecified parameters will retain their current value, i.e. either the static value
|
|
@@ -152,6 +157,10 @@ class Server:
|
|
|
152
157
|
scaleup_window: Seconds of sustained demand required before scaling up new containers.
|
|
153
158
|
scaledown_window: Maximum duration (in seconds) idle containers wait before scaling down.
|
|
154
159
|
|
|
160
|
+
Returns:
|
|
161
|
+
A `ServerAutoscalerSettings` dataclass which contains the current autoscaler settings of
|
|
162
|
+
this Server after the call.
|
|
163
|
+
|
|
155
164
|
Examples:
|
|
156
165
|
```python notest
|
|
157
166
|
server = modal.Server.from_name("my-app", "Server")
|
|
@@ -367,3 +367,41 @@ class EnvironmentBillingSummary:
|
|
|
367
367
|
metered_cost=Decimal(pb_item.metered_cost),
|
|
368
368
|
metered_cost_breakdown=metered_cost_breakdown,
|
|
369
369
|
)
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
@dataclass(slots=True, frozen=True)
|
|
373
|
+
class FunctionAutoscalerSettings:
|
|
374
|
+
min_containers: int | None
|
|
375
|
+
max_containers: int | None
|
|
376
|
+
scaledown_window: int | None
|
|
377
|
+
buffer_containers: int | None
|
|
378
|
+
|
|
379
|
+
@classmethod
|
|
380
|
+
def _from_proto(cls, pb_item: api_pb2.AutoscalerSettings) -> "FunctionAutoscalerSettings":
|
|
381
|
+
return cls(
|
|
382
|
+
min_containers=pb_item.min_containers if pb_item.HasField("min_containers") else None,
|
|
383
|
+
max_containers=pb_item.max_containers if pb_item.HasField("max_containers") else None,
|
|
384
|
+
scaledown_window=pb_item.scaledown_window if pb_item.HasField("scaledown_window") else None,
|
|
385
|
+
buffer_containers=pb_item.buffer_containers if pb_item.HasField("buffer_containers") else None,
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
@dataclass(slots=True, frozen=True)
|
|
390
|
+
class ServerAutoscalerSettings:
|
|
391
|
+
target_concurrency: int | None
|
|
392
|
+
min_containers: int | None
|
|
393
|
+
max_containers: int | None
|
|
394
|
+
buffer_containers: int | None
|
|
395
|
+
scaleup_window: int | None
|
|
396
|
+
scaledown_window: int | None
|
|
397
|
+
|
|
398
|
+
@classmethod
|
|
399
|
+
def _from_proto(cls, pb_item: api_pb2.AutoscalerSettings) -> "ServerAutoscalerSettings":
|
|
400
|
+
return cls(
|
|
401
|
+
min_containers=pb_item.min_containers if pb_item.HasField("min_containers") else None,
|
|
402
|
+
max_containers=pb_item.max_containers if pb_item.HasField("max_containers") else None,
|
|
403
|
+
buffer_containers=pb_item.buffer_containers if pb_item.HasField("buffer_containers") else None,
|
|
404
|
+
scaleup_window=pb_item.scaleup_window if pb_item.HasField("scaleup_window") else None,
|
|
405
|
+
scaledown_window=pb_item.scaledown_window if pb_item.HasField("scaledown_window") else None,
|
|
406
|
+
target_concurrency=pb_item.target_concurrency if pb_item.HasField("target_concurrency") else None,
|
|
407
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|