modal 0.74.30__py3-none-any.whl → 0.74.33__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.
modal/_functions.py CHANGED
@@ -407,7 +407,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
407
407
  _build_args: dict
408
408
 
409
409
  _is_generator: Optional[bool] = None
410
- _cluster_size: Optional[int] = None
411
410
 
412
411
  # when this is the method of a class/object function, invocation of this function
413
412
  # should supply the method name in the FunctionInput:
@@ -931,7 +930,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
931
930
  obj._app = app # needed for CLI right now
932
931
  obj._obj = None
933
932
  obj._is_generator = is_generator
934
- obj._cluster_size = cluster_size
935
933
  obj._is_method = False
936
934
  obj._spec = function_spec # needed for modal shell
937
935
  obj._webhook_config = webhook_config # only set locally
@@ -968,19 +966,9 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
968
966
  parent = self
969
967
 
970
968
  async def _load(param_bound_func: _Function, resolver: Resolver, existing_object_id: Optional[str]):
971
- try:
972
- identity = f"{parent.info.function_name} class service function"
973
- except Exception:
974
- # Can't always look up the function name that way, so fall back to generic message
975
- identity = "class service function for a parametrized class"
976
969
  if not parent.is_hydrated:
977
- if parent.app._running_app is None:
978
- reason = ", because the App it is defined on is not running"
979
- else:
980
- reason = ""
981
- raise ExecutionError(
982
- f"The {identity} has not been hydrated with the metadata it needs to run on Modal{reason}."
983
- )
970
+ # While the base Object.hydrate() method appears to be idempotent, it's not always safe
971
+ await parent.hydrate()
984
972
 
985
973
  assert parent._client and parent._client.stub
986
974
 
@@ -1236,7 +1224,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1236
1224
  # Overridden concrete implementation of base class method
1237
1225
  self._progress = None
1238
1226
  self._is_generator = None
1239
- self._cluster_size = None
1240
1227
  self._web_url = None
1241
1228
  self._function_name = None
1242
1229
  self._info = None
@@ -1305,11 +1292,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1305
1292
  assert self._is_generator is not None # should be set now
1306
1293
  return self._is_generator
1307
1294
 
1308
- @property
1309
- def cluster_size(self) -> int:
1310
- """mdmd:hidden"""
1311
- return self._cluster_size or 1
1312
-
1313
1295
  @live_method_gen
1314
1296
  async def _map(
1315
1297
  self, input_queue: _SynchronizedQueue, order_outputs: bool, return_exceptions: bool
@@ -140,7 +140,7 @@ class FunctionInfo:
140
140
  def __init__(
141
141
  self,
142
142
  f: Optional[Callable[..., Any]],
143
- serialized=False,
143
+ serialized: bool = False,
144
144
  name_override: Optional[str] = None,
145
145
  user_cls: Optional[type] = None,
146
146
  ):
@@ -148,6 +148,10 @@ class FunctionInfo:
148
148
  self.user_cls = user_cls
149
149
 
150
150
  if name_override is not None:
151
+ if not serialized:
152
+ # We may relax this constraint in the future, but currently we don't track the distinction between
153
+ # the Function's name inside modal and the name of the object that we need to import in a container.
154
+ raise InvalidError("Setting a custom `name=` also requires setting `serialized=True`")
151
155
  self.function_name = name_override
152
156
  elif f is None and user_cls:
153
157
  # "service function" for running all methods of a class
modal/client.pyi CHANGED
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.30"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.33"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.30"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.33"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/functions.pyi CHANGED
@@ -48,7 +48,6 @@ class Function(
48
48
  _raw_f: typing.Optional[collections.abc.Callable[..., typing.Any]]
49
49
  _build_args: dict
50
50
  _is_generator: typing.Optional[bool]
51
- _cluster_size: typing.Optional[int]
52
51
  _use_method_name: str
53
52
  _class_parameter_info: typing.Optional[modal_proto.api_pb2.ClassParameterInfo]
54
53
  _method_handle_metadata: typing.Optional[dict[str, modal_proto.api_pb2.FunctionHandleMetadata]]
@@ -163,8 +162,6 @@ class Function(
163
162
  def web_url(self) -> typing.Optional[str]: ...
164
163
  @property
165
164
  def is_generator(self) -> bool: ...
166
- @property
167
- def cluster_size(self) -> int: ...
168
165
 
169
166
  class ___map_spec(typing_extensions.Protocol[SUPERSELF]):
170
167
  def __call__(
@@ -200,11 +197,11 @@ class Function(
200
197
 
201
198
  _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
202
199
 
203
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
200
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
204
201
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
205
202
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
206
203
 
207
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
204
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
208
205
 
209
206
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
210
207
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -219,19 +216,19 @@ class Function(
219
216
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
220
217
  ) -> modal._functions.OriginalReturnType: ...
221
218
 
222
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
219
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
223
220
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
224
221
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
225
222
 
226
223
  _experimental_spawn: ___experimental_spawn_spec[
227
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
224
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
228
225
  ]
229
226
 
230
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
227
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
228
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
232
229
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
233
230
 
234
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
231
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
232
 
236
233
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
237
234
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.30
3
+ Version: 0.74.33
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=sTJcc9EbDuCKSwg3tL6ZckFw9WWdlkXW8mId1IvJCNc,2846
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
5
  modal/_container_entrypoint.py,sha256=DymOImhc3uGRkIq_qXmBsEbWMB4EBMpfuXzz2S4BcGg,29404
6
- modal/_functions.py,sha256=TcIVXtgf23A0SziIDBoh9RVYPnQOyfVdKXc1o9TsoAw,74816
6
+ modal/_functions.py,sha256=SAne05DDItfyywxXxh_WpmUuSq5BXOc3DXbCsveQhao,74070
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=JBIECWdfpRKCaCxVWZbC3Q1kF5Whk_EKvY9f4Y6AFyg,11446
@@ -22,7 +22,7 @@ modal/app.py,sha256=VQPV0u6zqePdocBZS6Tgjf_we7aSrLtvqqXmZNdMfBQ,50890
22
22
  modal/app.pyi,sha256=Dq7cfzkW8HR6Ud6L6YueZucHelEUYnGUc6BKn8KWpIk,28420
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
25
- modal/client.pyi,sha256=mnZOQTD4LONNFMQT93NGhR17PaZ1Pwk1RI8EjQRVSAA,7593
25
+ modal/client.pyi,sha256=XV6ltRSq0V4LtMUrMO0EsEfsZXxe1bpwdVhheWvo0Ig,7593
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
28
  modal/cls.py,sha256=ByV4st7Ka5mXAW4eBl9WMOmZKq1pSiCT4etpHIcylo8,33519
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
39
39
  modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
40
40
  modal/file_pattern_matcher.py,sha256=trosX-Bp7dOubudN1bLLhRAoidWy1TcoaR4Pv8CedWw,6497
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=ghYvquNzn1ye52k9TitwRCLDtQh8asKB6Hh4MIYlsE4,14918
42
+ modal/functions.pyi,sha256=ljRsgHRmnHEvZlrvzUSDb9PCZjtsPgMxYQptYS6REu4,14825
43
43
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
44
44
  modal/image.py,sha256=ZCghS6l1O7pezXcdMHk6RoJpW3qWszfWGJTW38lNXaU,92797
45
45
  modal/image.pyi,sha256=ddbegF532pDLiVANOJdtJiYoDbbF3mAFrsCiyvIu7jU,25632
@@ -96,7 +96,7 @@ modal/_utils/blob_utils.py,sha256=WhWaSFLcffVDchMyfKys-j0EFVbm9l7rebzeoa7Z2jM,18
96
96
  modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
97
97
  modal/_utils/deprecation.py,sha256=EXP1beU4pmEqEzWMLw6E3kUfNfpmNA_VOp6i0EHi93g,4856
98
98
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
99
- modal/_utils/function_utils.py,sha256=z6v8A5Ee827K9f2XV1c2_Ea6iv_zcaxbXySER-qW5XQ,26903
99
+ modal/_utils/function_utils.py,sha256=_q89uQr9v5ontrBkJ-WwEGR-VInJQpaCxmReCmfp4_A,27277
100
100
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
101
101
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
102
102
  modal/_utils/grpc_utils.py,sha256=YgUfYuOKVYshBmFaIo4VWwcEEIFeZ2VjiVS5Y5K3Lfo,8549
@@ -145,7 +145,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
145
145
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
146
146
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
147
147
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
148
- modal-0.74.30.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
148
+ modal-0.74.33.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
149
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
150
150
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
151
151
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -170,9 +170,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
170
170
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  modal_version/__init__.py,sha256=m94xZNWIjH8oUtJk4l9xfovzDJede2o7X-q0MHVECtM,470
172
172
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
173
- modal_version/_version_generated.py,sha256=_GBSSIgewLP1Xli73UKMsMkE08V4r3bHn6Sa3Q_ZPOY,149
174
- modal-0.74.30.dist-info/METADATA,sha256=P0ZsZ9FInu3yvDPVyE1UFdurJr3IK6HXQ49TZoO7i2U,2474
175
- modal-0.74.30.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
- modal-0.74.30.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
- modal-0.74.30.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
- modal-0.74.30.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=6Use0Q9KiS4_eDdhMKDVfgMatdQWkDUKTNgIT_FQwJE,149
174
+ modal-0.74.33.dist-info/METADATA,sha256=vvPoqqVkrkz1meqKfpP3v1QGI3qYyREmtjagy7Ha1Jg,2474
175
+ modal-0.74.33.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
+ modal-0.74.33.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
+ modal-0.74.33.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
+ modal-0.74.33.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 30 # git: 7a51123
4
+ build_number = 33 # git: 0f5cbf2