modal 0.74.19__py3-none-any.whl → 0.74.21__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
@@ -430,7 +430,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
430
430
  # TODO: maybe break this out into a separate decorator for notebooks.
431
431
  mounts: Collection[_Mount] = (),
432
432
  network_file_systems: dict[Union[str, PurePosixPath], _NetworkFileSystem] = {},
433
- allow_cross_region_volumes: bool = False,
434
433
  volumes: dict[Union[str, PurePosixPath], Union[_Volume, _CloudBucketMount]] = {},
435
434
  webhook_config: Optional[api_pb2.WebhookConfig] = None,
436
435
  cpu: Optional[Union[float, tuple[float, float]]] = None,
@@ -788,9 +787,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
788
787
  autoscaler_settings=autoscaler_settings,
789
788
  method_definitions=method_definitions,
790
789
  method_definitions_set=True,
791
- shared_volume_mounts=network_file_system_mount_protos(
792
- validated_network_file_systems, allow_cross_region_volumes
793
- ),
790
+ shared_volume_mounts=network_file_system_mount_protos(validated_network_file_systems),
794
791
  volume_mounts=volume_mounts,
795
792
  proxy_id=(proxy.object_id if proxy else None),
796
793
  retry_policy=retry_policy,
@@ -970,7 +967,20 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
970
967
  parent = self
971
968
 
972
969
  async def _load(param_bound_func: _Function, resolver: Resolver, existing_object_id: Optional[str]):
973
- await parent.hydrate()
970
+ try:
971
+ identity = f"{parent.info.function_name} class service function"
972
+ except Exception:
973
+ # Can't always look up the function name that way, so fall back to generic message
974
+ identity = "class service function for a parametrized class"
975
+ if not parent.is_hydrated:
976
+ if parent.app._running_app is None:
977
+ reason = ", because the App it is defined on is not running"
978
+ else:
979
+ reason = ""
980
+ raise ExecutionError(
981
+ f"The {identity} has not been hydrated with the metadata it needs to run on Modal{reason}."
982
+ )
983
+
974
984
  assert parent._client and parent._client.stub
975
985
 
976
986
  if (
modal/app.py CHANGED
@@ -645,7 +645,6 @@ class _App:
645
645
  volumes: dict[
646
646
  Union[str, PurePosixPath], Union[_Volume, _CloudBucketMount]
647
647
  ] = {}, # Mount points for Modal Volumes & CloudBucketMounts
648
- allow_cross_region_volumes: bool = False, # Whether using network file systems from other regions is allowed.
649
648
  # Specify, in fractional CPU cores, how many CPU cores to request.
650
649
  # Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores.
651
650
  # CPU throttling will prevent a container from exceeding its specified limit.
@@ -689,6 +688,7 @@ class _App:
689
688
  container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
690
689
  allow_concurrent_inputs: Optional[int] = None, # Replaced with the `@modal.concurrent` decorator
691
690
  _experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
691
+ allow_cross_region_volumes: Optional[bool] = None, # Always True on the Modal backend now
692
692
  ) -> _FunctionDecoratorType:
693
693
  """Decorator to register a new Modal [Function](/docs/reference/modal.Function) with this App."""
694
694
  if isinstance(_warn_parentheses_missing, _Image):
@@ -707,6 +707,8 @@ class _App:
707
707
  " Please use the `@modal.concurrent` decorator instead."
708
708
  "\n\nSee https://modal.com/docs/guide/modal-1-0-migration for more information.",
709
709
  )
710
+ if allow_cross_region_volumes is not None:
711
+ deprecation_warning((2025, 4, 23), "The `allow_cross_region_volumes` parameter no longer has any effect.")
710
712
 
711
713
  secrets = [*self._secrets, *secrets]
712
714
 
@@ -821,7 +823,6 @@ class _App:
821
823
  gpu=gpu,
822
824
  mounts=[*self._mounts, *mounts],
823
825
  network_file_systems=network_file_systems,
824
- allow_cross_region_volumes=allow_cross_region_volumes,
825
826
  volumes={**self._volumes, **volumes},
826
827
  cpu=cpu,
827
828
  memory=memory,
@@ -876,7 +877,6 @@ class _App:
876
877
  volumes: dict[
877
878
  Union[str, PurePosixPath], Union[_Volume, _CloudBucketMount]
878
879
  ] = {}, # Mount points for Modal Volumes & CloudBucketMounts
879
- allow_cross_region_volumes: bool = False, # Whether using network file systems from other regions is allowed.
880
880
  # Specify, in fractional CPU cores, how many CPU cores to request.
881
881
  # Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores.
882
882
  # CPU throttling will prevent a container from exceeding its specified limit.
@@ -914,6 +914,7 @@ class _App:
914
914
  container_idle_timeout: Optional[int] = None, # Replaced with `scaledown_window`
915
915
  allow_concurrent_inputs: Optional[int] = None, # Replaced with the `@modal.concurrent` decorator
916
916
  _experimental_buffer_containers: Optional[int] = None, # Now stable API with `buffer_containers`
917
+ allow_cross_region_volumes: Optional[bool] = None, # Always True on the Modal backend now
917
918
  ) -> Callable[[Union[CLS_T, _PartialFunction]], CLS_T]:
918
919
  """
919
920
  Decorator to register a new Modal [Cls](/docs/reference/modal.Cls) with this App.
@@ -934,6 +935,8 @@ class _App:
934
935
  " Please use the `@modal.concurrent` decorator instead."
935
936
  "\n\nSee https://modal.com/docs/guide/modal-1-0-migration for more information.",
936
937
  )
938
+ if allow_cross_region_volumes is not None:
939
+ deprecation_warning((2025, 4, 23), "The `allow_cross_region_volumes` parameter no longer has any effect.")
937
940
 
938
941
  def wrapper(wrapped_cls: Union[CLS_T, _PartialFunction]) -> CLS_T:
939
942
  # Check if the decorated object is a class
@@ -990,7 +993,6 @@ class _App:
990
993
  gpu=gpu,
991
994
  mounts=[*self._mounts, *mounts],
992
995
  network_file_systems=network_file_systems,
993
- allow_cross_region_volumes=allow_cross_region_volumes,
994
996
  volumes={**self._volumes, **volumes},
995
997
  cpu=cpu,
996
998
  memory=memory,
modal/app.pyi CHANGED
@@ -180,7 +180,6 @@ class _App:
180
180
  typing.Union[str, pathlib.PurePosixPath],
181
181
  typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
182
182
  ] = {},
183
- allow_cross_region_volumes: bool = False,
184
183
  cpu: typing.Union[float, tuple[float, float], None] = None,
185
184
  memory: typing.Union[int, tuple[int, int], None] = None,
186
185
  ephemeral_disk: typing.Optional[int] = None,
@@ -210,6 +209,7 @@ class _App:
210
209
  container_idle_timeout: typing.Optional[int] = None,
211
210
  allow_concurrent_inputs: typing.Optional[int] = None,
212
211
  _experimental_buffer_containers: typing.Optional[int] = None,
212
+ allow_cross_region_volumes: typing.Optional[bool] = None,
213
213
  ) -> _FunctionDecoratorType: ...
214
214
  @typing_extensions.dataclass_transform(
215
215
  field_specifiers=(modal.cls.parameter,),
@@ -231,7 +231,6 @@ class _App:
231
231
  typing.Union[str, pathlib.PurePosixPath],
232
232
  typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
233
233
  ] = {},
234
- allow_cross_region_volumes: bool = False,
235
234
  cpu: typing.Union[float, tuple[float, float], None] = None,
236
235
  memory: typing.Union[int, tuple[int, int], None] = None,
237
236
  ephemeral_disk: typing.Optional[int] = None,
@@ -258,6 +257,7 @@ class _App:
258
257
  container_idle_timeout: typing.Optional[int] = None,
259
258
  allow_concurrent_inputs: typing.Optional[int] = None,
260
259
  _experimental_buffer_containers: typing.Optional[int] = None,
260
+ allow_cross_region_volumes: typing.Optional[bool] = None,
261
261
  ) -> collections.abc.Callable[[typing.Union[CLS_T, modal._partial_function._PartialFunction]], CLS_T]: ...
262
262
  async def spawn_sandbox(
263
263
  self,
@@ -442,7 +442,6 @@ class App:
442
442
  typing.Union[str, pathlib.PurePosixPath],
443
443
  typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
444
444
  ] = {},
445
- allow_cross_region_volumes: bool = False,
446
445
  cpu: typing.Union[float, tuple[float, float], None] = None,
447
446
  memory: typing.Union[int, tuple[int, int], None] = None,
448
447
  ephemeral_disk: typing.Optional[int] = None,
@@ -472,6 +471,7 @@ class App:
472
471
  container_idle_timeout: typing.Optional[int] = None,
473
472
  allow_concurrent_inputs: typing.Optional[int] = None,
474
473
  _experimental_buffer_containers: typing.Optional[int] = None,
474
+ allow_cross_region_volumes: typing.Optional[bool] = None,
475
475
  ) -> _FunctionDecoratorType: ...
476
476
  @typing_extensions.dataclass_transform(
477
477
  field_specifiers=(modal.cls.parameter,),
@@ -493,7 +493,6 @@ class App:
493
493
  typing.Union[str, pathlib.PurePosixPath],
494
494
  typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
495
495
  ] = {},
496
- allow_cross_region_volumes: bool = False,
497
496
  cpu: typing.Union[float, tuple[float, float], None] = None,
498
497
  memory: typing.Union[int, tuple[int, int], None] = None,
499
498
  ephemeral_disk: typing.Optional[int] = None,
@@ -520,6 +519,7 @@ class App:
520
519
  container_idle_timeout: typing.Optional[int] = None,
521
520
  allow_concurrent_inputs: typing.Optional[int] = None,
522
521
  _experimental_buffer_containers: typing.Optional[int] = None,
522
+ allow_cross_region_volumes: typing.Optional[bool] = None,
523
523
  ) -> collections.abc.Callable[[typing.Union[CLS_T, modal.partial_function.PartialFunction]], CLS_T]: ...
524
524
 
525
525
  class __spawn_sandbox_spec(typing_extensions.Protocol[SUPERSELF]):
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.19"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.21"
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.19"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.21"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/functions.pyi CHANGED
@@ -68,7 +68,6 @@ class Function(
68
68
  network_file_systems: dict[
69
69
  typing.Union[str, pathlib.PurePosixPath], modal.network_file_system.NetworkFileSystem
70
70
  ] = {},
71
- allow_cross_region_volumes: bool = False,
72
71
  volumes: dict[
73
72
  typing.Union[str, pathlib.PurePosixPath],
74
73
  typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
@@ -37,7 +37,6 @@ NETWORK_FILE_SYSTEM_PUT_FILE_CLIENT_TIMEOUT = (
37
37
 
38
38
  def network_file_system_mount_protos(
39
39
  validated_network_file_systems: list[tuple[str, "_NetworkFileSystem"]],
40
- allow_cross_region_volumes: bool,
41
40
  ) -> list[api_pb2.SharedVolumeMount]:
42
41
  network_file_system_mounts = []
43
42
  # Relies on dicts being ordered (true as of Python 3.6).
@@ -46,7 +45,6 @@ def network_file_system_mount_protos(
46
45
  api_pb2.SharedVolumeMount(
47
46
  mount_path=path,
48
47
  shared_volume_id=volume.object_id,
49
- allow_cross_region=allow_cross_region_volumes,
50
48
  )
51
49
  )
52
50
  return network_file_system_mounts
@@ -10,7 +10,7 @@ import typing
10
10
  import typing_extensions
11
11
 
12
12
  def network_file_system_mount_protos(
13
- validated_network_file_systems: list[tuple[str, _NetworkFileSystem]], allow_cross_region_volumes: bool
13
+ validated_network_file_systems: list[tuple[str, _NetworkFileSystem]],
14
14
  ) -> list[modal_proto.api_pb2.SharedVolumeMount]: ...
15
15
 
16
16
  class _NetworkFileSystem(modal._object._Object):
modal/sandbox.py CHANGED
@@ -187,7 +187,7 @@ class _Sandbox(_Object, type_prefix="sb"):
187
187
  cpu=cpu, memory=memory, gpu=gpu, ephemeral_disk=ephemeral_disk
188
188
  ),
189
189
  cloud_provider_str=cloud if cloud else None, # Supersedes cloud_provider
190
- nfs_mounts=network_file_system_mount_protos(validated_network_file_systems, False),
190
+ nfs_mounts=network_file_system_mount_protos(validated_network_file_systems),
191
191
  runtime=config.get("function_runtime"),
192
192
  runtime_debug=config.get("function_runtime_debug"),
193
193
  cloud_bucket_mounts=cloud_bucket_mounts_to_proto(cloud_bucket_mounts),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.19
3
+ Version: 0.74.21
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=fvPz6oksYkPujA5Q9Lr13OM6pp3H5o4RfwenA-hYwsA,74236
6
+ modal/_functions.py,sha256=XFBnzOUc4MZlJWarnw8iC2za0QciePdnu0yxCW5q5DY,74776
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
@@ -18,11 +18,11 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
18
18
  modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
19
19
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
20
20
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
21
- modal/app.py,sha256=TnXw6EaejqwyJNawbtp177mG87ufJZClPoiIxO41Ioc,50664
22
- modal/app.pyi,sha256=8oj9DpTHySHymjy6aSat6IG-z2FF77mx_ls1dGbt3Qg,28222
21
+ modal/app.py,sha256=pfVe8VH56foho4uqdQJCbn0HST_ihh0qUGqmAMNrfWw,50822
22
+ modal/app.pyi,sha256=xM5u8WuGRRAWAQ0m2cd2PowJOgqI3M87hcq-AAM6XBQ,28286
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=wSvN4PKoC4BazCyPhTWaAjvyruNM7vlVoKhuICNBBIE,7593
25
+ modal/client.pyi,sha256=dtltzSHCwY4o8_HjNczIsILGd10aVVzOecpg02X9ZXs,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=GvaNl8R5UsH7Vg88WEOyerdjvZEPK7xxi3nqHlyOW_c,33497
@@ -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=2J7jPa2tQWhuUy67wg-MWvEx0rwrBNjX6UTEJbAUq_A,14855
42
+ modal/functions.pyi,sha256=ehzJTMoBAOqrliX9ignzCcekvjTsY6fPXBjMngpPfwE,14805
43
43
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
44
44
  modal/image.py,sha256=I-9_YZL0SSfnuGPywa3-4PlxDmJ-53p7ce3gP74SrOA,92877
45
45
  modal/image.pyi,sha256=89zv12C1sFrJs7Es9SnX23_m208ASAdeNGCVTrhjzHI,25632
@@ -47,8 +47,8 @@ modal/io_streams.py,sha256=YDZVQSDv05DeXg5TwcucC9Rj5hQBx2GXdluan9rIUpw,15467
47
47
  modal/io_streams.pyi,sha256=RpXIWFm6fQkLJRc1uxd0KkQ2wTLCB65jRlyGplU6CQE,5100
48
48
  modal/mount.py,sha256=VruBgKrCXD_mmv7iXEfSYERQ3CwH7iqymA3v-5xLGMc,32685
49
49
  modal/mount.pyi,sha256=CmHa7zKSxHA_7-vMQLnGfw_ZXvAvHlafvUEVJcQ1LQA,12535
50
- modal/network_file_system.py,sha256=WXdyL7du_fvjvuG6hSAREyJ83sSEP2xSLAIAhBsisdI,14869
51
- modal/network_file_system.pyi,sha256=4N3eqMbTSlqmS8VV_aJK-uvrgJC8xnf_YtW5FHfRfc8,8156
50
+ modal/network_file_system.py,sha256=YjSv2j-pP4mTtAbxq26OO01xgOzuTy4ZNfMCG6K8k3M,14768
51
+ modal/network_file_system.pyi,sha256=fkSIj27UVkQtd7-msWQ-4y1Cvqp2XXq9MX_FzOCKHyk,8123
52
52
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
53
53
  modal/object.pyi,sha256=kyJkRQcVv3ct7zSAxvvXcuhBVeH914v80uSlqeS7cA4,5632
54
54
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
@@ -65,7 +65,7 @@ modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
65
65
  modal/runner.py,sha256=yK1mBkX1_ZKvvWLoe1e2mGehJSWs97Mpyglo9Oj5rQw,24783
66
66
  modal/runner.pyi,sha256=HW2pvC_PLwg1Es_EkrfQgMZsktIr9zzVEtmjOVFG6Dw,5351
67
67
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
68
- modal/sandbox.py,sha256=CX42Rrso7a_Gz6fWEEu-OYzFsWanWOyBy9iQ4nAfAkg,32162
68
+ modal/sandbox.py,sha256=wM0-AWRJKwwREdUSLaSMn9yTbiWz5VAX9ahpVy0K0nU,32155
69
69
  modal/sandbox.pyi,sha256=cLmSwI1ab-2DgEuXNf6S1PiK63wfUR9dHtxlZtSOuX8,22719
70
70
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
71
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
@@ -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.19.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
148
+ modal-0.74.21.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=gnhxZOCXj_bRya3jnYgGg-_unrUkIoDxJUMPO5LnVz0,149
174
- modal-0.74.19.dist-info/METADATA,sha256=xfMm5VTZynErYWFfwZ0xu5TyBDzl6PxByuJll7Raras,2474
175
- modal-0.74.19.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
- modal-0.74.19.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
- modal-0.74.19.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
- modal-0.74.19.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=b63t7pBkkiESN2xoagTdXGDEppQTz0jfwTc7sADu8cg,149
174
+ modal-0.74.21.dist-info/METADATA,sha256=uakEn2SqXkcq-hXG79e_-wCybug8kNaPQpE8l6MEo10,2474
175
+ modal-0.74.21.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
176
+ modal-0.74.21.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
177
+ modal-0.74.21.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
178
+ modal-0.74.21.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 = 19 # git: a9af0d6
4
+ build_number = 21 # git: 6821129