modal 1.0.3.dev13__tar.gz → 1.0.3.dev15__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 (184) hide show
  1. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/PKG-INFO +1 -1
  2. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/client.pyi +2 -2
  3. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/mount.py +106 -0
  4. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/mount.pyi +10 -0
  5. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api.proto +10 -2
  7. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api_pb2.pyi +7 -2
  8. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_version/__init__.py +1 -1
  9. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/LICENSE +0 -0
  10. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/README.md +0 -0
  11. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/__init__.py +0 -0
  12. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/__main__.py +0 -0
  13. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_clustered_functions.py +0 -0
  14. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_functions.py +0 -0
  17. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_ipython.py +0 -0
  18. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_location.py +0 -0
  19. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_object.py +0 -0
  20. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_output.py +0 -0
  21. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_partial_function.py +0 -0
  22. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_pty.py +0 -0
  23. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_resolver.py +0 -0
  24. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_resources.py +0 -0
  25. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_serialization.py +0 -0
  35. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_traceback.py +0 -0
  36. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_tunnel.py +0 -0
  37. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_tunnel.pyi +0 -0
  38. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_type_manager.py +0 -0
  39. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/__init__.py +0 -0
  40. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/async_utils.py +0 -0
  42. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/logger.py +0 -0
  54. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/_watcher.py +0 -0
  66. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/app.py +0 -0
  67. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/app.pyi +0 -0
  68. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/call_graph.py +0 -0
  69. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/__init__.py +0 -0
  70. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/_download.py +0 -0
  71. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/_traceback.py +0 -0
  72. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/app.py +0 -0
  73. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/cluster.py +0 -0
  74. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/config.py +0 -0
  75. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/container.py +0 -0
  76. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/dict.py +0 -0
  77. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/entry_point.py +0 -0
  78. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/environment.py +0 -0
  79. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/import_refs.py +0 -0
  80. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/launch.py +0 -0
  81. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/network_file_system.py +0 -0
  82. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/profile.py +0 -0
  83. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/queues.py +0 -0
  87. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/run.py +0 -0
  88. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/secret.py +0 -0
  89. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/token.py +0 -0
  90. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/utils.py +0 -0
  91. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cli/volume.py +0 -0
  92. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/client.py +0 -0
  93. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cloud_bucket_mount.py +0 -0
  94. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cloud_bucket_mount.pyi +0 -0
  95. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cls.py +0 -0
  96. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/cls.pyi +0 -0
  97. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/config.py +0 -0
  98. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/container_process.py +0 -0
  99. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/container_process.pyi +0 -0
  100. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/dict.py +0 -0
  101. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/dict.pyi +0 -0
  102. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/environments.py +0 -0
  103. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/environments.pyi +0 -0
  104. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/exception.py +0 -0
  105. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/experimental/__init__.py +0 -0
  106. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/experimental/ipython.py +0 -0
  107. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/file_io.py +0 -0
  108. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/file_io.pyi +0 -0
  109. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/file_pattern_matcher.py +0 -0
  110. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/functions.py +0 -0
  111. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/functions.pyi +0 -0
  112. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/gpu.py +0 -0
  113. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/image.py +0 -0
  114. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/image.pyi +0 -0
  115. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/io_streams.py +0 -0
  116. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/io_streams.pyi +0 -0
  117. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/network_file_system.py +0 -0
  118. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/network_file_system.pyi +0 -0
  119. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/object.py +0 -0
  120. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/object.pyi +0 -0
  121. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/output.py +0 -0
  122. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/parallel_map.py +0 -0
  123. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/parallel_map.pyi +0 -0
  124. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/partial_function.py +0 -0
  125. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/partial_function.pyi +0 -0
  126. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/proxy.py +0 -0
  127. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/proxy.pyi +0 -0
  128. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/py.typed +0 -0
  129. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/queue.py +0 -0
  130. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/queue.pyi +0 -0
  131. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/2023.12.312.txt +0 -0
  132. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/2023.12.txt +0 -0
  133. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/2024.04.txt +0 -0
  134. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/2024.10.txt +0 -0
  135. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/PREVIEW.txt +0 -0
  136. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/README.md +0 -0
  137. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/requirements/base-images.json +0 -0
  138. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/retries.py +0 -0
  139. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/runner.py +0 -0
  140. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/runner.pyi +0 -0
  141. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/running_app.py +0 -0
  142. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/sandbox.py +0 -0
  143. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/sandbox.pyi +0 -0
  144. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/schedule.py +0 -0
  145. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/scheduler_placement.py +0 -0
  146. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/secret.py +0 -0
  147. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/secret.pyi +0 -0
  148. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/serving.py +0 -0
  149. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/serving.pyi +0 -0
  150. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/snapshot.py +0 -0
  151. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/snapshot.pyi +0 -0
  152. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/stream_type.py +0 -0
  153. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/token_flow.py +0 -0
  154. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/token_flow.pyi +0 -0
  155. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/volume.py +0 -0
  156. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal/volume.pyi +0 -0
  157. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/SOURCES.txt +0 -0
  158. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/dependency_links.txt +0 -0
  159. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/entry_points.txt +0 -0
  160. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/requires.txt +0 -0
  161. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal.egg-info/top_level.txt +0 -0
  162. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/__init__.py +0 -0
  163. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/gen_cli_docs.py +0 -0
  164. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/gen_reference_docs.py +0 -0
  165. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/mdmd/__init__.py +0 -0
  166. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/mdmd/mdmd.py +0 -0
  167. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_docs/mdmd/signatures.py +0 -0
  168. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/__init__.py +0 -0
  169. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api_grpc.py +0 -0
  170. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api_pb2.py +0 -0
  171. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options.proto +0 -0
  176. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_proto/py.typed +0 -0
  182. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/modal_version/__main__.py +0 -0
  183. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/pyproject.toml +0 -0
  184. {modal-1.0.3.dev13 → modal-1.0.3.dev15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev13
3
+ Version: 1.0.3.dev15
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.dev13",
34
+ version: str = "1.0.3.dev15",
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.dev13",
97
+ version: str = "1.0.3.dev15",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -810,3 +810,109 @@ def _is_modal_path(remote_path: PurePosixPath):
810
810
  if is_modal_path:
811
811
  return True
812
812
  return False
813
+
814
+ REMOTE_PACKAGES_PATH = "/__modal/deps"
815
+ REMOTE_SITECUSTOMIZE_PATH = "/pkg/sitecustomize.py"
816
+
817
+ SITECUSTOMIZE_CONTENT = f"""
818
+ # This file is automatically generated by Modal.
819
+ # It ensures that Modal's python dependencies are available in the Python PATH,
820
+ # while prioritizing user-installed packages.
821
+ import sys; sys.path.append('{REMOTE_PACKAGES_PATH}')
822
+ """.strip()
823
+
824
+ async def _create_single_mount(
825
+ client: _Client,
826
+ builder_version: str,
827
+ python_version: str,
828
+ platform: str,
829
+ arch: str,
830
+ uv_python_platform: str = None,
831
+ check_if_exists: bool = True,
832
+ ):
833
+ import subprocess
834
+ import tempfile
835
+
836
+ profile_environment = config.get("environment")
837
+ abi_tag = "cp" + python_version.replace(".", "")
838
+ mount_name = f"{builder_version}-{abi_tag}-{platform}-{arch}"
839
+ uv_python_platform = uv_python_platform or f"{arch}-{platform}"
840
+
841
+ if check_if_exists:
842
+ try:
843
+ await Mount.from_name(mount_name, namespace=api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL).hydrate.aio(client)
844
+ print(f"✅ Found existing mount {mount_name} in global namespace.")
845
+ return
846
+ except modal.exception.NotFoundError:
847
+ pass
848
+
849
+ with tempfile.TemporaryDirectory() as tmpd:
850
+ print(f"📦 Building {mount_name}.")
851
+ requirements = os.path.join(os.path.dirname(__file__), f"requirements/{builder_version}.txt")
852
+ subprocess.run(
853
+ [
854
+ "uv",
855
+ "pip",
856
+ "install",
857
+ "--strict",
858
+ "--no-deps",
859
+ "--no-cache",
860
+ "-r",
861
+ requirements,
862
+ "--compile-bytecode",
863
+ "--target",
864
+ tmpd,
865
+ "--python-platform",
866
+ uv_python_platform,
867
+ "--python-version",
868
+ python_version,
869
+ ],
870
+ check=True,
871
+ capture_output=True,
872
+ )
873
+
874
+ print(f"🌐 Downloaded and unpacked packages to {tmpd}.")
875
+
876
+ python_mount = Mount._from_local_dir(tmpd, remote_path=REMOTE_PACKAGES_PATH)
877
+
878
+ with tempfile.NamedTemporaryFile() as sitecustomize:
879
+ sitecustomize.write(
880
+ SITECUSTOMIZE_CONTENT.encode("utf-8"),
881
+ )
882
+ sitecustomize.flush()
883
+
884
+ python_mount = python_mount.add_local_file(
885
+ sitecustomize.name,
886
+ remote_path=REMOTE_SITECUSTOMIZE_PATH,
887
+ )
888
+
889
+ await python_mount._deploy.aio(
890
+ mount_name,
891
+ api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL,
892
+ environment_name=profile_environment,
893
+ client=client,
894
+ )
895
+ print(f"✅ Deployed mount {mount_name} to global namespace.")
896
+
897
+
898
+ async def _create_client_dependency_mounts(client=None, check_if_exists=True):
899
+ for python_version in PYTHON_STANDALONE_VERSIONS:
900
+ # glibc >= 2.17
901
+ await _create_single_mount(
902
+ client,
903
+ "PREVIEW",
904
+ python_version,
905
+ "manylinux_2_17",
906
+ "x86_64",
907
+ check_if_exists=check_if_exists,
908
+ )
909
+ # musl >= 1.2
910
+ await _create_single_mount(
911
+ client,
912
+ "PREVIEW",
913
+ python_version,
914
+ "musllinux_1_2",
915
+ "x86_64",
916
+ uv_python_platform="x86_64-unknown-linux-musl",
917
+ check_if_exists=check_if_exists,
918
+ )
@@ -308,6 +308,16 @@ def _create_client_mount(): ...
308
308
  def create_client_mount(): ...
309
309
  def _get_client_mount(): ...
310
310
  def _is_modal_path(remote_path: pathlib.PurePosixPath): ...
311
+ async def _create_single_mount(
312
+ client: modal.client._Client,
313
+ builder_version: str,
314
+ python_version: str,
315
+ platform: str,
316
+ arch: str,
317
+ uv_python_platform: str = None,
318
+ check_if_exists: bool = True,
319
+ ): ...
320
+ async def _create_client_dependency_mounts(client=None, check_if_exists=True): ...
311
321
 
312
322
  ROOT_DIR: pathlib.PurePosixPath
313
323
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev13
3
+ Version: 1.0.3.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1952,13 +1952,21 @@ message ImageJoinStreamingResponse {
1952
1952
  message ImageMetadata {
1953
1953
  // The output of `python -VV. Not set if missing
1954
1954
  optional string python_version_info = 1;
1955
+
1955
1956
  // Installed python packages, as listed by by `pip list`.
1956
1957
  // package name -> version. Empty if missing
1957
1958
  map<string, string> python_packages = 2;
1958
- // The work directory of the image, defaulting to "/". Not set if missing
1959
+
1960
+ // The working directory of the image, defaulting to "/". Not set if missing.
1961
+ //
1962
+ // Note that this is NOT the actual working directory of the image, especially
1963
+ // for runner tasks. Please see `ImageManifest.workdir` instead. This field
1964
+ // should not be used in any future code.
1959
1965
  optional string workdir = 3;
1960
- // The image's libc version
1966
+
1967
+ // The version of glibc in this image, if any.
1961
1968
  optional string libc_version_info = 4;
1969
+
1962
1970
  // The builder version for/with which the image was created.
1963
1971
  optional string image_builder_version = 5;
1964
1972
  }
@@ -6313,9 +6313,14 @@ class ImageMetadata(google.protobuf.message.Message):
6313
6313
  package name -> version. Empty if missing
6314
6314
  """
6315
6315
  workdir: builtins.str
6316
- """The work directory of the image, defaulting to "/". Not set if missing"""
6316
+ """The working directory of the image, defaulting to "/". Not set if missing.
6317
+
6318
+ Note that this is NOT the actual working directory of the image, especially
6319
+ for runner tasks. Please see `ImageManifest.workdir` instead. This field
6320
+ should not be used in any future code.
6321
+ """
6317
6322
  libc_version_info: builtins.str
6318
- """The image's libc version"""
6323
+ """The version of glibc in this image, if any."""
6319
6324
  image_builder_version: builtins.str
6320
6325
  """The builder version for/with which the image was created."""
6321
6326
  def __init__(
@@ -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.dev13"
4
+ __version__ = "1.0.3.dev15"
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