modal 1.2.1.dev17__tar.gz → 1.2.1.dev18__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.
Potentially problematic release.
This version of modal might be problematic. Click here for more details.
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/PKG-INFO +1 -1
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_partial_function.py +22 -2
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/function_utils.py +4 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/app.py +4 -1
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/client.pyi +2 -2
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/partial_function.pyi +4 -1
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_version/__init__.py +1 -1
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/LICENSE +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/README.md +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/__main__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_billing.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_clustered_functions.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_clustered_functions.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_container_entrypoint.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_functions.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_ipython.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_location.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_object.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_output.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_pty.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_resolver.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_resources.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/asgi.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/execution_context.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/telemetry.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_serialization.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_traceback.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_tunnel.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_tunnel.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_type_manager.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/app_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/async_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/blob_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/deprecation.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/docker_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/git_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/hash_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/http_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/logger.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/mount_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/name_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/package_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/shell_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_utils/time_utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_vendor/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_vendor/tblib.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/_watcher.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/app.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/billing.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/2023.12.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/2024.04.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/2024.10.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/2025.06.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/README.md +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/builder/base-images.json +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/call_graph.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/_download.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/_traceback.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/app.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/cluster.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/config.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/container.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/dict.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/entry_point.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/environment.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/import_refs.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/launch.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/network_file_system.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/profile.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/programs/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/programs/vscode.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/queues.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/run.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/secret.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/token.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/utils.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cli/volume.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/client.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cls.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/cls.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/config.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/container_process.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/container_process.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/dict.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/dict.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/environments.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/environments.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/exception.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/experimental/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/experimental/flash.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/experimental/flash.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/experimental/ipython.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/file_io.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/file_io.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/file_pattern_matcher.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/functions.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/functions.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/gpu.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/image.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/image.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/io_streams.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/io_streams.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/mount.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/mount.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/network_file_system.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/network_file_system.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/object.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/object.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/output.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/parallel_map.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/parallel_map.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/partial_function.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/proxy.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/proxy.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/py.typed +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/queue.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/queue.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/retries.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/runner.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/runner.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/running_app.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/sandbox.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/sandbox.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/schedule.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/scheduler_placement.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/secret.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/secret.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/serving.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/serving.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/snapshot.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/snapshot.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/stream_type.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/token_flow.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/token_flow.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/volume.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal/volume.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/requires.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal.egg-info/top_level.txt +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/__init__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api.proto +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api_pb2.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/py.typed +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router.proto +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router.proto +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/modal_version/__main__.py +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/pyproject.toml +0 -0
- {modal-1.2.1.dev17 → modal-1.2.1.dev18}/setup.cfg +0 -0
|
@@ -93,6 +93,26 @@ NullaryFuncOrMethod = Union[Callable[[], Any], Callable[[Any], Any]]
|
|
|
93
93
|
NullaryMethod = Callable[[Any], Any]
|
|
94
94
|
|
|
95
95
|
|
|
96
|
+
def verify_concurrent_params(params: _PartialFunctionParams, is_flash: bool = False) -> None:
|
|
97
|
+
def _verify_concurrent_params_with_flash_settings(params: _PartialFunctionParams) -> None:
|
|
98
|
+
if params.max_concurrent_inputs is not None:
|
|
99
|
+
raise TypeError(
|
|
100
|
+
"@modal.concurrent(max_inputs=...) is not yet supported for Flash functions. "
|
|
101
|
+
"Use `@modal.concurrent(target_inputs=...)` instead."
|
|
102
|
+
)
|
|
103
|
+
if params.target_concurrent_inputs is None:
|
|
104
|
+
raise TypeError("`@modal.concurrent()` missing required argument: `target_inputs`.")
|
|
105
|
+
|
|
106
|
+
def _verify_concurrent_params(params: _PartialFunctionParams) -> None:
|
|
107
|
+
if params.max_concurrent_inputs is None:
|
|
108
|
+
raise TypeError("`@modal.concurrent()` missing required argument: `max_inputs`.")
|
|
109
|
+
|
|
110
|
+
if is_flash:
|
|
111
|
+
_verify_concurrent_params_with_flash_settings(params)
|
|
112
|
+
else:
|
|
113
|
+
_verify_concurrent_params(params)
|
|
114
|
+
|
|
115
|
+
|
|
96
116
|
class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
|
|
97
117
|
"""Object produced by a decorator in the `modal` namespace
|
|
98
118
|
|
|
@@ -765,7 +785,7 @@ def _batched(
|
|
|
765
785
|
def _concurrent(
|
|
766
786
|
_warn_parentheses_missing=None, # mdmd:line-hidden
|
|
767
787
|
*,
|
|
768
|
-
max_inputs: int, # Hard limit on each container's input concurrency
|
|
788
|
+
max_inputs: Optional[int] = None, # Hard limit on each container's input concurrency
|
|
769
789
|
target_inputs: Optional[int] = None, # Input concurrency that Modal's autoscaler should target
|
|
770
790
|
) -> Callable[
|
|
771
791
|
[Union[Callable[P, ReturnType], _PartialFunction[P, ReturnType, ReturnType]]],
|
|
@@ -817,7 +837,7 @@ def _concurrent(
|
|
|
817
837
|
"Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@modal.concurrent()`."
|
|
818
838
|
)
|
|
819
839
|
|
|
820
|
-
if target_inputs and target_inputs > max_inputs:
|
|
840
|
+
if max_inputs is not None and target_inputs is not None and target_inputs > max_inputs:
|
|
821
841
|
raise InvalidError("`target_inputs` parameter cannot be greater than `max_inputs`.")
|
|
822
842
|
|
|
823
843
|
flags = _PartialFunctionFlags.CONCURRENT
|
|
@@ -75,6 +75,10 @@ def is_global_object(object_qual_name: str):
|
|
|
75
75
|
return "<locals>" not in object_qual_name.split(".")
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
def is_flash_object(experimental_options: Optional[dict[str, Any]]) -> bool:
|
|
79
|
+
return experimental_options.get("flash", False) if experimental_options else False
|
|
80
|
+
|
|
81
|
+
|
|
78
82
|
def is_method_fn(object_qual_name: str):
|
|
79
83
|
# methods have names like Cls.foo.
|
|
80
84
|
if "<locals>" in object_qual_name:
|
|
@@ -27,13 +27,14 @@ from ._partial_function import (
|
|
|
27
27
|
_find_partial_methods_for_user_cls,
|
|
28
28
|
_PartialFunction,
|
|
29
29
|
_PartialFunctionFlags,
|
|
30
|
+
verify_concurrent_params,
|
|
30
31
|
)
|
|
31
32
|
from ._utils.async_utils import synchronize_api
|
|
32
33
|
from ._utils.deprecation import (
|
|
33
34
|
deprecation_warning,
|
|
34
35
|
warn_on_renamed_autoscaler_settings,
|
|
35
36
|
)
|
|
36
|
-
from ._utils.function_utils import FunctionInfo, is_global_object, is_method_fn
|
|
37
|
+
from ._utils.function_utils import FunctionInfo, is_flash_object, is_global_object, is_method_fn
|
|
37
38
|
from ._utils.grpc_utils import retry_transient_errors
|
|
38
39
|
from ._utils.mount_utils import validate_volumes
|
|
39
40
|
from ._utils.name_utils import check_object_name, check_tag_dict
|
|
@@ -802,6 +803,7 @@ class _App:
|
|
|
802
803
|
batch_max_size = f.params.batch_max_size
|
|
803
804
|
batch_wait_ms = f.params.batch_wait_ms
|
|
804
805
|
if f.flags & _PartialFunctionFlags.CONCURRENT:
|
|
806
|
+
verify_concurrent_params(params=f.params, is_flash=is_flash_object(experimental_options))
|
|
805
807
|
max_concurrent_inputs = f.params.max_concurrent_inputs
|
|
806
808
|
target_concurrent_inputs = f.params.target_concurrent_inputs
|
|
807
809
|
else:
|
|
@@ -996,6 +998,7 @@ class _App:
|
|
|
996
998
|
wrapped_cls.registered = True
|
|
997
999
|
user_cls = wrapped_cls.user_cls
|
|
998
1000
|
if wrapped_cls.flags & _PartialFunctionFlags.CONCURRENT:
|
|
1001
|
+
verify_concurrent_params(params=wrapped_cls.params, is_flash=is_flash_object(experimental_options))
|
|
999
1002
|
max_concurrent_inputs = wrapped_cls.params.max_concurrent_inputs
|
|
1000
1003
|
target_concurrent_inputs = wrapped_cls.params.target_concurrent_inputs
|
|
1001
1004
|
else:
|
|
@@ -33,7 +33,7 @@ class _Client:
|
|
|
33
33
|
server_url: str,
|
|
34
34
|
client_type: int,
|
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
|
36
|
-
version: str = "1.2.1.
|
|
36
|
+
version: str = "1.2.1.dev18",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -164,7 +164,7 @@ class Client:
|
|
|
164
164
|
server_url: str,
|
|
165
165
|
client_type: int,
|
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
|
167
|
-
version: str = "1.2.1.
|
|
167
|
+
version: str = "1.2.1.dev18",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -329,7 +329,10 @@ def batched(
|
|
|
329
329
|
...
|
|
330
330
|
|
|
331
331
|
def concurrent(
|
|
332
|
-
_warn_parentheses_missing=None,
|
|
332
|
+
_warn_parentheses_missing=None,
|
|
333
|
+
*,
|
|
334
|
+
max_inputs: typing.Optional[int] = None,
|
|
335
|
+
target_inputs: typing.Optional[int] = None,
|
|
333
336
|
) -> collections.abc.Callable[
|
|
334
337
|
[
|
|
335
338
|
typing.Union[
|
|
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
|
|
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
|
|
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
|