modal 1.5.6.dev2__tar.gz → 1.5.6.dev3__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 (236) hide show
  1. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/PKG-INFO +1 -1
  2. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/gpu_memory_snapshot.py +3 -34
  3. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/task_lifecycle_manager.py +28 -16
  4. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/task_lifecycle_manager.pyi +5 -0
  5. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/client.pyi +2 -2
  6. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/config.py +2 -0
  7. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/functions.pyi +6 -6
  8. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_version/__init__.py +1 -1
  10. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/pyproject.toml +4 -8
  11. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/LICENSE +0 -0
  12. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/README.md +0 -0
  13. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/__init__.py +0 -0
  14. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/__main__.py +0 -0
  15. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_billing.py +0 -0
  16. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_clustered_functions.py +0 -0
  17. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_clustered_functions.pyi +0 -0
  18. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_container_entrypoint.py +0 -0
  19. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_environments.py +0 -0
  20. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_function_variants.py +0 -0
  21. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_functions.py +0 -0
  22. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_grpc_client.py +0 -0
  23. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_image.py +0 -0
  24. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_ipython.py +0 -0
  25. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_load_context.py +0 -0
  26. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_location.py +0 -0
  27. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_logs.py +0 -0
  28. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_logs_manager.py +0 -0
  29. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_logs_manager.pyi +0 -0
  30. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_object.py +0 -0
  31. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_output/__init__.py +0 -0
  32. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_output/manager.py +0 -0
  33. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_output/pty.py +0 -0
  34. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_output/rich.py +0 -0
  35. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_output/status.py +0 -0
  36. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_partial_function.py +0 -0
  37. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_resolver.py +0 -0
  38. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_resources.py +0 -0
  39. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/__init__.py +0 -0
  40. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/asgi.py +0 -0
  41. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/container_io_manager.py +0 -0
  42. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
  43. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/execution_context.py +0 -0
  44. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/execution_context.pyi +0 -0
  45. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/telemetry.py +0 -0
  46. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
  47. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_runtime/user_code_imports.py +0 -0
  48. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_serialization.py +0 -0
  49. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_server.py +0 -0
  50. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_supports_logs.py +0 -0
  51. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_traceback.py +0 -0
  52. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_tunnel.py +0 -0
  53. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_tunnel.pyi +0 -0
  54. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_type_manager.py +0 -0
  55. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/__init__.py +0 -0
  56. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/app_utils.py +0 -0
  57. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/async_utils.py +0 -0
  58. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/auth_token_manager.py +0 -0
  59. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/blob_utils.py +0 -0
  60. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/browser_utils.py +0 -0
  61. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
  62. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/curl_utils.py +0 -0
  63. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/deprecation.py +0 -0
  64. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/display_utils.py +0 -0
  65. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/docker_utils.py +0 -0
  66. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/function_utils.py +0 -0
  67. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/git_utils.py +0 -0
  68. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/grpc_testing.py +0 -0
  69. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/grpc_utils.py +0 -0
  70. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/hash_utils.py +0 -0
  71. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/http_utils.py +0 -0
  72. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/jwt_utils.py +0 -0
  73. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/logger.py +0 -0
  74. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/mount_utils.py +0 -0
  75. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/name_utils.py +0 -0
  76. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/package_utils.py +0 -0
  77. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/pattern_utils.py +0 -0
  78. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/proxy_support.py +0 -0
  79. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/rand_pb_testing.py +0 -0
  80. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/sandbox_fs_utils.py +0 -0
  81. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/shell_utils.py +0 -0
  82. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/task_command_router_client.py +0 -0
  83. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_utils/time_utils.py +0 -0
  84. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_vendor/__init__.py +0 -0
  85. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  86. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_vendor/cloudpickle.py +0 -0
  87. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_vendor/tblib.py +0 -0
  88. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_vendor/version.py +0 -0
  89. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_watcher.py +0 -0
  90. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/_workspace.py +0 -0
  91. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/app.py +0 -0
  92. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/app.pyi +0 -0
  93. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/billing.py +0 -0
  94. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/billing.pyi +0 -0
  95. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/2023.12.312.txt +0 -0
  96. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/2023.12.txt +0 -0
  97. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/2024.04.txt +0 -0
  98. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/2024.10.txt +0 -0
  99. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/2025.06.txt +0 -0
  100. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/PREVIEW.txt +0 -0
  101. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/README.md +0 -0
  102. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/builder/base-images.json +0 -0
  103. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/call_graph.py +0 -0
  104. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/__init__.py +0 -0
  105. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/_download.py +0 -0
  106. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/_help.py +0 -0
  107. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/_traceback.py +0 -0
  108. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/app.py +0 -0
  109. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/billing.py +0 -0
  110. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/bootstrap.py +0 -0
  111. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/changelog.py +0 -0
  112. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/cluster.py +0 -0
  113. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/config.py +0 -0
  114. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/container.py +0 -0
  115. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/curl.py +0 -0
  116. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/dashboard.py +0 -0
  117. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/dict.py +0 -0
  118. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/endpoint.py +0 -0
  119. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/entry_point.py +0 -0
  120. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/environment.py +0 -0
  121. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/image.py +0 -0
  122. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/import_refs.py +0 -0
  123. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/launch.py +0 -0
  124. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/logo.py +0 -0
  125. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/network_file_system.py +0 -0
  126. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/profile.py +0 -0
  127. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/programs/__init__.py +0 -0
  128. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/programs/run_jupyter.py +0 -0
  129. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/programs/vscode.py +0 -0
  130. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/queues.py +0 -0
  131. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/run.py +0 -0
  132. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/secret.py +0 -0
  133. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/selector.py +0 -0
  134. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/shell.py +0 -0
  135. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/skills.py +0 -0
  136. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/token.py +0 -0
  137. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/utils.py +0 -0
  138. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/volume.py +0 -0
  139. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cli/workspace.py +0 -0
  140. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/client.py +0 -0
  141. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cloud_bucket_mount.py +0 -0
  142. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cloud_bucket_mount.pyi +0 -0
  143. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cls.py +0 -0
  144. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/cls.pyi +0 -0
  145. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/container_process.py +0 -0
  146. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/container_process.pyi +0 -0
  147. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/dict.py +0 -0
  148. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/dict.pyi +0 -0
  149. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/environments.py +0 -0
  150. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/environments.pyi +0 -0
  151. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/exception.py +0 -0
  152. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/experimental/__init__.py +0 -0
  153. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/experimental/flash.py +0 -0
  154. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/experimental/flash.pyi +0 -0
  155. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/experimental/ipython.py +0 -0
  156. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/file_io.py +0 -0
  157. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/file_io.pyi +0 -0
  158. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/file_pattern_matcher.py +0 -0
  159. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/functions.py +0 -0
  160. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/image.py +0 -0
  161. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/image.pyi +0 -0
  162. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/io_streams.py +0 -0
  163. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/io_streams.pyi +0 -0
  164. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/mount.py +0 -0
  165. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/mount.pyi +0 -0
  166. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/network_file_system.py +0 -0
  167. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/network_file_system.pyi +0 -0
  168. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/object.py +0 -0
  169. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/object.pyi +0 -0
  170. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/output.py +0 -0
  171. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/parallel_map.py +0 -0
  172. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/parallel_map.pyi +0 -0
  173. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/partial_function.py +0 -0
  174. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/partial_function.pyi +0 -0
  175. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/proxy.py +0 -0
  176. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/proxy.pyi +0 -0
  177. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/py.typed +0 -0
  178. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/queue.py +0 -0
  179. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/queue.pyi +0 -0
  180. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/retries.py +0 -0
  181. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/runner.py +0 -0
  182. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/runner.pyi +0 -0
  183. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/running_app.py +0 -0
  184. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/sandbox.py +0 -0
  185. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/sandbox.pyi +0 -0
  186. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/sandbox_fs.py +0 -0
  187. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/sandbox_fs.pyi +0 -0
  188. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/schedule.py +0 -0
  189. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/scheduler_placement.py +0 -0
  190. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/secret.py +0 -0
  191. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/secret.pyi +0 -0
  192. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/server.py +0 -0
  193. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/server.pyi +0 -0
  194. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/serving.py +0 -0
  195. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/serving.pyi +0 -0
  196. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/skills/modal/SKILL.md +0 -0
  197. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/snapshot.py +0 -0
  198. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/snapshot.pyi +0 -0
  199. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/stream_type.py +0 -0
  200. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/token_flow.py +0 -0
  201. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/token_flow.pyi +0 -0
  202. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/types.py +0 -0
  203. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/volume.py +0 -0
  204. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/volume.pyi +0 -0
  205. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/workspace.py +0 -0
  206. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal/workspace.pyi +0 -0
  207. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/SOURCES.txt +0 -0
  208. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/dependency_links.txt +0 -0
  209. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/entry_points.txt +0 -0
  210. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/requires.txt +0 -0
  211. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal.egg-info/top_level.txt +0 -0
  212. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/__init__.py +0 -0
  213. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/gen_cli_docs.py +0 -0
  214. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/gen_cli_docs_main.py +0 -0
  215. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/gen_reference_docs.py +0 -0
  216. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/gen_reference_docs_main.py +0 -0
  217. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/mdmd/__init__.py +0 -0
  218. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/mdmd/mdmd.py +0 -0
  219. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/mdmd/signatures.py +0 -0
  220. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/mdmd/types.py +0 -0
  221. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_docs/reference_intro.md +0 -0
  222. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/__init__.py +0 -0
  223. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/api_grpc.py +0 -0
  224. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/api_pb2.py +0 -0
  225. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/api_pb2.pyi +0 -0
  226. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/api_pb2_grpc.py +0 -0
  227. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
  228. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/modal_api_grpc.py +0 -0
  229. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/py.typed +0 -0
  230. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/task_command_router_grpc.py +0 -0
  231. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/task_command_router_pb2.py +0 -0
  232. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
  233. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  234. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  235. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/modal_version/__main__.py +0 -0
  236. {modal-1.5.6.dev2 → modal-1.5.6.dev3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev2
3
+ Version: 1.5.6.dev3
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -22,15 +22,9 @@ CUDA_CHECKPOINT_PATH: str = config.get("cuda_checkpoint_path")
22
22
  # stay in sync with `GPU_SNAPSHOT_RESTORE_FAILED_EXIT_CODE` in runner.rs.
23
23
  SNAPSHOT_RESTORE_FAILED_EXIT_CODE: int = 222
24
24
 
25
- # Maximum total duration for each individual `cuda-checkpoint` invocation.
26
- CUDA_CHECKPOINT_TIMEOUT: float = 3 * 60.0
27
-
28
25
  # Number of retries for each individual `cuda-checkpoint --toggle` invocation.
29
26
  CUDA_CHECKPOINT_TOGGLE_NUM_RETRIES: int = 3
30
27
 
31
- # Maximum total duration for an entire toggle operation.
32
- CUDA_CHECKPOINT_TOGGLE_TIMEOUT: float = CUDA_CHECKPOINT_TOGGLE_NUM_RETRIES * CUDA_CHECKPOINT_TIMEOUT
33
-
34
28
 
35
29
  class CudaCheckpointState(Enum):
36
30
  """State representation from the CUDA API [1].
@@ -63,14 +57,11 @@ class CudaCheckpointProcess:
63
57
  """
64
58
  logger.debug(f"PID: {self.pid} Toggling CUDA checkpoint state to {target_state.value}")
65
59
 
66
- start_time = time.monotonic()
67
60
  retry_count = 0
68
61
  max_retries = CUDA_CHECKPOINT_TOGGLE_NUM_RETRIES
69
62
 
70
63
  attempts = 0
71
- while self._should_continue_toggle(
72
- target_state, start_time, refresh=not (skip_first_refresh and attempts == 0)
73
- ):
64
+ while self._should_continue_toggle(target_state, refresh=not (skip_first_refresh and attempts == 0)):
74
65
  attempts += 1
75
66
  try:
76
67
  self._execute_toggle_command()
@@ -89,10 +80,8 @@ class CudaCheckpointProcess:
89
80
 
90
81
  logger.debug(f"PID: {self.pid} Target state {target_state.value} reached")
91
82
 
92
- def _should_continue_toggle(
93
- self, target_state: CudaCheckpointState, start_time: float, refresh: bool = True
94
- ) -> bool:
95
- """Check if toggle operation should continue based on current state and timeout."""
83
+ def _should_continue_toggle(self, target_state: CudaCheckpointState, refresh: bool = True) -> bool:
84
+ """Check if toggle operation should continue based on current state."""
96
85
  if refresh:
97
86
  self.refresh_state()
98
87
 
@@ -102,13 +91,6 @@ class CudaCheckpointProcess:
102
91
  if self.state == CudaCheckpointState.FAILED:
103
92
  raise CudaCheckpointException(f"PID: {self.pid} CUDA process state is {self.state}")
104
93
 
105
- elapsed = time.monotonic() - start_time
106
- if elapsed >= CUDA_CHECKPOINT_TOGGLE_TIMEOUT:
107
- raise CudaCheckpointException(
108
- f"PID: {self.pid} Timeout after {elapsed:.2f}s waiting for state {target_state.value}. "
109
- f"Current state: {self.state}"
110
- )
111
-
112
94
  return True
113
95
 
114
96
  def _execute_toggle_command(self) -> None:
@@ -119,17 +101,12 @@ class CudaCheckpointProcess:
119
101
  check=True,
120
102
  capture_output=True,
121
103
  text=True,
122
- timeout=CUDA_CHECKPOINT_TIMEOUT,
123
104
  )
124
105
  logger.debug(f"PID: {self.pid} Successfully toggled CUDA checkpoint state")
125
106
  except subprocess.CalledProcessError as e:
126
107
  error_msg = f"PID: {self.pid} Failed to toggle CUDA checkpoint state: {e.stderr}"
127
108
  logger.debug(error_msg)
128
109
  raise CudaCheckpointException(error_msg)
129
- except subprocess.TimeoutExpired:
130
- error_msg = f"PID: {self.pid} Toggle command timed out"
131
- logger.debug(error_msg)
132
- raise CudaCheckpointException(error_msg)
133
110
 
134
111
  def refresh_state(self) -> None:
135
112
  """Refreshes the current CUDA checkpoint state for this process."""
@@ -139,7 +116,6 @@ class CudaCheckpointProcess:
139
116
  check=True,
140
117
  capture_output=True,
141
118
  text=True,
142
- timeout=CUDA_CHECKPOINT_TIMEOUT,
143
119
  )
144
120
 
145
121
  state_str = result.stdout.strip().lower()
@@ -149,10 +125,6 @@ class CudaCheckpointProcess:
149
125
  error_msg = f"PID: {self.pid} Failed to get CUDA checkpoint state: {e.stderr}"
150
126
  logger.debug(error_msg)
151
127
  raise CudaCheckpointException(error_msg)
152
- except subprocess.TimeoutExpired:
153
- error_msg = f"PID: {self.pid} Get state command timed out"
154
- logger.debug(error_msg)
155
- raise CudaCheckpointException(error_msg)
156
128
 
157
129
 
158
130
  class CudaCheckpointSession:
@@ -208,7 +180,6 @@ class CudaCheckpointSession:
208
180
  [CUDA_CHECKPOINT_PATH, "--get-state", "--pid", str(pid)],
209
181
  capture_output=True,
210
182
  text=True,
211
- timeout=CUDA_CHECKPOINT_TIMEOUT,
212
183
  )
213
184
 
214
185
  # If the command succeeds (return code 0), this PID has a CUDA session
@@ -220,8 +191,6 @@ class CudaCheckpointSession:
220
191
  except subprocess.CalledProcessError:
221
192
  # Command failed, which is expected for PIDs without CUDA sessions
222
193
  pass
223
- except subprocess.TimeoutExpired:
224
- logger.debug(f"Timeout checking CUDA state for PID {pid}")
225
194
  except Exception as e:
226
195
  logger.debug(f"Error checking PID {pid}: {e}")
227
196
 
@@ -143,6 +143,12 @@ class _TaskLifecycleManager:
143
143
  else:
144
144
  logger.debug(f"modal.Volume background commit success for {volume_id}.")
145
145
 
146
+ @property
147
+ def _gpu_snapshot_enabled(self) -> bool:
148
+ return bool(
149
+ self.function_def._experimental_enable_gpu_snapshot and self.function_def.resources.gpu_config.gpu_type
150
+ )
151
+
146
152
  async def memory_restore(self) -> None:
147
153
  # Busy-wait for restore. `/__modal/restore-state.json` is created
148
154
  # by the worker process with updates to the container config.
@@ -177,18 +183,21 @@ class _TaskLifecycleManager:
177
183
  config.override_locally(key, value)
178
184
 
179
185
  # Restore GPU memory.
180
- if self.function_def._experimental_enable_gpu_snapshot and self.function_def.resources.gpu_config.gpu_type:
181
- logger.debug("GPU memory snapshot enabled. Attempting to restore GPU memory.")
182
-
183
- try:
184
- if self._cuda_checkpoint_session is None:
185
- raise gpu_memory_snapshot.CudaCheckpointException("CudaCheckpointSession not found")
186
- self._cuda_checkpoint_session.restore()
187
- except gpu_memory_snapshot.CudaCheckpointException as exc:
188
- logger.warning(f"GPU memory snapshot restore failed; retrying task without snapshot. Error: {exc}")
189
- sys.stderr.flush()
190
- # Exit with a sentinel code that the runtime will use to retry the task without a snapshot.
191
- os._exit(gpu_memory_snapshot.SNAPSHOT_RESTORE_FAILED_EXIT_CODE)
186
+ if self._gpu_snapshot_enabled:
187
+ if config.get("runtime_managed_cuda_checkpoint"):
188
+ logger.debug("GPU memory restore is managed by the container runtime.")
189
+ else:
190
+ logger.debug("GPU memory snapshot enabled. Attempting to restore GPU memory.")
191
+
192
+ try:
193
+ if self._cuda_checkpoint_session is None:
194
+ raise gpu_memory_snapshot.CudaCheckpointException("CudaCheckpointSession not found")
195
+ self._cuda_checkpoint_session.restore()
196
+ except gpu_memory_snapshot.CudaCheckpointException as exc:
197
+ logger.warning(f"GPU memory snapshot restore failed; retrying task without snapshot. Error: {exc}")
198
+ sys.stderr.flush()
199
+ # Exit with a sentinel code that the runtime will use to retry the task without a snapshot.
200
+ os._exit(gpu_memory_snapshot.SNAPSHOT_RESTORE_FAILED_EXIT_CODE)
192
201
 
193
202
  self._client = await _Client.from_env()
194
203
 
@@ -199,11 +208,14 @@ class _TaskLifecycleManager:
199
208
  else:
200
209
  raise ValueError("No checkpoint ID provided for memory snapshot")
201
210
 
202
- if self.function_def._experimental_enable_gpu_snapshot and self.function_def.resources.gpu_config.gpu_type:
203
- logger.debug("GPU memory snapshot enabled. Attempting to snapshot GPU memory.")
211
+ if self._gpu_snapshot_enabled:
212
+ if config.get("runtime_managed_cuda_checkpoint"):
213
+ logger.debug("GPU memory snapshot is managed by the container runtime.")
214
+ else:
215
+ logger.debug("GPU memory snapshot enabled. Attempting to snapshot GPU memory.")
204
216
 
205
- self._cuda_checkpoint_session = gpu_memory_snapshot.CudaCheckpointSession()
206
- self._cuda_checkpoint_session.checkpoint()
217
+ self._cuda_checkpoint_session = gpu_memory_snapshot.CudaCheckpointSession()
218
+ self._cuda_checkpoint_session.checkpoint()
207
219
 
208
220
  await self._client.stub.ContainerCheckpoint(
209
221
  api_pb2.ContainerCheckpointRequest(checkpoint_id=self.checkpoint_id)
@@ -54,6 +54,8 @@ class _TaskLifecycleManager:
54
54
  """
55
55
  ...
56
56
 
57
+ @property
58
+ def _gpu_snapshot_enabled(self) -> bool: ...
57
59
  async def memory_restore(self) -> None: ...
58
60
  async def memory_snapshot(self) -> None:
59
61
  """Message server indicating that function is ready to be checkpointed."""
@@ -111,6 +113,9 @@ class TaskLifecycleManager:
111
113
 
112
114
  volume_commit: __volume_commit_spec
113
115
 
116
+ @property
117
+ def _gpu_snapshot_enabled(self) -> bool: ...
118
+
114
119
  class __memory_restore_spec(typing_extensions.Protocol):
115
120
  def __call__(self, /) -> None: ...
116
121
  async def aio(self, /) -> None: ...
@@ -77,7 +77,7 @@ class _Client:
77
77
  server_url: str,
78
78
  client_type: int,
79
79
  credentials: typing.Optional[tuple[str, str]],
80
- version: str = "1.5.6.dev2",
80
+ version: str = "1.5.6.dev3",
81
81
  *,
82
82
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
83
83
  ):
@@ -277,7 +277,7 @@ class Client:
277
277
  server_url: str,
278
278
  client_type: int,
279
279
  credentials: typing.Optional[tuple[str, str]],
280
- version: str = "1.5.6.dev2",
280
+ version: str = "1.5.6.dev3",
281
281
  *,
282
282
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
283
283
  ):
@@ -339,6 +339,8 @@ _SETTINGS = {
339
339
  "sandbox_v2": _Setting(None, transform=_to_boolean),
340
340
  "snapshot_debug": _Setting(False, transform=_to_boolean),
341
341
  "cuda_checkpoint_path": _Setting("/__modal/.bin/cuda-checkpoint"), # Used for snapshotting GPU memory.
342
+ # Used to indicate gVisor cuda-checkpoint automation.
343
+ "runtime_managed_cuda_checkpoint": _Setting(False, transform=_to_boolean),
342
344
  "build_validation": _Setting("error", transform=_check_value(["error", "warn", "ignore"])),
343
345
  # Payload format for function inputs/outputs: 'pickle' (default) or 'cbor'
344
346
  "payload_format": _Setting(
@@ -619,7 +619,7 @@ class Function(
619
619
 
620
620
  _call_generator: ___call_generator_spec
621
621
 
622
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
622
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
623
623
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
624
624
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
625
625
 
@@ -644,7 +644,7 @@ class Function(
644
644
  """
645
645
  ...
646
646
 
647
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
647
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
648
648
 
649
649
  class __remote_gen_spec(typing_extensions.Protocol):
650
650
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -694,7 +694,7 @@ class Function(
694
694
  """
695
695
  ...
696
696
 
697
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
697
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
698
698
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
699
699
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
700
700
 
@@ -727,7 +727,7 @@ class Function(
727
727
  """
728
728
  ...
729
729
 
730
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
730
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
731
731
 
732
732
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
733
733
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -735,7 +735,7 @@ class Function(
735
735
 
736
736
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
737
737
 
738
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
738
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
739
739
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
740
740
  """Calls the function with the given arguments, without waiting for the results.
741
741
 
@@ -768,7 +768,7 @@ class Function(
768
768
  """
769
769
  ...
770
770
 
771
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
771
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
772
772
 
773
773
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
774
774
  """Return the inner Python object wrapped by this Modal Function.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev2
3
+ Version: 1.5.6.dev3
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.6.dev2"
4
+ __version__ = "1.5.6.dev3"
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["setuptools~=77.0.3", "wheel"]
2
+ requires = ["setuptools>=83,<84", "wheel"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
@@ -53,10 +53,10 @@ dev = [
53
53
  "pytest-env~=1.1.5",
54
54
  "pytest-markdown-docs==0.9.2",
55
55
  "pytest-timeout~=2.4.0",
56
- "python-dotenv~=1.0.0",
57
- "requests~=2.32.4",
56
+ "python-dotenv~=1.2.2",
57
+ "requests==2.33.0",
58
58
  "ruff~=0.9.6",
59
- "setuptools<82", # Required by grpcio-tools for pkg_resources (v82+ removed pkg_resources)"
59
+ "setuptools>=83,<84",
60
60
  "types-croniter~=1.0.8",
61
61
  "types-python-dateutil~=2.8.10",
62
62
  "types-requests~=2.31.0",
@@ -98,10 +98,6 @@ dev = [
98
98
  "aiohttp-socks>=0.8",
99
99
  ]
100
100
 
101
- [tool.uv.extra-build-dependencies]
102
- grpcio-tools = ["setuptools<82"]
103
-
104
-
105
101
  [project.urls]
106
102
  Homepage = "https://modal.com"
107
103
  Source = "https://github.com/modal-labs/modal-client"
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