modal 1.1.5.dev25__tar.gz → 1.1.5.dev26__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (190) hide show
  1. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/client.pyi +2 -2
  3. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/image.py +62 -0
  4. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/image.pyi +163 -0
  5. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_version/__init__.py +1 -1
  7. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/LICENSE +0 -0
  8. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/README.md +0 -0
  9. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/__init__.py +0 -0
  10. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/__main__.py +0 -0
  11. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_clustered_functions.py +0 -0
  12. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_functions.py +0 -0
  15. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_ipython.py +0 -0
  16. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_location.py +0 -0
  17. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_object.py +0 -0
  18. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_output.py +0 -0
  19. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_partial_function.py +0 -0
  20. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_pty.py +0 -0
  21. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_resolver.py +0 -0
  22. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_resources.py +0 -0
  23. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/__init__.py +0 -0
  24. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/asgi.py +0 -0
  25. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/execution_context.py +0 -0
  28. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/telemetry.py +0 -0
  31. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_runtime/user_code_imports.py +0 -0
  32. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_serialization.py +0 -0
  33. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_traceback.py +0 -0
  34. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_tunnel.py +0 -0
  35. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_tunnel.pyi +0 -0
  36. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_type_manager.py +0 -0
  37. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/__init__.py +0 -0
  38. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/app_utils.py +0 -0
  39. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/async_utils.py +0 -0
  40. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/auth_token_manager.py +0 -0
  41. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/blob_utils.py +0 -0
  42. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/bytes_io_segment_payload.py +0 -0
  43. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/deprecation.py +0 -0
  44. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/docker_utils.py +0 -0
  45. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/function_utils.py +0 -0
  46. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/git_utils.py +0 -0
  47. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/grpc_testing.py +0 -0
  48. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/grpc_utils.py +0 -0
  49. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/hash_utils.py +0 -0
  50. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/http_utils.py +0 -0
  51. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/jwt_utils.py +0 -0
  52. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/logger.py +0 -0
  53. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/mount_utils.py +0 -0
  54. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/name_utils.py +0 -0
  55. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/package_utils.py +0 -0
  56. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/pattern_utils.py +0 -0
  57. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/rand_pb_testing.py +0 -0
  58. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/shell_utils.py +0 -0
  59. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_utils/time_utils.py +0 -0
  60. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_vendor/__init__.py +0 -0
  61. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  62. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_vendor/cloudpickle.py +0 -0
  63. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_vendor/tblib.py +0 -0
  64. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/_watcher.py +0 -0
  65. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/app.py +0 -0
  66. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/app.pyi +0 -0
  67. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/2023.12.312.txt +0 -0
  68. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/2023.12.txt +0 -0
  69. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/2024.04.txt +0 -0
  70. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/2024.10.txt +0 -0
  71. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/2025.06.txt +0 -0
  72. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/PREVIEW.txt +0 -0
  73. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/README.md +0 -0
  74. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/builder/base-images.json +0 -0
  75. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/call_graph.py +0 -0
  76. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/__init__.py +0 -0
  77. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/_download.py +0 -0
  78. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/_traceback.py +0 -0
  79. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/app.py +0 -0
  80. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/cluster.py +0 -0
  81. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/config.py +0 -0
  82. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/container.py +0 -0
  83. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/dict.py +0 -0
  84. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/entry_point.py +0 -0
  85. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/environment.py +0 -0
  86. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/import_refs.py +0 -0
  87. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/launch.py +0 -0
  88. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/network_file_system.py +0 -0
  89. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/profile.py +0 -0
  90. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/programs/__init__.py +0 -0
  91. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/programs/launch_instance_ssh.py +0 -0
  92. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/programs/run_jupyter.py +0 -0
  93. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/programs/run_marimo.py +0 -0
  94. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/programs/vscode.py +0 -0
  95. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/queues.py +0 -0
  96. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/run.py +0 -0
  97. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/secret.py +0 -0
  98. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/token.py +0 -0
  99. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/utils.py +0 -0
  100. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cli/volume.py +0 -0
  101. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/client.py +0 -0
  102. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cloud_bucket_mount.py +0 -0
  103. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cloud_bucket_mount.pyi +0 -0
  104. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cls.py +0 -0
  105. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/cls.pyi +0 -0
  106. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/config.py +0 -0
  107. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/container_process.py +0 -0
  108. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/container_process.pyi +0 -0
  109. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/dict.py +0 -0
  110. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/dict.pyi +0 -0
  111. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/environments.py +0 -0
  112. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/environments.pyi +0 -0
  113. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/exception.py +0 -0
  114. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/experimental/__init__.py +0 -0
  115. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/experimental/flash.py +0 -0
  116. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/experimental/flash.pyi +0 -0
  117. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/experimental/ipython.py +0 -0
  118. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/file_io.py +0 -0
  119. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/file_io.pyi +0 -0
  120. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/file_pattern_matcher.py +0 -0
  121. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/functions.py +0 -0
  122. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/functions.pyi +0 -0
  123. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/gpu.py +0 -0
  124. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/io_streams.py +0 -0
  125. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/io_streams.pyi +0 -0
  126. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/mount.py +0 -0
  127. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/mount.pyi +0 -0
  128. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/network_file_system.py +0 -0
  129. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/network_file_system.pyi +0 -0
  130. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/object.py +0 -0
  131. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/object.pyi +0 -0
  132. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/output.py +0 -0
  133. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/parallel_map.py +0 -0
  134. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/parallel_map.pyi +0 -0
  135. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/partial_function.py +0 -0
  136. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/partial_function.pyi +0 -0
  137. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/proxy.py +0 -0
  138. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/proxy.pyi +0 -0
  139. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/py.typed +0 -0
  140. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/queue.py +0 -0
  141. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/queue.pyi +0 -0
  142. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/retries.py +0 -0
  143. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/runner.py +0 -0
  144. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/runner.pyi +0 -0
  145. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/running_app.py +0 -0
  146. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/sandbox.py +0 -0
  147. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/sandbox.pyi +0 -0
  148. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/schedule.py +0 -0
  149. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/secret.py +0 -0
  151. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/secret.pyi +0 -0
  152. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/serving.py +0 -0
  153. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/serving.pyi +0 -0
  154. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/snapshot.py +0 -0
  155. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/stream_type.py +0 -0
  157. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/token_flow.py +0 -0
  158. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/volume.py +0 -0
  160. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal/volume.pyi +0 -0
  161. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api.proto +0 -0
  174. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/modal_version/__main__.py +0 -0
  189. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/pyproject.toml +0 -0
  190. {modal-1.1.5.dev25 → modal-1.1.5.dev26}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev25
3
+ Version: 1.1.5.dev26
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.5.dev25",
36
+ version: str = "1.1.5.dev26",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev25",
167
+ version: str = "1.1.5.dev26",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -868,6 +868,68 @@ class _Image(_Object, type_prefix="im"):
868
868
 
869
869
  return obj
870
870
 
871
+ async def build(self, app: "modal.app._App") -> "_Image":
872
+ """Eagerly build an image.
873
+
874
+ If your image was previously built, then this method will not rebuild your image
875
+ and your cached image is returned.
876
+
877
+ **Examples**
878
+
879
+ ```python
880
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
881
+
882
+ app = modal.App("build-image")
883
+ with modal.enable_output(), app.run():
884
+ image.build(app)
885
+
886
+ # Save the image id
887
+ my_image_id = image.object_id
888
+
889
+ # Reference the image with the id or uses it another context.
890
+ built_image = modal.Image.from_id(my_image_id)
891
+ ```
892
+
893
+ Alternatively, you can pre-build a image and use it in a sandbox.
894
+
895
+ ```python notest
896
+ app = modal.App.lookup("sandbox-example")
897
+
898
+ with modal.enable_output():
899
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
900
+ image.build(app)
901
+
902
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
903
+ print(sb.stdout.read())
904
+ sb.terminate()
905
+ ```
906
+
907
+ **Note**
908
+
909
+ For defining Modal functions, images are built automatically when deploying or running an App.
910
+ You do not need to built the image explicitly:
911
+
912
+ ```python notest
913
+ app = modal.App()
914
+ image = modal.Image.debian_slim()
915
+
916
+ # No need to explicitly build the image for defining a function.
917
+ @app.function(image=image)
918
+ def f():
919
+ ...
920
+ ```
921
+
922
+ """
923
+ if app.app_id is None:
924
+ raise InvalidError("App has not been initialized yet. Use the content manager `app.run()` or `App.lookup`")
925
+
926
+ app_id = app.app_id
927
+ app_client = app._client or await _Client.from_env()
928
+
929
+ resolver = Resolver(app_client, app_id=app_id)
930
+ await resolver.load(self)
931
+ return self
932
+
871
933
  def pip_install(
872
934
  self,
873
935
  *packages: Union[str, list[str]], # A list of Python packages, eg. ["numpy", "matplotlib>=3.5.0"]
@@ -2,6 +2,7 @@ import collections.abc
2
2
  import google.protobuf.message
3
3
  import modal._functions
4
4
  import modal._object
5
+ import modal.app
5
6
  import modal.client
6
7
  import modal.cloud_bucket_mount
7
8
  import modal.functions
@@ -318,6 +319,59 @@ class _Image(modal._object._Object):
318
319
  """
319
320
  ...
320
321
 
322
+ async def build(self, app: modal.app._App) -> _Image:
323
+ """Eagerly build an image.
324
+
325
+ If your image was previously built, then this method will not rebuild your image
326
+ and your cached image is returned.
327
+
328
+ **Examples**
329
+
330
+ ```python
331
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
332
+
333
+ app = modal.App("build-image")
334
+ with modal.enable_output(), app.run():
335
+ image.build(app)
336
+
337
+ # Save the image id
338
+ my_image_id = image.object_id
339
+
340
+ # Reference the image with the id or uses it another context.
341
+ built_image = modal.Image.from_id(my_image_id)
342
+ ```
343
+
344
+ Alternatively, you can pre-build a image and use it in a sandbox.
345
+
346
+ ```python notest
347
+ app = modal.App.lookup("sandbox-example")
348
+
349
+ with modal.enable_output():
350
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
351
+ image.build(app)
352
+
353
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
354
+ print(sb.stdout.read())
355
+ sb.terminate()
356
+ ```
357
+
358
+ **Note**
359
+
360
+ For defining Modal functions, images are built automatically when deploying or running an App.
361
+ You do not need to built the image explicitly:
362
+
363
+ ```python notest
364
+ app = modal.App()
365
+ image = modal.Image.debian_slim()
366
+
367
+ # No need to explicitly build the image for defining a function.
368
+ @app.function(image=image)
369
+ def f():
370
+ ...
371
+ ```
372
+ """
373
+ ...
374
+
321
375
  def pip_install(
322
376
  self,
323
377
  *packages: typing.Union[str, list[str]],
@@ -1182,6 +1236,115 @@ class Image(modal.object.Object):
1182
1236
 
1183
1237
  from_id: __from_id_spec
1184
1238
 
1239
+ class __build_spec(typing_extensions.Protocol[SUPERSELF]):
1240
+ def __call__(self, /, app: modal.app.App) -> Image:
1241
+ """Eagerly build an image.
1242
+
1243
+ If your image was previously built, then this method will not rebuild your image
1244
+ and your cached image is returned.
1245
+
1246
+ **Examples**
1247
+
1248
+ ```python
1249
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1250
+
1251
+ app = modal.App("build-image")
1252
+ with modal.enable_output(), app.run():
1253
+ image.build(app)
1254
+
1255
+ # Save the image id
1256
+ my_image_id = image.object_id
1257
+
1258
+ # Reference the image with the id or uses it another context.
1259
+ built_image = modal.Image.from_id(my_image_id)
1260
+ ```
1261
+
1262
+ Alternatively, you can pre-build a image and use it in a sandbox.
1263
+
1264
+ ```python notest
1265
+ app = modal.App.lookup("sandbox-example")
1266
+
1267
+ with modal.enable_output():
1268
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
1269
+ image.build(app)
1270
+
1271
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
1272
+ print(sb.stdout.read())
1273
+ sb.terminate()
1274
+ ```
1275
+
1276
+ **Note**
1277
+
1278
+ For defining Modal functions, images are built automatically when deploying or running an App.
1279
+ You do not need to built the image explicitly:
1280
+
1281
+ ```python notest
1282
+ app = modal.App()
1283
+ image = modal.Image.debian_slim()
1284
+
1285
+ # No need to explicitly build the image for defining a function.
1286
+ @app.function(image=image)
1287
+ def f():
1288
+ ...
1289
+ ```
1290
+ """
1291
+ ...
1292
+
1293
+ async def aio(self, /, app: modal.app.App) -> Image:
1294
+ """Eagerly build an image.
1295
+
1296
+ If your image was previously built, then this method will not rebuild your image
1297
+ and your cached image is returned.
1298
+
1299
+ **Examples**
1300
+
1301
+ ```python
1302
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1303
+
1304
+ app = modal.App("build-image")
1305
+ with modal.enable_output(), app.run():
1306
+ image.build(app)
1307
+
1308
+ # Save the image id
1309
+ my_image_id = image.object_id
1310
+
1311
+ # Reference the image with the id or uses it another context.
1312
+ built_image = modal.Image.from_id(my_image_id)
1313
+ ```
1314
+
1315
+ Alternatively, you can pre-build a image and use it in a sandbox.
1316
+
1317
+ ```python notest
1318
+ app = modal.App.lookup("sandbox-example")
1319
+
1320
+ with modal.enable_output():
1321
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
1322
+ image.build(app)
1323
+
1324
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
1325
+ print(sb.stdout.read())
1326
+ sb.terminate()
1327
+ ```
1328
+
1329
+ **Note**
1330
+
1331
+ For defining Modal functions, images are built automatically when deploying or running an App.
1332
+ You do not need to built the image explicitly:
1333
+
1334
+ ```python notest
1335
+ app = modal.App()
1336
+ image = modal.Image.debian_slim()
1337
+
1338
+ # No need to explicitly build the image for defining a function.
1339
+ @app.function(image=image)
1340
+ def f():
1341
+ ...
1342
+ ```
1343
+ """
1344
+ ...
1345
+
1346
+ build: __build_spec[typing_extensions.Self]
1347
+
1185
1348
  def pip_install(
1186
1349
  self,
1187
1350
  *packages: typing.Union[str, list[str]],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev25
3
+ Version: 1.1.5.dev26
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.1.5.dev25"
4
+ __version__ = "1.1.5.dev26"
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