modal 1.5.2.dev9__tar.gz → 1.5.2.dev11__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 (230) hide show
  1. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/PKG-INFO +1 -1
  2. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_function_variants.py +4 -0
  3. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_functions.py +2 -0
  4. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_image.py +1 -1
  5. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/task_command_router_client.py +8 -0
  6. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/client.pyi +2 -2
  7. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/functions.pyi +1 -0
  8. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox.py +48 -9
  9. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox.pyi +65 -3
  10. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_version/__init__.py +1 -1
  12. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/LICENSE +0 -0
  13. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/README.md +0 -0
  14. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/__init__.py +0 -0
  15. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/__main__.py +0 -0
  16. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_billing.py +0 -0
  17. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_clustered_functions.py +0 -0
  18. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_clustered_functions.pyi +0 -0
  19. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_container_entrypoint.py +0 -0
  20. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_environments.py +0 -0
  21. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_grpc_client.py +0 -0
  22. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_ipython.py +0 -0
  23. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_load_context.py +0 -0
  24. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_location.py +0 -0
  25. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_logs.py +0 -0
  26. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_object.py +0 -0
  27. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/__init__.py +0 -0
  28. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/manager.py +0 -0
  29. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/pty.py +0 -0
  30. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/rich.py +0 -0
  31. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_output/status.py +0 -0
  32. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_partial_function.py +0 -0
  33. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_resolver.py +0 -0
  34. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_resources.py +0 -0
  35. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/__init__.py +0 -0
  36. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/asgi.py +0 -0
  37. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.py +0 -0
  38. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
  39. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/execution_context.py +0 -0
  40. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/execution_context.pyi +0 -0
  41. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  42. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.py +0 -0
  43. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  44. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/telemetry.py +0 -0
  45. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
  46. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_runtime/user_code_imports.py +0 -0
  47. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_serialization.py +0 -0
  48. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_server.py +0 -0
  49. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_traceback.py +0 -0
  50. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_tunnel.py +0 -0
  51. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_tunnel.pyi +0 -0
  52. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_type_manager.py +0 -0
  53. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/__init__.py +0 -0
  54. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/app_utils.py +0 -0
  55. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/async_utils.py +0 -0
  56. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/auth_token_manager.py +0 -0
  57. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/blob_utils.py +0 -0
  58. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/browser_utils.py +0 -0
  59. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
  60. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/curl_utils.py +0 -0
  61. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/deprecation.py +0 -0
  62. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/docker_utils.py +0 -0
  63. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/function_utils.py +0 -0
  64. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/git_utils.py +0 -0
  65. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/grpc_testing.py +0 -0
  66. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/grpc_utils.py +0 -0
  67. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/hash_utils.py +0 -0
  68. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/http_utils.py +0 -0
  69. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/jwt_utils.py +0 -0
  70. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/logger.py +0 -0
  71. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/mount_utils.py +0 -0
  72. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/name_utils.py +0 -0
  73. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/package_utils.py +0 -0
  74. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/pattern_utils.py +0 -0
  75. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/proxy_support.py +0 -0
  76. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/rand_pb_testing.py +0 -0
  77. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/sandbox_fs_utils.py +0 -0
  78. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/shell_utils.py +0 -0
  79. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_utils/time_utils.py +0 -0
  80. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/__init__.py +0 -0
  81. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  82. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/cloudpickle.py +0 -0
  83. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/tblib.py +0 -0
  84. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_vendor/version.py +0 -0
  85. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_watcher.py +0 -0
  86. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/_workspace.py +0 -0
  87. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/app.py +0 -0
  88. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/app.pyi +0 -0
  89. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/billing.py +0 -0
  90. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/billing.pyi +0 -0
  91. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2023.12.312.txt +0 -0
  92. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2023.12.txt +0 -0
  93. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2024.04.txt +0 -0
  94. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2024.10.txt +0 -0
  95. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/2025.06.txt +0 -0
  96. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/PREVIEW.txt +0 -0
  97. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/README.md +0 -0
  98. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/builder/base-images.json +0 -0
  99. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/call_graph.py +0 -0
  100. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/__init__.py +0 -0
  101. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_download.py +0 -0
  102. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_help.py +0 -0
  103. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/_traceback.py +0 -0
  104. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/app.py +0 -0
  105. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/billing.py +0 -0
  106. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/bootstrap.py +0 -0
  107. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/changelog.py +0 -0
  108. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/cluster.py +0 -0
  109. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/config.py +0 -0
  110. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/container.py +0 -0
  111. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/curl.py +0 -0
  112. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/dashboard.py +0 -0
  113. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/dict.py +0 -0
  114. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/endpoint.py +0 -0
  115. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/entry_point.py +0 -0
  116. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/environment.py +0 -0
  117. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/image.py +0 -0
  118. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/import_refs.py +0 -0
  119. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/launch.py +0 -0
  120. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/logo.py +0 -0
  121. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/network_file_system.py +0 -0
  122. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/profile.py +0 -0
  123. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/__init__.py +0 -0
  124. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/run_jupyter.py +0 -0
  125. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/programs/vscode.py +0 -0
  126. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/queues.py +0 -0
  127. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/run.py +0 -0
  128. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/secret.py +0 -0
  129. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/selector.py +0 -0
  130. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/shell.py +0 -0
  131. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/skills.py +0 -0
  132. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/token.py +0 -0
  133. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/utils.py +0 -0
  134. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/volume.py +0 -0
  135. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cli/workspace.py +0 -0
  136. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/client.py +0 -0
  137. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.py +0 -0
  138. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.pyi +0 -0
  139. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cls.py +0 -0
  140. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/cls.pyi +0 -0
  141. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/config.py +0 -0
  142. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/container_process.py +0 -0
  143. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/container_process.pyi +0 -0
  144. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/dict.py +0 -0
  145. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/dict.pyi +0 -0
  146. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/environments.py +0 -0
  147. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/environments.pyi +0 -0
  148. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/exception.py +0 -0
  149. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/__init__.py +0 -0
  150. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/flash.py +0 -0
  151. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/flash.pyi +0 -0
  152. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/experimental/ipython.py +0 -0
  153. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_io.py +0 -0
  154. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_io.pyi +0 -0
  155. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/file_pattern_matcher.py +0 -0
  156. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/functions.py +0 -0
  157. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/image.py +0 -0
  158. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/image.pyi +0 -0
  159. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/io_streams.py +0 -0
  160. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/io_streams.pyi +0 -0
  161. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/mount.py +0 -0
  162. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/mount.pyi +0 -0
  163. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/network_file_system.py +0 -0
  164. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/network_file_system.pyi +0 -0
  165. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/object.py +0 -0
  166. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/object.pyi +0 -0
  167. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/output.py +0 -0
  168. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/parallel_map.py +0 -0
  169. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/parallel_map.pyi +0 -0
  170. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/partial_function.py +0 -0
  171. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/partial_function.pyi +0 -0
  172. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/proxy.py +0 -0
  173. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/proxy.pyi +0 -0
  174. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/py.typed +0 -0
  175. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/queue.py +0 -0
  176. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/queue.pyi +0 -0
  177. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/retries.py +0 -0
  178. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/runner.py +0 -0
  179. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/runner.pyi +0 -0
  180. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/running_app.py +0 -0
  181. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox_fs.py +0 -0
  182. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/sandbox_fs.pyi +0 -0
  183. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/schedule.py +0 -0
  184. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/scheduler_placement.py +0 -0
  185. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/secret.py +0 -0
  186. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/secret.pyi +0 -0
  187. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/server.py +0 -0
  188. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/server.pyi +0 -0
  189. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/serving.py +0 -0
  190. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/serving.pyi +0 -0
  191. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/skills/modal/SKILL.md +0 -0
  192. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/snapshot.py +0 -0
  193. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/snapshot.pyi +0 -0
  194. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/stream_type.py +0 -0
  195. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/token_flow.py +0 -0
  196. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/token_flow.pyi +0 -0
  197. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/volume.py +0 -0
  198. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/volume.pyi +0 -0
  199. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/workspace.py +0 -0
  200. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal/workspace.pyi +0 -0
  201. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/SOURCES.txt +0 -0
  202. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/dependency_links.txt +0 -0
  203. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/entry_points.txt +0 -0
  204. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/requires.txt +0 -0
  205. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal.egg-info/top_level.txt +0 -0
  206. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/__init__.py +0 -0
  207. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs.py +0 -0
  208. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs_main.py +0 -0
  209. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs.py +0 -0
  210. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs_main.py +0 -0
  211. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/__init__.py +0 -0
  212. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/mdmd.py +0 -0
  213. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/signatures.py +0 -0
  214. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_docs/mdmd/types.py +0 -0
  215. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/__init__.py +0 -0
  216. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_grpc.py +0 -0
  217. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2.py +0 -0
  218. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2.pyi +0 -0
  219. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.py +0 -0
  220. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.pyi +0 -0
  221. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/modal_api_grpc.py +0 -0
  222. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/py.typed +0 -0
  223. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_grpc.py +0 -0
  224. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.py +0 -0
  225. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
  226. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  227. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  228. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/modal_version/__main__.py +0 -0
  229. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/pyproject.toml +0 -0
  230. {modal-1.5.2.dev9 → modal-1.5.2.dev11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev9
3
+ Version: 1.5.2.dev11
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -51,6 +51,7 @@ class _FunctionOptions:
51
51
  target_concurrent_inputs: int | None = None
52
52
  batch_max_size: int | None = None
53
53
  batch_wait_ms: int | None = None
54
+ routing_region: str | None = None
54
55
 
55
56
  @classmethod
56
57
  def new(
@@ -73,6 +74,7 @@ class _FunctionOptions:
73
74
  target_concurrent_inputs: int | None = None,
74
75
  batch_max_size: int | None = None,
75
76
  batch_wait_ms: int | None = None,
77
+ routing_region: str | None = None,
76
78
  ) -> "_FunctionOptions":
77
79
  """Internal constructor that validates and normalizes public parameters."""
78
80
  retry_policy = _parse_retries(retries)
@@ -119,6 +121,7 @@ class _FunctionOptions:
119
121
  target_concurrent_inputs=target_concurrent_inputs,
120
122
  batch_max_size=batch_max_size,
121
123
  batch_wait_ms=batch_wait_ms,
124
+ routing_region=routing_region,
122
125
  )
123
126
 
124
127
  def merge_options(self, new_options: "_FunctionOptions") -> "_FunctionOptions":
@@ -182,6 +185,7 @@ class _FunctionOptions:
182
185
  batch_linger_ms=self.batch_wait_ms,
183
186
  scheduler_placement=self.scheduler_placement,
184
187
  cloud_provider_str=self.cloud,
188
+ routing_region=self.routing_region,
185
189
  )
186
190
 
187
191
 
@@ -1519,6 +1519,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1519
1519
  timeout: int | None = None,
1520
1520
  region: str | Sequence[str] | None = None,
1521
1521
  cloud: str | None = None,
1522
+ routing_region: str | None = None,
1522
1523
  ) -> "_Function[P, ReturnType, OriginalReturnType]":
1523
1524
  """Dynamically override the static Function configuration with invocation-specific values.
1524
1525
 
@@ -1567,6 +1568,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1567
1568
  timeout=timeout,
1568
1569
  region=region,
1569
1570
  cloud=cloud,
1571
+ routing_region=routing_region,
1570
1572
  )
1571
1573
 
1572
1574
  return self._apply_dynamic_config(options, "with_options")
@@ -1022,7 +1022,7 @@ class _Image(_Object, type_prefix="im"):
1022
1022
  ```
1023
1023
  """
1024
1024
  if app.app_id is None:
1025
- raise InvalidError("App has not been initialized yet. Use the content manager `app.run()` or `App.lookup`")
1025
+ raise InvalidError("App has not been initialized yet. Use the context manager `app.run()` or `App.lookup`")
1026
1026
 
1027
1027
  resolver = Resolver()
1028
1028
  async with TaskContext() as tc:
@@ -811,6 +811,14 @@ class TaskCommandRouterClient:
811
811
  lambda: self._call_with_auth_retry(self._stub.TaskSetNetworkAccess, request)
812
812
  )
813
813
 
814
+ async def reload_volumes(self, task_id: str) -> sr_pb2.TaskReloadVolumesResponse:
815
+ """Reload all Volumes mounted in the task to reflect their latest committed state."""
816
+ request = sr_pb2.TaskReloadVolumesRequest(task_id=task_id)
817
+ with grpc_error_converter():
818
+ return await call_with_retries_on_transient_errors(
819
+ lambda: self._call_with_auth_retry(self._stub.TaskReloadVolumes, request)
820
+ )
821
+
814
822
  async def _snapshot_with_deadline(self, rpc, request, *, timeout: float, **kwargs):
815
823
  # helper method for snapshot_directory and snapshot_filesystem to handle grpc
816
824
  # deadlines in a consistent way, converting any error to TimeoutError after passing
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.5.2.dev9",
38
+ version: str = "1.5.2.dev11",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.5.2.dev9",
208
+ version: str = "1.5.2.dev11",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -371,6 +371,7 @@ class Function(
371
371
  timeout: typing.Optional[int] = None,
372
372
  region: typing.Union[str, collections.abc.Sequence[str], None] = None,
373
373
  cloud: typing.Optional[str] = None,
374
+ routing_region: typing.Optional[str] = None,
374
375
  ) -> Function[modal._functions.P, modal._functions.ReturnType, modal._functions.OriginalReturnType]:
375
376
  """Dynamically override the static Function configuration with invocation-specific values.
376
377
 
@@ -39,7 +39,12 @@ from ._resolver import Resolver
39
39
  from ._resources import convert_fn_config_to_resources_config
40
40
  from ._utils.async_utils import TaskContext, synchronize_api
41
41
  from ._utils.deprecation import deprecation_warning
42
- from ._utils.mount_utils import validate_network_file_systems, validate_volumes, validate_volumes_by_object_id
42
+ from ._utils.mount_utils import (
43
+ validate_network_file_systems,
44
+ validate_only_modal_volumes,
45
+ validate_volumes,
46
+ validate_volumes_by_object_id,
47
+ )
43
48
  from ._utils.name_utils import check_object_name
44
49
  from ._utils.task_command_router_client import TaskCommandRouterClient
45
50
  from .client import _Client
@@ -1638,13 +1643,16 @@ class _Sandbox(_Object, type_prefix="sb"):
1638
1643
  Added in v1.1.0.
1639
1644
 
1640
1645
  """
1641
- self._ensure_v1("reload_volumes")
1642
1646
  task_id = await self._get_task_id()
1643
- await self._client.stub.ContainerReloadVolumes(
1644
- api_pb2.ContainerReloadVolumesRequest(
1645
- task_id=task_id,
1646
- ),
1647
- )
1647
+ if self._is_v2:
1648
+ command_router_client = await self._get_command_router_client(task_id)
1649
+ await command_router_client.reload_volumes(task_id)
1650
+ else:
1651
+ await self._client.stub.ContainerReloadVolumes(
1652
+ api_pb2.ContainerReloadVolumesRequest(
1653
+ task_id=task_id,
1654
+ ),
1655
+ )
1648
1656
 
1649
1657
  @overload
1650
1658
  async def terminate(
@@ -2538,13 +2546,34 @@ class _SidecarManager:
2538
2546
  env: dict[str, str] | None = None,
2539
2547
  secrets: Collection[_Secret] | None = None,
2540
2548
  workdir: str | None = None,
2549
+ volumes: dict[str | os.PathLike, _Volume] | None = None,
2541
2550
  ) -> _SidecarContainer:
2551
+ """Create a sidecar container running alongside the Sandbox's main container.
2552
+
2553
+ Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
2554
+ can be used to run auxiliary processes, such as a database or a service the main container
2555
+ depends on.
2556
+
2557
+ Args:
2558
+ *args: Command and arguments to run inside the sidecar container.
2559
+ name: Unique name for the sidecar container. The name ``"main"`` is reserved.
2560
+ image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
2561
+ env: Environment variables to set in the sidecar container.
2562
+ secrets: Secrets to inject as environment variables in the sidecar container.
2563
+ workdir: Working directory for the command; must be absolute if set.
2564
+ volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
2565
+
2566
+ Returns:
2567
+ A `SidecarContainer` handle for the running container.
2568
+ """
2542
2569
  if name == _MAIN_CONTAINER_NAME:
2543
2570
  raise InvalidError(f"The name {_MAIN_CONTAINER_NAME!r} is reserved for the sandbox's main container.")
2544
2571
  if workdir is not None and not workdir.startswith("/"):
2545
2572
  raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
2546
2573
  _validate_exec_args(args)
2547
2574
 
2575
+ validated_volumes = validate_only_modal_volumes(volumes, "Sandbox._experimental_sidecars.create(volumes=...)")
2576
+
2548
2577
  if image._mount_layers:
2549
2578
  raise InvalidError(
2550
2579
  "Sandbox._experimental_sidecars.create(image=...) only supports pre-built images. "
@@ -2564,8 +2593,17 @@ class _SidecarManager:
2564
2593
  )
2565
2594
 
2566
2595
  secrets = secrets or []
2567
- secret_coros = [secret.hydrate(client=self._sandbox._client) for secret in secrets]
2568
- await TaskContext.gather(*secret_coros)
2596
+ hydrate_coros = [secret.hydrate(client=self._sandbox._client) for secret in secrets] + [
2597
+ volume.hydrate(client=self._sandbox._client) for _, volume in validated_volumes
2598
+ ]
2599
+ await TaskContext.gather(*hydrate_coros)
2600
+
2601
+ # Validate that the same volume (by object_id) isn't mounted at multiple paths. This relies on
2602
+ # the volumes being hydrated above, since it compares object_ids.
2603
+ validate_volumes_by_object_id(validated_volumes)
2604
+
2605
+ # Relies on dicts being ordered (true as of Python 3.6).
2606
+ volume_mounts = [_volume_to_mount_proto(path, volume) for path, volume in validated_volumes]
2569
2607
 
2570
2608
  task_id, command_router_client = await self._get_command_router()
2571
2609
 
@@ -2577,6 +2615,7 @@ class _SidecarManager:
2577
2615
  env=env or {},
2578
2616
  workdir=workdir or "",
2579
2617
  secret_ids=[secret.object_id for secret in secrets],
2618
+ volume_mounts=volume_mounts,
2580
2619
  )
2581
2620
  create_resp = await command_router_client.container_create(create_req)
2582
2621
  container_id = create_resp.container_id
@@ -1046,7 +1046,28 @@ class _SidecarManager:
1046
1046
  env: typing.Optional[dict[str, str]] = None,
1047
1047
  secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
1048
1048
  workdir: typing.Optional[str] = None,
1049
- ) -> _SidecarContainer: ...
1049
+ volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume._Volume]] = None,
1050
+ ) -> _SidecarContainer:
1051
+ """Create a sidecar container running alongside the Sandbox's main container.
1052
+
1053
+ Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
1054
+ can be used to run auxiliary processes, such as a database or a service the main container
1055
+ depends on.
1056
+
1057
+ Args:
1058
+ *args: Command and arguments to run inside the sidecar container.
1059
+ name: Unique name for the sidecar container. The name ``"main"`` is reserved.
1060
+ image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
1061
+ env: Environment variables to set in the sidecar container.
1062
+ secrets: Secrets to inject as environment variables in the sidecar container.
1063
+ workdir: Working directory for the command; must be absolute if set.
1064
+ volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
1065
+
1066
+ Returns:
1067
+ A `SidecarContainer` handle for the running container.
1068
+ """
1069
+ ...
1070
+
1050
1071
  async def get(self, *, name: str, include_terminated: bool = False) -> _SidecarContainer: ...
1051
1072
  async def list(self, include_terminated: bool = False) -> list[_SidecarContainer]: ...
1052
1073
 
@@ -1201,7 +1222,28 @@ class SidecarManager:
1201
1222
  env: typing.Optional[dict[str, str]] = None,
1202
1223
  secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
1203
1224
  workdir: typing.Optional[str] = None,
1204
- ) -> SidecarContainer: ...
1225
+ volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume.Volume]] = None,
1226
+ ) -> SidecarContainer:
1227
+ """Create a sidecar container running alongside the Sandbox's main container.
1228
+
1229
+ Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
1230
+ can be used to run auxiliary processes, such as a database or a service the main container
1231
+ depends on.
1232
+
1233
+ Args:
1234
+ *args: Command and arguments to run inside the sidecar container.
1235
+ name: Unique name for the sidecar container. The name ``"main"`` is reserved.
1236
+ image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
1237
+ env: Environment variables to set in the sidecar container.
1238
+ secrets: Secrets to inject as environment variables in the sidecar container.
1239
+ workdir: Working directory for the command; must be absolute if set.
1240
+ volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
1241
+
1242
+ Returns:
1243
+ A `SidecarContainer` handle for the running container.
1244
+ """
1245
+ ...
1246
+
1205
1247
  async def aio(
1206
1248
  self,
1207
1249
  /,
@@ -1211,7 +1253,27 @@ class SidecarManager:
1211
1253
  env: typing.Optional[dict[str, str]] = None,
1212
1254
  secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
1213
1255
  workdir: typing.Optional[str] = None,
1214
- ) -> SidecarContainer: ...
1256
+ volumes: typing.Optional[dict[typing.Union[str, os.PathLike], modal.volume.Volume]] = None,
1257
+ ) -> SidecarContainer:
1258
+ """Create a sidecar container running alongside the Sandbox's main container.
1259
+
1260
+ Sidecar containers share the Sandbox's lifecycle but run their own Image and command. They
1261
+ can be used to run auxiliary processes, such as a database or a service the main container
1262
+ depends on.
1263
+
1264
+ Args:
1265
+ *args: Command and arguments to run inside the sidecar container.
1266
+ name: Unique name for the sidecar container. The name ``"main"`` is reserved.
1267
+ image: Image to run the sidecar container with. Must be a pre-built or referenced Image.
1268
+ env: Environment variables to set in the sidecar container.
1269
+ secrets: Secrets to inject as environment variables in the sidecar container.
1270
+ workdir: Working directory for the command; must be absolute if set.
1271
+ volumes: Mapping of mount paths to `Volume` objects to mount in the sidecar container.
1272
+
1273
+ Returns:
1274
+ A `SidecarContainer` handle for the running container.
1275
+ """
1276
+ ...
1215
1277
 
1216
1278
  create: __create_spec
1217
1279
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev9
3
+ Version: 1.5.2.dev11
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.2.dev9"
4
+ __version__ = "1.5.2.dev11"
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