modal 1.1.3.dev6__tar.gz → 1.1.4__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.1.3.dev6 → modal-1.1.4}/PKG-INFO +1 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_clustered_functions.py +3 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_clustered_functions.pyi +3 -2
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_functions.py +12 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/asgi.py +1 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/grpc_utils.py +1 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/app.py +6 -2
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/app.pyi +4 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/2025.06.txt +1 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/PREVIEW.txt +1 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/client.pyi +2 -10
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cls.py +6 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cls.pyi +16 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/experimental/__init__.py +2 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/experimental/flash.py +183 -23
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/experimental/flash.pyi +83 -9
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/functions.pyi +12 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/image.py +8 -2
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/image.pyi +16 -4
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/mount.py +17 -11
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/mount.pyi +4 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/parallel_map.py +26 -6
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/parallel_map.pyi +1 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/sandbox.py +31 -4
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/sandbox.pyi +12 -3
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api.proto +30 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api_grpc.py +32 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api_pb2.py +893 -853
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api_pb2.pyi +94 -5
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api_pb2_grpc.py +68 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/api_pb2_grpc.pyi +25 -3
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/modal_api_grpc.py +2 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_version/__init__.py +1 -1
- {modal-1.1.3.dev6 → modal-1.1.4}/LICENSE +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/README.md +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/__main__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_ipython.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_location.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_object.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_output.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_partial_function.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_pty.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_resolver.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_resources.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_serialization.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_traceback.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_tunnel.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_tunnel.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_type_manager.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/logger.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/_watcher.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/README.md +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/builder/base-images.json +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/call_graph.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/_download.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/_traceback.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/app.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/cluster.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/config.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/container.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/dict.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/entry_point.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/environment.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/import_refs.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/launch.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/network_file_system.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/profile.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/queues.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/run.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/secret.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/token.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/utils.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cli/volume.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/client.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/config.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/container_process.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/container_process.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/dict.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/dict.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/environments.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/environments.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/exception.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/experimental/ipython.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/file_io.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/file_io.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/file_pattern_matcher.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/functions.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/gpu.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/io_streams.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/io_streams.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/network_file_system.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/network_file_system.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/object.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/object.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/output.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/partial_function.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/partial_function.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/proxy.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/proxy.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/py.typed +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/queue.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/queue.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/retries.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/runner.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/runner.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/running_app.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/schedule.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/scheduler_placement.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/secret.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/secret.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/serving.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/serving.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/snapshot.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/snapshot.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/stream_type.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/token_flow.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/token_flow.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/volume.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal/volume.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/__init__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options.proto +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_proto/py.typed +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/modal_version/__main__.py +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/pyproject.toml +0 -0
- {modal-1.1.3.dev6 → modal-1.1.4}/setup.cfg +0 -0
@@ -14,6 +14,7 @@ from modal_proto import api_pb2
|
|
14
14
|
@dataclass
|
15
15
|
class ClusterInfo:
|
16
16
|
rank: int
|
17
|
+
cluster_id: str
|
17
18
|
container_ips: list[str]
|
18
19
|
container_ipv4_ips: list[str]
|
19
20
|
|
@@ -69,12 +70,14 @@ async def _initialize_clustered_function(client: _Client, task_id: str, world_si
|
|
69
70
|
)
|
70
71
|
cluster_info = ClusterInfo(
|
71
72
|
rank=resp.cluster_rank,
|
73
|
+
cluster_id=resp.cluster_id,
|
72
74
|
container_ips=resp.container_ips,
|
73
75
|
container_ipv4_ips=resp.container_ipv4_ips,
|
74
76
|
)
|
75
77
|
else:
|
76
78
|
cluster_info = ClusterInfo(
|
77
79
|
rank=0,
|
80
|
+
cluster_id="", # No cluster ID for single-node # TODO(irfansharif): Is this right?
|
78
81
|
container_ips=[container_ip],
|
79
82
|
container_ipv4_ips=[], # No IPv4 IPs for single-node
|
80
83
|
)
|
@@ -3,13 +3,14 @@ import typing
|
|
3
3
|
import typing_extensions
|
4
4
|
|
5
5
|
class ClusterInfo:
|
6
|
-
"""ClusterInfo(rank: int, container_ips: list[str], container_ipv4_ips: list[str])"""
|
6
|
+
"""ClusterInfo(rank: int, cluster_id: str, container_ips: list[str], container_ipv4_ips: list[str])"""
|
7
7
|
|
8
8
|
rank: int
|
9
|
+
cluster_id: str
|
9
10
|
container_ips: list[str]
|
10
11
|
container_ipv4_ips: list[str]
|
11
12
|
|
12
|
-
def __init__(self, rank: int, container_ips: list[str], container_ipv4_ips: list[str]) -> None:
|
13
|
+
def __init__(self, rank: int, cluster_id: str, container_ips: list[str], container_ipv4_ips: list[str]) -> None:
|
13
14
|
"""Initialize self. See help(type(self)) for accurate signature."""
|
14
15
|
...
|
15
16
|
|
@@ -674,6 +674,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
674
674
|
proxy: Optional[_Proxy] = None,
|
675
675
|
retries: Optional[Union[int, Retries]] = None,
|
676
676
|
timeout: int = 300,
|
677
|
+
startup_timeout: Optional[int] = None,
|
677
678
|
min_containers: Optional[int] = None,
|
678
679
|
max_containers: Optional[int] = None,
|
679
680
|
buffer_containers: Optional[int] = None,
|
@@ -966,6 +967,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
966
967
|
proxy_id=(proxy.object_id if proxy else None),
|
967
968
|
retry_policy=retry_policy,
|
968
969
|
timeout_secs=timeout_secs or 0,
|
970
|
+
startup_timeout_secs=startup_timeout or timeout_secs,
|
969
971
|
pty_info=pty_info,
|
970
972
|
cloud_provider_str=cloud if cloud else "",
|
971
973
|
runtime=config.get("function_runtime"),
|
@@ -1019,6 +1021,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1019
1021
|
autoscaler_settings=function_definition.autoscaler_settings,
|
1020
1022
|
worker_id=function_definition.worker_id,
|
1021
1023
|
timeout_secs=function_definition.timeout_secs,
|
1024
|
+
startup_timeout_secs=function_definition.startup_timeout_secs,
|
1022
1025
|
web_url=function_definition.web_url,
|
1023
1026
|
web_url_info=function_definition.web_url_info,
|
1024
1027
|
webhook_config=function_definition.webhook_config,
|
@@ -1471,6 +1474,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1471
1474
|
self._info = None
|
1472
1475
|
self._serve_mounts = frozenset()
|
1473
1476
|
self._metadata = None
|
1477
|
+
self._experimental_flash_urls = None
|
1474
1478
|
|
1475
1479
|
def _hydrate_metadata(self, metadata: Optional[Message]):
|
1476
1480
|
# Overridden concrete implementation of base class method
|
@@ -1498,6 +1502,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1498
1502
|
self._max_object_size_bytes = (
|
1499
1503
|
metadata.max_object_size_bytes if metadata.HasField("max_object_size_bytes") else MAX_OBJECT_SIZE_BYTES
|
1500
1504
|
)
|
1505
|
+
self._experimental_flash_urls = metadata._experimental_flash_urls
|
1501
1506
|
|
1502
1507
|
def _get_metadata(self):
|
1503
1508
|
# Overridden concrete implementation of base class method
|
@@ -1515,6 +1520,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
1515
1520
|
input_plane_url=self._input_plane_url,
|
1516
1521
|
input_plane_region=self._input_plane_region,
|
1517
1522
|
max_object_size_bytes=self._max_object_size_bytes,
|
1523
|
+
_experimental_flash_urls=self._experimental_flash_urls,
|
1518
1524
|
)
|
1519
1525
|
|
1520
1526
|
def _check_no_web_url(self, fn_name: str):
|
@@ -1545,6 +1551,11 @@ Use the `Function.get_web_url()` method instead.
|
|
1545
1551
|
"""URL of a Function running as a web endpoint."""
|
1546
1552
|
return self._web_url
|
1547
1553
|
|
1554
|
+
@live_method
|
1555
|
+
async def _experimental_get_flash_urls(self) -> Optional[list[str]]:
|
1556
|
+
"""URL of the flash service for the function."""
|
1557
|
+
return list(self._experimental_flash_urls) if self._experimental_flash_urls else None
|
1558
|
+
|
1548
1559
|
@property
|
1549
1560
|
async def is_generator(self) -> bool:
|
1550
1561
|
"""mdmd:hidden"""
|
@@ -2015,6 +2026,7 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
|
|
2015
2026
|
fc: _FunctionCall[Any] = _FunctionCall._from_loader(_load, rep, hydrate_lazily=True)
|
2016
2027
|
# We already know the object ID, so we can set it directly
|
2017
2028
|
fc._object_id = function_call_id
|
2029
|
+
fc._client = client
|
2018
2030
|
return fc
|
2019
2031
|
|
2020
2032
|
@staticmethod
|
@@ -120,7 +120,7 @@ def asgi_app_wrapper(asgi_app, container_io_manager) -> tuple[Callable[..., Asyn
|
|
120
120
|
|
121
121
|
async def handle_first_input_timeout():
|
122
122
|
if scope["type"] == "http":
|
123
|
-
await messages_from_app.put({"type": "http.response.start", "status":
|
123
|
+
await messages_from_app.put({"type": "http.response.start", "status": 408})
|
124
124
|
await messages_from_app.put(
|
125
125
|
{
|
126
126
|
"type": "http.response.body",
|
@@ -641,7 +641,8 @@ class _App:
|
|
641
641
|
scaledown_window: Optional[int] = None, # Max time (in seconds) a container can remain idle while scaling down.
|
642
642
|
proxy: Optional[_Proxy] = None, # Reference to a Modal Proxy to use in front of this function.
|
643
643
|
retries: Optional[Union[int, Retries]] = None, # Number of times to retry each input in case of failure.
|
644
|
-
timeout: int = 300, # Maximum execution time in seconds.
|
644
|
+
timeout: int = 300, # Maximum execution time for inputs and startup time in seconds.
|
645
|
+
startup_timeout: Optional[int] = None, # Maximum startup time in seconds with higher precedence than `timeout`.
|
645
646
|
name: Optional[str] = None, # Sets the Modal name of the function within the app
|
646
647
|
is_generator: Optional[
|
647
648
|
bool
|
@@ -816,6 +817,7 @@ class _App:
|
|
816
817
|
batch_max_size=batch_max_size,
|
817
818
|
batch_wait_ms=batch_wait_ms,
|
818
819
|
timeout=timeout,
|
820
|
+
startup_timeout=startup_timeout or timeout,
|
819
821
|
cloud=cloud,
|
820
822
|
webhook_config=webhook_config,
|
821
823
|
enable_memory_snapshot=enable_memory_snapshot,
|
@@ -869,7 +871,8 @@ class _App:
|
|
869
871
|
scaledown_window: Optional[int] = None, # Max time (in seconds) a container can remain idle while scaling down.
|
870
872
|
proxy: Optional[_Proxy] = None, # Reference to a Modal Proxy to use in front of this function.
|
871
873
|
retries: Optional[Union[int, Retries]] = None, # Number of times to retry each input in case of failure.
|
872
|
-
timeout: int = 300, # Maximum execution time
|
874
|
+
timeout: int = 300, # Maximum execution time for inputs and startup time in seconds.
|
875
|
+
startup_timeout: Optional[int] = None, # Maximum startup time in seconds with higher precedence than `timeout`.
|
873
876
|
cloud: Optional[str] = None, # Cloud provider to run the function on. Possible values are aws, gcp, oci, auto.
|
874
877
|
region: Optional[Union[str, Sequence[str]]] = None, # Region or regions to run the function on.
|
875
878
|
enable_memory_snapshot: bool = False, # Enable memory checkpointing for faster cold starts.
|
@@ -1002,6 +1005,7 @@ class _App:
|
|
1002
1005
|
batch_max_size=batch_max_size,
|
1003
1006
|
batch_wait_ms=batch_wait_ms,
|
1004
1007
|
timeout=timeout,
|
1008
|
+
startup_timeout=startup_timeout or timeout,
|
1005
1009
|
cloud=cloud,
|
1006
1010
|
enable_memory_snapshot=enable_memory_snapshot,
|
1007
1011
|
block_network=block_network,
|
@@ -411,6 +411,7 @@ class _App:
|
|
411
411
|
proxy: typing.Optional[modal.proxy._Proxy] = None,
|
412
412
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
413
413
|
timeout: int = 300,
|
414
|
+
startup_timeout: typing.Optional[int] = None,
|
414
415
|
name: typing.Optional[str] = None,
|
415
416
|
is_generator: typing.Optional[bool] = None,
|
416
417
|
cloud: typing.Optional[str] = None,
|
@@ -464,6 +465,7 @@ class _App:
|
|
464
465
|
proxy: typing.Optional[modal.proxy._Proxy] = None,
|
465
466
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
466
467
|
timeout: int = 300,
|
468
|
+
startup_timeout: typing.Optional[int] = None,
|
467
469
|
cloud: typing.Optional[str] = None,
|
468
470
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
469
471
|
enable_memory_snapshot: bool = False,
|
@@ -1014,6 +1016,7 @@ class App:
|
|
1014
1016
|
proxy: typing.Optional[modal.proxy.Proxy] = None,
|
1015
1017
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
1016
1018
|
timeout: int = 300,
|
1019
|
+
startup_timeout: typing.Optional[int] = None,
|
1017
1020
|
name: typing.Optional[str] = None,
|
1018
1021
|
is_generator: typing.Optional[bool] = None,
|
1019
1022
|
cloud: typing.Optional[str] = None,
|
@@ -1067,6 +1070,7 @@ class App:
|
|
1067
1070
|
proxy: typing.Optional[modal.proxy.Proxy] = None,
|
1068
1071
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
1069
1072
|
timeout: int = 300,
|
1073
|
+
startup_timeout: typing.Optional[int] = None,
|
1070
1074
|
cloud: typing.Optional[str] = None,
|
1071
1075
|
region: typing.Union[str, collections.abc.Sequence[str], None] = None,
|
1072
1076
|
enable_memory_snapshot: bool = False,
|
@@ -29,11 +29,7 @@ class _Client:
|
|
29
29
|
_snapshotted: bool
|
30
30
|
|
31
31
|
def __init__(
|
32
|
-
self,
|
33
|
-
server_url: str,
|
34
|
-
client_type: int,
|
35
|
-
credentials: typing.Optional[tuple[str, str]],
|
36
|
-
version: str = "1.1.3.dev6",
|
32
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "1.1.4"
|
37
33
|
):
|
38
34
|
"""mdmd:hidden
|
39
35
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -160,11 +156,7 @@ class Client:
|
|
160
156
|
_snapshotted: bool
|
161
157
|
|
162
158
|
def __init__(
|
163
|
-
self,
|
164
|
-
server_url: str,
|
165
|
-
client_type: int,
|
166
|
-
credentials: typing.Optional[tuple[str, str]],
|
167
|
-
version: str = "1.1.3.dev6",
|
159
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "1.1.4"
|
168
160
|
):
|
169
161
|
"""mdmd:hidden
|
170
162
|
The Modal client object is not intended to be instantiated directly by users.
|
@@ -12,7 +12,7 @@ from grpclib import GRPCError, Status
|
|
12
12
|
from modal_proto import api_pb2
|
13
13
|
|
14
14
|
from ._functions import _Function, _parse_retries
|
15
|
-
from ._object import _Object
|
15
|
+
from ._object import _Object, live_method
|
16
16
|
from ._partial_function import (
|
17
17
|
_find_callables_for_obj,
|
18
18
|
_find_partial_methods_for_user_cls,
|
@@ -510,6 +510,11 @@ class _Cls(_Object, type_prefix="cs"):
|
|
510
510
|
# returns method names for a *local* class only for now (used by cli)
|
511
511
|
return self._method_partials.keys()
|
512
512
|
|
513
|
+
@live_method
|
514
|
+
async def _experimental_get_flash_urls(self) -> Optional[list[str]]:
|
515
|
+
"""URL of the flash service for the class."""
|
516
|
+
return await self._get_class_service_function()._experimental_get_flash_urls()
|
517
|
+
|
513
518
|
def _hydrate_metadata(self, metadata: Message):
|
514
519
|
assert isinstance(metadata, api_pb2.ClassHandleMetadata)
|
515
520
|
class_service_function = self._get_class_service_function()
|
@@ -354,6 +354,10 @@ class _Cls(modal._object._Object):
|
|
354
354
|
def _get_name(self) -> str: ...
|
355
355
|
def _get_class_service_function(self) -> modal._functions._Function: ...
|
356
356
|
def _get_method_names(self) -> collections.abc.Collection[str]: ...
|
357
|
+
async def _experimental_get_flash_urls(self) -> typing.Optional[list[str]]:
|
358
|
+
"""URL of the flash service for the class."""
|
359
|
+
...
|
360
|
+
|
357
361
|
def _hydrate_metadata(self, metadata: google.protobuf.message.Message): ...
|
358
362
|
@staticmethod
|
359
363
|
def validate_construction_mechanism(user_cls):
|
@@ -520,6 +524,18 @@ class Cls(modal.object.Object):
|
|
520
524
|
def _get_name(self) -> str: ...
|
521
525
|
def _get_class_service_function(self) -> modal.functions.Function: ...
|
522
526
|
def _get_method_names(self) -> collections.abc.Collection[str]: ...
|
527
|
+
|
528
|
+
class ___experimental_get_flash_urls_spec(typing_extensions.Protocol[SUPERSELF]):
|
529
|
+
def __call__(self, /) -> typing.Optional[list[str]]:
|
530
|
+
"""URL of the flash service for the class."""
|
531
|
+
...
|
532
|
+
|
533
|
+
async def aio(self, /) -> typing.Optional[list[str]]:
|
534
|
+
"""URL of the flash service for the class."""
|
535
|
+
...
|
536
|
+
|
537
|
+
_experimental_get_flash_urls: ___experimental_get_flash_urls_spec[typing_extensions.Self]
|
538
|
+
|
523
539
|
def _hydrate_metadata(self, metadata: google.protobuf.message.Message): ...
|
524
540
|
@staticmethod
|
525
541
|
def validate_construction_mechanism(user_cls):
|
@@ -311,7 +311,8 @@ async def notebook_base_image(*, python_version: Optional[str] = None, force_bui
|
|
311
311
|
|
312
312
|
commands: list[str] = [
|
313
313
|
"apt-get update",
|
314
|
-
"apt-get install -y
|
314
|
+
"apt-get install -y "
|
315
|
+
+ "libpq-dev pkg-config cmake git curl wget unzip zip libsqlite3-dev openssh-server vim ffmpeg",
|
315
316
|
_install_cuda_command(),
|
316
317
|
# Install uv since it's faster than pip for installing packages.
|
317
318
|
"pip install uv",
|