modal 0.74.19__tar.gz → 0.74.21__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.
Files changed (183) hide show
  1. {modal-0.74.19 → modal-0.74.21}/PKG-INFO +1 -1
  2. {modal-0.74.19 → modal-0.74.21}/modal/_functions.py +15 -5
  3. {modal-0.74.19 → modal-0.74.21}/modal/app.py +6 -4
  4. {modal-0.74.19 → modal-0.74.21}/modal/app.pyi +4 -4
  5. {modal-0.74.19 → modal-0.74.21}/modal/client.pyi +2 -2
  6. {modal-0.74.19 → modal-0.74.21}/modal/functions.pyi +0 -1
  7. {modal-0.74.19 → modal-0.74.21}/modal/network_file_system.py +0 -2
  8. {modal-0.74.19 → modal-0.74.21}/modal/network_file_system.pyi +1 -1
  9. {modal-0.74.19 → modal-0.74.21}/modal/sandbox.py +1 -1
  10. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-0.74.19 → modal-0.74.21}/modal_version/_version_generated.py +1 -1
  12. {modal-0.74.19 → modal-0.74.21}/LICENSE +0 -0
  13. {modal-0.74.19 → modal-0.74.21}/README.md +0 -0
  14. {modal-0.74.19 → modal-0.74.21}/modal/__init__.py +0 -0
  15. {modal-0.74.19 → modal-0.74.21}/modal/__main__.py +0 -0
  16. {modal-0.74.19 → modal-0.74.21}/modal/_clustered_functions.py +0 -0
  17. {modal-0.74.19 → modal-0.74.21}/modal/_clustered_functions.pyi +0 -0
  18. {modal-0.74.19 → modal-0.74.21}/modal/_container_entrypoint.py +0 -0
  19. {modal-0.74.19 → modal-0.74.21}/modal/_ipython.py +0 -0
  20. {modal-0.74.19 → modal-0.74.21}/modal/_location.py +0 -0
  21. {modal-0.74.19 → modal-0.74.21}/modal/_object.py +0 -0
  22. {modal-0.74.19 → modal-0.74.21}/modal/_output.py +0 -0
  23. {modal-0.74.19 → modal-0.74.21}/modal/_partial_function.py +0 -0
  24. {modal-0.74.19 → modal-0.74.21}/modal/_pty.py +0 -0
  25. {modal-0.74.19 → modal-0.74.21}/modal/_resolver.py +0 -0
  26. {modal-0.74.19 → modal-0.74.21}/modal/_resources.py +0 -0
  27. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/__init__.py +0 -0
  28. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/asgi.py +0 -0
  29. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/container_io_manager.py +0 -0
  30. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/container_io_manager.pyi +0 -0
  31. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/execution_context.py +0 -0
  32. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/execution_context.pyi +0 -0
  33. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  34. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/telemetry.py +0 -0
  35. {modal-0.74.19 → modal-0.74.21}/modal/_runtime/user_code_imports.py +0 -0
  36. {modal-0.74.19 → modal-0.74.21}/modal/_serialization.py +0 -0
  37. {modal-0.74.19 → modal-0.74.21}/modal/_traceback.py +0 -0
  38. {modal-0.74.19 → modal-0.74.21}/modal/_tunnel.py +0 -0
  39. {modal-0.74.19 → modal-0.74.21}/modal/_tunnel.pyi +0 -0
  40. {modal-0.74.19 → modal-0.74.21}/modal/_type_manager.py +0 -0
  41. {modal-0.74.19 → modal-0.74.21}/modal/_utils/__init__.py +0 -0
  42. {modal-0.74.19 → modal-0.74.21}/modal/_utils/app_utils.py +0 -0
  43. {modal-0.74.19 → modal-0.74.21}/modal/_utils/async_utils.py +0 -0
  44. {modal-0.74.19 → modal-0.74.21}/modal/_utils/blob_utils.py +0 -0
  45. {modal-0.74.19 → modal-0.74.21}/modal/_utils/bytes_io_segment_payload.py +0 -0
  46. {modal-0.74.19 → modal-0.74.21}/modal/_utils/deprecation.py +0 -0
  47. {modal-0.74.19 → modal-0.74.21}/modal/_utils/docker_utils.py +0 -0
  48. {modal-0.74.19 → modal-0.74.21}/modal/_utils/function_utils.py +0 -0
  49. {modal-0.74.19 → modal-0.74.21}/modal/_utils/git_utils.py +0 -0
  50. {modal-0.74.19 → modal-0.74.21}/modal/_utils/grpc_testing.py +0 -0
  51. {modal-0.74.19 → modal-0.74.21}/modal/_utils/grpc_utils.py +0 -0
  52. {modal-0.74.19 → modal-0.74.21}/modal/_utils/hash_utils.py +0 -0
  53. {modal-0.74.19 → modal-0.74.21}/modal/_utils/http_utils.py +0 -0
  54. {modal-0.74.19 → modal-0.74.21}/modal/_utils/jwt_utils.py +0 -0
  55. {modal-0.74.19 → modal-0.74.21}/modal/_utils/logger.py +0 -0
  56. {modal-0.74.19 → modal-0.74.21}/modal/_utils/mount_utils.py +0 -0
  57. {modal-0.74.19 → modal-0.74.21}/modal/_utils/name_utils.py +0 -0
  58. {modal-0.74.19 → modal-0.74.21}/modal/_utils/package_utils.py +0 -0
  59. {modal-0.74.19 → modal-0.74.21}/modal/_utils/pattern_utils.py +0 -0
  60. {modal-0.74.19 → modal-0.74.21}/modal/_utils/rand_pb_testing.py +0 -0
  61. {modal-0.74.19 → modal-0.74.21}/modal/_utils/shell_utils.py +0 -0
  62. {modal-0.74.19 → modal-0.74.21}/modal/_vendor/__init__.py +0 -0
  63. {modal-0.74.19 → modal-0.74.21}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  64. {modal-0.74.19 → modal-0.74.21}/modal/_vendor/cloudpickle.py +0 -0
  65. {modal-0.74.19 → modal-0.74.21}/modal/_vendor/tblib.py +0 -0
  66. {modal-0.74.19 → modal-0.74.21}/modal/_watcher.py +0 -0
  67. {modal-0.74.19 → modal-0.74.21}/modal/call_graph.py +0 -0
  68. {modal-0.74.19 → modal-0.74.21}/modal/cli/__init__.py +0 -0
  69. {modal-0.74.19 → modal-0.74.21}/modal/cli/_download.py +0 -0
  70. {modal-0.74.19 → modal-0.74.21}/modal/cli/_traceback.py +0 -0
  71. {modal-0.74.19 → modal-0.74.21}/modal/cli/app.py +0 -0
  72. {modal-0.74.19 → modal-0.74.21}/modal/cli/config.py +0 -0
  73. {modal-0.74.19 → modal-0.74.21}/modal/cli/container.py +0 -0
  74. {modal-0.74.19 → modal-0.74.21}/modal/cli/dict.py +0 -0
  75. {modal-0.74.19 → modal-0.74.21}/modal/cli/entry_point.py +0 -0
  76. {modal-0.74.19 → modal-0.74.21}/modal/cli/environment.py +0 -0
  77. {modal-0.74.19 → modal-0.74.21}/modal/cli/import_refs.py +0 -0
  78. {modal-0.74.19 → modal-0.74.21}/modal/cli/launch.py +0 -0
  79. {modal-0.74.19 → modal-0.74.21}/modal/cli/network_file_system.py +0 -0
  80. {modal-0.74.19 → modal-0.74.21}/modal/cli/profile.py +0 -0
  81. {modal-0.74.19 → modal-0.74.21}/modal/cli/programs/__init__.py +0 -0
  82. {modal-0.74.19 → modal-0.74.21}/modal/cli/programs/run_jupyter.py +0 -0
  83. {modal-0.74.19 → modal-0.74.21}/modal/cli/programs/vscode.py +0 -0
  84. {modal-0.74.19 → modal-0.74.21}/modal/cli/queues.py +0 -0
  85. {modal-0.74.19 → modal-0.74.21}/modal/cli/run.py +0 -0
  86. {modal-0.74.19 → modal-0.74.21}/modal/cli/secret.py +0 -0
  87. {modal-0.74.19 → modal-0.74.21}/modal/cli/token.py +0 -0
  88. {modal-0.74.19 → modal-0.74.21}/modal/cli/utils.py +0 -0
  89. {modal-0.74.19 → modal-0.74.21}/modal/cli/volume.py +0 -0
  90. {modal-0.74.19 → modal-0.74.21}/modal/client.py +0 -0
  91. {modal-0.74.19 → modal-0.74.21}/modal/cloud_bucket_mount.py +0 -0
  92. {modal-0.74.19 → modal-0.74.21}/modal/cloud_bucket_mount.pyi +0 -0
  93. {modal-0.74.19 → modal-0.74.21}/modal/cls.py +0 -0
  94. {modal-0.74.19 → modal-0.74.21}/modal/cls.pyi +0 -0
  95. {modal-0.74.19 → modal-0.74.21}/modal/config.py +0 -0
  96. {modal-0.74.19 → modal-0.74.21}/modal/container_process.py +0 -0
  97. {modal-0.74.19 → modal-0.74.21}/modal/container_process.pyi +0 -0
  98. {modal-0.74.19 → modal-0.74.21}/modal/dict.py +0 -0
  99. {modal-0.74.19 → modal-0.74.21}/modal/dict.pyi +0 -0
  100. {modal-0.74.19 → modal-0.74.21}/modal/environments.py +0 -0
  101. {modal-0.74.19 → modal-0.74.21}/modal/environments.pyi +0 -0
  102. {modal-0.74.19 → modal-0.74.21}/modal/exception.py +0 -0
  103. {modal-0.74.19 → modal-0.74.21}/modal/experimental/__init__.py +0 -0
  104. {modal-0.74.19 → modal-0.74.21}/modal/experimental/ipython.py +0 -0
  105. {modal-0.74.19 → modal-0.74.21}/modal/file_io.py +0 -0
  106. {modal-0.74.19 → modal-0.74.21}/modal/file_io.pyi +0 -0
  107. {modal-0.74.19 → modal-0.74.21}/modal/file_pattern_matcher.py +0 -0
  108. {modal-0.74.19 → modal-0.74.21}/modal/functions.py +0 -0
  109. {modal-0.74.19 → modal-0.74.21}/modal/gpu.py +0 -0
  110. {modal-0.74.19 → modal-0.74.21}/modal/image.py +0 -0
  111. {modal-0.74.19 → modal-0.74.21}/modal/image.pyi +0 -0
  112. {modal-0.74.19 → modal-0.74.21}/modal/io_streams.py +0 -0
  113. {modal-0.74.19 → modal-0.74.21}/modal/io_streams.pyi +0 -0
  114. {modal-0.74.19 → modal-0.74.21}/modal/mount.py +0 -0
  115. {modal-0.74.19 → modal-0.74.21}/modal/mount.pyi +0 -0
  116. {modal-0.74.19 → modal-0.74.21}/modal/object.py +0 -0
  117. {modal-0.74.19 → modal-0.74.21}/modal/object.pyi +0 -0
  118. {modal-0.74.19 → modal-0.74.21}/modal/output.py +0 -0
  119. {modal-0.74.19 → modal-0.74.21}/modal/parallel_map.py +0 -0
  120. {modal-0.74.19 → modal-0.74.21}/modal/parallel_map.pyi +0 -0
  121. {modal-0.74.19 → modal-0.74.21}/modal/partial_function.py +0 -0
  122. {modal-0.74.19 → modal-0.74.21}/modal/partial_function.pyi +0 -0
  123. {modal-0.74.19 → modal-0.74.21}/modal/proxy.py +0 -0
  124. {modal-0.74.19 → modal-0.74.21}/modal/proxy.pyi +0 -0
  125. {modal-0.74.19 → modal-0.74.21}/modal/py.typed +0 -0
  126. {modal-0.74.19 → modal-0.74.21}/modal/queue.py +0 -0
  127. {modal-0.74.19 → modal-0.74.21}/modal/queue.pyi +0 -0
  128. {modal-0.74.19 → modal-0.74.21}/modal/requirements/2023.12.312.txt +0 -0
  129. {modal-0.74.19 → modal-0.74.21}/modal/requirements/2023.12.txt +0 -0
  130. {modal-0.74.19 → modal-0.74.21}/modal/requirements/2024.04.txt +0 -0
  131. {modal-0.74.19 → modal-0.74.21}/modal/requirements/2024.10.txt +0 -0
  132. {modal-0.74.19 → modal-0.74.21}/modal/requirements/PREVIEW.txt +0 -0
  133. {modal-0.74.19 → modal-0.74.21}/modal/requirements/README.md +0 -0
  134. {modal-0.74.19 → modal-0.74.21}/modal/requirements/base-images.json +0 -0
  135. {modal-0.74.19 → modal-0.74.21}/modal/retries.py +0 -0
  136. {modal-0.74.19 → modal-0.74.21}/modal/runner.py +0 -0
  137. {modal-0.74.19 → modal-0.74.21}/modal/runner.pyi +0 -0
  138. {modal-0.74.19 → modal-0.74.21}/modal/running_app.py +0 -0
  139. {modal-0.74.19 → modal-0.74.21}/modal/sandbox.pyi +0 -0
  140. {modal-0.74.19 → modal-0.74.21}/modal/schedule.py +0 -0
  141. {modal-0.74.19 → modal-0.74.21}/modal/scheduler_placement.py +0 -0
  142. {modal-0.74.19 → modal-0.74.21}/modal/secret.py +0 -0
  143. {modal-0.74.19 → modal-0.74.21}/modal/secret.pyi +0 -0
  144. {modal-0.74.19 → modal-0.74.21}/modal/serving.py +0 -0
  145. {modal-0.74.19 → modal-0.74.21}/modal/serving.pyi +0 -0
  146. {modal-0.74.19 → modal-0.74.21}/modal/snapshot.py +0 -0
  147. {modal-0.74.19 → modal-0.74.21}/modal/snapshot.pyi +0 -0
  148. {modal-0.74.19 → modal-0.74.21}/modal/stream_type.py +0 -0
  149. {modal-0.74.19 → modal-0.74.21}/modal/token_flow.py +0 -0
  150. {modal-0.74.19 → modal-0.74.21}/modal/token_flow.pyi +0 -0
  151. {modal-0.74.19 → modal-0.74.21}/modal/volume.py +0 -0
  152. {modal-0.74.19 → modal-0.74.21}/modal/volume.pyi +0 -0
  153. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/SOURCES.txt +0 -0
  154. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/dependency_links.txt +0 -0
  155. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/entry_points.txt +0 -0
  156. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/requires.txt +0 -0
  157. {modal-0.74.19 → modal-0.74.21}/modal.egg-info/top_level.txt +0 -0
  158. {modal-0.74.19 → modal-0.74.21}/modal_docs/__init__.py +0 -0
  159. {modal-0.74.19 → modal-0.74.21}/modal_docs/gen_cli_docs.py +0 -0
  160. {modal-0.74.19 → modal-0.74.21}/modal_docs/gen_reference_docs.py +0 -0
  161. {modal-0.74.19 → modal-0.74.21}/modal_docs/mdmd/__init__.py +0 -0
  162. {modal-0.74.19 → modal-0.74.21}/modal_docs/mdmd/mdmd.py +0 -0
  163. {modal-0.74.19 → modal-0.74.21}/modal_docs/mdmd/signatures.py +0 -0
  164. {modal-0.74.19 → modal-0.74.21}/modal_proto/__init__.py +0 -0
  165. {modal-0.74.19 → modal-0.74.21}/modal_proto/api.proto +0 -0
  166. {modal-0.74.19 → modal-0.74.21}/modal_proto/api_grpc.py +0 -0
  167. {modal-0.74.19 → modal-0.74.21}/modal_proto/api_pb2.py +0 -0
  168. {modal-0.74.19 → modal-0.74.21}/modal_proto/api_pb2.pyi +0 -0
  169. {modal-0.74.19 → modal-0.74.21}/modal_proto/api_pb2_grpc.py +0 -0
  170. {modal-0.74.19 → modal-0.74.21}/modal_proto/api_pb2_grpc.pyi +0 -0
  171. {modal-0.74.19 → modal-0.74.21}/modal_proto/modal_api_grpc.py +0 -0
  172. {modal-0.74.19 → modal-0.74.21}/modal_proto/modal_options_grpc.py +0 -0
  173. {modal-0.74.19 → modal-0.74.21}/modal_proto/options.proto +0 -0
  174. {modal-0.74.19 → modal-0.74.21}/modal_proto/options_grpc.py +0 -0
  175. {modal-0.74.19 → modal-0.74.21}/modal_proto/options_pb2.py +0 -0
  176. {modal-0.74.19 → modal-0.74.21}/modal_proto/options_pb2.pyi +0 -0
  177. {modal-0.74.19 → modal-0.74.21}/modal_proto/options_pb2_grpc.py +0 -0
  178. {modal-0.74.19 → modal-0.74.21}/modal_proto/options_pb2_grpc.pyi +0 -0
  179. {modal-0.74.19 → modal-0.74.21}/modal_proto/py.typed +0 -0
  180. {modal-0.74.19 → modal-0.74.21}/modal_version/__init__.py +0 -0
  181. {modal-0.74.19 → modal-0.74.21}/modal_version/__main__.py +0 -0
  182. {modal-0.74.19 → modal-0.74.21}/pyproject.toml +0 -0
  183. {modal-0.74.19 → modal-0.74.21}/setup.cfg +0 -0
@@ -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
@@ -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 (
@@ -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,
@@ -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]):
@@ -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
@@ -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):
@@ -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
@@ -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
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