modal 1.0.3.dev28__tar.gz → 1.0.4.dev2__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 (186) hide show
  1. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/PKG-INFO +1 -1
  2. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/client.pyi +2 -2
  3. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/functions.pyi +6 -6
  4. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/mount.py +52 -38
  5. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/mount.pyi +15 -6
  6. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/parallel_map.py +1 -1
  7. modal-1.0.4.dev2/modal/requirements/PREVIEW.txt +17 -0
  8. modal-1.0.4.dev2/modal/requirements/base-images.json +48 -0
  9. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/PKG-INFO +1 -1
  10. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_version/__init__.py +1 -1
  11. modal-1.0.3.dev28/modal/requirements/PREVIEW.txt +0 -16
  12. modal-1.0.3.dev28/modal/requirements/base-images.json +0 -26
  13. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/LICENSE +0 -0
  14. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/README.md +0 -0
  15. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/__init__.py +0 -0
  16. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/__main__.py +0 -0
  17. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_clustered_functions.py +0 -0
  18. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_clustered_functions.pyi +0 -0
  19. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_container_entrypoint.py +0 -0
  20. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_functions.py +0 -0
  21. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_ipython.py +0 -0
  22. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_location.py +0 -0
  23. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_object.py +0 -0
  24. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_output.py +0 -0
  25. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_partial_function.py +0 -0
  26. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_pty.py +0 -0
  27. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_resolver.py +0 -0
  28. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_resources.py +0 -0
  29. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/__init__.py +0 -0
  30. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/asgi.py +0 -0
  31. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/container_io_manager.py +0 -0
  32. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/container_io_manager.pyi +0 -0
  33. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/execution_context.py +0 -0
  34. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/execution_context.pyi +0 -0
  35. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  36. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/telemetry.py +0 -0
  37. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_runtime/user_code_imports.py +0 -0
  38. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_serialization.py +0 -0
  39. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_traceback.py +0 -0
  40. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_tunnel.py +0 -0
  41. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_tunnel.pyi +0 -0
  42. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_type_manager.py +0 -0
  43. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/__init__.py +0 -0
  44. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/app_utils.py +0 -0
  45. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/async_utils.py +0 -0
  46. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/blob_utils.py +0 -0
  47. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/bytes_io_segment_payload.py +0 -0
  48. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/deprecation.py +0 -0
  49. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/docker_utils.py +0 -0
  50. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/function_utils.py +0 -0
  51. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/git_utils.py +0 -0
  52. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/grpc_testing.py +0 -0
  53. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/grpc_utils.py +0 -0
  54. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/hash_utils.py +0 -0
  55. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/http_utils.py +0 -0
  56. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/jwt_utils.py +0 -0
  57. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/logger.py +0 -0
  58. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/mount_utils.py +0 -0
  59. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/name_utils.py +0 -0
  60. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/package_utils.py +0 -0
  61. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/pattern_utils.py +0 -0
  62. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/rand_pb_testing.py +0 -0
  63. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/shell_utils.py +0 -0
  64. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_utils/time_utils.py +0 -0
  65. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_vendor/__init__.py +0 -0
  66. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  67. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_vendor/cloudpickle.py +0 -0
  68. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_vendor/tblib.py +0 -0
  69. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/_watcher.py +0 -0
  70. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/app.py +0 -0
  71. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/app.pyi +0 -0
  72. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/call_graph.py +0 -0
  73. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/__init__.py +0 -0
  74. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/_download.py +0 -0
  75. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/_traceback.py +0 -0
  76. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/app.py +0 -0
  77. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/cluster.py +0 -0
  78. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/config.py +0 -0
  79. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/container.py +0 -0
  80. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/dict.py +0 -0
  81. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/entry_point.py +0 -0
  82. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/environment.py +0 -0
  83. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/import_refs.py +0 -0
  84. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/launch.py +0 -0
  85. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/network_file_system.py +0 -0
  86. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/profile.py +0 -0
  87. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/programs/__init__.py +0 -0
  88. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/programs/run_jupyter.py +0 -0
  89. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/programs/vscode.py +0 -0
  90. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/queues.py +0 -0
  91. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/run.py +0 -0
  92. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/secret.py +0 -0
  93. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/token.py +0 -0
  94. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/utils.py +0 -0
  95. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cli/volume.py +0 -0
  96. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/client.py +0 -0
  97. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cloud_bucket_mount.py +0 -0
  98. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cloud_bucket_mount.pyi +0 -0
  99. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cls.py +0 -0
  100. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/cls.pyi +0 -0
  101. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/config.py +0 -0
  102. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/container_process.py +0 -0
  103. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/container_process.pyi +0 -0
  104. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/dict.py +0 -0
  105. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/dict.pyi +0 -0
  106. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/environments.py +0 -0
  107. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/environments.pyi +0 -0
  108. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/exception.py +0 -0
  109. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/experimental/__init__.py +0 -0
  110. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/experimental/ipython.py +0 -0
  111. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/file_io.py +0 -0
  112. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/file_io.pyi +0 -0
  113. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/file_pattern_matcher.py +0 -0
  114. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/functions.py +0 -0
  115. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/gpu.py +0 -0
  116. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/image.py +0 -0
  117. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/image.pyi +0 -0
  118. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/io_streams.py +0 -0
  119. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/io_streams.pyi +0 -0
  120. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/network_file_system.py +0 -0
  121. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/network_file_system.pyi +0 -0
  122. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/object.py +0 -0
  123. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/object.pyi +0 -0
  124. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/output.py +0 -0
  125. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/parallel_map.pyi +0 -0
  126. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/partial_function.py +0 -0
  127. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/partial_function.pyi +0 -0
  128. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/proxy.py +0 -0
  129. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/proxy.pyi +0 -0
  130. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/py.typed +0 -0
  131. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/queue.py +0 -0
  132. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/queue.pyi +0 -0
  133. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/requirements/2023.12.312.txt +0 -0
  134. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/requirements/2023.12.txt +0 -0
  135. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/requirements/2024.04.txt +0 -0
  136. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/requirements/2024.10.txt +0 -0
  137. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/requirements/README.md +0 -0
  138. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/retries.py +0 -0
  139. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/runner.py +0 -0
  140. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/runner.pyi +0 -0
  141. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/running_app.py +0 -0
  142. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/sandbox.py +0 -0
  143. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/sandbox.pyi +0 -0
  144. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/schedule.py +0 -0
  145. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/scheduler_placement.py +0 -0
  146. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/secret.py +0 -0
  147. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/secret.pyi +0 -0
  148. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/serving.py +0 -0
  149. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/serving.pyi +0 -0
  150. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/snapshot.py +0 -0
  151. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/snapshot.pyi +0 -0
  152. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/stream_type.py +0 -0
  153. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/token_flow.py +0 -0
  154. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/token_flow.pyi +0 -0
  155. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/volume.py +0 -0
  156. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal/volume.pyi +0 -0
  157. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/SOURCES.txt +0 -0
  158. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/dependency_links.txt +0 -0
  159. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/entry_points.txt +0 -0
  160. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/requires.txt +0 -0
  161. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal.egg-info/top_level.txt +0 -0
  162. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/__init__.py +0 -0
  163. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/gen_cli_docs.py +0 -0
  164. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/gen_reference_docs.py +0 -0
  165. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/mdmd/__init__.py +0 -0
  166. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/mdmd/mdmd.py +0 -0
  167. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_docs/mdmd/signatures.py +0 -0
  168. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/__init__.py +0 -0
  169. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api.proto +0 -0
  170. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api_grpc.py +0 -0
  171. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api_pb2.py +0 -0
  172. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api_pb2.pyi +0 -0
  173. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api_pb2_grpc.py +0 -0
  174. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/api_pb2_grpc.pyi +0 -0
  175. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/modal_api_grpc.py +0 -0
  176. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/modal_options_grpc.py +0 -0
  177. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options.proto +0 -0
  178. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options_grpc.py +0 -0
  179. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options_pb2.py +0 -0
  180. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options_pb2.pyi +0 -0
  181. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options_pb2_grpc.py +0 -0
  182. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/options_pb2_grpc.pyi +0 -0
  183. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_proto/py.typed +0 -0
  184. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/modal_version/__main__.py +0 -0
  185. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/pyproject.toml +0 -0
  186. {modal-1.0.3.dev28 → modal-1.0.4.dev2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev28
3
+ Version: 1.0.4.dev2
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "1.0.3.dev28",
34
+ version: str = "1.0.4.dev2",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -94,7 +94,7 @@ class Client:
94
94
  server_url: str,
95
95
  client_type: int,
96
96
  credentials: typing.Optional[tuple[str, str]],
97
- version: str = "1.0.3.dev28",
97
+ version: str = "1.0.4.dev2",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -227,11 +227,11 @@ class Function(
227
227
 
228
228
  _call_generator: ___call_generator_spec[typing_extensions.Self]
229
229
 
230
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
230
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
231
231
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
232
232
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
233
233
 
234
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
234
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
235
235
 
236
236
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
237
237
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -246,12 +246,12 @@ class Function(
246
246
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
247
247
  ) -> modal._functions.OriginalReturnType: ...
248
248
 
249
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
249
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
250
250
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
251
251
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
252
252
 
253
253
  _experimental_spawn: ___experimental_spawn_spec[
254
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
254
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
255
255
  ]
256
256
 
257
257
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -260,11 +260,11 @@ class Function(
260
260
 
261
261
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
262
262
 
263
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
263
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
264
264
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
265
265
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
266
266
 
267
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
267
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
268
268
 
269
269
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
270
270
 
@@ -290,6 +290,7 @@ class _Mount(_Object, type_prefix="mo"):
290
290
  _deployment_name: Optional[str] = None
291
291
  _namespace: Optional[int] = None
292
292
  _environment_name: Optional[str] = None
293
+ _allow_overwrite: bool = False
293
294
  _content_checksum_sha256_hex: Optional[str] = None
294
295
 
295
296
  @staticmethod
@@ -600,11 +601,16 @@ class _Mount(_Object, type_prefix="mo"):
600
601
  # Build the mount.
601
602
  status_row.message(f"Creating mount {message_label}: Finalizing index of {len(files)} files")
602
603
  if self._deployment_name:
604
+ creation_type = (
605
+ api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING
606
+ if self._allow_overwrite
607
+ else api_pb2.OBJECT_CREATION_TYPE_CREATE_FAIL_IF_EXISTS
608
+ )
603
609
  req = api_pb2.MountGetOrCreateRequest(
604
610
  deployment_name=self._deployment_name,
605
611
  namespace=self._namespace,
606
612
  environment_name=self._environment_name,
607
- object_creation_type=api_pb2.OBJECT_CREATION_TYPE_CREATE_FAIL_IF_EXISTS,
613
+ object_creation_type=creation_type,
608
614
  files=files,
609
615
  )
610
616
  elif resolver.app_id is not None:
@@ -736,7 +742,9 @@ class _Mount(_Object, type_prefix="mo"):
736
742
  self: "_Mount",
737
743
  deployment_name: Optional[str] = None,
738
744
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
745
+ *,
739
746
  environment_name: Optional[str] = None,
747
+ allow_overwrite: bool = False,
740
748
  client: Optional[_Client] = None,
741
749
  ) -> None:
742
750
  check_object_name(deployment_name, "Mount")
@@ -744,6 +752,7 @@ class _Mount(_Object, type_prefix="mo"):
744
752
  self._deployment_name = deployment_name
745
753
  self._namespace = namespace
746
754
  self._environment_name = environment_name
755
+ self._allow_overwrite = allow_overwrite
747
756
  if client is None:
748
757
  client = await _Client.from_env()
749
758
  resolver = Resolver(client=client, environment_name=environment_name)
@@ -826,35 +835,34 @@ import sys; sys.path.append('{REMOTE_PACKAGES_PATH}')
826
835
  """.strip()
827
836
 
828
837
 
829
- async def _create_single_mount(
838
+ async def _create_single_client_dependency_mount(
830
839
  client: _Client,
831
840
  builder_version: str,
832
841
  python_version: str,
833
- platform: str,
834
842
  arch: str,
835
- uv_python_platform: str = None,
843
+ platform: str,
844
+ uv_python_platform: str,
836
845
  check_if_exists: bool = True,
846
+ allow_overwrite: bool = False,
837
847
  ):
838
- import subprocess
839
848
  import tempfile
840
849
 
841
850
  profile_environment = config.get("environment")
842
851
  abi_tag = "cp" + python_version.replace(".", "")
843
852
  mount_name = f"{builder_version}-{abi_tag}-{platform}-{arch}"
844
- uv_python_platform = uv_python_platform or f"{arch}-{platform}"
845
853
 
846
854
  if check_if_exists:
847
855
  try:
848
856
  await Mount.from_name(mount_name, namespace=api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL).hydrate.aio(client)
849
- print(f" Found existing mount {mount_name} in global namespace.")
857
+ print(f" Found existing mount {mount_name} in global namespace.")
850
858
  return
851
859
  except modal.exception.NotFoundError:
852
860
  pass
853
861
 
854
- with tempfile.TemporaryDirectory() as tmpd:
862
+ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpd:
855
863
  print(f"📦 Building {mount_name}.")
856
864
  requirements = os.path.join(os.path.dirname(__file__), f"requirements/{builder_version}.txt")
857
- subprocess.run(
865
+ cmd = " ".join(
858
866
  [
859
867
  "uv",
860
868
  "pip",
@@ -871,12 +879,21 @@ async def _create_single_mount(
871
879
  uv_python_platform,
872
880
  "--python-version",
873
881
  python_version,
874
- ],
875
- check=True,
876
- capture_output=True,
882
+ ]
877
883
  )
884
+ proc = await asyncio.create_subprocess_shell(
885
+ cmd,
886
+ stdout=asyncio.subprocess.PIPE,
887
+ stderr=asyncio.subprocess.PIPE,
888
+ )
889
+ await proc.wait()
890
+ if proc.returncode:
891
+ stdout, stderr = await proc.communicate()
892
+ print(stdout.decode("utf-8"))
893
+ print(stderr.decode("utf-8"))
894
+ raise RuntimeError(f"Subprocess failed with {proc.returncode}", proc.args)
878
895
 
879
- print(f"🌐 Downloaded and unpacked packages to {tmpd}.")
896
+ print(f"🌐 Downloaded and unpacked {mount_name} packages to {tmpd}.")
880
897
 
881
898
  python_mount = Mount._from_local_dir(tmpd, remote_path=REMOTE_PACKAGES_PATH)
882
899
 
@@ -895,6 +912,7 @@ async def _create_single_mount(
895
912
  mount_name,
896
913
  api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL,
897
914
  environment_name=profile_environment,
915
+ allow_overwrite=allow_overwrite,
898
916
  client=client,
899
917
  )
900
918
  print(f"✅ Deployed mount {mount_name} to global namespace.")
@@ -902,34 +920,30 @@ async def _create_single_mount(
902
920
 
903
921
  async def _create_client_dependency_mounts(
904
922
  client=None,
905
- check_if_exists=True,
906
923
  python_versions: list[str] = list(PYTHON_STANDALONE_VERSIONS),
924
+ check_if_exists=True,
907
925
  ):
926
+ arch = "x86_64"
927
+ platform_tags = [
928
+ ("manylinux_2_17", f"{arch}-manylinux_2_17"), # glibc >= 2.17
929
+ ("musllinux_1_2", f"{arch}-unknown-linux-musl"), # musl >= 1.2
930
+ ]
908
931
  coros = []
909
- for python_version in python_versions:
910
- # glibc >= 2.17
911
- coros.append(
912
- _create_single_mount(
913
- client,
914
- "PREVIEW",
915
- python_version,
916
- "manylinux_2_17",
917
- "x86_64",
918
- check_if_exists=check_if_exists,
919
- )
920
- )
921
- # musl >= 1.2
922
- coros.append(
923
- _create_single_mount(
924
- client,
925
- "PREVIEW",
926
- python_version,
927
- "musllinux_1_2",
928
- "x86_64",
929
- uv_python_platform="x86_64-unknown-linux-musl",
930
- check_if_exists=check_if_exists,
931
- )
932
- )
932
+ for builder_version in ["PREVIEW"]:
933
+ for python_version in python_versions:
934
+ for platform, uv_python_platform in platform_tags:
935
+ coros.append(
936
+ _create_single_client_dependency_mount(
937
+ client,
938
+ builder_version,
939
+ python_version,
940
+ arch,
941
+ platform,
942
+ uv_python_platform,
943
+ check_if_exists=builder_version != "PREVIEW",
944
+ allow_overwrite=builder_version == "PREVIEW",
945
+ )
946
+ )
933
947
  await TaskContext.gather(*coros)
934
948
 
935
949
 
@@ -82,6 +82,7 @@ class _Mount(modal._object._Object):
82
82
  _deployment_name: typing.Optional[str]
83
83
  _namespace: typing.Optional[int]
84
84
  _environment_name: typing.Optional[str]
85
+ _allow_overwrite: bool
85
86
  _content_checksum_sha256_hex: typing.Optional[str]
86
87
 
87
88
  @staticmethod
@@ -172,7 +173,9 @@ class _Mount(modal._object._Object):
172
173
  self: _Mount,
173
174
  deployment_name: typing.Optional[str] = None,
174
175
  namespace=1,
176
+ *,
175
177
  environment_name: typing.Optional[str] = None,
178
+ allow_overwrite: bool = False,
176
179
  client: typing.Optional[modal.client._Client] = None,
177
180
  ) -> None: ...
178
181
  def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata: ...
@@ -184,6 +187,7 @@ class Mount(modal.object.Object):
184
187
  _deployment_name: typing.Optional[str]
185
188
  _namespace: typing.Optional[int]
186
189
  _environment_name: typing.Optional[str]
190
+ _allow_overwrite: bool
187
191
  _content_checksum_sha256_hex: typing.Optional[str]
188
192
 
189
193
  def __init__(self, *args, **kwargs): ...
@@ -288,7 +292,9 @@ class Mount(modal.object.Object):
288
292
  /,
289
293
  deployment_name: typing.Optional[str] = None,
290
294
  namespace=1,
295
+ *,
291
296
  environment_name: typing.Optional[str] = None,
297
+ allow_overwrite: bool = False,
292
298
  client: typing.Optional[modal.client.Client] = None,
293
299
  ) -> None: ...
294
300
  async def aio(
@@ -296,7 +302,9 @@ class Mount(modal.object.Object):
296
302
  /,
297
303
  deployment_name: typing.Optional[str] = None,
298
304
  namespace=1,
305
+ *,
299
306
  environment_name: typing.Optional[str] = None,
307
+ allow_overwrite: bool = False,
300
308
  client: typing.Optional[modal.client.Client] = None,
301
309
  ) -> None: ...
302
310
 
@@ -308,25 +316,26 @@ def _create_client_mount(): ...
308
316
  def create_client_mount(): ...
309
317
  def _get_client_mount(): ...
310
318
  def _is_modal_path(remote_path: pathlib.PurePosixPath): ...
311
- async def _create_single_mount(
319
+ async def _create_single_client_dependency_mount(
312
320
  client: modal.client._Client,
313
321
  builder_version: str,
314
322
  python_version: str,
315
- platform: str,
316
323
  arch: str,
317
- uv_python_platform: str = None,
324
+ platform: str,
325
+ uv_python_platform: str,
318
326
  check_if_exists: bool = True,
327
+ allow_overwrite: bool = False,
319
328
  ): ...
320
329
  async def _create_client_dependency_mounts(
321
- client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
330
+ client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
322
331
  ): ...
323
332
 
324
333
  class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
325
334
  def __call__(
326
- self, /, client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
335
+ self, /, client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
327
336
  ): ...
328
337
  async def aio(
329
- self, /, client=None, check_if_exists=True, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"]
338
+ self, /, client=None, python_versions: list[str] = ["3.9", "3.10", "3.11", "3.12", "3.13"], check_if_exists=True
330
339
  ): ...
331
340
 
332
341
  create_client_dependency_mounts: __create_client_dependency_mounts_spec
@@ -593,7 +593,7 @@ def _spawn_map_sync(self, *input_iterators, kwargs={}) -> None:
593
593
 
594
594
  return run_coroutine_in_temporary_event_loop(
595
595
  _spawn_map_async(self, *input_iterators, kwargs=kwargs),
596
- "You can't run Function.spawn_map() from an async function. Use Function.map.aio() instead.",
596
+ "You can't run Function.spawn_map() from an async function. Use Function.spawn_map.aio() instead.",
597
597
  )
598
598
 
599
599
 
@@ -0,0 +1,17 @@
1
+ aiohappyeyeballs==2.6.1
2
+ aiohttp==3.12.7
3
+ aiosignal==1.3.2
4
+ async-timeout==5.0.1 ; python_version < "3.11"
5
+ attrs==25.3.0
6
+ certifi==2025.4.26
7
+ frozenlist==1.6.0
8
+ grpclib==0.4.8
9
+ h2==4.2.0
10
+ hpack==4.1.0
11
+ hyperframe==6.1.0
12
+ idna==3.10
13
+ multidict==6.4.4
14
+ propcache==0.3.1
15
+ protobuf==6.31.1
16
+ typing_extensions==4.13.2
17
+ yarl==1.20.0
@@ -0,0 +1,48 @@
1
+ {
2
+ "debian": {
3
+ "PREVIEW": "bookworm",
4
+ "2024.10": "bookworm",
5
+ "2024.04": "bookworm",
6
+ "2023.12": "bullseye"
7
+ },
8
+ "python": {
9
+ "PREVIEW": [
10
+ "3.9.22",
11
+ "3.10.17",
12
+ "3.11.12",
13
+ "3.12.10",
14
+ "3.13.3"
15
+ ],
16
+ "2024.10": [
17
+ "3.9.20",
18
+ "3.10.15",
19
+ "3.11.10",
20
+ "3.12.6",
21
+ "3.13.0"
22
+ ],
23
+ "2024.04": [
24
+ "3.9.19",
25
+ "3.10.14",
26
+ "3.11.8",
27
+ "3.12.2"
28
+ ],
29
+ "2023.12": [
30
+ "3.9.15",
31
+ "3.10.8",
32
+ "3.11.0",
33
+ "3.12.1"
34
+ ]
35
+ },
36
+ "micromamba": {
37
+ "PREVIEW": "2.1.1",
38
+ "2024.10": "1.5.10",
39
+ "2024.04": "1.5.8",
40
+ "2023.12": "1.3.1"
41
+ },
42
+ "package_tools": {
43
+ "PREVIEW": "pip wheel uv",
44
+ "2024.10": "pip wheel uv",
45
+ "2024.04": "pip wheel uv",
46
+ "2023.12": "pip"
47
+ }
48
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev28
3
+ Version: 1.0.4.dev2
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
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.0.3.dev28"
4
+ __version__ = "1.0.4.dev2"
@@ -1,16 +0,0 @@
1
- aiohappyeyeballs==2.4.3
2
- aiohttp==3.10.8
3
- aiosignal==1.3.1
4
- async-timeout==4.0.3 ; python_version < "3.11"
5
- attrs==24.2.0
6
- certifi==2024.8.30
7
- frozenlist==1.4.1
8
- grpclib==0.4.7
9
- h2==4.1.0
10
- hpack==4.0.0
11
- hyperframe==6.0.1
12
- idna==3.10
13
- multidict==6.1.0
14
- protobuf>=3.20,<6
15
- typing_extensions==4.12.2
16
- yarl==1.13.1
@@ -1,26 +0,0 @@
1
- {
2
- "debian": {
3
- "PREVIEW": "bookworm",
4
- "2024.10": "bookworm",
5
- "2024.04": "bookworm",
6
- "2023.12": "bullseye"
7
- },
8
- "python": {
9
- "PREVIEW": ["3.9.20", "3.10.15", "3.11.10", "3.12.6", "3.13.0"],
10
- "2024.10": ["3.9.20", "3.10.15", "3.11.10", "3.12.6", "3.13.0"],
11
- "2024.04": ["3.9.19", "3.10.14", "3.11.8", "3.12.2"],
12
- "2023.12": ["3.9.15", "3.10.8", "3.11.0", "3.12.1"]
13
- },
14
- "micromamba": {
15
- "PREVIEW": "1.5.10",
16
- "2024.10": "1.5.10",
17
- "2024.04": "1.5.8",
18
- "2023.12": "1.3.1"
19
- },
20
- "package_tools": {
21
- "PREVIEW": "pip wheel uv",
22
- "2024.10": "pip wheel uv",
23
- "2024.04": "pip wheel uv",
24
- "2023.12": "pip"
25
- }
26
- }
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