modal 1.5.2.dev10__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.dev10 → modal-1.5.2.dev11}/PKG-INFO +1 -1
  2. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_image.py +1 -1
  3. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/task_command_router_client.py +8 -0
  4. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/client.pyi +2 -2
  5. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/functions.pyi +6 -6
  6. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox.py +48 -9
  7. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox.pyi +65 -3
  8. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_version/__init__.py +1 -1
  10. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/LICENSE +0 -0
  11. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/README.md +0 -0
  12. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/__init__.py +0 -0
  13. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/__main__.py +0 -0
  14. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_billing.py +0 -0
  15. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_clustered_functions.py +0 -0
  16. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_container_entrypoint.py +0 -0
  18. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_environments.py +0 -0
  19. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_function_variants.py +0 -0
  20. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_functions.py +0 -0
  21. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_grpc_client.py +0 -0
  22. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_ipython.py +0 -0
  23. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_load_context.py +0 -0
  24. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_location.py +0 -0
  25. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_logs.py +0 -0
  26. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_object.py +0 -0
  27. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/__init__.py +0 -0
  28. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/manager.py +0 -0
  29. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/pty.py +0 -0
  30. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/rich.py +0 -0
  31. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_output/status.py +0 -0
  32. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_partial_function.py +0 -0
  33. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_resolver.py +0 -0
  34. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_resources.py +0 -0
  35. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/__init__.py +0 -0
  36. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/asgi.py +0 -0
  37. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.py +0 -0
  38. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
  39. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/execution_context.py +0 -0
  40. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/execution_context.pyi +0 -0
  41. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  42. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.py +0 -0
  43. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  44. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/telemetry.py +0 -0
  45. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
  46. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_runtime/user_code_imports.py +0 -0
  47. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_serialization.py +0 -0
  48. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_server.py +0 -0
  49. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_traceback.py +0 -0
  50. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_tunnel.py +0 -0
  51. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_tunnel.pyi +0 -0
  52. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_type_manager.py +0 -0
  53. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/__init__.py +0 -0
  54. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/app_utils.py +0 -0
  55. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/async_utils.py +0 -0
  56. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/auth_token_manager.py +0 -0
  57. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/blob_utils.py +0 -0
  58. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/browser_utils.py +0 -0
  59. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
  60. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/curl_utils.py +0 -0
  61. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/deprecation.py +0 -0
  62. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/docker_utils.py +0 -0
  63. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/function_utils.py +0 -0
  64. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/git_utils.py +0 -0
  65. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/grpc_testing.py +0 -0
  66. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/grpc_utils.py +0 -0
  67. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/hash_utils.py +0 -0
  68. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/http_utils.py +0 -0
  69. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/jwt_utils.py +0 -0
  70. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/logger.py +0 -0
  71. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/mount_utils.py +0 -0
  72. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/name_utils.py +0 -0
  73. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/package_utils.py +0 -0
  74. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/pattern_utils.py +0 -0
  75. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/proxy_support.py +0 -0
  76. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/rand_pb_testing.py +0 -0
  77. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/sandbox_fs_utils.py +0 -0
  78. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/shell_utils.py +0 -0
  79. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_utils/time_utils.py +0 -0
  80. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/__init__.py +0 -0
  81. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  82. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/cloudpickle.py +0 -0
  83. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/tblib.py +0 -0
  84. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_vendor/version.py +0 -0
  85. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_watcher.py +0 -0
  86. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/_workspace.py +0 -0
  87. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/app.py +0 -0
  88. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/app.pyi +0 -0
  89. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/billing.py +0 -0
  90. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/billing.pyi +0 -0
  91. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2023.12.312.txt +0 -0
  92. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2023.12.txt +0 -0
  93. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2024.04.txt +0 -0
  94. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2024.10.txt +0 -0
  95. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/2025.06.txt +0 -0
  96. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/PREVIEW.txt +0 -0
  97. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/README.md +0 -0
  98. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/builder/base-images.json +0 -0
  99. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/call_graph.py +0 -0
  100. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/__init__.py +0 -0
  101. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_download.py +0 -0
  102. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_help.py +0 -0
  103. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/_traceback.py +0 -0
  104. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/app.py +0 -0
  105. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/billing.py +0 -0
  106. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/bootstrap.py +0 -0
  107. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/changelog.py +0 -0
  108. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/cluster.py +0 -0
  109. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/config.py +0 -0
  110. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/container.py +0 -0
  111. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/curl.py +0 -0
  112. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/dashboard.py +0 -0
  113. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/dict.py +0 -0
  114. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/endpoint.py +0 -0
  115. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/entry_point.py +0 -0
  116. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/environment.py +0 -0
  117. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/image.py +0 -0
  118. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/import_refs.py +0 -0
  119. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/launch.py +0 -0
  120. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/logo.py +0 -0
  121. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/network_file_system.py +0 -0
  122. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/profile.py +0 -0
  123. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/__init__.py +0 -0
  124. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/run_jupyter.py +0 -0
  125. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/programs/vscode.py +0 -0
  126. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/queues.py +0 -0
  127. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/run.py +0 -0
  128. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/secret.py +0 -0
  129. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/selector.py +0 -0
  130. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/shell.py +0 -0
  131. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/skills.py +0 -0
  132. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/token.py +0 -0
  133. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/utils.py +0 -0
  134. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/volume.py +0 -0
  135. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cli/workspace.py +0 -0
  136. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/client.py +0 -0
  137. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.py +0 -0
  138. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cloud_bucket_mount.pyi +0 -0
  139. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cls.py +0 -0
  140. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/cls.pyi +0 -0
  141. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/config.py +0 -0
  142. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/container_process.py +0 -0
  143. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/container_process.pyi +0 -0
  144. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/dict.py +0 -0
  145. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/dict.pyi +0 -0
  146. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/environments.py +0 -0
  147. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/environments.pyi +0 -0
  148. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/exception.py +0 -0
  149. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/__init__.py +0 -0
  150. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/flash.py +0 -0
  151. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/flash.pyi +0 -0
  152. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/experimental/ipython.py +0 -0
  153. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_io.py +0 -0
  154. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_io.pyi +0 -0
  155. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/file_pattern_matcher.py +0 -0
  156. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/functions.py +0 -0
  157. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/image.py +0 -0
  158. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/image.pyi +0 -0
  159. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/io_streams.py +0 -0
  160. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/io_streams.pyi +0 -0
  161. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/mount.py +0 -0
  162. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/mount.pyi +0 -0
  163. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/network_file_system.py +0 -0
  164. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/network_file_system.pyi +0 -0
  165. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/object.py +0 -0
  166. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/object.pyi +0 -0
  167. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/output.py +0 -0
  168. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/parallel_map.py +0 -0
  169. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/parallel_map.pyi +0 -0
  170. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/partial_function.py +0 -0
  171. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/partial_function.pyi +0 -0
  172. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/proxy.py +0 -0
  173. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/proxy.pyi +0 -0
  174. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/py.typed +0 -0
  175. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/queue.py +0 -0
  176. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/queue.pyi +0 -0
  177. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/retries.py +0 -0
  178. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/runner.py +0 -0
  179. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/runner.pyi +0 -0
  180. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/running_app.py +0 -0
  181. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox_fs.py +0 -0
  182. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/sandbox_fs.pyi +0 -0
  183. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/schedule.py +0 -0
  184. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/scheduler_placement.py +0 -0
  185. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/secret.py +0 -0
  186. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/secret.pyi +0 -0
  187. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/server.py +0 -0
  188. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/server.pyi +0 -0
  189. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/serving.py +0 -0
  190. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/serving.pyi +0 -0
  191. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/skills/modal/SKILL.md +0 -0
  192. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/snapshot.py +0 -0
  193. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/snapshot.pyi +0 -0
  194. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/stream_type.py +0 -0
  195. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/token_flow.py +0 -0
  196. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/token_flow.pyi +0 -0
  197. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/volume.py +0 -0
  198. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/volume.pyi +0 -0
  199. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/workspace.py +0 -0
  200. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal/workspace.pyi +0 -0
  201. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/SOURCES.txt +0 -0
  202. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/dependency_links.txt +0 -0
  203. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/entry_points.txt +0 -0
  204. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/requires.txt +0 -0
  205. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal.egg-info/top_level.txt +0 -0
  206. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/__init__.py +0 -0
  207. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs.py +0 -0
  208. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_cli_docs_main.py +0 -0
  209. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs.py +0 -0
  210. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/gen_reference_docs_main.py +0 -0
  211. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/__init__.py +0 -0
  212. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/mdmd.py +0 -0
  213. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/signatures.py +0 -0
  214. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_docs/mdmd/types.py +0 -0
  215. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/__init__.py +0 -0
  216. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_grpc.py +0 -0
  217. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2.py +0 -0
  218. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2.pyi +0 -0
  219. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.py +0 -0
  220. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/api_pb2_grpc.pyi +0 -0
  221. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/modal_api_grpc.py +0 -0
  222. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/py.typed +0 -0
  223. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_grpc.py +0 -0
  224. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.py +0 -0
  225. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
  226. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  227. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  228. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/modal_version/__main__.py +0 -0
  229. {modal-1.5.2.dev10 → modal-1.5.2.dev11}/pyproject.toml +0 -0
  230. {modal-1.5.2.dev10 → 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.dev10
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
@@ -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.dev10",
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.dev10",
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.
@@ -491,7 +491,7 @@ class Function(
491
491
 
492
492
  _call_generator: ___call_generator_spec
493
493
 
494
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
494
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
495
495
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
496
496
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
497
497
 
@@ -516,7 +516,7 @@ class Function(
516
516
  """
517
517
  ...
518
518
 
519
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
519
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
520
520
 
521
521
  class __remote_gen_spec(typing_extensions.Protocol):
522
522
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -566,7 +566,7 @@ class Function(
566
566
  """
567
567
  ...
568
568
 
569
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
569
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
570
570
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
571
571
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
572
572
 
@@ -599,7 +599,7 @@ class Function(
599
599
  """
600
600
  ...
601
601
 
602
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
602
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
603
603
 
604
604
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
605
605
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -607,7 +607,7 @@ class Function(
607
607
 
608
608
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
609
609
 
610
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
610
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
611
611
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
612
612
  """Calls the function with the given arguments, without waiting for the results.
613
613
 
@@ -640,7 +640,7 @@ class Function(
640
640
  """
641
641
  ...
642
642
 
643
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
643
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
644
644
 
645
645
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
646
646
  """Return the inner Python object wrapped by this Modal Function.
@@ -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.dev10
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.dev10"
4
+ __version__ = "1.5.2.dev11"
File without changes
File without changes
File without changes
File without changes
File without changes