modAL 1.5.3.dev10__tar.gz → 1.5.3.dev11__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 (232) hide show
  1. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/PKG-INFO +1 -1
  2. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/client.pyi +2 -2
  3. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/exception.py +4 -0
  4. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/functions.pyi +6 -6
  5. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/sandbox.py +67 -0
  6. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/sandbox.pyi +78 -0
  7. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/api_grpc.py +16 -0
  9. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/api_pb2.py +499 -441
  10. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/api_pb2.pyi +88 -0
  11. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/api_pb2_grpc.py +33 -0
  12. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/api_pb2_grpc.pyi +10 -0
  13. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/modal_api_grpc.py +1 -0
  14. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_version/__init__.py +1 -1
  15. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/pyproject.toml +0 -1
  16. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/LICENSE +0 -0
  17. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/README.md +0 -0
  18. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/__init__.py +0 -0
  19. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/__main__.py +0 -0
  20. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_billing.py +0 -0
  21. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_clustered_functions.py +0 -0
  22. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_clustered_functions.pyi +0 -0
  23. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_container_entrypoint.py +0 -0
  24. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_environments.py +0 -0
  25. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_function_variants.py +0 -0
  26. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_functions.py +0 -0
  27. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_grpc_client.py +0 -0
  28. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_image.py +0 -0
  29. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_ipython.py +0 -0
  30. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_load_context.py +0 -0
  31. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_location.py +0 -0
  32. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_logs.py +0 -0
  33. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_object.py +0 -0
  34. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_output/__init__.py +0 -0
  35. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_output/manager.py +0 -0
  36. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_output/pty.py +0 -0
  37. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_output/rich.py +0 -0
  38. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_output/status.py +0 -0
  39. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_partial_function.py +0 -0
  40. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_resolver.py +0 -0
  41. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_resources.py +0 -0
  42. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/__init__.py +0 -0
  43. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/asgi.py +0 -0
  44. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/container_io_manager.py +0 -0
  45. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
  46. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/execution_context.py +0 -0
  47. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/execution_context.pyi +0 -0
  48. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  49. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/task_lifecycle_manager.py +0 -0
  50. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  51. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/telemetry.py +0 -0
  52. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
  53. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_runtime/user_code_imports.py +0 -0
  54. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_serialization.py +0 -0
  55. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_server.py +0 -0
  56. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_traceback.py +0 -0
  57. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_tunnel.py +0 -0
  58. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_tunnel.pyi +0 -0
  59. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_type_manager.py +0 -0
  60. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/__init__.py +0 -0
  61. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/app_utils.py +0 -0
  62. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/async_utils.py +0 -0
  63. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/auth_token_manager.py +0 -0
  64. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/blob_utils.py +0 -0
  65. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/browser_utils.py +0 -0
  66. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
  67. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/curl_utils.py +0 -0
  68. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/deprecation.py +0 -0
  69. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/docker_utils.py +0 -0
  70. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/function_utils.py +0 -0
  71. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/git_utils.py +0 -0
  72. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/grpc_testing.py +0 -0
  73. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/grpc_utils.py +0 -0
  74. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/hash_utils.py +0 -0
  75. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/http_utils.py +0 -0
  76. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/jwt_utils.py +0 -0
  77. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/logger.py +0 -0
  78. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/mount_utils.py +0 -0
  79. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/name_utils.py +0 -0
  80. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/package_utils.py +0 -0
  81. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/pattern_utils.py +0 -0
  82. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/proxy_support.py +0 -0
  83. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/rand_pb_testing.py +0 -0
  84. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/sandbox_fs_utils.py +0 -0
  85. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/shell_utils.py +0 -0
  86. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/task_command_router_client.py +0 -0
  87. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_utils/time_utils.py +0 -0
  88. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_vendor/__init__.py +0 -0
  89. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  90. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_vendor/cloudpickle.py +0 -0
  91. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_vendor/tblib.py +0 -0
  92. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_vendor/version.py +0 -0
  93. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_watcher.py +0 -0
  94. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/_workspace.py +0 -0
  95. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/app.py +0 -0
  96. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/app.pyi +0 -0
  97. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/billing.py +0 -0
  98. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/billing.pyi +0 -0
  99. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/2023.12.312.txt +0 -0
  100. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/2023.12.txt +0 -0
  101. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/2024.04.txt +0 -0
  102. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/2024.10.txt +0 -0
  103. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/2025.06.txt +0 -0
  104. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/PREVIEW.txt +0 -0
  105. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/README.md +0 -0
  106. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/builder/base-images.json +0 -0
  107. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/call_graph.py +0 -0
  108. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/__init__.py +0 -0
  109. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/_download.py +0 -0
  110. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/_help.py +0 -0
  111. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/_traceback.py +0 -0
  112. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/app.py +0 -0
  113. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/billing.py +0 -0
  114. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/bootstrap.py +0 -0
  115. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/changelog.py +0 -0
  116. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/cluster.py +0 -0
  117. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/config.py +0 -0
  118. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/container.py +0 -0
  119. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/curl.py +0 -0
  120. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/dashboard.py +0 -0
  121. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/dict.py +0 -0
  122. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/endpoint.py +0 -0
  123. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/entry_point.py +0 -0
  124. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/environment.py +0 -0
  125. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/image.py +0 -0
  126. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/import_refs.py +0 -0
  127. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/launch.py +0 -0
  128. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/logo.py +0 -0
  129. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/network_file_system.py +0 -0
  130. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/profile.py +0 -0
  131. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/programs/__init__.py +0 -0
  132. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/programs/run_jupyter.py +0 -0
  133. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/programs/vscode.py +0 -0
  134. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/queues.py +0 -0
  135. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/run.py +0 -0
  136. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/secret.py +0 -0
  137. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/selector.py +0 -0
  138. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/shell.py +0 -0
  139. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/skills.py +0 -0
  140. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/token.py +0 -0
  141. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/utils.py +0 -0
  142. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/volume.py +0 -0
  143. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cli/workspace.py +0 -0
  144. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/client.py +0 -0
  145. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cloud_bucket_mount.py +0 -0
  146. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cloud_bucket_mount.pyi +0 -0
  147. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cls.py +0 -0
  148. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/cls.pyi +0 -0
  149. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/config.py +0 -0
  150. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/container_process.py +0 -0
  151. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/container_process.pyi +0 -0
  152. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/dict.py +0 -0
  153. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/dict.pyi +0 -0
  154. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/environments.py +0 -0
  155. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/environments.pyi +0 -0
  156. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/experimental/__init__.py +0 -0
  157. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/experimental/flash.py +0 -0
  158. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/experimental/flash.pyi +0 -0
  159. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/experimental/ipython.py +0 -0
  160. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/file_io.py +0 -0
  161. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/file_io.pyi +0 -0
  162. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/file_pattern_matcher.py +0 -0
  163. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/functions.py +0 -0
  164. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/image.py +0 -0
  165. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/image.pyi +0 -0
  166. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/io_streams.py +0 -0
  167. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/io_streams.pyi +0 -0
  168. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/mount.py +0 -0
  169. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/mount.pyi +0 -0
  170. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/network_file_system.py +0 -0
  171. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/network_file_system.pyi +0 -0
  172. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/object.py +0 -0
  173. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/object.pyi +0 -0
  174. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/output.py +0 -0
  175. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/parallel_map.py +0 -0
  176. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/parallel_map.pyi +0 -0
  177. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/partial_function.py +0 -0
  178. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/partial_function.pyi +0 -0
  179. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/proxy.py +0 -0
  180. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/proxy.pyi +0 -0
  181. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/py.typed +0 -0
  182. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/queue.py +0 -0
  183. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/queue.pyi +0 -0
  184. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/retries.py +0 -0
  185. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/runner.py +0 -0
  186. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/runner.pyi +0 -0
  187. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/running_app.py +0 -0
  188. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/sandbox_fs.py +0 -0
  189. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/sandbox_fs.pyi +0 -0
  190. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/schedule.py +0 -0
  191. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/scheduler_placement.py +0 -0
  192. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/secret.py +0 -0
  193. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/secret.pyi +0 -0
  194. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/server.py +0 -0
  195. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/server.pyi +0 -0
  196. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/serving.py +0 -0
  197. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/serving.pyi +0 -0
  198. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/skills/modal/SKILL.md +0 -0
  199. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/snapshot.py +0 -0
  200. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/snapshot.pyi +0 -0
  201. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/stream_type.py +0 -0
  202. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/token_flow.py +0 -0
  203. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/token_flow.pyi +0 -0
  204. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/types.py +0 -0
  205. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/volume.py +0 -0
  206. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/volume.pyi +0 -0
  207. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/workspace.py +0 -0
  208. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal/workspace.pyi +0 -0
  209. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/SOURCES.txt +0 -0
  210. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/dependency_links.txt +0 -0
  211. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/entry_points.txt +0 -0
  212. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/requires.txt +0 -0
  213. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal.egg-info/top_level.txt +0 -0
  214. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/__init__.py +0 -0
  215. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/gen_cli_docs.py +0 -0
  216. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/gen_cli_docs_main.py +0 -0
  217. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/gen_reference_docs.py +0 -0
  218. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/gen_reference_docs_main.py +0 -0
  219. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/mdmd/__init__.py +0 -0
  220. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/mdmd/mdmd.py +0 -0
  221. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/mdmd/signatures.py +0 -0
  222. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/mdmd/types.py +0 -0
  223. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_docs/reference_intro.md +0 -0
  224. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/__init__.py +0 -0
  225. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/py.typed +0 -0
  226. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/task_command_router_grpc.py +0 -0
  227. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/task_command_router_pb2.py +0 -0
  228. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
  229. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  230. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  231. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/modal_version/__main__.py +0 -0
  232. {modal-1.5.3.dev10 → modal-1.5.3.dev11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev10
3
+ Version: 1.5.3.dev11
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -37,7 +37,7 @@ class _Client:
37
37
  server_url: str,
38
38
  client_type: int,
39
39
  credentials: typing.Optional[tuple[str, str]],
40
- version: str = "1.5.3.dev10",
40
+ version: str = "1.5.3.dev11",
41
41
  ):
42
42
  """mdmd:hidden
43
43
  The Modal client object is not intended to be instantiated directly by users.
@@ -207,7 +207,7 @@ class Client:
207
207
  server_url: str,
208
208
  client_type: int,
209
209
  credentials: typing.Optional[tuple[str, str]],
210
- version: str = "1.5.3.dev10",
210
+ version: str = "1.5.3.dev11",
211
211
  ):
212
212
  """mdmd:hidden
213
213
  The Modal client object is not intended to be instantiated directly by users.
@@ -188,6 +188,10 @@ class SandboxTimeoutError(TimeoutError):
188
188
  """Raised when a Sandbox exceeds its execution duration limit and times out."""
189
189
 
190
190
 
191
+ class SnapshotCreationError(Error):
192
+ """Raised when a Sandbox fails to create an exit snapshot."""
193
+
194
+
191
195
  class ExecTimeoutError(TimeoutError):
192
196
  """Raised when a container process exceeds its execution duration limit and times out."""
193
197
 
@@ -493,7 +493,7 @@ class Function(
493
493
 
494
494
  _call_generator: ___call_generator_spec
495
495
 
496
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
496
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
497
497
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
498
498
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
499
499
 
@@ -518,7 +518,7 @@ class Function(
518
518
  """
519
519
  ...
520
520
 
521
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
521
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
522
522
 
523
523
  class __remote_gen_spec(typing_extensions.Protocol):
524
524
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -568,7 +568,7 @@ class Function(
568
568
  """
569
569
  ...
570
570
 
571
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
571
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
572
572
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
573
573
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
574
574
 
@@ -601,7 +601,7 @@ class Function(
601
601
  """
602
602
  ...
603
603
 
604
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
604
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
605
605
 
606
606
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
607
607
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -609,7 +609,7 @@ class Function(
609
609
 
610
610
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
611
611
 
612
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
612
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
613
613
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
614
614
  """Calls the function with the given arguments, without waiting for the results.
615
615
 
@@ -642,7 +642,7 @@ class Function(
642
642
  """
643
643
  ...
644
644
 
645
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
645
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
646
646
 
647
647
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
648
648
  """Return the inner Python object wrapped by this Modal Function.
@@ -52,10 +52,13 @@ from .exception import (
52
52
  ClientClosed,
53
53
  ConflictError,
54
54
  ExecutionError,
55
+ InternalError,
55
56
  InvalidError,
56
57
  NotFoundError,
57
58
  SandboxTerminatedError,
58
59
  SandboxTimeoutError,
60
+ SnapshotCreationError,
61
+ TimeoutError,
59
62
  )
60
63
  from .file_io import _FileIO, ls, mkdir, rm, watch
61
64
  from .io_streams import (
@@ -77,6 +80,8 @@ from .stream_type import StreamType
77
80
  from .types import FileWatchEvent, FileWatchEventType, SandboxConnectCredentials
78
81
 
79
82
  _default_image: _Image = _Image.debian_slim()
83
+ _EXIT_SNAPSHOT_POLL_INTERVAL_SECONDS = 1.0
84
+ _EXIT_SNAPSHOT_NOT_FOUND_ERROR_CODES = frozenset((api_pb2.SandboxGetExitSnapshotResponse.ERROR_CODE_TIMEOUT,))
80
85
 
81
86
 
82
87
  async def _gather_load_with_timings(
@@ -1410,6 +1415,68 @@ class _Sandbox(_Object, type_prefix="sb"):
1410
1415
  req = sr_pb2.TaskSetNetworkAccessRequest(task_id=task_id, network_access=network_access)
1411
1416
  await command_router_client.set_network_access(req)
1412
1417
 
1418
+ async def _experimental_get_exit_snapshot(self, timeout: float | None = 60) -> _Image:
1419
+ """Get the exit filesystem snapshot image.
1420
+
1421
+ Args:
1422
+ timeout: Client-side deadline in seconds (default 60). Use `None` to
1423
+ poll until the snapshot reaches a terminal state. Use `0` to
1424
+ perform an immediate check.
1425
+
1426
+ Returns:
1427
+ The exit snapshot Image.
1428
+
1429
+ Raises:
1430
+ InvalidError: If `timeout` is negative, or if exit snapshot is not
1431
+ enabled for the sandbox.
1432
+ TimeoutError: If `timeout` elapses before the snapshot reaches a
1433
+ terminal state. This includes `timeout=0` when the snapshot is
1434
+ still pending.
1435
+ SnapshotCreationError: If no exit snapshot image will be produced.
1436
+ NotFoundError: If the sandbox does not exist.
1437
+ PermissionDeniedError: If the caller cannot access the sandbox.
1438
+ InternalError: If persisted snapshot state is malformed.
1439
+ ServiceError: If a transient client/server communication failure occurs.
1440
+ """
1441
+ if timeout is not None and timeout < 0:
1442
+ raise InvalidError("timeout must be non-negative or None")
1443
+
1444
+ deadline = None if timeout is None else time.monotonic() + timeout
1445
+ timeout_message = f"timed out waiting for exit snapshot for Sandbox {self.object_id}"
1446
+
1447
+ while True:
1448
+ resp: api_pb2.SandboxGetExitSnapshotResponse = await self._client.stub.SandboxGetExitSnapshot(
1449
+ api_pb2.SandboxGetExitSnapshotRequest(sandbox_id=self.object_id)
1450
+ )
1451
+ outcome = resp.WhichOneof("outcome")
1452
+
1453
+ if outcome == "success":
1454
+ if not resp.success.image_id:
1455
+ raise InternalError("Exit snapshot result is missing image ID")
1456
+ return _Image._new_hydrated(resp.success.image_id, self._client, None)
1457
+
1458
+ if outcome == "error":
1459
+ if resp.error.error_code in _EXIT_SNAPSHOT_NOT_FOUND_ERROR_CODES:
1460
+ message = resp.error.message or "No exit snapshot image will be produced"
1461
+ raise SnapshotCreationError(message)
1462
+ message = resp.error.message or "Exit snapshot state is malformed"
1463
+ raise InternalError(message)
1464
+
1465
+ if outcome != "pending":
1466
+ raise InternalError("Exit snapshot response is missing an outcome")
1467
+
1468
+ sleep_for = _EXIT_SNAPSHOT_POLL_INTERVAL_SECONDS
1469
+ if deadline is not None:
1470
+ remaining = deadline - time.monotonic()
1471
+ if remaining <= 0:
1472
+ raise TimeoutError(timeout_message)
1473
+ sleep_for = min(sleep_for, remaining)
1474
+
1475
+ await asyncio.sleep(sleep_for)
1476
+
1477
+ if deadline is not None and time.monotonic() >= deadline:
1478
+ raise TimeoutError(timeout_message)
1479
+
1413
1480
  async def snapshot_filesystem(
1414
1481
  self,
1415
1482
  timeout: int = 55,
@@ -573,6 +573,31 @@ class _Sandbox(modal._object._Object):
573
573
  """
574
574
  ...
575
575
 
576
+ async def _experimental_get_exit_snapshot(self, timeout: typing.Optional[float] = 60) -> modal._image._Image:
577
+ """Get the exit filesystem snapshot image.
578
+
579
+ Args:
580
+ timeout: Client-side deadline in seconds (default 60). Use `None` to
581
+ poll until the snapshot reaches a terminal state. Use `0` to
582
+ perform an immediate check.
583
+
584
+ Returns:
585
+ The exit snapshot Image.
586
+
587
+ Raises:
588
+ InvalidError: If `timeout` is negative, or if exit snapshot is not
589
+ enabled for the sandbox.
590
+ TimeoutError: If `timeout` elapses before the snapshot reaches a
591
+ terminal state. This includes `timeout=0` when the snapshot is
592
+ still pending.
593
+ SnapshotCreationError: If no exit snapshot image will be produced.
594
+ NotFoundError: If the sandbox does not exist.
595
+ PermissionDeniedError: If the caller cannot access the sandbox.
596
+ InternalError: If persisted snapshot state is malformed.
597
+ ServiceError: If a transient client/server communication failure occurs.
598
+ """
599
+ ...
600
+
576
601
  async def snapshot_filesystem(
577
602
  self, timeout: int = 55, *, ttl: typing.Optional[int] = 2592000
578
603
  ) -> modal._image._Image:
@@ -2198,6 +2223,59 @@ class Sandbox(modal.object.Object):
2198
2223
 
2199
2224
  _experimental_set_outbound_network_policy: ___experimental_set_outbound_network_policy_spec
2200
2225
 
2226
+ class ___experimental_get_exit_snapshot_spec(typing_extensions.Protocol):
2227
+ def __call__(self, /, timeout: typing.Optional[float] = 60) -> modal.image.Image:
2228
+ """Get the exit filesystem snapshot image.
2229
+
2230
+ Args:
2231
+ timeout: Client-side deadline in seconds (default 60). Use `None` to
2232
+ poll until the snapshot reaches a terminal state. Use `0` to
2233
+ perform an immediate check.
2234
+
2235
+ Returns:
2236
+ The exit snapshot Image.
2237
+
2238
+ Raises:
2239
+ InvalidError: If `timeout` is negative, or if exit snapshot is not
2240
+ enabled for the sandbox.
2241
+ TimeoutError: If `timeout` elapses before the snapshot reaches a
2242
+ terminal state. This includes `timeout=0` when the snapshot is
2243
+ still pending.
2244
+ SnapshotCreationError: If no exit snapshot image will be produced.
2245
+ NotFoundError: If the sandbox does not exist.
2246
+ PermissionDeniedError: If the caller cannot access the sandbox.
2247
+ InternalError: If persisted snapshot state is malformed.
2248
+ ServiceError: If a transient client/server communication failure occurs.
2249
+ """
2250
+ ...
2251
+
2252
+ async def aio(self, /, timeout: typing.Optional[float] = 60) -> modal.image.Image:
2253
+ """Get the exit filesystem snapshot image.
2254
+
2255
+ Args:
2256
+ timeout: Client-side deadline in seconds (default 60). Use `None` to
2257
+ poll until the snapshot reaches a terminal state. Use `0` to
2258
+ perform an immediate check.
2259
+
2260
+ Returns:
2261
+ The exit snapshot Image.
2262
+
2263
+ Raises:
2264
+ InvalidError: If `timeout` is negative, or if exit snapshot is not
2265
+ enabled for the sandbox.
2266
+ TimeoutError: If `timeout` elapses before the snapshot reaches a
2267
+ terminal state. This includes `timeout=0` when the snapshot is
2268
+ still pending.
2269
+ SnapshotCreationError: If no exit snapshot image will be produced.
2270
+ NotFoundError: If the sandbox does not exist.
2271
+ PermissionDeniedError: If the caller cannot access the sandbox.
2272
+ InternalError: If persisted snapshot state is malformed.
2273
+ ServiceError: If a transient client/server communication failure occurs.
2274
+ """
2275
+ ...
2276
+
2277
+ _experimental_get_exit_snapshot: ___experimental_get_exit_snapshot_spec
2278
+
2201
2279
  class __snapshot_filesystem_spec(typing_extensions.Protocol):
2202
2280
  def __call__(self, /, timeout: int = 55, *, ttl: typing.Optional[int] = 2592000) -> modal.image.Image:
2203
2281
  """Snapshot the filesystem of the Sandbox.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev10
3
+ Version: 1.5.3.dev11
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -595,6 +595,10 @@ class ModalClientBase(abc.ABC):
595
595
  async def SandboxGetCommandRouterAccess(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest, modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse]') -> None:
596
596
  pass
597
597
 
598
+ @abc.abstractmethod
599
+ async def SandboxGetExitSnapshot(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetExitSnapshotRequest, modal_proto.api_pb2.SandboxGetExitSnapshotResponse]') -> None:
600
+ pass
601
+
598
602
  @abc.abstractmethod
599
603
  async def SandboxGetFromName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetFromNameRequest, modal_proto.api_pb2.SandboxGetFromNameResponse]') -> None:
600
604
  pass
@@ -1813,6 +1817,12 @@ class ModalClientBase(abc.ABC):
1813
1817
  modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
1814
1818
  modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
1815
1819
  ),
1820
+ '/modal.client.ModalClient/SandboxGetExitSnapshot': grpclib.const.Handler(
1821
+ self.SandboxGetExitSnapshot,
1822
+ grpclib.const.Cardinality.UNARY_UNARY,
1823
+ modal_proto.api_pb2.SandboxGetExitSnapshotRequest,
1824
+ modal_proto.api_pb2.SandboxGetExitSnapshotResponse,
1825
+ ),
1816
1826
  '/modal.client.ModalClient/SandboxGetFromName': grpclib.const.Handler(
1817
1827
  self.SandboxGetFromName,
1818
1828
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -3211,6 +3221,12 @@ class ModalClientStub:
3211
3221
  modal_proto.api_pb2.SandboxGetCommandRouterAccessRequest,
3212
3222
  modal_proto.api_pb2.SandboxGetCommandRouterAccessResponse,
3213
3223
  )
3224
+ self.SandboxGetExitSnapshot = grpclib.client.UnaryUnaryMethod(
3225
+ channel,
3226
+ '/modal.client.ModalClient/SandboxGetExitSnapshot',
3227
+ modal_proto.api_pb2.SandboxGetExitSnapshotRequest,
3228
+ modal_proto.api_pb2.SandboxGetExitSnapshotResponse,
3229
+ )
3214
3230
  self.SandboxGetFromName = grpclib.client.UnaryUnaryMethod(
3215
3231
  channel,
3216
3232
  '/modal.client.ModalClient/SandboxGetFromName',