modal 1.1.1.dev7__tar.gz → 1.1.1.dev10__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 (188) hide show
  1. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/PKG-INFO +1 -1
  2. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/client.pyi +2 -2
  3. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/exception.py +4 -0
  4. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/experimental/__init__.py +1 -1
  5. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/experimental/flash.py +17 -0
  6. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/experimental/flash.pyi +19 -0
  7. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/sandbox.py +17 -7
  8. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/sandbox.pyi +6 -6
  9. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/PKG-INFO +1 -1
  10. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_version/__init__.py +1 -1
  11. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/LICENSE +0 -0
  12. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/README.md +0 -0
  13. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/__init__.py +0 -0
  14. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/__main__.py +0 -0
  15. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_clustered_functions.py +0 -0
  16. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_container_entrypoint.py +0 -0
  18. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_functions.py +0 -0
  19. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_ipython.py +0 -0
  20. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_location.py +0 -0
  21. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_object.py +0 -0
  22. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_output.py +0 -0
  23. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_partial_function.py +0 -0
  24. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_pty.py +0 -0
  25. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_resolver.py +0 -0
  26. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_resources.py +0 -0
  27. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/__init__.py +0 -0
  28. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/asgi.py +0 -0
  29. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/container_io_manager.py +0 -0
  30. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
  31. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/execution_context.py +0 -0
  32. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/execution_context.pyi +0 -0
  33. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  34. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/telemetry.py +0 -0
  35. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_runtime/user_code_imports.py +0 -0
  36. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_serialization.py +0 -0
  37. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_traceback.py +0 -0
  38. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_tunnel.py +0 -0
  39. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_tunnel.pyi +0 -0
  40. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_type_manager.py +0 -0
  41. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/__init__.py +0 -0
  42. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/app_utils.py +0 -0
  43. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/async_utils.py +0 -0
  44. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/auth_token_manager.py +0 -0
  45. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/blob_utils.py +0 -0
  46. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
  47. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/deprecation.py +0 -0
  48. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/docker_utils.py +0 -0
  49. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/function_utils.py +0 -0
  50. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/git_utils.py +0 -0
  51. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/grpc_testing.py +0 -0
  52. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/grpc_utils.py +0 -0
  53. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/hash_utils.py +0 -0
  54. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/http_utils.py +0 -0
  55. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/jwt_utils.py +0 -0
  56. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/logger.py +0 -0
  57. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/mount_utils.py +0 -0
  58. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/name_utils.py +0 -0
  59. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/package_utils.py +0 -0
  60. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/pattern_utils.py +0 -0
  61. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/rand_pb_testing.py +0 -0
  62. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/shell_utils.py +0 -0
  63. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_utils/time_utils.py +0 -0
  64. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_vendor/__init__.py +0 -0
  65. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_vendor/tblib.py +0 -0
  68. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/_watcher.py +0 -0
  69. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/app.py +0 -0
  70. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/app.pyi +0 -0
  71. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/call_graph.py +0 -0
  72. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/__init__.py +0 -0
  73. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/_download.py +0 -0
  74. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/_traceback.py +0 -0
  75. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/app.py +0 -0
  76. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/cluster.py +0 -0
  77. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/config.py +0 -0
  78. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/container.py +0 -0
  79. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/dict.py +0 -0
  80. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/entry_point.py +0 -0
  81. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/environment.py +0 -0
  82. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/import_refs.py +0 -0
  83. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/launch.py +0 -0
  84. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/network_file_system.py +0 -0
  85. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/profile.py +0 -0
  86. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/programs/__init__.py +0 -0
  87. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/programs/run_jupyter.py +0 -0
  88. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/programs/vscode.py +0 -0
  89. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/queues.py +0 -0
  90. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/run.py +0 -0
  91. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/secret.py +0 -0
  92. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/token.py +0 -0
  93. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/utils.py +0 -0
  94. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cli/volume.py +0 -0
  95. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/client.py +0 -0
  96. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cloud_bucket_mount.py +0 -0
  97. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cloud_bucket_mount.pyi +0 -0
  98. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cls.py +0 -0
  99. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/cls.pyi +0 -0
  100. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/config.py +0 -0
  101. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/container_process.py +0 -0
  102. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/container_process.pyi +0 -0
  103. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/dict.py +0 -0
  104. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/dict.pyi +0 -0
  105. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/environments.py +0 -0
  106. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/environments.pyi +0 -0
  107. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/experimental/ipython.py +0 -0
  108. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/file_io.py +0 -0
  109. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/file_io.pyi +0 -0
  110. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/file_pattern_matcher.py +0 -0
  111. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/functions.py +0 -0
  112. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/functions.pyi +0 -0
  113. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/gpu.py +0 -0
  114. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/image.py +0 -0
  115. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/image.pyi +0 -0
  116. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/io_streams.py +0 -0
  117. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/io_streams.pyi +0 -0
  118. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/mount.py +0 -0
  119. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/mount.pyi +0 -0
  120. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/network_file_system.py +0 -0
  121. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/network_file_system.pyi +0 -0
  122. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/object.py +0 -0
  123. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/object.pyi +0 -0
  124. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/output.py +0 -0
  125. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/parallel_map.py +0 -0
  126. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/parallel_map.pyi +0 -0
  127. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/partial_function.py +0 -0
  128. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/partial_function.pyi +0 -0
  129. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/proxy.py +0 -0
  130. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/proxy.pyi +0 -0
  131. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/py.typed +0 -0
  132. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/queue.py +0 -0
  133. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/queue.pyi +0 -0
  134. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/2023.12.312.txt +0 -0
  135. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/2023.12.txt +0 -0
  136. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/2024.04.txt +0 -0
  137. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/2024.10.txt +0 -0
  138. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/2025.06.txt +0 -0
  139. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/PREVIEW.txt +0 -0
  140. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/README.md +0 -0
  141. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/requirements/base-images.json +0 -0
  142. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/retries.py +0 -0
  143. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/runner.py +0 -0
  144. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/runner.pyi +0 -0
  145. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/running_app.py +0 -0
  146. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/schedule.py +0 -0
  147. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/scheduler_placement.py +0 -0
  148. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/secret.py +0 -0
  149. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/secret.pyi +0 -0
  150. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/serving.py +0 -0
  151. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/serving.pyi +0 -0
  152. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/snapshot.py +0 -0
  153. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/snapshot.pyi +0 -0
  154. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/stream_type.py +0 -0
  155. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/token_flow.py +0 -0
  156. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/token_flow.pyi +0 -0
  157. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/volume.py +0 -0
  158. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal/volume.pyi +0 -0
  159. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/SOURCES.txt +0 -0
  160. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/dependency_links.txt +0 -0
  161. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/entry_points.txt +0 -0
  162. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/requires.txt +0 -0
  163. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal.egg-info/top_level.txt +0 -0
  164. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/__init__.py +0 -0
  165. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/gen_cli_docs.py +0 -0
  166. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/gen_reference_docs.py +0 -0
  167. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/mdmd/__init__.py +0 -0
  168. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/mdmd/mdmd.py +0 -0
  169. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_docs/mdmd/signatures.py +0 -0
  170. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/__init__.py +0 -0
  171. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api.proto +0 -0
  172. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api_grpc.py +0 -0
  173. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api_pb2.py +0 -0
  174. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api_pb2.pyi +0 -0
  175. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api_pb2_grpc.py +0 -0
  176. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/api_pb2_grpc.pyi +0 -0
  177. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/modal_api_grpc.py +0 -0
  178. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/modal_options_grpc.py +0 -0
  179. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options.proto +0 -0
  180. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options_grpc.py +0 -0
  181. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options_pb2.py +0 -0
  182. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options_pb2.pyi +0 -0
  183. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options_pb2_grpc.py +0 -0
  184. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/options_pb2_grpc.pyi +0 -0
  185. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_proto/py.typed +0 -0
  186. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/modal_version/__main__.py +0 -0
  187. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/pyproject.toml +0 -0
  188. {modal-1.1.1.dev7 → modal-1.1.1.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev7
3
+ Version: 1.1.1.dev10
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.1.dev7",
36
+ version: str = "1.1.1.dev10",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.1.1.dev7",
166
+ version: str = "1.1.1.dev10",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -26,6 +26,10 @@ class Error(Exception):
26
26
  """
27
27
 
28
28
 
29
+ class AlreadyExistsError(Error):
30
+ """Raised when a resource creation conflicts with an existing resource."""
31
+
32
+
29
33
  class RemoteError(Error):
30
34
  """Raised when an error occurs on the Modal server."""
31
35
 
@@ -20,7 +20,7 @@ from ..cls import _Cls, _Obj
20
20
  from ..exception import InvalidError
21
21
  from ..image import DockerfileSpec, ImageBuilderVersion, _Image, _ImageRegistryConfig
22
22
  from ..secret import _Secret
23
- from .flash import flash_forward, flash_prometheus_autoscaler # noqa: F401
23
+ from .flash import flash_forward, flash_get_containers, flash_prometheus_autoscaler # noqa: F401
24
24
 
25
25
 
26
26
  def stop_fetching_inputs():
@@ -447,3 +447,20 @@ async def flash_prometheus_autoscaler(
447
447
  )
448
448
  await autoscaler.start()
449
449
  return autoscaler
450
+
451
+
452
+ @synchronizer.create_blocking
453
+ async def flash_get_containers(app_name: str, cls_name: str) -> list[dict[str, Any]]:
454
+ """
455
+ Return a list of flash containers for a deployed Flash service.
456
+
457
+ This is a highly experimental method that can break or be removed at any time without warning.
458
+ Do not use this method unless explicitly instructed to do so by Modal support.
459
+ """
460
+ client = await _Client.from_env()
461
+ fn = _Cls.from_name(app_name, cls_name)._class_service_function
462
+ assert fn is not None
463
+ await fn.hydrate(client=client)
464
+ req = api_pb2.FlashContainerListRequest(function_id=fn.object_id)
465
+ resp = await retry_transient_errors(client.stub.FlashContainerList, req)
466
+ return resp.containers
@@ -250,3 +250,22 @@ class __flash_prometheus_autoscaler_spec(typing_extensions.Protocol):
250
250
  ...
251
251
 
252
252
  flash_prometheus_autoscaler: __flash_prometheus_autoscaler_spec
253
+
254
+ class __flash_get_containers_spec(typing_extensions.Protocol):
255
+ def __call__(self, /, app_name: str, cls_name: str) -> list[dict[str, typing.Any]]:
256
+ """Return a list of flash containers for a deployed Flash service.
257
+
258
+ This is a highly experimental method that can break or be removed at any time without warning.
259
+ Do not use this method unless explicitly instructed to do so by Modal support.
260
+ """
261
+ ...
262
+
263
+ async def aio(self, /, app_name: str, cls_name: str) -> list[dict[str, typing.Any]]:
264
+ """Return a list of flash containers for a deployed Flash service.
265
+
266
+ This is a highly experimental method that can break or be removed at any time without warning.
267
+ Do not use this method unless explicitly instructed to do so by Modal support.
268
+ """
269
+ ...
270
+
271
+ flash_get_containers: __flash_get_containers_spec
@@ -27,7 +27,7 @@ from ._utils.mount_utils import validate_network_file_systems, validate_volumes
27
27
  from .client import _Client
28
28
  from .config import config
29
29
  from .container_process import _ContainerProcess
30
- from .exception import ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
30
+ from .exception import AlreadyExistsError, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
31
31
  from .file_io import FileWatchEvent, FileWatchEventType, _FileIO
32
32
  from .gpu import GPU_T
33
33
  from .image import _Image
@@ -236,7 +236,12 @@ class _Sandbox(_Object, type_prefix="sb"):
236
236
  )
237
237
 
238
238
  create_req = api_pb2.SandboxCreateRequest(app_id=resolver.app_id, definition=definition)
239
- create_resp = await retry_transient_errors(resolver.client.stub.SandboxCreate, create_req)
239
+ try:
240
+ create_resp = await retry_transient_errors(resolver.client.stub.SandboxCreate, create_req)
241
+ except GRPCError as exc:
242
+ if exc.status == Status.ALREADY_EXISTS:
243
+ raise AlreadyExistsError(exc.message)
244
+ raise exc
240
245
 
241
246
  sandbox_id = create_resp.sandbox_id
242
247
  self._hydrate(sandbox_id, resolver.client, None)
@@ -475,8 +480,8 @@ class _Sandbox(_Object, type_prefix="sb"):
475
480
  ) -> "_Sandbox":
476
481
  """Get a running Sandbox by name from the given app.
477
482
 
478
- Raises an error if no running sandbox is found with the given name. A Sandbox's name
479
- is the `name` argument passed to `Sandbox.create`.
483
+ Raises a modal.exception.NotFoundError if no running sandbox is found with the given name.
484
+ A Sandbox's name is the `name` argument passed to `Sandbox.create`.
480
485
  """
481
486
  if client is None:
482
487
  client = await _Client.from_env()
@@ -786,10 +791,15 @@ class _Sandbox(_Object, type_prefix="sb"):
786
791
  sandbox_name_override=name,
787
792
  sandbox_name_override_type=api_pb2.SandboxRestoreRequest.SANDBOX_NAME_OVERRIDE_TYPE_STRING,
788
793
  )
794
+ try:
795
+ restore_resp: api_pb2.SandboxRestoreResponse = await retry_transient_errors(
796
+ client.stub.SandboxRestore, restore_req
797
+ )
798
+ except GRPCError as exc:
799
+ if exc.status == Status.ALREADY_EXISTS:
800
+ raise AlreadyExistsError(exc.message)
801
+ raise exc
789
802
 
790
- restore_resp: api_pb2.SandboxRestoreResponse = await retry_transient_errors(
791
- client.stub.SandboxRestore, restore_req
792
- )
793
803
  sandbox = await _Sandbox.from_id(restore_resp.sandbox_id, client)
794
804
 
795
805
  task_id_req = api_pb2.SandboxGetTaskIdRequest(
@@ -178,8 +178,8 @@ class _Sandbox(modal._object._Object):
178
178
  ) -> _Sandbox:
179
179
  """Get a running Sandbox by name from the given app.
180
180
 
181
- Raises an error if no running sandbox is found with the given name. A Sandbox's name
182
- is the `name` argument passed to `Sandbox.create`.
181
+ Raises a modal.exception.NotFoundError if no running sandbox is found with the given name.
182
+ A Sandbox's name is the `name` argument passed to `Sandbox.create`.
183
183
  """
184
184
  ...
185
185
 
@@ -588,8 +588,8 @@ class Sandbox(modal.object.Object):
588
588
  ) -> Sandbox:
589
589
  """Get a running Sandbox by name from the given app.
590
590
 
591
- Raises an error if no running sandbox is found with the given name. A Sandbox's name
592
- is the `name` argument passed to `Sandbox.create`.
591
+ Raises a modal.exception.NotFoundError if no running sandbox is found with the given name.
592
+ A Sandbox's name is the `name` argument passed to `Sandbox.create`.
593
593
  """
594
594
  ...
595
595
 
@@ -604,8 +604,8 @@ class Sandbox(modal.object.Object):
604
604
  ) -> Sandbox:
605
605
  """Get a running Sandbox by name from the given app.
606
606
 
607
- Raises an error if no running sandbox is found with the given name. A Sandbox's name
608
- is the `name` argument passed to `Sandbox.create`.
607
+ Raises a modal.exception.NotFoundError if no running sandbox is found with the given name.
608
+ A Sandbox's name is the `name` argument passed to `Sandbox.create`.
609
609
  """
610
610
  ...
611
611
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev7
3
+ Version: 1.1.1.dev10
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.1.dev7"
4
+ __version__ = "1.1.1.dev10"
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