modal 1.1.5.dev33__tar.gz → 1.1.5.dev34__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.1.5.dev33 → modal-1.1.5.dev34}/PKG-INFO +1 -1
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_functions.py +7 -1
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/client.pyi +2 -2
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cloud_bucket_mount.py +2 -2
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cloud_bucket_mount.pyi +1 -1
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cls.py +11 -3
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cls.pyi +13 -4
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/functions.pyi +6 -6
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_version/__init__.py +1 -1
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/LICENSE +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/README.md +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/__main__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_clustered_functions.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_clustered_functions.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_ipython.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_location.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_object.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_output.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_partial_function.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_pty.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_resolver.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_resources.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/asgi.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_serialization.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_traceback.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_tunnel.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_tunnel.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_type_manager.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/logger.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/_watcher.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/app.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/app.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/2025.06.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/README.md +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/builder/base-images.json +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/call_graph.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/_download.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/_traceback.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/app.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/cluster.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/config.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/container.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/dict.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/entry_point.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/environment.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/import_refs.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/launch.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/network_file_system.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/profile.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/queues.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/run.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/secret.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/token.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/utils.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/cli/volume.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/client.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/config.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/container_process.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/container_process.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/dict.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/dict.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/environments.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/environments.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/exception.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/experimental/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/experimental/flash.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/experimental/flash.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/experimental/ipython.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/file_io.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/file_io.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/file_pattern_matcher.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/functions.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/gpu.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/image.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/image.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/io_streams.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/io_streams.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/mount.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/mount.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/network_file_system.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/network_file_system.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/object.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/object.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/output.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/parallel_map.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/parallel_map.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/partial_function.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/partial_function.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/proxy.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/proxy.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/py.typed +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/queue.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/queue.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/retries.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/runner.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/runner.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/running_app.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/sandbox.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/sandbox.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/schedule.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/scheduler_placement.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/secret.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/secret.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/serving.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/serving.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/snapshot.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/snapshot.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/stream_type.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/token_flow.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/token_flow.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/volume.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal/volume.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/__init__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api.proto +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api_pb2.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options.proto +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_proto/py.typed +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/modal_version/__main__.py +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/pyproject.toml +0 -0
- {modal-1.1.5.dev33 → modal-1.1.5.dev34}/setup.cfg +0 -0
|
@@ -1224,6 +1224,8 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1224
1224
|
replace_secret_ids=bool(options.secrets),
|
|
1225
1225
|
replace_volume_mounts=len(volume_mounts) > 0,
|
|
1226
1226
|
volume_mounts=volume_mounts,
|
|
1227
|
+
cloud_bucket_mounts=cloud_bucket_mounts_to_proto(options.cloud_bucket_mounts),
|
|
1228
|
+
replace_cloud_bucket_mounts=bool(options.cloud_bucket_mounts),
|
|
1227
1229
|
resources=options.resources,
|
|
1228
1230
|
retry_policy=options.retry_policy,
|
|
1229
1231
|
concurrency_limit=options.max_containers,
|
|
@@ -1253,7 +1255,11 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1253
1255
|
|
|
1254
1256
|
def _deps():
|
|
1255
1257
|
if options:
|
|
1256
|
-
all_deps =
|
|
1258
|
+
all_deps = (
|
|
1259
|
+
[v for _, v in options.validated_volumes]
|
|
1260
|
+
+ list(options.secrets)
|
|
1261
|
+
+ [mount.secret for _, mount in options.cloud_bucket_mounts if mount.secret]
|
|
1262
|
+
)
|
|
1257
1263
|
return [dep for dep in all_deps if not dep.is_hydrated]
|
|
1258
1264
|
return []
|
|
1259
1265
|
|
|
@@ -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.1.5.
|
|
36
|
+
version: str = "1.1.5.dev34",
|
|
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.1.5.
|
|
167
|
+
version: str = "1.1.5.dev34",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copyright Modal Labs 2022
|
|
2
2
|
from dataclasses import dataclass
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Optional, Sequence
|
|
4
4
|
from urllib.parse import urlparse
|
|
5
5
|
|
|
6
6
|
from modal_proto import api_pb2
|
|
@@ -119,7 +119,7 @@ class _CloudBucketMount:
|
|
|
119
119
|
requester_pays: bool = False
|
|
120
120
|
|
|
121
121
|
|
|
122
|
-
def cloud_bucket_mounts_to_proto(mounts:
|
|
122
|
+
def cloud_bucket_mounts_to_proto(mounts: Sequence[tuple[str, _CloudBucketMount]]) -> list[api_pb2.CloudBucketMount]:
|
|
123
123
|
"""Helper function to convert `CloudBucketMount` to a list of protobufs that can be passed to the server."""
|
|
124
124
|
cloud_bucket_mounts: list[api_pb2.CloudBucketMount] = []
|
|
125
125
|
|
|
@@ -122,7 +122,7 @@ class _CloudBucketMount:
|
|
|
122
122
|
...
|
|
123
123
|
|
|
124
124
|
def cloud_bucket_mounts_to_proto(
|
|
125
|
-
mounts:
|
|
125
|
+
mounts: typing.Sequence[tuple[str, _CloudBucketMount]],
|
|
126
126
|
) -> list[modal_proto.api_pb2.CloudBucketMount]:
|
|
127
127
|
"""Helper function to convert `CloudBucketMount` to a list of protobufs that can be passed to the server."""
|
|
128
128
|
...
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Copyright Modal Labs 2022
|
|
2
2
|
import dataclasses
|
|
3
3
|
import inspect
|
|
4
|
-
import os
|
|
5
4
|
import typing
|
|
6
5
|
from collections.abc import Collection
|
|
6
|
+
from pathlib import PurePosixPath
|
|
7
7
|
from typing import Any, Callable, Optional, Sequence, TypeVar, Union
|
|
8
8
|
|
|
9
9
|
from google.protobuf.message import Message
|
|
@@ -33,6 +33,7 @@ from ._utils.deprecation import (
|
|
|
33
33
|
from ._utils.grpc_utils import retry_transient_errors
|
|
34
34
|
from ._utils.mount_utils import validate_volumes
|
|
35
35
|
from .client import _Client
|
|
36
|
+
from .cloud_bucket_mount import _CloudBucketMount
|
|
36
37
|
from .config import config
|
|
37
38
|
from .exception import ExecutionError, InvalidError, NotFoundError
|
|
38
39
|
from .gpu import GPU_T
|
|
@@ -95,6 +96,7 @@ class _ServiceOptions:
|
|
|
95
96
|
batch_wait_ms: Optional[int] = None
|
|
96
97
|
scheduler_placement: Optional[api_pb2.SchedulerPlacement] = None
|
|
97
98
|
cloud: Optional[str] = None
|
|
99
|
+
cloud_bucket_mounts: typing.Sequence[tuple[str, _CloudBucketMount]] = ()
|
|
98
100
|
|
|
99
101
|
def merge_options(self, new_options: "_ServiceOptions") -> "_ServiceOptions":
|
|
100
102
|
"""Implement protobuf-like MergeFrom semantics for this dataclass.
|
|
@@ -688,7 +690,7 @@ More information on class parameterization can be found here: https://modal.com/
|
|
|
688
690
|
gpu: GPU_T = None,
|
|
689
691
|
env: Optional[dict[str, Optional[str]]] = None,
|
|
690
692
|
secrets: Optional[Collection[_Secret]] = None,
|
|
691
|
-
volumes: dict[Union[str,
|
|
693
|
+
volumes: dict[Union[str, PurePosixPath], Union[_Volume, _CloudBucketMount]] = {},
|
|
692
694
|
retries: Optional[Union[int, Retries]] = None,
|
|
693
695
|
max_containers: Optional[int] = None, # Limit on the number of containers that can be concurrently running.
|
|
694
696
|
buffer_containers: Optional[int] = None, # Additional containers to scale up while Function is active.
|
|
@@ -762,13 +764,19 @@ More information on class parameterization can be found here: https://modal.com/
|
|
|
762
764
|
cls = _Cls._from_loader(_load_from_base, rep=f"{self._name}.with_options(...)", is_another_app=True, deps=_deps)
|
|
763
765
|
cls._initialize_from_other(self)
|
|
764
766
|
|
|
767
|
+
# Validate volumes
|
|
768
|
+
validated_volumes = validate_volumes(volumes)
|
|
769
|
+
cloud_bucket_mounts = [(k, v) for k, v in validated_volumes if isinstance(v, _CloudBucketMount)]
|
|
770
|
+
validated_volumes_no_cloud_buckets = [(k, v) for k, v in validated_volumes if isinstance(v, _Volume)]
|
|
771
|
+
|
|
765
772
|
secrets = secrets or []
|
|
766
773
|
if env:
|
|
767
774
|
secrets = [*secrets, _Secret.from_dict(env)]
|
|
768
775
|
|
|
769
776
|
new_options = _ServiceOptions(
|
|
770
777
|
secrets=secrets,
|
|
771
|
-
validated_volumes=
|
|
778
|
+
validated_volumes=validated_volumes_no_cloud_buckets,
|
|
779
|
+
cloud_bucket_mounts=cloud_bucket_mounts,
|
|
772
780
|
resources=resources,
|
|
773
781
|
retry_policy=retry_policy,
|
|
774
782
|
max_containers=max_containers,
|
|
@@ -6,6 +6,7 @@ import modal._object
|
|
|
6
6
|
import modal._partial_function
|
|
7
7
|
import modal.app
|
|
8
8
|
import modal.client
|
|
9
|
+
import modal.cloud_bucket_mount
|
|
9
10
|
import modal.functions
|
|
10
11
|
import modal.gpu
|
|
11
12
|
import modal.object
|
|
@@ -14,7 +15,7 @@ import modal.retries
|
|
|
14
15
|
import modal.secret
|
|
15
16
|
import modal.volume
|
|
16
17
|
import modal_proto.api_pb2
|
|
17
|
-
import
|
|
18
|
+
import pathlib
|
|
18
19
|
import typing
|
|
19
20
|
import typing_extensions
|
|
20
21
|
|
|
@@ -24,7 +25,7 @@ def _use_annotation_parameters(user_cls: type) -> bool: ...
|
|
|
24
25
|
def _get_class_constructor_signature(user_cls: type) -> inspect.Signature: ...
|
|
25
26
|
|
|
26
27
|
class _ServiceOptions:
|
|
27
|
-
"""_ServiceOptions(secrets: collections.abc.Collection[modal.secret._Secret] = (), validated_volumes: Sequence[tuple[str, modal.volume._Volume]] = (), resources: Optional[modal_proto.api_pb2.Resources] = None, retry_policy: Optional[modal_proto.api_pb2.FunctionRetryPolicy] = None, max_containers: Optional[int] = None, buffer_containers: Optional[int] = None, scaledown_window: Optional[int] = None, timeout_secs: Optional[int] = None, max_concurrent_inputs: Optional[int] = None, target_concurrent_inputs: Optional[int] = None, batch_max_size: Optional[int] = None, batch_wait_ms: Optional[int] = None, scheduler_placement: Optional[modal_proto.api_pb2.SchedulerPlacement] = None, cloud: Optional[str] = None)"""
|
|
28
|
+
"""_ServiceOptions(secrets: collections.abc.Collection[modal.secret._Secret] = (), validated_volumes: Sequence[tuple[str, modal.volume._Volume]] = (), resources: Optional[modal_proto.api_pb2.Resources] = None, retry_policy: Optional[modal_proto.api_pb2.FunctionRetryPolicy] = None, max_containers: Optional[int] = None, buffer_containers: Optional[int] = None, scaledown_window: Optional[int] = None, timeout_secs: Optional[int] = None, max_concurrent_inputs: Optional[int] = None, target_concurrent_inputs: Optional[int] = None, batch_max_size: Optional[int] = None, batch_wait_ms: Optional[int] = None, scheduler_placement: Optional[modal_proto.api_pb2.SchedulerPlacement] = None, cloud: Optional[str] = None, cloud_bucket_mounts: Sequence[tuple[str, modal.cloud_bucket_mount._CloudBucketMount]] = ())"""
|
|
28
29
|
|
|
29
30
|
secrets: collections.abc.Collection[modal.secret._Secret]
|
|
30
31
|
validated_volumes: typing.Sequence[tuple[str, modal.volume._Volume]]
|
|
@@ -40,6 +41,7 @@ class _ServiceOptions:
|
|
|
40
41
|
batch_wait_ms: typing.Optional[int]
|
|
41
42
|
scheduler_placement: typing.Optional[modal_proto.api_pb2.SchedulerPlacement]
|
|
42
43
|
cloud: typing.Optional[str]
|
|
44
|
+
cloud_bucket_mounts: typing.Sequence[tuple[str, modal.cloud_bucket_mount._CloudBucketMount]]
|
|
43
45
|
|
|
44
46
|
def merge_options(self, new_options: _ServiceOptions) -> _ServiceOptions:
|
|
45
47
|
"""Implement protobuf-like MergeFrom semantics for this dataclass.
|
|
@@ -64,6 +66,7 @@ class _ServiceOptions:
|
|
|
64
66
|
batch_wait_ms: typing.Optional[int] = None,
|
|
65
67
|
scheduler_placement: typing.Optional[modal_proto.api_pb2.SchedulerPlacement] = None,
|
|
66
68
|
cloud: typing.Optional[str] = None,
|
|
69
|
+
cloud_bucket_mounts: typing.Sequence[tuple[str, modal.cloud_bucket_mount._CloudBucketMount]] = (),
|
|
67
70
|
) -> None:
|
|
68
71
|
"""Initialize self. See help(type(self)) for accurate signature."""
|
|
69
72
|
...
|
|
@@ -398,7 +401,10 @@ class _Cls(modal._object._Object):
|
|
|
398
401
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
399
402
|
env: typing.Optional[dict[str, typing.Optional[str]]] = None,
|
|
400
403
|
secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
|
|
401
|
-
volumes: dict[
|
|
404
|
+
volumes: dict[
|
|
405
|
+
typing.Union[str, pathlib.PurePosixPath],
|
|
406
|
+
typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
|
|
407
|
+
] = {},
|
|
402
408
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
|
403
409
|
max_containers: typing.Optional[int] = None,
|
|
404
410
|
buffer_containers: typing.Optional[int] = None,
|
|
@@ -577,7 +583,10 @@ class Cls(modal.object.Object):
|
|
|
577
583
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
578
584
|
env: typing.Optional[dict[str, typing.Optional[str]]] = None,
|
|
579
585
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
580
|
-
volumes: dict[
|
|
586
|
+
volumes: dict[
|
|
587
|
+
typing.Union[str, pathlib.PurePosixPath],
|
|
588
|
+
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
|
589
|
+
] = {},
|
|
581
590
|
retries: typing.Union[int, modal.retries.Retries, None] = None,
|
|
582
591
|
max_containers: typing.Optional[int] = None,
|
|
583
592
|
buffer_containers: typing.Optional[int] = None,
|
|
@@ -449,7 +449,7 @@ class Function(
|
|
|
449
449
|
|
|
450
450
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
|
451
451
|
|
|
452
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
452
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
453
453
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
454
454
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
455
455
|
...
|
|
@@ -458,7 +458,7 @@ class Function(
|
|
|
458
458
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
459
459
|
...
|
|
460
460
|
|
|
461
|
-
remote: __remote_spec[modal._functions.
|
|
461
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
462
462
|
|
|
463
463
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
|
464
464
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -485,7 +485,7 @@ class Function(
|
|
|
485
485
|
"""
|
|
486
486
|
...
|
|
487
487
|
|
|
488
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
488
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
489
489
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
490
490
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
491
491
|
|
|
@@ -509,7 +509,7 @@ class Function(
|
|
|
509
509
|
...
|
|
510
510
|
|
|
511
511
|
_experimental_spawn: ___experimental_spawn_spec[
|
|
512
|
-
modal._functions.
|
|
512
|
+
modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
|
|
513
513
|
]
|
|
514
514
|
|
|
515
515
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
|
@@ -518,7 +518,7 @@ class Function(
|
|
|
518
518
|
|
|
519
519
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
|
520
520
|
|
|
521
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
521
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
522
522
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
523
523
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
524
524
|
|
|
@@ -539,7 +539,7 @@ class Function(
|
|
|
539
539
|
"""
|
|
540
540
|
...
|
|
541
541
|
|
|
542
|
-
spawn: __spawn_spec[modal._functions.
|
|
542
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
543
543
|
|
|
544
544
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
545
545
|
"""Return the inner Python object wrapped by this Modal Function."""
|
|
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
|