modal 1.1.5.dev32__py3-none-any.whl → 1.1.5.dev34__py3-none-any.whl

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/_functions.py CHANGED
@@ -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 = [v for _, v in options.validated_volumes] + list(options.secrets)
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
 
modal/client.pyi CHANGED
@@ -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.dev32",
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.dev32",
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: list[tuple[str, _CloudBucketMount]]) -> list[api_pb2.CloudBucketMount]:
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: list[tuple[str, _CloudBucketMount]],
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
  ...
modal/cls.py CHANGED
@@ -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, os.PathLike], _Volume] = {},
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=validate_volumes(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,
modal/cls.pyi CHANGED
@@ -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 os
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[typing.Union[str, os.PathLike], modal.volume._Volume] = {},
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[typing.Union[str, os.PathLike], modal.volume.Volume] = {},
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev32
3
+ Version: 1.1.5.dev34
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=45H-GtwzaDfN-1nP4_HYvzN3s7AG_HXR4-ynrsjO_OI,2803
3
3
  modal/_clustered_functions.py,sha256=Sy4Sf_17EO8OL-FUe8LYcm4hrqLyQFCssNhr3p0SroU,3013
4
4
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
5
5
  modal/_container_entrypoint.py,sha256=fLluT_sU34vGPCTG1Q58VI1RvxF5n7vQzCVCsL-MMk8,29033
6
- modal/_functions.py,sha256=tHoO-Wryrh2mO6MQi3RtvTHHh6VW0vcTVUrNZcBW8mg,91266
6
+ modal/_functions.py,sha256=-T41_HZxzKe6RdwxZAuZFHGuq3VZ5Nl3h1VgMY8AbKM,91605
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
9
  modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
@@ -22,11 +22,11 @@ modal/app.py,sha256=OBFaL-8KVMtBMEmspHA76LvblPdnSgdoGioLkQBjhdQ,48851
22
22
  modal/app.pyi,sha256=Cqk3pOeEEroCLejj3yJ3XHDqt0rMzeSA295gMKEx6Ww,43955
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=mGQdJ8WPOydFiWo2ztx2FnrizNxF7f2S6j71LckzSVM,15831
26
- modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
- modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
- modal/cls.py,sha256=qb9h_ZKiz2q7fwKQ-5bdkz1x3tdu6sIm-UI09aQjPPc,41101
29
- modal/cls.pyi,sha256=C_bOybNa5iaVCcea-o8M1ATqpAbsQTtS9jN3OiEqhNY,29171
25
+ modal/client.pyi,sha256=ixM8oHYStwBilFdPuLLcuxZdt0Fp7JwIP1GsNIzbJPY,15831
26
+ modal/cloud_bucket_mount.py,sha256=I2GRXYhOWLIz2kJZjXu75jAm9EJkBNcutGc6jR2ReUw,5928
27
+ modal/cloud_bucket_mount.pyi,sha256=VuUOipMIHqFXMkD-3g2bsoqpSxV5qswlFHDOqPQzYAo,7405
28
+ modal/cls.py,sha256=R1uLQbdqWRRjvxs0I57a4hZZELZkBVCxOKxvKryU5_s,41639
29
+ modal/cls.pyi,sha256=PRvC9lWIBL-L4cMc9cIt8I_ZDXI7oFttitKaFWWwhUk,29709
30
30
  modal/config.py,sha256=hpcfT03tdB-G0exZ4HjYDHwDtA8XcnliiyZzCcTbr8o,12124
31
31
  modal/container_process.py,sha256=Mutkl7sg_WR5zP4oJiWSC-3UdYRqp0zdKi1shZbi-bk,6996
32
32
  modal/container_process.pyi,sha256=9m-st3hCUlNN1GOTctfPPvIvoLtEl7FbuGWwif5-7YU,6037
@@ -153,7 +153,7 @@ modal/experimental/__init__.py,sha256=fCqzo_f3vcY750vHtd7CtLs5dvdM_C0ZLLGb3zXuK9
153
153
  modal/experimental/flash.py,sha256=7qRAL2Nrwbb60YKobcnpM0zJ8vw4xGJqabLPFgEzMZE,28295
154
154
  modal/experimental/flash.pyi,sha256=R9VV0UDotiY9BRUjacB-xI4qhR3yBymAvEZFRFHztLs,15143
155
155
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
156
- modal-1.1.5.dev32.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
156
+ modal-1.1.5.dev34.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
157
157
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
158
158
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
159
159
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -161,10 +161,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
161
161
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
162
162
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
163
163
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
164
- modal_proto/api.proto,sha256=y5TUm487syMEJX7Q_AdbASHPYcTzs7eoqDxajELhY5Y,108051
164
+ modal_proto/api.proto,sha256=2z4_8zfV2ZGgPjd7SM42jOFmJCdXkTtud1sCsj0w8ys,108146
165
165
  modal_proto/api_grpc.py,sha256=-jhV6iRL3mZnfVWdao7yH7tFajZnbEGePyzI96EfZCQ,131221
166
- modal_proto/api_pb2.py,sha256=LnJveE1jjEwVR9wbkdeImvBgy_uPUjQ3jbVMSJeKD8E,377131
167
- modal_proto/api_pb2.pyi,sha256=A9Diy7-HCz6izFmf6B9LmuqgQb17OsKWhTzF5OoPTOM,521520
166
+ modal_proto/api_pb2.py,sha256=1-DmyH_vh3_9IuaUiO3ZlB3HcdrDvra6sUmk3iDCp6g,377273
167
+ modal_proto/api_pb2.pyi,sha256=Fku7AuTNyk26otuX0Aei5f9OG0sV0eK4Zf2JgOEzL7E,522091
168
168
  modal_proto/api_pb2_grpc.py,sha256=s6srjmOFKQ4oDH4mtStS2dIv0pg-6znpP4AnZoHDZ-g,282909
169
169
  modal_proto/api_pb2_grpc.pyi,sha256=5JT1ePlOqkQ5hfm-0-Mva_ZZcisGoIhtBmIxFq_piRo,66259
170
170
  modal_proto/modal_api_grpc.py,sha256=wqX9Vbr20ldPjkXb5oZMwD4RV1cUMTt4T234YilZEaQ,19789
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
176
176
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
177
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_version/__init__.py,sha256=LaxI0sv_7S56LRqCNTMpcELRVlIczont8F9uOrcyZpI,121
179
+ modal_version/__init__.py,sha256=drz_MZvrVJ7yKBhS1Cqhlfi9pIU9QgSG7JjDMBnQyOg,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.5.dev32.dist-info/METADATA,sha256=tiyY9C7kjl-SEjYYs4Pc-NThocuJ69tvjHKp8GVx-oM,2460
182
- modal-1.1.5.dev32.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.5.dev32.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.5.dev32.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.5.dev32.dist-info/RECORD,,
181
+ modal-1.1.5.dev34.dist-info/METADATA,sha256=soziZDTIHRShLz0T2a2GhqdaxbVuZ8kOgn3sGqy7ThM,2460
182
+ modal-1.1.5.dev34.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
+ modal-1.1.5.dev34.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
+ modal-1.1.5.dev34.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
+ modal-1.1.5.dev34.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1886,6 +1886,8 @@ message FunctionOptions {
1886
1886
  optional uint64 batch_linger_ms = 16;
1887
1887
  optional SchedulerPlacement scheduler_placement = 17;
1888
1888
  optional string cloud_provider_str = 18;
1889
+ bool replace_cloud_bucket_mounts = 19;
1890
+ repeated CloudBucketMount cloud_bucket_mounts = 20;
1889
1891
  }
1890
1892
 
1891
1893
  message FunctionPrecreateRequest {