modal 1.5.6.dev4__tar.gz → 1.5.6.dev6__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.dev4 → modal-1.5.6.dev6}/PKG-INFO +1 -1
  2. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/grpc_utils.py +30 -7
  3. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/task_command_router_client.py +1 -1
  4. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/client.pyi +2 -2
  5. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/mount.py +6 -1
  6. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox.py +1 -1
  7. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_version/__init__.py +1 -1
  9. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/LICENSE +0 -0
  10. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/README.md +0 -0
  11. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/__init__.py +0 -0
  12. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/__main__.py +0 -0
  13. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_billing.py +0 -0
  14. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_clustered_functions.py +0 -0
  15. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_clustered_functions.pyi +0 -0
  16. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_container_entrypoint.py +0 -0
  17. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_environments.py +0 -0
  18. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_function_variants.py +0 -0
  19. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_functions.py +0 -0
  20. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_grpc_client.py +0 -0
  21. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_image.py +0 -0
  22. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_ipython.py +0 -0
  23. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_load_context.py +0 -0
  24. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_location.py +0 -0
  25. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs.py +0 -0
  26. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs_manager.py +0 -0
  27. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_logs_manager.pyi +0 -0
  28. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_object.py +0 -0
  29. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/__init__.py +0 -0
  30. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/manager.py +0 -0
  31. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/pty.py +0 -0
  32. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/rich.py +0 -0
  33. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_output/status.py +0 -0
  34. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_partial_function.py +0 -0
  35. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_resolver.py +0 -0
  36. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_resources.py +0 -0
  37. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/__init__.py +0 -0
  38. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/asgi.py +0 -0
  39. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/container_io_manager.py +0 -0
  40. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
  41. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/execution_context.py +0 -0
  42. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/execution_context.pyi +0 -0
  43. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  44. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/task_lifecycle_manager.py +0 -0
  45. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  46. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/telemetry.py +0 -0
  47. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
  48. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_runtime/user_code_imports.py +0 -0
  49. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_serialization.py +0 -0
  50. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_server.py +0 -0
  51. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_supports_logs.py +0 -0
  52. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_traceback.py +0 -0
  53. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_tunnel.py +0 -0
  54. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_tunnel.pyi +0 -0
  55. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_type_manager.py +0 -0
  56. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/__init__.py +0 -0
  57. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/app_utils.py +0 -0
  58. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/async_utils.py +0 -0
  59. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/auth_token_manager.py +0 -0
  60. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/blob_utils.py +0 -0
  61. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/browser_utils.py +0 -0
  62. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
  63. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/curl_utils.py +0 -0
  64. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/deprecation.py +0 -0
  65. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/display_utils.py +0 -0
  66. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/docker_utils.py +0 -0
  67. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/function_utils.py +0 -0
  68. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/git_utils.py +0 -0
  69. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/grpc_testing.py +0 -0
  70. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/hash_utils.py +0 -0
  71. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/http_utils.py +0 -0
  72. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/jwt_utils.py +0 -0
  73. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/logger.py +0 -0
  74. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/mount_utils.py +0 -0
  75. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/name_utils.py +0 -0
  76. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/package_utils.py +0 -0
  77. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/pattern_utils.py +0 -0
  78. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/proxy_support.py +0 -0
  79. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/rand_pb_testing.py +0 -0
  80. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
  81. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/shell_utils.py +0 -0
  82. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_utils/time_utils.py +0 -0
  83. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/__init__.py +0 -0
  84. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  85. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/cloudpickle.py +0 -0
  86. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/tblib.py +0 -0
  87. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_vendor/version.py +0 -0
  88. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_watcher.py +0 -0
  89. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/_workspace.py +0 -0
  90. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/app.py +0 -0
  91. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/app.pyi +0 -0
  92. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/billing.py +0 -0
  93. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/billing.pyi +0 -0
  94. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2023.12.312.txt +0 -0
  95. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2023.12.txt +0 -0
  96. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2024.04.txt +0 -0
  97. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2024.10.txt +0 -0
  98. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/2025.06.txt +0 -0
  99. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/PREVIEW.txt +0 -0
  100. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/README.md +0 -0
  101. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/builder/base-images.json +0 -0
  102. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/call_graph.py +0 -0
  103. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/__init__.py +0 -0
  104. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_download.py +0 -0
  105. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_help.py +0 -0
  106. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/_traceback.py +0 -0
  107. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/app.py +0 -0
  108. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/billing.py +0 -0
  109. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/bootstrap.py +0 -0
  110. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/changelog.py +0 -0
  111. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/cluster.py +0 -0
  112. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/config.py +0 -0
  113. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/container.py +0 -0
  114. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/curl.py +0 -0
  115. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/dashboard.py +0 -0
  116. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/dict.py +0 -0
  117. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/endpoint.py +0 -0
  118. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/entry_point.py +0 -0
  119. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/environment.py +0 -0
  120. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/image.py +0 -0
  121. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/import_refs.py +0 -0
  122. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/launch.py +0 -0
  123. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/logo.py +0 -0
  124. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/network_file_system.py +0 -0
  125. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/profile.py +0 -0
  126. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/__init__.py +0 -0
  127. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/run_jupyter.py +0 -0
  128. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/programs/vscode.py +0 -0
  129. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/queues.py +0 -0
  130. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/run.py +0 -0
  131. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/secret.py +0 -0
  132. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/selector.py +0 -0
  133. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/shell.py +0 -0
  134. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/skills.py +0 -0
  135. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/token.py +0 -0
  136. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/utils.py +0 -0
  137. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/volume.py +0 -0
  138. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cli/workspace.py +0 -0
  139. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/client.py +0 -0
  140. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cloud_bucket_mount.py +0 -0
  141. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cloud_bucket_mount.pyi +0 -0
  142. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cls.py +0 -0
  143. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/cls.pyi +0 -0
  144. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/config.py +0 -0
  145. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/container_process.py +0 -0
  146. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/container_process.pyi +0 -0
  147. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/dict.py +0 -0
  148. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/dict.pyi +0 -0
  149. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/environments.py +0 -0
  150. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/environments.pyi +0 -0
  151. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/exception.py +0 -0
  152. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/__init__.py +0 -0
  153. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/flash.py +0 -0
  154. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/flash.pyi +0 -0
  155. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/experimental/ipython.py +0 -0
  156. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_io.py +0 -0
  157. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_io.pyi +0 -0
  158. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/file_pattern_matcher.py +0 -0
  159. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/functions.py +0 -0
  160. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/functions.pyi +0 -0
  161. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/image.py +0 -0
  162. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/image.pyi +0 -0
  163. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/io_streams.py +0 -0
  164. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/io_streams.pyi +0 -0
  165. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/mount.pyi +0 -0
  166. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/network_file_system.py +0 -0
  167. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/network_file_system.pyi +0 -0
  168. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/object.py +0 -0
  169. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/object.pyi +0 -0
  170. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/output.py +0 -0
  171. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/parallel_map.py +0 -0
  172. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/parallel_map.pyi +0 -0
  173. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/partial_function.py +0 -0
  174. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/partial_function.pyi +0 -0
  175. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/proxy.py +0 -0
  176. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/proxy.pyi +0 -0
  177. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/py.typed +0 -0
  178. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/queue.py +0 -0
  179. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/queue.pyi +0 -0
  180. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/retries.py +0 -0
  181. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/runner.py +0 -0
  182. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/runner.pyi +0 -0
  183. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/running_app.py +0 -0
  184. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox.pyi +0 -0
  185. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox_fs.py +0 -0
  186. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/sandbox_fs.pyi +0 -0
  187. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/schedule.py +0 -0
  188. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/scheduler_placement.py +0 -0
  189. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/secret.py +0 -0
  190. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/secret.pyi +0 -0
  191. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/server.py +0 -0
  192. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/server.pyi +0 -0
  193. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/serving.py +0 -0
  194. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/serving.pyi +0 -0
  195. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/skills/modal/SKILL.md +0 -0
  196. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/snapshot.py +0 -0
  197. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/snapshot.pyi +0 -0
  198. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/stream_type.py +0 -0
  199. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/token_flow.py +0 -0
  200. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/token_flow.pyi +0 -0
  201. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/types.py +0 -0
  202. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/volume.py +0 -0
  203. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/volume.pyi +0 -0
  204. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/workspace.py +0 -0
  205. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal/workspace.pyi +0 -0
  206. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/SOURCES.txt +0 -0
  207. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/dependency_links.txt +0 -0
  208. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/entry_points.txt +0 -0
  209. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/requires.txt +0 -0
  210. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal.egg-info/top_level.txt +0 -0
  211. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/__init__.py +0 -0
  212. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_cli_docs.py +0 -0
  213. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
  214. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_reference_docs.py +0 -0
  215. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
  216. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/__init__.py +0 -0
  217. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/mdmd.py +0 -0
  218. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/signatures.py +0 -0
  219. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/mdmd/types.py +0 -0
  220. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_docs/reference_intro.md +0 -0
  221. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/__init__.py +0 -0
  222. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_grpc.py +0 -0
  223. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2.py +0 -0
  224. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2.pyi +0 -0
  225. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2_grpc.py +0 -0
  226. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/api_pb2_grpc.pyi +0 -0
  227. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/modal_api_grpc.py +0 -0
  228. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/py.typed +0 -0
  229. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_grpc.py +0 -0
  230. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2.py +0 -0
  231. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2.pyi +0 -0
  232. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  233. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  234. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/modal_version/__main__.py +0 -0
  235. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/pyproject.toml +0 -0
  236. {modal-1.5.6.dev4 → modal-1.5.6.dev6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev4
3
+ Version: 1.5.6.dev6
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
 
@@ -265,18 +272,34 @@ class CustomProtoStatusDetailsCodec(StatusDetailsCodecBase):
265
272
  custom_detail_codec = CustomProtoStatusDetailsCodec()
266
273
 
267
274
 
268
- def create_channel_config() -> grpclib.config.Configuration:
275
+ def create_channel_config(*, sustained_keepalive: bool = False) -> grpclib.config.Configuration:
269
276
  """Shared grpclib channel settings for Modal client connections.
270
277
 
271
278
  HTTP/2 keepalive probes keep idle transports warm through stateful
272
279
  middleboxes and surface dead connections before retries reuse them.
280
+
281
+ `sustained_keepalive` clears the two grpclib defaults such that a probe
282
+ actually goes out every `_keepalive_time`, for as long as the connection is
283
+ open.
273
284
  """
285
+ ping_throttle_overrides: dict[str, Any] = {}
286
+ if sustained_keepalive:
287
+ ping_throttle_overrides = {
288
+ # Default 2: probing stops after two probes with no request sent in
289
+ # between. Requests reset the count, acks don't. 0 = no cap.
290
+ "_http2_max_pings_without_data": 0,
291
+ # Default 300s floor between probes, applied regardless of data
292
+ # despite the name, so it has to stay under `_keepalive_time`.
293
+ "_http2_min_sent_ping_interval_without_data": GRPC_KEEPALIVE_TIME_SECS / 2,
294
+ }
295
+
274
296
  return grpclib.config.Configuration(
275
297
  _keepalive_time=GRPC_KEEPALIVE_TIME_SECS,
276
298
  _keepalive_timeout=GRPC_KEEPALIVE_TIMEOUT_SECS,
277
299
  _keepalive_permit_without_calls=True,
278
300
  http2_connection_window_size=GRPC_WINDOW_SIZE,
279
301
  http2_stream_window_size=GRPC_WINDOW_SIZE,
302
+ **ping_throttle_overrides,
280
303
  )
281
304
 
282
305
 
@@ -251,7 +251,7 @@ class TaskCommandRouterClient:
251
251
  host,
252
252
  port,
253
253
  ssl=ssl_context,
254
- config=create_channel_config(),
254
+ config=create_channel_config(sustained_keepalive=True),
255
255
  closed_error_message="Unable to perform operation on a detached sandbox",
256
256
  )
257
257
 
@@ -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.dev4",
80
+ version: str = "1.5.6.dev6",
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.dev4",
280
+ version: str = "1.5.6.dev6",
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.
@@ -2279,7 +2279,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2279
2279
  command_router_client = await self._get_command_router_client(task_id)
2280
2280
  snap_v2_resp = await command_router_client.snapshot_memory(
2281
2281
  sr_pb2.TaskSnapshotMemoryRequest(task_id=task_id, idempotency_key=str(uuid.uuid4())),
2282
- timeout=55.0,
2282
+ timeout=165.0,
2283
2283
  )
2284
2284
  snapshot_id = snap_v2_resp.snapshot_id
2285
2285
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev4
3
+ Version: 1.5.6.dev6
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.dev4"
4
+ __version__ = "1.5.6.dev6"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes