modal 1.5.6.dev3__tar.gz → 1.5.6.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 (236) hide show
  1. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/PKG-INFO +1 -1
  2. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/grpc_utils.py +13 -6
  3. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/client.pyi +2 -2
  4. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/mount.py +6 -1
  5. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/sandbox.py +35 -0
  6. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/sandbox.pyi +66 -0
  7. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/api_grpc.py +32 -0
  9. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/api_pb2.py +865 -805
  10. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/api_pb2.pyi +124 -1
  11. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/api_pb2_grpc.py +67 -1
  12. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/api_pb2_grpc.pyi +23 -3
  13. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/modal_api_grpc.py +2 -0
  14. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_version/__init__.py +1 -1
  15. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/LICENSE +0 -0
  16. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/README.md +0 -0
  17. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/__init__.py +0 -0
  18. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/__main__.py +0 -0
  19. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_billing.py +0 -0
  20. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_clustered_functions.py +0 -0
  21. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_clustered_functions.pyi +0 -0
  22. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_container_entrypoint.py +0 -0
  23. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_environments.py +0 -0
  24. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_function_variants.py +0 -0
  25. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_functions.py +0 -0
  26. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_grpc_client.py +0 -0
  27. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_image.py +0 -0
  28. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_ipython.py +0 -0
  29. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_load_context.py +0 -0
  30. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_location.py +0 -0
  31. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_logs.py +0 -0
  32. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_logs_manager.py +0 -0
  33. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_logs_manager.pyi +0 -0
  34. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_object.py +0 -0
  35. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_output/__init__.py +0 -0
  36. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_output/manager.py +0 -0
  37. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_output/pty.py +0 -0
  38. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_output/rich.py +0 -0
  39. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_output/status.py +0 -0
  40. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_partial_function.py +0 -0
  41. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_resolver.py +0 -0
  42. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_resources.py +0 -0
  43. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/__init__.py +0 -0
  44. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/asgi.py +0 -0
  45. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/container_io_manager.py +0 -0
  46. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
  47. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/execution_context.py +0 -0
  48. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/execution_context.pyi +0 -0
  49. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  50. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
  51. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  52. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/telemetry.py +0 -0
  53. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
  54. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_runtime/user_code_imports.py +0 -0
  55. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_serialization.py +0 -0
  56. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_server.py +0 -0
  57. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_supports_logs.py +0 -0
  58. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_traceback.py +0 -0
  59. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_tunnel.py +0 -0
  60. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_tunnel.pyi +0 -0
  61. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_type_manager.py +0 -0
  62. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/__init__.py +0 -0
  63. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/app_utils.py +0 -0
  64. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/async_utils.py +0 -0
  65. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/auth_token_manager.py +0 -0
  66. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/blob_utils.py +0 -0
  67. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/browser_utils.py +0 -0
  68. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
  69. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/curl_utils.py +0 -0
  70. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/deprecation.py +0 -0
  71. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/display_utils.py +0 -0
  72. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/docker_utils.py +0 -0
  73. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/function_utils.py +0 -0
  74. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/git_utils.py +0 -0
  75. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/grpc_testing.py +0 -0
  76. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/hash_utils.py +0 -0
  77. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/http_utils.py +0 -0
  78. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/jwt_utils.py +0 -0
  79. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/logger.py +0 -0
  80. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/mount_utils.py +0 -0
  81. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/name_utils.py +0 -0
  82. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/package_utils.py +0 -0
  83. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/pattern_utils.py +0 -0
  84. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/proxy_support.py +0 -0
  85. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/rand_pb_testing.py +0 -0
  86. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
  87. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/shell_utils.py +0 -0
  88. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/task_command_router_client.py +0 -0
  89. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_utils/time_utils.py +0 -0
  90. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_vendor/__init__.py +0 -0
  91. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  92. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_vendor/cloudpickle.py +0 -0
  93. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_vendor/tblib.py +0 -0
  94. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_vendor/version.py +0 -0
  95. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_watcher.py +0 -0
  96. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/_workspace.py +0 -0
  97. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/app.py +0 -0
  98. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/app.pyi +0 -0
  99. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/billing.py +0 -0
  100. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/billing.pyi +0 -0
  101. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/2023.12.312.txt +0 -0
  102. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/2023.12.txt +0 -0
  103. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/2024.04.txt +0 -0
  104. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/2024.10.txt +0 -0
  105. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/2025.06.txt +0 -0
  106. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/PREVIEW.txt +0 -0
  107. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/README.md +0 -0
  108. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/builder/base-images.json +0 -0
  109. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/call_graph.py +0 -0
  110. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/__init__.py +0 -0
  111. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/_download.py +0 -0
  112. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/_help.py +0 -0
  113. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/_traceback.py +0 -0
  114. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/app.py +0 -0
  115. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/billing.py +0 -0
  116. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/bootstrap.py +0 -0
  117. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/changelog.py +0 -0
  118. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/cluster.py +0 -0
  119. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/config.py +0 -0
  120. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/container.py +0 -0
  121. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/curl.py +0 -0
  122. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/dashboard.py +0 -0
  123. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/dict.py +0 -0
  124. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/endpoint.py +0 -0
  125. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/entry_point.py +0 -0
  126. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/environment.py +0 -0
  127. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/image.py +0 -0
  128. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/import_refs.py +0 -0
  129. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/launch.py +0 -0
  130. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/logo.py +0 -0
  131. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/network_file_system.py +0 -0
  132. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/profile.py +0 -0
  133. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/programs/__init__.py +0 -0
  134. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/programs/run_jupyter.py +0 -0
  135. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/programs/vscode.py +0 -0
  136. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/queues.py +0 -0
  137. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/run.py +0 -0
  138. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/secret.py +0 -0
  139. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/selector.py +0 -0
  140. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/shell.py +0 -0
  141. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/skills.py +0 -0
  142. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/token.py +0 -0
  143. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/utils.py +0 -0
  144. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/volume.py +0 -0
  145. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cli/workspace.py +0 -0
  146. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/client.py +0 -0
  147. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cloud_bucket_mount.py +0 -0
  148. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cloud_bucket_mount.pyi +0 -0
  149. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cls.py +0 -0
  150. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/cls.pyi +0 -0
  151. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/config.py +0 -0
  152. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/container_process.py +0 -0
  153. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/container_process.pyi +0 -0
  154. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/dict.py +0 -0
  155. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/dict.pyi +0 -0
  156. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/environments.py +0 -0
  157. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/environments.pyi +0 -0
  158. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/exception.py +0 -0
  159. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/experimental/__init__.py +0 -0
  160. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/experimental/flash.py +0 -0
  161. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/experimental/flash.pyi +0 -0
  162. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/experimental/ipython.py +0 -0
  163. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/file_io.py +0 -0
  164. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/file_io.pyi +0 -0
  165. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/file_pattern_matcher.py +0 -0
  166. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/functions.py +0 -0
  167. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/functions.pyi +0 -0
  168. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/image.py +0 -0
  169. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/image.pyi +0 -0
  170. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/io_streams.py +0 -0
  171. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/io_streams.pyi +0 -0
  172. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/mount.pyi +0 -0
  173. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/network_file_system.py +0 -0
  174. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/network_file_system.pyi +0 -0
  175. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/object.py +0 -0
  176. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/object.pyi +0 -0
  177. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/output.py +0 -0
  178. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/parallel_map.py +0 -0
  179. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/parallel_map.pyi +0 -0
  180. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/partial_function.py +0 -0
  181. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/partial_function.pyi +0 -0
  182. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/proxy.py +0 -0
  183. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/proxy.pyi +0 -0
  184. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/py.typed +0 -0
  185. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/queue.py +0 -0
  186. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/queue.pyi +0 -0
  187. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/retries.py +0 -0
  188. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/runner.py +0 -0
  189. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/runner.pyi +0 -0
  190. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/running_app.py +0 -0
  191. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/sandbox_fs.py +0 -0
  192. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/sandbox_fs.pyi +0 -0
  193. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/schedule.py +0 -0
  194. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/scheduler_placement.py +0 -0
  195. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/secret.py +0 -0
  196. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/secret.pyi +0 -0
  197. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/server.py +0 -0
  198. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/server.pyi +0 -0
  199. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/serving.py +0 -0
  200. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/serving.pyi +0 -0
  201. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/skills/modal/SKILL.md +0 -0
  202. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/snapshot.py +0 -0
  203. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/snapshot.pyi +0 -0
  204. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/stream_type.py +0 -0
  205. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/token_flow.py +0 -0
  206. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/token_flow.pyi +0 -0
  207. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/types.py +0 -0
  208. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/volume.py +0 -0
  209. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/volume.pyi +0 -0
  210. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/workspace.py +0 -0
  211. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal/workspace.pyi +0 -0
  212. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/SOURCES.txt +0 -0
  213. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/dependency_links.txt +0 -0
  214. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/entry_points.txt +0 -0
  215. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/requires.txt +0 -0
  216. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal.egg-info/top_level.txt +0 -0
  217. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/__init__.py +0 -0
  218. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/gen_cli_docs.py +0 -0
  219. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
  220. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/gen_reference_docs.py +0 -0
  221. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
  222. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/mdmd/__init__.py +0 -0
  223. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/mdmd/mdmd.py +0 -0
  224. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/mdmd/signatures.py +0 -0
  225. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/mdmd/types.py +0 -0
  226. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_docs/reference_intro.md +0 -0
  227. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/__init__.py +0 -0
  228. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/py.typed +0 -0
  229. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/task_command_router_grpc.py +0 -0
  230. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/task_command_router_pb2.py +0 -0
  231. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
  232. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  233. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  234. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/modal_version/__main__.py +0 -0
  235. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/pyproject.toml +0 -0
  236. {modal-1.5.6.dev3 → modal-1.5.6.dev5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev3
3
+ Version: 1.5.6.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
@@ -199,16 +199,23 @@ class ConnectionManager:
199
199
  self._client = client
200
200
  # This metadata is injected into all requests on all channels created by this manager.
201
201
  self._metadata = metadata
202
- self._channels: dict[str, grpclib.client.Channel] = {}
202
+ self._channels: dict[str, asyncio.Future[grpclib.client.Channel]] = {}
203
203
 
204
204
  async def get_or_create_channel(self, server_url: str) -> grpclib.client.Channel:
205
- if server_url not in self._channels:
206
- self._channels[server_url] = await create_channel_with_fallbacks(server_url, self._metadata)
207
- return self._channels[server_url]
205
+ fut = self._channels.get(server_url)
206
+ if fut is None or (fut.done() and (fut.cancelled() or fut.exception() is not None)):
207
+ # Cache the attempt rather than the channel, so callers racing to connect share one.
208
+ fut = asyncio.ensure_future(create_channel_with_fallbacks(server_url, self._metadata))
209
+ self._channels[server_url] = fut
210
+ # Shielded so one caller giving up doesn't cancel the connection for the others.
211
+ return await asyncio.shield(fut)
208
212
 
209
213
  def close(self):
210
- for channel in self._channels.values():
211
- channel.close()
214
+ for fut in self._channels.values():
215
+ if fut.done() and not fut.cancelled() and fut.exception() is None:
216
+ fut.result().close()
217
+ else:
218
+ fut.cancel()
212
219
  self._channels.clear()
213
220
 
214
221
 
@@ -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.dev3",
80
+ version: str = "1.5.6.dev5",
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.dev3",
280
+ version: str = "1.5.6.dev5",
281
281
  *,
282
282
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
283
283
  ):
@@ -851,7 +851,7 @@ async def _create_single_client_dependency_mount(
851
851
  print(f"📦 Building {mount_name}.") # noqa: T201
852
852
  requirements = os.path.join(os.path.dirname(__file__), f"builder/{builder_version}.txt")
853
853
  cmd = [
854
- "uv",
854
+ os.environ.get("MODAL_UV_PATH", "uv"),
855
855
  "pip",
856
856
  "install",
857
857
  "--strict",
@@ -867,6 +867,11 @@ async def _create_single_client_dependency_mount(
867
867
  "--python",
868
868
  python_version,
869
869
  ]
870
+ # A directory holding wheels for every pin in the requirements file, for
871
+ # building mounts where no package index is reachable.
872
+ find_links = os.environ.get("MODAL_BUILDER_WHEEL_DIR")
873
+ if find_links:
874
+ cmd += ["--no-index", "--find-links", find_links]
870
875
  # Retry uv pip install on transient failures (e.g. network blips,
871
876
  # resource contention). uv exits with non-zero on recoverable errors
872
877
  # like rate limits or connection resets.
@@ -1577,6 +1577,15 @@ class _Sandbox(_Object, type_prefix="sb"):
1577
1577
  raise InvalidError("ttl is not supported with MODAL_USE_LEGACY_FILESYSTEM_SNAPSHOT")
1578
1578
  return await self._legacy_snapshot_filesystem(timeout)
1579
1579
 
1580
+ return await self._snapshot_filesystem(timeout, ttl=ttl)
1581
+
1582
+ async def _snapshot_filesystem(
1583
+ self,
1584
+ timeout: int,
1585
+ *,
1586
+ ttl: int | None,
1587
+ container_id: str = "",
1588
+ ) -> _Image:
1580
1589
  wire_ttl_seconds = _ttl_to_wire_ttl(ttl)
1581
1590
 
1582
1591
  task_id = await self._get_task_id()
@@ -1586,6 +1595,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1586
1595
  task_id=task_id,
1587
1596
  snapshot_id=str(uuid.uuid4()),
1588
1597
  ttl_seconds=wire_ttl_seconds,
1598
+ container_id=container_id,
1589
1599
  )
1590
1600
  res = await command_router_client.snapshot_filesystem(req, timeout=float(timeout))
1591
1601
  return _Image._new_hydrated(res.image_id, self._client, None)
@@ -2755,6 +2765,31 @@ class _SidecarContainer:
2755
2765
  command_router_client = await self._sandbox._get_command_router_client(task_id)
2756
2766
  return task_id, command_router_client
2757
2767
 
2768
+ async def snapshot_filesystem(
2769
+ self,
2770
+ timeout: int = 55,
2771
+ *,
2772
+ ttl: int | None = 30 * 24 * 3600,
2773
+ ) -> _Image:
2774
+ """Snapshot this Sidecar container's filesystem.
2775
+
2776
+ Args:
2777
+ timeout:
2778
+ Maximum time in seconds to wait for the snapshot operation.
2779
+ ttl:
2780
+ The resulting Image is retained for `ttl` seconds (default: 30 days). Pass `ttl=None` to retain
2781
+ the image indefinitely.
2782
+
2783
+ Returns:
2784
+ An [`Image`](https://modal.com/docs/sdk/py/latest/Image) containing a snapshot of this Sidecar's
2785
+ filesystem.
2786
+ """
2787
+ return await self._sandbox._snapshot_filesystem(
2788
+ timeout,
2789
+ ttl=ttl,
2790
+ container_id=self._container_id,
2791
+ )
2792
+
2758
2793
  @typing.overload
2759
2794
  async def exec(
2760
2795
  self,
@@ -637,6 +637,9 @@ class _Sandbox(modal._object._Object):
637
637
  """
638
638
  ...
639
639
 
640
+ async def _snapshot_filesystem(
641
+ self, timeout: int, *, ttl: typing.Optional[int], container_id: str = ""
642
+ ) -> modal._image._Image: ...
640
643
  async def _legacy_snapshot_filesystem(self, timeout: int = 55) -> modal._image._Image: ...
641
644
  async def mount_image(
642
645
  self,
@@ -1111,6 +1114,24 @@ class _SidecarContainer:
1111
1114
  """Get task ID and command router client."""
1112
1115
  ...
1113
1116
 
1117
+ async def snapshot_filesystem(
1118
+ self, timeout: int = 55, *, ttl: typing.Optional[int] = 2592000
1119
+ ) -> modal._image._Image:
1120
+ """Snapshot this Sidecar container's filesystem.
1121
+
1122
+ Args:
1123
+ timeout:
1124
+ Maximum time in seconds to wait for the snapshot operation.
1125
+ ttl:
1126
+ The resulting Image is retained for `ttl` seconds (default: 30 days). Pass `ttl=None` to retain
1127
+ the image indefinitely.
1128
+
1129
+ Returns:
1130
+ An [`Image`](https://modal.com/docs/sdk/py/latest/Image) containing a snapshot of this Sidecar's
1131
+ filesystem.
1132
+ """
1133
+ ...
1134
+
1114
1135
  @typing.overload
1115
1136
  async def exec(
1116
1137
  self,
@@ -1289,6 +1310,41 @@ class SidecarContainer:
1289
1310
 
1290
1311
  _get_command_router: ___get_command_router_spec
1291
1312
 
1313
+ class __snapshot_filesystem_spec(typing_extensions.Protocol):
1314
+ def __call__(self, /, timeout: int = 55, *, ttl: typing.Optional[int] = 2592000) -> modal.image.Image:
1315
+ """Snapshot this Sidecar container's filesystem.
1316
+
1317
+ Args:
1318
+ timeout:
1319
+ Maximum time in seconds to wait for the snapshot operation.
1320
+ ttl:
1321
+ The resulting Image is retained for `ttl` seconds (default: 30 days). Pass `ttl=None` to retain
1322
+ the image indefinitely.
1323
+
1324
+ Returns:
1325
+ An [`Image`](https://modal.com/docs/sdk/py/latest/Image) containing a snapshot of this Sidecar's
1326
+ filesystem.
1327
+ """
1328
+ ...
1329
+
1330
+ async def aio(self, /, timeout: int = 55, *, ttl: typing.Optional[int] = 2592000) -> modal.image.Image:
1331
+ """Snapshot this Sidecar container's filesystem.
1332
+
1333
+ Args:
1334
+ timeout:
1335
+ Maximum time in seconds to wait for the snapshot operation.
1336
+ ttl:
1337
+ The resulting Image is retained for `ttl` seconds (default: 30 days). Pass `ttl=None` to retain
1338
+ the image indefinitely.
1339
+
1340
+ Returns:
1341
+ An [`Image`](https://modal.com/docs/sdk/py/latest/Image) containing a snapshot of this Sidecar's
1342
+ filesystem.
1343
+ """
1344
+ ...
1345
+
1346
+ snapshot_filesystem: __snapshot_filesystem_spec
1347
+
1292
1348
  class __exec_spec(typing_extensions.Protocol):
1293
1349
  @typing.overload
1294
1350
  def __call__(
@@ -2485,6 +2541,16 @@ class Sandbox(modal.object.Object):
2485
2541
 
2486
2542
  snapshot_filesystem: __snapshot_filesystem_spec
2487
2543
 
2544
+ class ___snapshot_filesystem_spec(typing_extensions.Protocol):
2545
+ def __call__(
2546
+ self, /, timeout: int, *, ttl: typing.Optional[int], container_id: str = ""
2547
+ ) -> modal.image.Image: ...
2548
+ async def aio(
2549
+ self, /, timeout: int, *, ttl: typing.Optional[int], container_id: str = ""
2550
+ ) -> modal.image.Image: ...
2551
+
2552
+ _snapshot_filesystem: ___snapshot_filesystem_spec
2553
+
2488
2554
  class ___legacy_snapshot_filesystem_spec(typing_extensions.Protocol):
2489
2555
  def __call__(self, /, timeout: int = 55) -> modal.image.Image: ...
2490
2556
  async def aio(self, /, timeout: int = 55) -> modal.image.Image: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev3
3
+ Version: 1.5.6.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
@@ -411,6 +411,10 @@ class ModalClientBase(abc.ABC):
411
411
  async def FunctionGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionGetRequest, modal_proto.api_pb2.FunctionGetResponse]') -> None:
412
412
  pass
413
413
 
414
+ @abc.abstractmethod
415
+ async def FunctionGetById(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionGetByIdRequest, modal_proto.api_pb2.FunctionGetByIdResponse]') -> None:
416
+ pass
417
+
414
418
  @abc.abstractmethod
415
419
  async def FunctionGetCallGraph(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.FunctionGetCallGraphRequest, modal_proto.api_pb2.FunctionGetCallGraphResponse]') -> None:
416
420
  pass
@@ -599,6 +603,10 @@ class ModalClientBase(abc.ABC):
599
603
  async def QueuePut(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.QueuePutRequest, google.protobuf.empty_pb2.Empty]') -> None:
600
604
  pass
601
605
 
606
+ @abc.abstractmethod
607
+ async def SandboxContainerCreateV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxContainerCreateV2Request, modal_proto.api_pb2.SandboxContainerCreateV2Response]') -> None:
608
+ pass
609
+
602
610
  @abc.abstractmethod
603
611
  async def SandboxCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxCreateRequest, modal_proto.api_pb2.SandboxCreateResponse]') -> None:
604
612
  pass
@@ -1577,6 +1585,12 @@ class ModalClientBase(abc.ABC):
1577
1585
  modal_proto.api_pb2.FunctionGetRequest,
1578
1586
  modal_proto.api_pb2.FunctionGetResponse,
1579
1587
  ),
1588
+ '/modal.client.ModalClient/FunctionGetById': grpclib.const.Handler(
1589
+ self.FunctionGetById,
1590
+ grpclib.const.Cardinality.UNARY_UNARY,
1591
+ modal_proto.api_pb2.FunctionGetByIdRequest,
1592
+ modal_proto.api_pb2.FunctionGetByIdResponse,
1593
+ ),
1580
1594
  '/modal.client.ModalClient/FunctionGetCallGraph': grpclib.const.Handler(
1581
1595
  self.FunctionGetCallGraph,
1582
1596
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1859,6 +1873,12 @@ class ModalClientBase(abc.ABC):
1859
1873
  modal_proto.api_pb2.QueuePutRequest,
1860
1874
  google.protobuf.empty_pb2.Empty,
1861
1875
  ),
1876
+ '/modal.client.ModalClient/SandboxContainerCreateV2': grpclib.const.Handler(
1877
+ self.SandboxContainerCreateV2,
1878
+ grpclib.const.Cardinality.UNARY_UNARY,
1879
+ modal_proto.api_pb2.SandboxContainerCreateV2Request,
1880
+ modal_proto.api_pb2.SandboxContainerCreateV2Response,
1881
+ ),
1862
1882
  '/modal.client.ModalClient/SandboxCreate': grpclib.const.Handler(
1863
1883
  self.SandboxCreate,
1864
1884
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -3035,6 +3055,12 @@ class ModalClientStub:
3035
3055
  modal_proto.api_pb2.FunctionGetRequest,
3036
3056
  modal_proto.api_pb2.FunctionGetResponse,
3037
3057
  )
3058
+ self.FunctionGetById = grpclib.client.UnaryUnaryMethod(
3059
+ channel,
3060
+ '/modal.client.ModalClient/FunctionGetById',
3061
+ modal_proto.api_pb2.FunctionGetByIdRequest,
3062
+ modal_proto.api_pb2.FunctionGetByIdResponse,
3063
+ )
3038
3064
  self.FunctionGetCallGraph = grpclib.client.UnaryUnaryMethod(
3039
3065
  channel,
3040
3066
  '/modal.client.ModalClient/FunctionGetCallGraph',
@@ -3317,6 +3343,12 @@ class ModalClientStub:
3317
3343
  modal_proto.api_pb2.QueuePutRequest,
3318
3344
  google.protobuf.empty_pb2.Empty,
3319
3345
  )
3346
+ self.SandboxContainerCreateV2 = grpclib.client.UnaryUnaryMethod(
3347
+ channel,
3348
+ '/modal.client.ModalClient/SandboxContainerCreateV2',
3349
+ modal_proto.api_pb2.SandboxContainerCreateV2Request,
3350
+ modal_proto.api_pb2.SandboxContainerCreateV2Response,
3351
+ )
3320
3352
  self.SandboxCreate = grpclib.client.UnaryUnaryMethod(
3321
3353
  channel,
3322
3354
  '/modal.client.ModalClient/SandboxCreate',