modal 1.6.2.dev12__tar.gz → 1.6.3.dev0__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 (245) hide show
  1. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/PKG-INFO +1 -1
  2. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/auth_token_manager.py +8 -4
  3. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/dict.py +3 -7
  4. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/network_file_system.py +2 -4
  5. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/queues.py +3 -7
  6. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/secret.py +2 -4
  7. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/volume.py +3 -7
  8. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/client.pyi +2 -2
  9. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/functions.pyi +6 -6
  10. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_sandbox.py +11 -5
  11. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/sandbox.pyi +4 -4
  12. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/PKG-INFO +1 -1
  13. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2.py +846 -845
  14. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2.pyi +16 -2
  15. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_version/__init__.py +1 -1
  16. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/LICENSE +0 -0
  17. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/README.md +0 -0
  18. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/__init__.py +0 -0
  19. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/__main__.py +0 -0
  20. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_billing.py +0 -0
  21. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_cluster.py +0 -0
  22. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_cluster.pyi +0 -0
  23. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_container_entrypoint.py +0 -0
  24. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_environments.py +0 -0
  25. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_function_variants.py +0 -0
  26. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_functions.py +0 -0
  27. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_grpc_client.py +0 -0
  28. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_image.py +0 -0
  29. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_ipython.py +0 -0
  30. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_load_context.py +0 -0
  31. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_location.py +0 -0
  32. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs.py +0 -0
  33. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs_manager.py +0 -0
  34. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_logs_manager.pyi +0 -0
  35. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_metrics.py +0 -0
  36. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_metrics.pyi +0 -0
  37. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_object.py +0 -0
  38. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_outbound_policy.py +0 -0
  39. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_outbound_policy.pyi +0 -0
  40. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/__init__.py +0 -0
  41. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/manager.py +0 -0
  42. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/pty.py +0 -0
  43. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/rich.py +0 -0
  44. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_output/status.py +0 -0
  45. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_partial_function.py +0 -0
  46. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_resolver.py +0 -0
  47. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_resources.py +0 -0
  48. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/__init__.py +0 -0
  49. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/asgi.py +0 -0
  50. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/container_io_manager.py +0 -0
  51. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/container_io_manager.pyi +0 -0
  52. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/execution_context.py +0 -0
  53. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/execution_context.pyi +0 -0
  54. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  55. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/task_lifecycle_manager.py +0 -0
  56. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  57. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/telemetry.py +0 -0
  58. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/user_code_event_loop.py +0 -0
  59. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_runtime/user_code_imports.py +0 -0
  60. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_serialization.py +0 -0
  61. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_server.py +0 -0
  62. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_server.pyi +0 -0
  63. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_supports_logs.py +0 -0
  64. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_traceback.py +0 -0
  65. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_tunnel.py +0 -0
  66. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_tunnel.pyi +0 -0
  67. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_type_manager.py +0 -0
  68. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/__init__.py +0 -0
  69. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/app_utils.py +0 -0
  70. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/async_utils.py +0 -0
  71. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/blob_utils.py +0 -0
  72. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/browser_utils.py +0 -0
  73. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/bytes_io_segment_payload.py +0 -0
  74. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/curl_utils.py +0 -0
  75. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/deprecation.py +0 -0
  76. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/display_utils.py +0 -0
  77. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/docker_utils.py +0 -0
  78. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/function_utils.py +0 -0
  79. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/git_utils.py +0 -0
  80. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/grpc_testing.py +0 -0
  81. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/grpc_utils.py +0 -0
  82. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/hash_utils.py +0 -0
  83. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/http_utils.py +0 -0
  84. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/idle_countdown.py +0 -0
  85. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/jwt_utils.py +0 -0
  86. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/logger.py +0 -0
  87. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/mount_utils.py +0 -0
  88. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/name_utils.py +0 -0
  89. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/package_utils.py +0 -0
  90. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/pattern_utils.py +0 -0
  91. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/proxy_support.py +0 -0
  92. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/rand_pb_testing.py +0 -0
  93. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/sandbox_fs_utils.py +0 -0
  94. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/shell_utils.py +0 -0
  95. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_utils/time_utils.py +0 -0
  96. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/__init__.py +0 -0
  97. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  98. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/cloudpickle.py +0 -0
  99. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/tblib.py +0 -0
  100. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_vendor/version.py +0 -0
  101. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_watcher.py +0 -0
  102. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/_workspace.py +0 -0
  103. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/app.py +0 -0
  104. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/app.pyi +0 -0
  105. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/billing.py +0 -0
  106. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/billing.pyi +0 -0
  107. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2023.12.312.txt +0 -0
  108. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2023.12.txt +0 -0
  109. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2024.04.txt +0 -0
  110. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2024.10.txt +0 -0
  111. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/2025.06.txt +0 -0
  112. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/PREVIEW.txt +0 -0
  113. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/README.md +0 -0
  114. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/builder/base-images.json +0 -0
  115. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/call_graph.py +0 -0
  116. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/__init__.py +0 -0
  117. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_download.py +0 -0
  118. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_help.py +0 -0
  119. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_logs.py +0 -0
  120. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_stats.py +0 -0
  121. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/_traceback.py +0 -0
  122. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/app.py +0 -0
  123. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/billing.py +0 -0
  124. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/changelog.py +0 -0
  125. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/config.py +0 -0
  126. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/container.py +0 -0
  127. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/curl.py +0 -0
  128. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/dashboard.py +0 -0
  129. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/endpoint.py +0 -0
  130. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/entry_point.py +0 -0
  131. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/environment.py +0 -0
  132. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/function.py +0 -0
  133. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/image.py +0 -0
  134. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/import_refs.py +0 -0
  135. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/logo.py +0 -0
  136. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/profile.py +0 -0
  137. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/run.py +0 -0
  138. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/selector.py +0 -0
  139. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/server.py +0 -0
  140. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/shell.py +0 -0
  141. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/skills.py +0 -0
  142. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/token.py +0 -0
  143. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/utils.py +0 -0
  144. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cli/workspace.py +0 -0
  145. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/client.py +0 -0
  146. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cloud_bucket_mount.py +0 -0
  147. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cloud_bucket_mount.pyi +0 -0
  148. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cls.py +0 -0
  149. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cls.pyi +0 -0
  150. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cluster.py +0 -0
  151. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/cluster.pyi +0 -0
  152. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/config.py +0 -0
  153. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/container_process.py +0 -0
  154. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/container_process.pyi +0 -0
  155. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/dict.py +0 -0
  156. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/dict.pyi +0 -0
  157. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/environments.py +0 -0
  158. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/environments.pyi +0 -0
  159. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/exception.py +0 -0
  160. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/__init__.py +0 -0
  161. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/_flash_container_entry.py +0 -0
  162. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash.py +0 -0
  163. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash.pyi +0 -0
  164. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash_server.py +0 -0
  165. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/flash_server.pyi +0 -0
  166. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/experimental/ipython.py +0 -0
  167. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/file_pattern_matcher.py +0 -0
  168. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/functions.py +0 -0
  169. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/image.py +0 -0
  170. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/image.pyi +0 -0
  171. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/io_streams.py +0 -0
  172. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/io_streams.pyi +0 -0
  173. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/mount.py +0 -0
  174. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/mount.pyi +0 -0
  175. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/network_file_system.py +0 -0
  176. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/network_file_system.pyi +0 -0
  177. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/object.py +0 -0
  178. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/object.pyi +0 -0
  179. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/output.py +0 -0
  180. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/parallel_map.py +0 -0
  181. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/parallel_map.pyi +0 -0
  182. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/partial_function.py +0 -0
  183. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/partial_function.pyi +0 -0
  184. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/proxy.py +0 -0
  185. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/proxy.pyi +0 -0
  186. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/py.typed +0 -0
  187. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/queue.py +0 -0
  188. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/queue.pyi +0 -0
  189. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/retries.py +0 -0
  190. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/runner.py +0 -0
  191. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/runner.pyi +0 -0
  192. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/running_app.py +0 -0
  193. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/__init__.py +0 -0
  194. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_common.py +0 -0
  195. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_filesystem.py +0 -0
  196. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_sidecar.py +0 -0
  197. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_snapshot.py +0 -0
  198. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/_task_command_router_client.py +0 -0
  199. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/sandbox/sandbox.py +0 -0
  200. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/schedule.py +0 -0
  201. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/scheduler_placement.py +0 -0
  202. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/secret.py +0 -0
  203. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/secret.pyi +0 -0
  204. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/server.py +0 -0
  205. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/server.pyi +0 -0
  206. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/serving.py +0 -0
  207. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/serving.pyi +0 -0
  208. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/skills/modal/SKILL.md +0 -0
  209. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/stream_type.py +0 -0
  210. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/token_flow.py +0 -0
  211. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/token_flow.pyi +0 -0
  212. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/types.py +0 -0
  213. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/volume.py +0 -0
  214. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/volume.pyi +0 -0
  215. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/workspace.py +0 -0
  216. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal/workspace.pyi +0 -0
  217. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/SOURCES.txt +0 -0
  218. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/dependency_links.txt +0 -0
  219. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/entry_points.txt +0 -0
  220. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/requires.txt +0 -0
  221. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal.egg-info/top_level.txt +0 -0
  222. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/__init__.py +0 -0
  223. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_cli_docs.py +0 -0
  224. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_cli_docs_main.py +0 -0
  225. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_reference_docs.py +0 -0
  226. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/gen_reference_docs_main.py +0 -0
  227. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/__init__.py +0 -0
  228. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/mdmd.py +0 -0
  229. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/signatures.py +0 -0
  230. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/mdmd/types.py +0 -0
  231. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_docs/reference_intro.md +0 -0
  232. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/__init__.py +0 -0
  233. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_grpc.py +0 -0
  234. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2_grpc.py +0 -0
  235. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/api_pb2_grpc.pyi +0 -0
  236. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/modal_api_grpc.py +0 -0
  237. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/py.typed +0 -0
  238. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_grpc.py +0 -0
  239. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2.py +0 -0
  240. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2.pyi +0 -0
  241. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  242. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  243. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/modal_version/__main__.py +0 -0
  244. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/pyproject.toml +0 -0
  245. {modal-1.6.2.dev12 → modal-1.6.3.dev0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.2.dev12
3
+ Version: 1.6.3.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -98,8 +98,9 @@ class _AuthTokenManager:
98
98
  caller goes away.
99
99
  """
100
100
  if self._refresh_task is None:
101
- # Maybe another coroutine refreshed already, or we're cooling down after a failure.
102
- if self._token and not self._should_refresh():
101
+ # Maybe another coroutine refreshed already, or we're cooling down after a failure. The cooldown
102
+ # only applies while the cached token is still usable.
103
+ if self._has_valid_token() and not self._should_refresh():
103
104
  return
104
105
  # Note: the task is created in async code so it binds to the synchronicity event loop.
105
106
  self._refresh_task = asyncio.create_task(self._fetch_token())
@@ -121,12 +122,12 @@ class _AuthTokenManager:
121
122
  async def _fetch_token(self):
122
123
  """Fetch a new token and cache it, or arm the failure backoff."""
123
124
  try:
124
- # No cached token to fall back on, so a failure is user-visible: retry transient errors.
125
+ # Retry transient errors if the cached token is missing or expired.
125
126
  # Otherwise one attempt, and _retry_after handles the cooldown.
126
127
  retry = Retry(
127
128
  attempt_timeout=self.AUTH_TOKEN_TIMEOUT,
128
129
  total_timeout=self.AUTH_TOKEN_RETRY_TOTAL_TIMEOUT,
129
- max_retries=0 if self._token else DEFAULT_MAX_RETRIES,
130
+ max_retries=0 if self._has_valid_token() else DEFAULT_MAX_RETRIES,
130
131
  )
131
132
  token = await self._fetch(retry)
132
133
  if not token:
@@ -166,6 +167,9 @@ class _AuthTokenManager:
166
167
  except Exception as e:
167
168
  raise ValueError("Internal error: Cannot parse auth token. Please contact Modal support.") from e
168
169
 
170
+ def _has_valid_token(self):
171
+ return bool(self._token) and not self._is_expired()
172
+
169
173
  def _in_backoff(self):
170
174
  return time.time() < self._retry_after
171
175
 
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import TaskContext, synchronizer
10
10
  from modal._utils.time_utils import timestamp_to_localized_str
11
- from modal.cli.utils import display_table, env_option, yes_option
11
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
12
12
  from modal.client import _Client
13
13
  from modal.dict import _Dict
14
14
  from modal.output import OutputManager
@@ -64,10 +64,8 @@ async def clear(name: str, *, yes: bool = False, env: str | None = None):
64
64
  """Clear the contents of a named Dict by deleting all of its data."""
65
65
  d = _Dict.from_name(name, environment_name=env)
66
66
  if not yes:
67
- click.confirm(
67
+ confirm_or_suggest_yes(
68
68
  f"Are you sure you want to irrevocably delete the contents of modal.Dict '{name}'?",
69
- default=False,
70
- abort=True,
71
69
  )
72
70
  await d.clear()
73
71
 
@@ -87,10 +85,8 @@ async def delete(
87
85
  ):
88
86
  """Delete a named Dict and all of its data."""
89
87
  if not yes:
90
- click.confirm(
88
+ confirm_or_suggest_yes(
91
89
  f"Are you sure you want to irrevocably delete the modal.Dict '{name}'?",
92
- default=False,
93
- abort=True,
94
90
  )
95
91
  await _Dict.objects.delete(name, environment_name=env, allow_missing=allow_missing)
96
92
 
@@ -14,7 +14,7 @@ from modal._location import display_location
14
14
  from modal._utils.async_utils import synchronizer
15
15
  from modal._utils.time_utils import timestamp_to_localized_str
16
16
  from modal.cli._download import _volume_download
17
- from modal.cli.utils import display_table, env_option, yes_option
17
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
18
18
  from modal.client import _Client
19
19
  from modal.network_file_system import _NetworkFileSystem
20
20
  from modal.output import OutputManager
@@ -86,10 +86,8 @@ async def delete(
86
86
  # Lookup first to validate the name, even though delete is a staticmethod
87
87
  await _NetworkFileSystem.from_name(nfs_name, environment_name=env).hydrate()
88
88
  if not yes:
89
- click.confirm(
89
+ confirm_or_suggest_yes(
90
90
  f"Are you sure you want to irrevocably delete the modal.NetworkFileSystem '{nfs_name}'?",
91
- default=False,
92
- abort=True,
93
91
  )
94
92
 
95
93
  await _NetworkFileSystem.delete(nfs_name, environment_name=env)
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import TaskContext, synchronizer
10
10
  from modal._utils.time_utils import timestamp_to_localized_str
11
- from modal.cli.utils import display_table, env_option, yes_option
11
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
12
12
  from modal.client import _Client
13
13
  from modal.output import OutputManager
14
14
  from modal.queue import _Queue
@@ -127,10 +127,8 @@ async def clear(
127
127
  """Clear the contents of a Queue by removing all of its data."""
128
128
  q = _Queue.from_name(name, environment_name=env)
129
129
  if not yes:
130
- click.confirm(
130
+ confirm_or_suggest_yes(
131
131
  f"Are you sure you want to irrevocably delete the contents of modal.Queue '{name}'?",
132
- default=False,
133
- abort=True,
134
132
  )
135
133
  await q.clear(partition=partition, all=all)
136
134
 
@@ -151,10 +149,8 @@ async def delete(
151
149
  """Delete a named Queue and all of its data."""
152
150
  env = ensure_env(env)
153
151
  if not yes:
154
- click.confirm(
152
+ confirm_or_suggest_yes(
155
153
  f"Are you sure you want to irrevocably delete the modal.Queue '{name}'?",
156
- default=False,
157
- abort=True,
158
154
  )
159
155
  await _Queue.objects.delete(name, environment_name=env, allow_missing=allow_missing)
160
156
 
@@ -13,7 +13,7 @@ from rich.syntax import Syntax
13
13
  from modal._environments import ensure_env
14
14
  from modal._utils.async_utils import synchronizer
15
15
  from modal._utils.time_utils import timestamp_to_localized_str
16
- from modal.cli.utils import display_table, env_option, yes_option
16
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
17
17
  from modal.client import _Client
18
18
  from modal.output import OutputManager
19
19
  from modal.secret import _Secret
@@ -194,10 +194,8 @@ async def delete(
194
194
  ):
195
195
  env = ensure_env(env)
196
196
  if not yes:
197
- click.confirm(
197
+ confirm_or_suggest_yes(
198
198
  f"Are you sure you want to irrevocably delete the modal.Secret '{name}'?",
199
- default=False,
200
- abort=True,
201
199
  )
202
200
  await _Secret.objects.delete(name, environment_name=env, allow_missing=allow_missing)
203
201
 
@@ -13,7 +13,7 @@ from modal._utils.async_utils import synchronizer
13
13
  from modal._utils.browser_utils import open_url_and_display
14
14
  from modal._utils.time_utils import timestamp_to_localized_str
15
15
  from modal.cli._download import _volume_download
16
- from modal.cli.utils import display_table, env_option, humanize_filesize, yes_option
16
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, humanize_filesize, yes_option
17
17
  from modal.output import OutputManager
18
18
  from modal.volume import _AbstractVolumeUploadContextManager, _Volume
19
19
  from modal_proto import api_pb2
@@ -81,10 +81,8 @@ async def rename(
81
81
  env: str | None = None,
82
82
  ):
83
83
  if not yes:
84
- click.confirm(
84
+ confirm_or_suggest_yes(
85
85
  f"Are you sure you want rename the modal.Volume '{old_name}'? This may break any Apps currently using it.",
86
- default=False,
87
- abort=True,
88
86
  )
89
87
 
90
88
  await _Volume.rename(old_name, new_name, environment_name=env)
@@ -132,10 +130,8 @@ async def delete(
132
130
  ):
133
131
  env = ensure_env(env)
134
132
  if not yes:
135
- click.confirm(
133
+ confirm_or_suggest_yes(
136
134
  f"Are you sure you want to irrevocably delete the modal.Volume '{name}'?",
137
- default=False,
138
- abort=True,
139
135
  )
140
136
 
141
137
  await _Volume.objects.delete(name, environment_name=env, allow_missing=allow_missing)
@@ -80,7 +80,7 @@ class _Client:
80
80
  server_url: str,
81
81
  client_type: int,
82
82
  credentials: typing.Optional[tuple[str, str]],
83
- version: str = "1.6.2.dev12",
83
+ version: str = "1.6.3.dev0",
84
84
  *,
85
85
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
86
86
  ):
@@ -290,7 +290,7 @@ class Client:
290
290
  server_url: str,
291
291
  client_type: int,
292
292
  credentials: typing.Optional[tuple[str, str]],
293
- version: str = "1.6.2.dev12",
293
+ version: str = "1.6.3.dev0",
294
294
  *,
295
295
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
296
296
  ):
@@ -619,7 +619,7 @@ class Function(
619
619
 
620
620
  _call_generator: ___call_generator_spec
621
621
 
622
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
622
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_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.ReturnType, modal._functions.P]
647
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
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[ReturnType_INNER, P_INNER]):
697
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_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.ReturnType, modal._functions.P]
730
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
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[ReturnType_INNER, P_INNER]):
738
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_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.ReturnType, modal._functions.P]
771
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
772
772
 
773
773
  @property
774
774
  def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
@@ -112,6 +112,11 @@ _EXIT_SNAPSHOT_LONG_POLL_TIMEOUT = 10.0
112
112
  # client-side deadline.
113
113
  _EXIT_SNAPSHOT_POLL_DEADLINE_MARGIN = 5.0
114
114
 
115
+ # `Sandbox.wait` re-polls a server-side long poll of this many seconds. Each poll gets a network deadline
116
+ # with a margin over the hold, so a poll the server never answers fails and is retried instead of hanging.
117
+ _WAIT_LONG_POLL_TIMEOUT = 10.0
118
+ _WAIT_POLL_DEADLINE_MARGIN = 5.0
119
+
115
120
  # How long `Sandbox.create` waits for capacity before giving up.
116
121
  _SANDBOX_SCHEDULING_TIMEOUT: float = 21 * 60
117
122
 
@@ -484,8 +489,8 @@ class _Sandbox(_Object, type_prefix="sb"):
484
489
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
485
490
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
486
491
  inbound_cidr_allowlist:
487
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
488
- all CIDRs are allowed.
492
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
493
+ If None, all CIDRs are allowed.
489
494
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
490
495
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
491
496
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1682,14 +1687,15 @@ class _Sandbox(_Object, type_prefix="sb"):
1682
1687
 
1683
1688
  """
1684
1689
 
1690
+ poll_retry = Retry(attempt_timeout=_WAIT_LONG_POLL_TIMEOUT + _WAIT_POLL_DEADLINE_MARGIN)
1685
1691
  while True:
1686
- req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=10)
1692
+ req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=_WAIT_LONG_POLL_TIMEOUT)
1687
1693
  # Use the private __client to allow `wait` to work with a detached sandbox
1688
1694
  stub = self.__client._stub
1689
1695
  if self._is_v2:
1690
- resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata(self.__client))
1696
+ resp = await stub.SandboxWaitV2(req, retry=poll_retry, metadata=await self._v2_metadata(self.__client))
1691
1697
  else:
1692
- resp = await stub.SandboxWait(req)
1698
+ resp = await stub.SandboxWait(req, retry=poll_retry)
1693
1699
  if resp.result.status:
1694
1700
  logger.debug(f"Sandbox {self.object_id} wait completed with status {resp.result.status}")
1695
1701
  self._result = resp.result
@@ -1474,8 +1474,8 @@ class Sandbox(modal.object.Object):
1474
1474
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
1475
1475
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
1476
1476
  inbound_cidr_allowlist:
1477
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1478
- all CIDRs are allowed.
1477
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
1478
+ If None, all CIDRs are allowed.
1479
1479
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
1480
1480
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
1481
1481
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1598,8 +1598,8 @@ class Sandbox(modal.object.Object):
1598
1598
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
1599
1599
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
1600
1600
  inbound_cidr_allowlist:
1601
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1602
- all CIDRs are allowed.
1601
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
1602
+ If None, all CIDRs are allowed.
1603
1603
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
1604
1604
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
1605
1605
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.2.dev12
3
+ Version: 1.6.3.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0