modal 1.5.2.dev4__tar.gz → 1.5.2.dev5__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 (230) hide show
  1. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/PKG-INFO +1 -1
  2. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/blob_utils.py +7 -0
  3. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/client.pyi +2 -2
  4. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/sandbox.py +56 -0
  5. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/sandbox.pyi +55 -0
  6. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_version/__init__.py +1 -1
  8. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/LICENSE +0 -0
  9. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/README.md +0 -0
  10. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/__init__.py +0 -0
  11. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/__main__.py +0 -0
  12. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_billing.py +0 -0
  13. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_clustered_functions.py +0 -0
  14. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_environments.py +0 -0
  17. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_function_variants.py +0 -0
  18. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_functions.py +0 -0
  19. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_grpc_client.py +0 -0
  20. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_image.py +0 -0
  21. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_ipython.py +0 -0
  22. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_load_context.py +0 -0
  23. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_location.py +0 -0
  24. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_logs.py +0 -0
  25. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_object.py +0 -0
  26. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_output/__init__.py +0 -0
  27. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_output/manager.py +0 -0
  28. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_output/pty.py +0 -0
  29. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_output/rich.py +0 -0
  30. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_output/status.py +0 -0
  31. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_partial_function.py +0 -0
  32. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_resolver.py +0 -0
  33. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_resources.py +0 -0
  34. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/__init__.py +0 -0
  35. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/asgi.py +0 -0
  36. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/container_io_manager.py +0 -0
  37. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
  38. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/execution_context.py +0 -0
  39. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/execution_context.pyi +0 -0
  40. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  41. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
  42. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  43. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/telemetry.py +0 -0
  44. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
  45. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_runtime/user_code_imports.py +0 -0
  46. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_serialization.py +0 -0
  47. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_server.py +0 -0
  48. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_traceback.py +0 -0
  49. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_tunnel.py +0 -0
  50. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_tunnel.pyi +0 -0
  51. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_type_manager.py +0 -0
  52. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/__init__.py +0 -0
  53. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/app_utils.py +0 -0
  54. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/async_utils.py +0 -0
  55. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/auth_token_manager.py +0 -0
  56. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/browser_utils.py +0 -0
  57. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
  58. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/curl_utils.py +0 -0
  59. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/deprecation.py +0 -0
  60. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/docker_utils.py +0 -0
  61. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/function_utils.py +0 -0
  62. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/git_utils.py +0 -0
  63. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/grpc_testing.py +0 -0
  64. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/grpc_utils.py +0 -0
  65. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/hash_utils.py +0 -0
  66. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/http_utils.py +0 -0
  67. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/jwt_utils.py +0 -0
  68. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/logger.py +0 -0
  69. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/mount_utils.py +0 -0
  70. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/name_utils.py +0 -0
  71. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/package_utils.py +0 -0
  72. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/pattern_utils.py +0 -0
  73. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/proxy_support.py +0 -0
  74. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/rand_pb_testing.py +0 -0
  75. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
  76. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/shell_utils.py +0 -0
  77. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/task_command_router_client.py +0 -0
  78. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_utils/time_utils.py +0 -0
  79. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_vendor/__init__.py +0 -0
  80. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  81. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_vendor/cloudpickle.py +0 -0
  82. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_vendor/tblib.py +0 -0
  83. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_vendor/version.py +0 -0
  84. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_watcher.py +0 -0
  85. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/_workspace.py +0 -0
  86. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/app.py +0 -0
  87. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/app.pyi +0 -0
  88. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/billing.py +0 -0
  89. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/billing.pyi +0 -0
  90. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/2023.12.312.txt +0 -0
  91. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/2023.12.txt +0 -0
  92. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/2024.04.txt +0 -0
  93. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/2024.10.txt +0 -0
  94. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/2025.06.txt +0 -0
  95. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/PREVIEW.txt +0 -0
  96. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/README.md +0 -0
  97. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/builder/base-images.json +0 -0
  98. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/call_graph.py +0 -0
  99. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/__init__.py +0 -0
  100. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/_download.py +0 -0
  101. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/_help.py +0 -0
  102. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/_traceback.py +0 -0
  103. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/app.py +0 -0
  104. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/billing.py +0 -0
  105. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/bootstrap.py +0 -0
  106. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/changelog.py +0 -0
  107. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/cluster.py +0 -0
  108. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/config.py +0 -0
  109. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/container.py +0 -0
  110. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/curl.py +0 -0
  111. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/dashboard.py +0 -0
  112. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/dict.py +0 -0
  113. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/endpoint.py +0 -0
  114. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/entry_point.py +0 -0
  115. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/environment.py +0 -0
  116. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/image.py +0 -0
  117. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/import_refs.py +0 -0
  118. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/launch.py +0 -0
  119. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/logo.py +0 -0
  120. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/network_file_system.py +0 -0
  121. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/profile.py +0 -0
  122. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/programs/__init__.py +0 -0
  123. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/programs/run_jupyter.py +0 -0
  124. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/programs/vscode.py +0 -0
  125. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/queues.py +0 -0
  126. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/run.py +0 -0
  127. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/secret.py +0 -0
  128. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/selector.py +0 -0
  129. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/shell.py +0 -0
  130. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/skills.py +0 -0
  131. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/token.py +0 -0
  132. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/utils.py +0 -0
  133. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/volume.py +0 -0
  134. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cli/workspace.py +0 -0
  135. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/client.py +0 -0
  136. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cloud_bucket_mount.py +0 -0
  137. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cloud_bucket_mount.pyi +0 -0
  138. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cls.py +0 -0
  139. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/cls.pyi +0 -0
  140. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/config.py +0 -0
  141. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/container_process.py +0 -0
  142. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/container_process.pyi +0 -0
  143. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/dict.py +0 -0
  144. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/dict.pyi +0 -0
  145. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/environments.py +0 -0
  146. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/environments.pyi +0 -0
  147. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/exception.py +0 -0
  148. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/experimental/__init__.py +0 -0
  149. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/experimental/flash.py +0 -0
  150. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/experimental/flash.pyi +0 -0
  151. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/experimental/ipython.py +0 -0
  152. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/file_io.py +0 -0
  153. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/file_io.pyi +0 -0
  154. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/file_pattern_matcher.py +0 -0
  155. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/functions.py +0 -0
  156. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/functions.pyi +0 -0
  157. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/image.py +0 -0
  158. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/image.pyi +0 -0
  159. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/io_streams.py +0 -0
  160. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/io_streams.pyi +0 -0
  161. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/mount.py +0 -0
  162. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/mount.pyi +0 -0
  163. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/network_file_system.py +0 -0
  164. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/network_file_system.pyi +0 -0
  165. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/object.py +0 -0
  166. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/object.pyi +0 -0
  167. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/output.py +0 -0
  168. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/parallel_map.py +0 -0
  169. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/parallel_map.pyi +0 -0
  170. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/partial_function.py +0 -0
  171. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/partial_function.pyi +0 -0
  172. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/proxy.py +0 -0
  173. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/proxy.pyi +0 -0
  174. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/py.typed +0 -0
  175. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/queue.py +0 -0
  176. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/queue.pyi +0 -0
  177. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/retries.py +0 -0
  178. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/runner.py +0 -0
  179. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/runner.pyi +0 -0
  180. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/running_app.py +0 -0
  181. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/sandbox_fs.py +0 -0
  182. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/sandbox_fs.pyi +0 -0
  183. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/schedule.py +0 -0
  184. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/scheduler_placement.py +0 -0
  185. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/secret.py +0 -0
  186. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/secret.pyi +0 -0
  187. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/server.py +0 -0
  188. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/server.pyi +0 -0
  189. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/serving.py +0 -0
  190. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/serving.pyi +0 -0
  191. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/skills/modal/SKILL.md +0 -0
  192. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/snapshot.py +0 -0
  193. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/snapshot.pyi +0 -0
  194. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/stream_type.py +0 -0
  195. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/token_flow.py +0 -0
  196. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/token_flow.pyi +0 -0
  197. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/volume.py +0 -0
  198. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/volume.pyi +0 -0
  199. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/workspace.py +0 -0
  200. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal/workspace.pyi +0 -0
  201. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/SOURCES.txt +0 -0
  202. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/dependency_links.txt +0 -0
  203. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/entry_points.txt +0 -0
  204. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/requires.txt +0 -0
  205. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal.egg-info/top_level.txt +0 -0
  206. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/__init__.py +0 -0
  207. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/gen_cli_docs.py +0 -0
  208. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
  209. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/gen_reference_docs.py +0 -0
  210. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
  211. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/mdmd/__init__.py +0 -0
  212. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/mdmd/mdmd.py +0 -0
  213. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/mdmd/signatures.py +0 -0
  214. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_docs/mdmd/types.py +0 -0
  215. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/__init__.py +0 -0
  216. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/api_grpc.py +0 -0
  217. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/api_pb2.py +0 -0
  218. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/api_pb2.pyi +0 -0
  219. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/api_pb2_grpc.py +0 -0
  220. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/api_pb2_grpc.pyi +0 -0
  221. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/modal_api_grpc.py +0 -0
  222. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/py.typed +0 -0
  223. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/task_command_router_grpc.py +0 -0
  224. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2.py +0 -0
  225. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
  226. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  227. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  228. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/modal_version/__main__.py +0 -0
  229. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/pyproject.toml +0 -0
  230. {modal-1.5.2.dev4 → modal-1.5.2.dev5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev4
3
+ Version: 1.5.2.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -138,6 +138,13 @@ async def _upload_to_s3_url(
138
138
  text = await resp.text()
139
139
  except Exception:
140
140
  text = "<no body>"
141
+
142
+ if "The Content-MD5 you specified did not match what we received." in text:
143
+ raise ExecutionError(
144
+ "Hash mismatch during upload. This may be caused by files changing while an upload is in "
145
+ "progress. Please try again."
146
+ )
147
+
141
148
  raise ExecutionError(f"Put to url {upload_url} failed with status {resp.status}: {text}")
142
149
 
143
150
  # client side ETag checksum verification
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.5.2.dev4",
38
+ version: str = "1.5.2.dev5",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.5.2.dev4",
208
+ version: str = "1.5.2.dev5",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -2282,6 +2282,62 @@ class _Sandbox(_Object, type_prefix="sb"):
2282
2282
  # Fetch the next batch starting from the end of the current one.
2283
2283
  before_timestamp = resp.sandboxes[-1].created_at
2284
2284
 
2285
+ @staticmethod
2286
+ async def _experimental_list(
2287
+ *, app_id: str | None = None, client: _Client | None = None
2288
+ ) -> AsyncGenerator["_Sandbox", None]:
2289
+ """List v2 Sandboxes in an App.
2290
+
2291
+ This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
2292
+ Filtering based on tags is not yet supported.
2293
+
2294
+ Args:
2295
+ app_id: The App to list Sandboxes under.
2296
+ client: Optional client to use for the session.
2297
+
2298
+ Yields:
2299
+ `Sandbox` objects that are currently running in the App.
2300
+ """
2301
+ if not app_id:
2302
+ raise InvalidError(
2303
+ "Sandbox._experimental_list requires an `app_id`:\n\n"
2304
+ 'app = modal.App.lookup("my-app")\n'
2305
+ "Sandbox._experimental_list(app_id=app.app_id)"
2306
+ )
2307
+
2308
+ before_timestamp = None
2309
+ if client is None:
2310
+ client = await _Client.from_env()
2311
+
2312
+ assert client._auth_token_manager
2313
+ while True:
2314
+ req = api_pb2.SandboxListRequest(
2315
+ app_id=app_id,
2316
+ before_timestamp=before_timestamp,
2317
+ include_finished=False,
2318
+ )
2319
+
2320
+ # Fetches a batch of sandboxes. SandboxListV2 authenticates via the
2321
+ # auth-token metadata, like the other V2 sandbox RPCs.
2322
+ auth_token = await client._auth_token_manager.get_token()
2323
+ resp = await client.stub.SandboxListV2(req, metadata=[("x-modal-auth-token", auth_token)])
2324
+
2325
+ if not resp.sandboxes:
2326
+ return
2327
+
2328
+ for sandbox_info in resp.sandboxes:
2329
+ sandbox_info: api_pb2.SandboxInfo
2330
+ obj = _Sandbox._new_hydrated(sandbox_info.id, client, None)
2331
+ # SandboxListV2 only returns V2 sandboxes; mark them as such so
2332
+ # operations like wait/terminate/exec use the V2 RPCs and stdio.
2333
+ obj._is_v2 = True
2334
+ obj._hydrate_metadata_v2()
2335
+ obj._result = sandbox_info.task_info.result
2336
+ yield obj
2337
+
2338
+ # Fetch the next batch starting from the end of the current one.
2339
+ before_timestamp = resp.sandboxes[-1].created_at
2340
+
2285
2341
 
2286
2342
  class _SidecarContainer:
2287
2343
  """Handle to an additional container running in a Sandbox."""
@@ -942,6 +942,24 @@ class _Sandbox(modal._object._Object):
942
942
  """
943
943
  ...
944
944
 
945
+ @staticmethod
946
+ def _experimental_list(
947
+ *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client._Client] = None
948
+ ) -> collections.abc.AsyncGenerator[_Sandbox, None]:
949
+ """List v2 Sandboxes in an App.
950
+
951
+ This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
952
+ Filtering based on tags is not yet supported.
953
+
954
+ Args:
955
+ app_id: The App to list Sandboxes under.
956
+ client: Optional client to use for the session.
957
+
958
+ Yields:
959
+ `Sandbox` objects that are currently running in the App.
960
+ """
961
+ ...
962
+
945
963
  class _SidecarContainer:
946
964
  """Handle to an additional container running in a Sandbox."""
947
965
 
@@ -2790,6 +2808,43 @@ class Sandbox(modal.object.Object):
2790
2808
 
2791
2809
  list: typing.ClassVar[__list_spec]
2792
2810
 
2811
+ class ___experimental_list_spec(typing_extensions.Protocol):
2812
+ def __call__(
2813
+ self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
2814
+ ) -> typing.Generator[Sandbox, None, None]:
2815
+ """List v2 Sandboxes in an App.
2816
+
2817
+ This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
2818
+ Filtering based on tags is not yet supported.
2819
+
2820
+ Args:
2821
+ app_id: The App to list Sandboxes under.
2822
+ client: Optional client to use for the session.
2823
+
2824
+ Yields:
2825
+ `Sandbox` objects that are currently running in the App.
2826
+ """
2827
+ ...
2828
+
2829
+ def aio(
2830
+ self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
2831
+ ) -> collections.abc.AsyncGenerator[Sandbox, None]:
2832
+ """List v2 Sandboxes in an App.
2833
+
2834
+ This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
2835
+ Filtering based on tags is not yet supported.
2836
+
2837
+ Args:
2838
+ app_id: The App to list Sandboxes under.
2839
+ client: Optional client to use for the session.
2840
+
2841
+ Yields:
2842
+ `Sandbox` objects that are currently running in the App.
2843
+ """
2844
+ ...
2845
+
2846
+ _experimental_list: typing.ClassVar[___experimental_list_spec]
2847
+
2793
2848
  _default_image: modal._image._Image
2794
2849
 
2795
2850
  _MAIN_CONTAINER_NAME: str
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev4
3
+ Version: 1.5.2.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2026
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.5.2.dev4"
4
+ __version__ = "1.5.2.dev5"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes