modAL 1.6.3.dev4__tar.gz → 1.6.3.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 (249) hide show
  1. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/PKG-INFO +1 -1
  2. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_image.py +12 -3
  3. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/2025.06.txt +1 -1
  4. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/base-images.json +2 -11
  5. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/client.pyi +2 -2
  6. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/functions.pyi +6 -6
  7. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/runner.py +10 -25
  8. modal-1.6.3.dev5/modal/sandbox/_common.py +1119 -0
  9. modal-1.6.3.dev5/modal/sandbox/_impl_v1.py +513 -0
  10. modal-1.6.3.dev5/modal/sandbox/_impl_v2.py +613 -0
  11. modal-1.6.3.dev5/modal/sandbox/_sandbox.py +1474 -0
  12. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/_sidecar.py +67 -214
  13. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/_task_command_router_client.py +80 -115
  14. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/sandbox.pyi +72 -312
  15. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/PKG-INFO +1 -1
  16. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/SOURCES.txt +2 -0
  17. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/api_pb2.py +1426 -1426
  18. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/api_pb2.pyi +43 -41
  19. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_version/__init__.py +1 -1
  20. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/pyproject.toml +2 -0
  21. modal-1.6.3.dev4/modal/sandbox/_common.py +0 -248
  22. modal-1.6.3.dev4/modal/sandbox/_sandbox.py +0 -2596
  23. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/LICENSE +0 -0
  24. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/README.md +0 -0
  25. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/__init__.py +0 -0
  26. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/__main__.py +0 -0
  27. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_billing.py +0 -0
  28. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_cluster.py +0 -0
  29. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_cluster.pyi +0 -0
  30. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_container_entrypoint.py +0 -0
  31. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_environments.py +0 -0
  32. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_function_variants.py +0 -0
  33. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_functions.py +0 -0
  34. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_grpc_client.py +0 -0
  35. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_ipython.py +0 -0
  36. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_load_context.py +0 -0
  37. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_location.py +0 -0
  38. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_logs.py +0 -0
  39. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_logs_manager.py +0 -0
  40. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_logs_manager.pyi +0 -0
  41. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_metrics.py +0 -0
  42. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_metrics.pyi +0 -0
  43. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_object.py +0 -0
  44. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_outbound_policy.py +0 -0
  45. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_outbound_policy.pyi +0 -0
  46. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_output/__init__.py +0 -0
  47. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_output/manager.py +0 -0
  48. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_output/pty.py +0 -0
  49. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_output/rich.py +0 -0
  50. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_output/status.py +0 -0
  51. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_partial_function.py +0 -0
  52. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_resolver.py +0 -0
  53. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_resources.py +0 -0
  54. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/__init__.py +0 -0
  55. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/asgi.py +0 -0
  56. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/container_io_manager.py +0 -0
  57. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
  58. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/execution_context.py +0 -0
  59. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/execution_context.pyi +0 -0
  60. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  61. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
  62. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  63. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/telemetry.py +0 -0
  64. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
  65. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_runtime/user_code_imports.py +0 -0
  66. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_serialization.py +0 -0
  67. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_server.py +0 -0
  68. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_server.pyi +0 -0
  69. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_supports_logs.py +0 -0
  70. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_traceback.py +0 -0
  71. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_tunnel.py +0 -0
  72. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_tunnel.pyi +0 -0
  73. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_type_manager.py +0 -0
  74. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/__init__.py +0 -0
  75. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/app_utils.py +0 -0
  76. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/async_utils.py +0 -0
  77. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/auth_token_manager.py +0 -0
  78. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/blob_utils.py +0 -0
  79. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/browser_utils.py +0 -0
  80. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
  81. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/curl_utils.py +0 -0
  82. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/deprecation.py +0 -0
  83. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/display_utils.py +0 -0
  84. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/docker_utils.py +0 -0
  85. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/function_utils.py +0 -0
  86. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/git_utils.py +0 -0
  87. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/grpc_testing.py +0 -0
  88. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/grpc_utils.py +0 -0
  89. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/hash_utils.py +0 -0
  90. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/http_utils.py +0 -0
  91. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/idle_countdown.py +0 -0
  92. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/jwt_utils.py +0 -0
  93. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/logger.py +0 -0
  94. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/mount_utils.py +0 -0
  95. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/name_utils.py +0 -0
  96. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/package_utils.py +0 -0
  97. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/pattern_utils.py +0 -0
  98. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/proxy_support.py +0 -0
  99. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/rand_pb_testing.py +0 -0
  100. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
  101. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/shell_utils.py +0 -0
  102. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_utils/time_utils.py +0 -0
  103. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_vendor/__init__.py +0 -0
  104. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  105. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_vendor/cloudpickle.py +0 -0
  106. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_vendor/tblib.py +0 -0
  107. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_vendor/version.py +0 -0
  108. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_watcher.py +0 -0
  109. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/_workspace.py +0 -0
  110. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/app.py +0 -0
  111. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/app.pyi +0 -0
  112. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/billing.py +0 -0
  113. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/billing.pyi +0 -0
  114. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/2023.12.312.txt +0 -0
  115. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/2023.12.txt +0 -0
  116. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/2024.04.txt +0 -0
  117. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/2024.10.txt +0 -0
  118. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/PREVIEW.txt +0 -0
  119. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/builder/README.md +0 -0
  120. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/call_graph.py +0 -0
  121. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/__init__.py +0 -0
  122. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/_download.py +0 -0
  123. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/_help.py +0 -0
  124. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/_logs.py +0 -0
  125. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/_stats.py +0 -0
  126. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/_traceback.py +0 -0
  127. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/app.py +0 -0
  128. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/billing.py +0 -0
  129. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/changelog.py +0 -0
  130. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/config.py +0 -0
  131. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/container.py +0 -0
  132. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/curl.py +0 -0
  133. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/dashboard.py +0 -0
  134. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/dict.py +0 -0
  135. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/endpoint.py +0 -0
  136. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/entry_point.py +0 -0
  137. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/environment.py +0 -0
  138. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/function.py +0 -0
  139. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/image.py +0 -0
  140. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/import_refs.py +0 -0
  141. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/logo.py +0 -0
  142. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/network_file_system.py +0 -0
  143. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/profile.py +0 -0
  144. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/queues.py +0 -0
  145. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/run.py +0 -0
  146. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/secret.py +0 -0
  147. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/selector.py +0 -0
  148. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/server.py +0 -0
  149. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/shell.py +0 -0
  150. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/skills.py +0 -0
  151. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/token.py +0 -0
  152. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/utils.py +0 -0
  153. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/volume.py +0 -0
  154. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cli/workspace.py +0 -0
  155. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/client.py +0 -0
  156. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cloud_bucket_mount.py +0 -0
  157. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cloud_bucket_mount.pyi +0 -0
  158. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cls.py +0 -0
  159. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cls.pyi +0 -0
  160. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cluster.py +0 -0
  161. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/cluster.pyi +0 -0
  162. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/config.py +0 -0
  163. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/container_process.py +0 -0
  164. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/container_process.pyi +0 -0
  165. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/dict.py +0 -0
  166. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/dict.pyi +0 -0
  167. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/environments.py +0 -0
  168. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/environments.pyi +0 -0
  169. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/exception.py +0 -0
  170. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/__init__.py +0 -0
  171. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/_flash_container_entry.py +0 -0
  172. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/flash.py +0 -0
  173. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/flash.pyi +0 -0
  174. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/flash_server.py +0 -0
  175. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/flash_server.pyi +0 -0
  176. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/experimental/ipython.py +0 -0
  177. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/file_pattern_matcher.py +0 -0
  178. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/functions.py +0 -0
  179. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/image.py +0 -0
  180. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/image.pyi +0 -0
  181. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/io_streams.py +0 -0
  182. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/io_streams.pyi +0 -0
  183. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/mount.py +0 -0
  184. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/mount.pyi +0 -0
  185. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/network_file_system.py +0 -0
  186. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/network_file_system.pyi +0 -0
  187. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/object.py +0 -0
  188. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/object.pyi +0 -0
  189. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/output.py +0 -0
  190. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/parallel_map.py +0 -0
  191. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/parallel_map.pyi +0 -0
  192. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/partial_function.py +0 -0
  193. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/partial_function.pyi +0 -0
  194. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/proxy.py +0 -0
  195. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/proxy.pyi +0 -0
  196. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/py.typed +0 -0
  197. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/queue.py +0 -0
  198. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/queue.pyi +0 -0
  199. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/retries.py +0 -0
  200. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/runner.pyi +0 -0
  201. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/running_app.py +0 -0
  202. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/__init__.py +0 -0
  203. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/_filesystem.py +0 -0
  204. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/_snapshot.py +0 -0
  205. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/sandbox/sandbox.py +0 -0
  206. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/schedule.py +0 -0
  207. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/scheduler_placement.py +0 -0
  208. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/secret.py +0 -0
  209. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/secret.pyi +0 -0
  210. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/server.py +0 -0
  211. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/server.pyi +0 -0
  212. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/serving.py +0 -0
  213. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/serving.pyi +0 -0
  214. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/skills/modal/SKILL.md +0 -0
  215. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/stream_type.py +0 -0
  216. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/token_flow.py +0 -0
  217. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/token_flow.pyi +0 -0
  218. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/types.py +0 -0
  219. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/volume.py +0 -0
  220. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/volume.pyi +0 -0
  221. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/workspace.py +0 -0
  222. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal/workspace.pyi +0 -0
  223. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/dependency_links.txt +0 -0
  224. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/entry_points.txt +0 -0
  225. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/requires.txt +0 -0
  226. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal.egg-info/top_level.txt +0 -0
  227. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/__init__.py +0 -0
  228. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/gen_cli_docs.py +0 -0
  229. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
  230. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/gen_reference_docs.py +0 -0
  231. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
  232. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/mdmd/__init__.py +0 -0
  233. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/mdmd/mdmd.py +0 -0
  234. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/mdmd/signatures.py +0 -0
  235. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/mdmd/types.py +0 -0
  236. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_docs/reference_intro.md +0 -0
  237. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/__init__.py +0 -0
  238. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/api_grpc.py +0 -0
  239. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/api_pb2_grpc.py +0 -0
  240. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/api_pb2_grpc.pyi +0 -0
  241. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/modal_api_grpc.py +0 -0
  242. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/py.typed +0 -0
  243. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/task_command_router_grpc.py +0 -0
  244. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/task_command_router_pb2.py +0 -0
  245. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
  246. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  247. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  248. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/modal_version/__main__.py +0 -0
  249. {modal-1.6.3.dev4 → modal-1.6.3.dev5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.3.dev4
3
+ Version: 1.6.3.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
@@ -212,23 +212,32 @@ def _dockerhub_python_version(
212
212
  python_version = _validate_python_version(
213
213
  python_version, builder_version, allow_free_threading=allow_free_threading, caller_name=caller_name
214
214
  )
215
+
215
216
  version_components = python_version.split(".")
216
217
 
217
- # When user specifies a full Python version, use that
218
- if len(version_components) > 2:
218
+ # - Users that want a specific patch version for reproducibility guarantees can specify that up
219
+ # front
220
+ # - Users on the newest builder can force-rebuild to get the latest patch versions, allowing
221
+ # quick responses to upstream bug fixes / CVEs.
222
+ if builder_version > "2025.06" or len(version_components) > 2:
219
223
  return python_version
220
224
 
221
225
  # Otherwise, use the same series, but a specific micro version, corresponding to the latest
222
226
  # available from https://hub.docker.com/_/python at the time of each image builder release.
223
227
  # This allows us to publish one pre-built debian-slim image per Python series.
224
228
  python_versions = _base_image_config("python", builder_version)
225
- series_to_micro_version = dict(tuple(v.rsplit(".", 1)) for v in python_versions)
229
+ series_to_micro_version: dict[str, str] = {}
230
+ for v in python_versions:
231
+ series, micro = v.rsplit(".", 1)
232
+ series_to_micro_version[series] = micro
226
233
  python_series_requested = "{}.{}".format(*version_components)
227
234
  micro_version = series_to_micro_version[python_series_requested]
228
235
  return f"{python_series_requested}.{micro_version}"
229
236
 
230
237
 
231
238
  def _base_image_config(group: str, builder_version: ImageBuilderVersion) -> Any:
239
+ # data["python"] does not include image builder versions more recent than `2025.06`, as those do
240
+ # not rely on hardcoded patch versions.
232
241
  with open(LOCAL_REQUIREMENTS_DIR / "base-images.json") as f:
233
242
  data = json.load(f)
234
243
  return data[group][builder_version]
@@ -7,7 +7,7 @@ aiosignal==1.4.0 ; python_version >= "3.14"
7
7
  async-timeout==5.0.1 ; python_version < "3.11"
8
8
  attrs==25.3.0
9
9
  cbor2==5.7.0
10
- certifi==2025.4.26
10
+ certifi==2026.10.19
11
11
  frozenlist==1.6.0
12
12
  grpclib==0.4.8 ; python_version < "3.14"
13
13
  grpclib==0.4.9 ; python_version >= "3.14"
@@ -1,21 +1,12 @@
1
1
  {
2
2
  "debian": {
3
- "PREVIEW": "bookworm",
3
+ "PREVIEW": "trixie",
4
4
  "2025.06": "bookworm",
5
5
  "2024.10": "bookworm",
6
6
  "2024.04": "bookworm",
7
7
  "2023.12": "bullseye"
8
8
  },
9
9
  "python": {
10
- "PREVIEW": [
11
- "3.9.22",
12
- "3.10.17",
13
- "3.11.12",
14
- "3.12.10",
15
- "3.13.3",
16
- "3.14.2",
17
- "3.15.0"
18
- ],
19
10
  "2025.06": [
20
11
  "3.9.22",
21
12
  "3.10.17",
@@ -46,7 +37,7 @@
46
37
  ]
47
38
  },
48
39
  "micromamba": {
49
- "PREVIEW": "2.1.1-debian12-slim",
40
+ "PREVIEW": "2.9.0-debian13-slim",
50
41
  "2025.06": "2.1.1-debian12-slim",
51
42
  "2024.10": "1.5.10-bookworm-slim",
52
43
  "2024.04": "1.5.8-bookworm-slim",
@@ -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.3.dev4",
83
+ version: str = "1.6.3.dev5",
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.3.dev4",
293
+ version: str = "1.6.3.dev5",
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[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
  @property
774
774
  def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
@@ -43,7 +43,9 @@ from .exception import (
43
43
  )
44
44
  from .output import OutputManager
45
45
  from .running_app import RunningApp, running_app_from_layout
46
- from .sandbox._sandbox import _Sandbox
46
+ from .sandbox._common import SandboxCreateArgs
47
+ from .sandbox._impl_v2 import SandboxImplV2
48
+ from .sandbox._sandbox import _Sandbox, impl_class_for_create_args
47
49
  from .secret import _Secret
48
50
  from .stream_type import StreamType
49
51
 
@@ -758,21 +760,10 @@ async def _interactive_shell(
758
760
  for option in ("gpu", "network_file_systems"):
759
761
  if kwargs.pop(option, None):
760
762
  raise InvalidError(f"`{option}` is not supported for V2 sandboxes")
761
- sandbox = await _Sandbox._experimental_create(
762
- "sleep",
763
- "100000",
764
- app=_app,
765
- secrets=secrets,
766
- **kwargs,
767
- )
768
- else:
769
- sandbox = await _Sandbox._create(
770
- "sleep",
771
- "100000",
772
- app=_app,
773
- secrets=secrets,
774
- **kwargs,
775
- )
763
+ create_args = SandboxCreateArgs(args=("sleep", "100000"), secrets=secrets, **kwargs)
764
+ impl_cls = SandboxImplV2 if v2 else impl_class_for_create_args(create_args)
765
+ impl, metadata = await impl_cls.create(create_args, app=_app, client=None)
766
+ sandbox = _Sandbox._from_impl(impl, metadata)
776
767
 
777
768
  # Re-enable quiet mode before starting the interactive session
778
769
  output_mgr.set_quiet_mode(True)
@@ -790,15 +781,9 @@ async def _interactive_shell(
790
781
  await container_process.wait()
791
782
  except InteractiveTimeoutError:
792
783
  # Check on status of Sandbox. It may have crashed, causing connection failure.
793
- req = api_pb2.SandboxWaitRequest(sandbox_id=sandbox.object_id, timeout=0)
794
- if sandbox._is_v2:
795
- assert sandbox._client._auth_token_manager
796
- auth_token = await sandbox._client._auth_token_manager.get_token()
797
- resp = await sandbox._client._stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
798
- else:
799
- resp = await sandbox._client._stub.SandboxWait(req)
800
- if resp.result.exception:
801
- raise RemoteError(resp.result.exception)
784
+ await sandbox.poll()
785
+ if sandbox._impl.result is not None and sandbox._impl.result.exception:
786
+ raise RemoteError(sandbox._impl.result.exception)
802
787
  else:
803
788
  raise
804
789