modal 1.4.4.dev7__tar.gz → 1.4.4.dev8__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 (214) hide show
  1. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/PKG-INFO +1 -1
  2. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/shell.py +6 -6
  3. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/client.pyi +2 -2
  4. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox.py +34 -20
  5. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox.pyi +23 -21
  6. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox_fs.py +5 -5
  7. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/sandbox_fs.pyi +4 -4
  8. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_version/__init__.py +1 -1
  10. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/LICENSE +0 -0
  11. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/README.md +0 -0
  12. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/__init__.py +0 -0
  13. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/__main__.py +0 -0
  14. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_billing.py +0 -0
  15. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_clustered_functions.py +0 -0
  16. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_container_entrypoint.py +0 -0
  18. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_environments.py +0 -0
  19. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_function_variants.py +0 -0
  20. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_functions.py +0 -0
  21. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_grpc_client.py +0 -0
  22. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_ipython.py +0 -0
  23. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_load_context.py +0 -0
  24. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_location.py +0 -0
  25. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_logs.py +0 -0
  26. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_object.py +0 -0
  27. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/__init__.py +0 -0
  28. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/manager.py +0 -0
  29. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/pty.py +0 -0
  30. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/rich.py +0 -0
  31. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_output/status.py +0 -0
  32. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_partial_function.py +0 -0
  33. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_resolver.py +0 -0
  34. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_resources.py +0 -0
  35. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/__init__.py +0 -0
  36. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/asgi.py +0 -0
  37. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/container_io_manager.py +0 -0
  38. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/container_io_manager.pyi +0 -0
  39. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/execution_context.py +0 -0
  40. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/execution_context.pyi +0 -0
  41. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  42. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/telemetry.py +0 -0
  43. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/user_code_event_loop.py +0 -0
  44. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_runtime/user_code_imports.py +0 -0
  45. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_serialization.py +0 -0
  46. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_server.py +0 -0
  47. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_traceback.py +0 -0
  48. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_tunnel.py +0 -0
  49. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_tunnel.pyi +0 -0
  50. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_type_manager.py +0 -0
  51. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/__init__.py +0 -0
  52. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/app_utils.py +0 -0
  53. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/async_utils.py +0 -0
  54. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/auth_token_manager.py +0 -0
  55. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/blob_utils.py +0 -0
  56. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/browser_utils.py +0 -0
  57. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/bytes_io_segment_payload.py +0 -0
  58. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/deprecation.py +0 -0
  59. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/docker_utils.py +0 -0
  60. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/function_utils.py +0 -0
  61. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/git_utils.py +0 -0
  62. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/grpc_testing.py +0 -0
  63. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/grpc_utils.py +0 -0
  64. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/hash_utils.py +0 -0
  65. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/http_utils.py +0 -0
  66. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/jwt_utils.py +0 -0
  67. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/logger.py +0 -0
  68. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/mount_utils.py +0 -0
  69. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/name_utils.py +0 -0
  70. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/package_utils.py +0 -0
  71. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/pattern_utils.py +0 -0
  72. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/rand_pb_testing.py +0 -0
  73. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/sandbox_fs_utils.py +0 -0
  74. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/shell_utils.py +0 -0
  75. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/task_command_router_client.py +0 -0
  76. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_utils/time_utils.py +0 -0
  77. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/__init__.py +0 -0
  78. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  79. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/cloudpickle.py +0 -0
  80. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/tblib.py +0 -0
  81. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_vendor/version.py +0 -0
  82. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/_watcher.py +0 -0
  83. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/app.py +0 -0
  84. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/app.pyi +0 -0
  85. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/billing.py +0 -0
  86. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2023.12.312.txt +0 -0
  87. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2023.12.txt +0 -0
  88. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2024.04.txt +0 -0
  89. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2024.10.txt +0 -0
  90. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/2025.06.txt +0 -0
  91. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/PREVIEW.txt +0 -0
  92. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/README.md +0 -0
  93. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/builder/base-images.json +0 -0
  94. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/call_graph.py +0 -0
  95. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/__init__.py +0 -0
  96. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_download.py +0 -0
  97. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_help.py +0 -0
  98. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/_traceback.py +0 -0
  99. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/app.py +0 -0
  100. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/billing.py +0 -0
  101. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/bootstrap.py +0 -0
  102. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/changelog.py +0 -0
  103. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/cluster.py +0 -0
  104. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/config.py +0 -0
  105. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/container.py +0 -0
  106. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/dashboard.py +0 -0
  107. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/dict.py +0 -0
  108. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/entry_point.py +0 -0
  109. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/environment.py +0 -0
  110. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/import_refs.py +0 -0
  111. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/launch.py +0 -0
  112. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/logo.py +0 -0
  113. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/network_file_system.py +0 -0
  114. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/profile.py +0 -0
  115. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/__init__.py +0 -0
  116. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/run_jupyter.py +0 -0
  117. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/programs/vscode.py +0 -0
  118. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/queues.py +0 -0
  119. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/run.py +0 -0
  120. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/secret.py +0 -0
  121. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/selector.py +0 -0
  122. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/token.py +0 -0
  123. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/utils.py +0 -0
  124. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cli/volume.py +0 -0
  125. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/client.py +0 -0
  126. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cloud_bucket_mount.py +0 -0
  127. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cloud_bucket_mount.pyi +0 -0
  128. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cls.py +0 -0
  129. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/cls.pyi +0 -0
  130. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/config.py +0 -0
  131. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/container_process.py +0 -0
  132. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/container_process.pyi +0 -0
  133. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/dict.py +0 -0
  134. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/dict.pyi +0 -0
  135. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/environments.py +0 -0
  136. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/environments.pyi +0 -0
  137. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/exception.py +0 -0
  138. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/__init__.py +0 -0
  139. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/flash.py +0 -0
  140. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/flash.pyi +0 -0
  141. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/experimental/ipython.py +0 -0
  142. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_io.py +0 -0
  143. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_io.pyi +0 -0
  144. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/file_pattern_matcher.py +0 -0
  145. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/functions.py +0 -0
  146. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/functions.pyi +0 -0
  147. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/image.py +0 -0
  148. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/image.pyi +0 -0
  149. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/io_streams.py +0 -0
  150. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/io_streams.pyi +0 -0
  151. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/mount.py +0 -0
  152. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/mount.pyi +0 -0
  153. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/network_file_system.py +0 -0
  154. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/network_file_system.pyi +0 -0
  155. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/object.py +0 -0
  156. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/object.pyi +0 -0
  157. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/output.py +0 -0
  158. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/parallel_map.py +0 -0
  159. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/parallel_map.pyi +0 -0
  160. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/partial_function.py +0 -0
  161. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/partial_function.pyi +0 -0
  162. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/proxy.py +0 -0
  163. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/proxy.pyi +0 -0
  164. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/py.typed +0 -0
  165. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/queue.py +0 -0
  166. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/queue.pyi +0 -0
  167. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/retries.py +0 -0
  168. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/runner.py +0 -0
  169. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/runner.pyi +0 -0
  170. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/running_app.py +0 -0
  171. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/schedule.py +0 -0
  172. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/scheduler_placement.py +0 -0
  173. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/secret.py +0 -0
  174. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/secret.pyi +0 -0
  175. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/server.py +0 -0
  176. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/server.pyi +0 -0
  177. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/serving.py +0 -0
  178. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/serving.pyi +0 -0
  179. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/snapshot.py +0 -0
  180. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/snapshot.pyi +0 -0
  181. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/stream_type.py +0 -0
  182. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/token_flow.py +0 -0
  183. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/token_flow.pyi +0 -0
  184. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/volume.py +0 -0
  185. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal/volume.pyi +0 -0
  186. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/SOURCES.txt +0 -0
  187. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/dependency_links.txt +0 -0
  188. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/entry_points.txt +0 -0
  189. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/requires.txt +0 -0
  190. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal.egg-info/top_level.txt +0 -0
  191. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/__init__.py +0 -0
  192. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_cli_docs.py +0 -0
  193. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_cli_docs_main.py +0 -0
  194. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_reference_docs.py +0 -0
  195. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/gen_reference_docs_main.py +0 -0
  196. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/__init__.py +0 -0
  197. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/mdmd.py +0 -0
  198. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_docs/mdmd/signatures.py +0 -0
  199. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/__init__.py +0 -0
  200. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_grpc.py +0 -0
  201. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2.py +0 -0
  202. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2.pyi +0 -0
  203. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2_grpc.py +0 -0
  204. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/api_pb2_grpc.pyi +0 -0
  205. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/modal_api_grpc.py +0 -0
  206. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/py.typed +0 -0
  207. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_grpc.py +0 -0
  208. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2.py +0 -0
  209. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2.pyi +0 -0
  210. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  211. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  212. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/modal_version/__main__.py +0 -0
  213. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/pyproject.toml +0 -0
  214. {modal-1.4.4.dev7 → modal-1.4.4.dev8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.4.dev7
3
+ Version: 1.4.4.dev8
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -16,7 +16,7 @@ from ..functions import Function
16
16
  from ..image import Image
17
17
  from ..mount import _Mount
18
18
  from ..runner import interactive_shell
19
- from ..sandbox import Sandbox
19
+ from ..sandbox import _MAIN_CONTAINER_NAME, Sandbox
20
20
  from ..secret import Secret
21
21
  from ..stream_type import StreamType
22
22
  from ..volume import Volume
@@ -106,8 +106,8 @@ def _is_running_container_ref(ref: Optional[str]) -> bool:
106
106
  return _is_valid_modal_id(sandbox_id, "sb-") or _is_valid_modal_id(ref, "ta-")
107
107
 
108
108
 
109
- def _start_shell_in_sandbox_container(sandbox_id: str, container_name: str, cmd: str, pty: bool) -> None:
110
- """Shell into a named container within a sandbox."""
109
+ def _start_shell_in_sidecar_container(sandbox_id: str, container_name: str, cmd: str, pty: bool) -> None:
110
+ """Shell into a sidecar container within a sandbox."""
111
111
  try:
112
112
  sandbox = Sandbox.from_id(sandbox_id)
113
113
  except NotFoundError:
@@ -116,7 +116,7 @@ def _start_shell_in_sandbox_container(sandbox_id: str, container_name: str, cmd:
116
116
  raise ClickException(f"Error connecting to Sandbox '{sandbox_id}': {str(e)}")
117
117
 
118
118
  try:
119
- sandbox_container = sandbox._experimental_containers.get(name=container_name)
119
+ sandbox_container = sandbox._experimental_sidecars.get(name=container_name)
120
120
  process: Union[ContainerProcess[bytes], ContainerProcess[str]]
121
121
  if pty:
122
122
  # PTY output is raw terminal bytes, not text; strict UTF-8 decode
@@ -138,8 +138,8 @@ def _start_shell_in_sandbox_container(sandbox_id: str, container_name: str, cmd:
138
138
  def _start_shell_in_running_container(ref: str, cmd: str, pty: bool) -> None:
139
139
  sandbox_id, container_name = _parse_sandbox_container_ref(ref)
140
140
 
141
- if container_name is not None:
142
- return _start_shell_in_sandbox_container(sandbox_id, container_name, cmd, pty)
141
+ if container_name is not None and container_name != _MAIN_CONTAINER_NAME:
142
+ return _start_shell_in_sidecar_container(sandbox_id, container_name, cmd, pty)
143
143
 
144
144
  if _is_valid_modal_id(sandbox_id, "sb-"):
145
145
  try:
@@ -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.4.4.dev7",
38
+ version: str = "1.4.4.dev8",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -175,7 +175,7 @@ class Client:
175
175
  server_url: str,
176
176
  client_type: int,
177
177
  credentials: typing.Optional[tuple[str, str]],
178
- version: str = "1.4.4.dev7",
178
+ version: str = "1.4.4.dev8",
179
179
  ):
180
180
  """mdmd:hidden
181
181
  The Modal client object is not intended to be instantiated directly by users.
@@ -1386,10 +1386,10 @@ class _Sandbox(_Object, type_prefix="sb"):
1386
1386
  return self._command_router_client
1387
1387
 
1388
1388
  @property
1389
- def _experimental_containers(self) -> "_SandboxContainerManager":
1390
- """Manage additional containers running in this Sandbox."""
1389
+ def _experimental_sidecars(self) -> "_SidecarManager":
1390
+ """Manage sidecar containers running in this Sandbox."""
1391
1391
  self._ensure_attached()
1392
- return _SandboxContainerManager(self)
1392
+ return _SidecarManager(self)
1393
1393
 
1394
1394
  @overload
1395
1395
  async def exec(
@@ -1854,7 +1854,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1854
1854
  before_timestamp = resp.sandboxes[-1].created_at
1855
1855
 
1856
1856
 
1857
- class _SandboxContainer:
1857
+ class _SidecarContainer:
1858
1858
  """Handle to an additional container running in a Sandbox."""
1859
1859
 
1860
1860
  _result: Optional[api_pb2.GenericResult]
@@ -1882,9 +1882,9 @@ class _SandboxContainer:
1882
1882
  return self._container_name
1883
1883
 
1884
1884
  @staticmethod
1885
- def _from_container_info(sandbox: "_Sandbox", container_info: sr_pb2.TaskContainerInfo) -> "_SandboxContainer":
1885
+ def _from_container_info(sandbox: "_Sandbox", container_info: sr_pb2.TaskContainerInfo) -> "_SidecarContainer":
1886
1886
  result = container_info.result if container_info.HasField("result") else None
1887
- return _SandboxContainer(sandbox, container_info.container_id, container_info.container_name, result)
1887
+ return _SidecarContainer(sandbox, container_info.container_id, container_info.container_name, result)
1888
1888
 
1889
1889
  async def _get_command_router(self) -> tuple[str, "TaskCommandRouterClient"]:
1890
1890
  """Get task ID and command router client."""
@@ -2031,8 +2031,11 @@ class _SandboxContainer:
2031
2031
  return _result_returncode(self._result)
2032
2032
 
2033
2033
 
2034
- class _SandboxContainerManager:
2035
- """Creates and manages additional containers in a Sandbox."""
2034
+ _MAIN_CONTAINER_NAME: str = "main"
2035
+
2036
+
2037
+ class _SidecarManager:
2038
+ """Creates and manages sidecar containers in a Sandbox."""
2036
2039
 
2037
2040
  def __init__(self, sandbox: _Sandbox) -> None:
2038
2041
  self._sandbox = sandbox
@@ -2051,22 +2054,24 @@ class _SandboxContainerManager:
2051
2054
  env: Optional[dict[str, str]] = None,
2052
2055
  secrets: Optional[Collection[_Secret]] = None,
2053
2056
  workdir: Optional[str] = None,
2054
- ) -> _SandboxContainer:
2057
+ ) -> _SidecarContainer:
2058
+ if name == _MAIN_CONTAINER_NAME:
2059
+ raise InvalidError(f"The name {_MAIN_CONTAINER_NAME!r} is reserved for the sandbox's main container.")
2055
2060
  if workdir is not None and not workdir.startswith("/"):
2056
2061
  raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
2057
2062
  _validate_exec_args(args)
2058
2063
 
2059
2064
  if image._mount_layers:
2060
2065
  raise InvalidError(
2061
- "Sandbox._experimental_containers.create(image=...) only supports pre-built images. "
2066
+ "Sandbox._experimental_sidecars.create(image=...) only supports pre-built images. "
2062
2067
  "When using `add_local*` methods, specify `copy=True` and call `.build()` before passing "
2063
- "the image to `._experimental_containers.create()`:\n\nE.g.\n"
2068
+ "the image to `._experimental_sidecars.create()`:\n\nE.g.\n"
2064
2069
  'img = modal.Image.debian_slim().add_local_file("foo", "/foo", copy=True).build(app)\n'
2065
- 'sandbox._experimental_containers.create(name="worker", image=img)'
2070
+ 'sandbox._experimental_sidecars.create(name="worker", image=img)'
2066
2071
  )
2067
2072
  if not image._object_id:
2068
2073
  raise InvalidError(
2069
- "Sandbox._experimental_containers.create(image=...) currently only supports Images that are "
2074
+ "Sandbox._experimental_sidecars.create(image=...) currently only supports Images that are "
2070
2075
  "either:\n"
2071
2076
  "- prebuilt using `image.build()`\n"
2072
2077
  "- referenced by id, e.g. `Image.from_id()`\n"
@@ -2092,9 +2097,14 @@ class _SandboxContainerManager:
2092
2097
  create_resp = await command_router_client.container_create(create_req)
2093
2098
  container_id = create_resp.container_id
2094
2099
  container_name = create_resp.container_name or name
2095
- return _SandboxContainer(self._sandbox, container_id, container_name)
2100
+ return _SidecarContainer(self._sandbox, container_id, container_name)
2096
2101
 
2097
- async def get(self, *, name: str, include_terminated: bool = False) -> "_SandboxContainer":
2102
+ async def get(self, *, name: str, include_terminated: bool = False) -> "_SidecarContainer":
2103
+ if name == _MAIN_CONTAINER_NAME:
2104
+ raise InvalidError(
2105
+ "Cannot get the main sandbox container through the sidecars API. "
2106
+ "Use Sandbox methods directly to interact with the main container."
2107
+ )
2098
2108
  task_id, command_router_client = await self._get_command_router()
2099
2109
  resp = await command_router_client.container_get(
2100
2110
  sr_pb2.TaskContainerGetRequest(
@@ -2103,16 +2113,20 @@ class _SandboxContainerManager:
2103
2113
  include_terminated=include_terminated,
2104
2114
  )
2105
2115
  )
2106
- return _SandboxContainer._from_container_info(self._sandbox, resp.container)
2116
+ return _SidecarContainer._from_container_info(self._sandbox, resp.container)
2107
2117
 
2108
- async def list(self, include_terminated: bool = False) -> builtins.list[_SandboxContainer]:
2118
+ async def list(self, include_terminated: bool = False) -> builtins.list[_SidecarContainer]:
2109
2119
  task_id, command_router_client = await self._get_command_router()
2110
2120
  resp = await command_router_client.container_list(
2111
2121
  sr_pb2.TaskContainerListRequest(task_id=task_id, include_terminated=include_terminated)
2112
2122
  )
2113
- return [_SandboxContainer._from_container_info(self._sandbox, container) for container in resp.containers]
2123
+ return [
2124
+ _SidecarContainer._from_container_info(self._sandbox, container)
2125
+ for container in resp.containers
2126
+ if container.container_name != _MAIN_CONTAINER_NAME
2127
+ ]
2114
2128
 
2115
2129
 
2116
- SandboxContainer = synchronize_api(_SandboxContainer)
2117
- SandboxContainerManager = synchronize_api(_SandboxContainerManager)
2130
+ SidecarContainer = synchronize_api(_SidecarContainer)
2131
+ SidecarManager = synchronize_api(_SidecarManager)
2118
2132
  Sandbox = synchronize_api(_Sandbox)
@@ -533,8 +533,8 @@ class _Sandbox(modal._object._Object):
533
533
  self, task_id: str
534
534
  ) -> modal._utils.task_command_router_client.TaskCommandRouterClient: ...
535
535
  @property
536
- def _experimental_containers(self) -> _SandboxContainerManager:
537
- """Manage additional containers running in this Sandbox."""
536
+ def _experimental_sidecars(self) -> _SidecarManager:
537
+ """Manage sidecar containers running in this Sandbox."""
538
538
  ...
539
539
 
540
540
  @typing.overload
@@ -697,7 +697,7 @@ class _Sandbox(modal._object._Object):
697
697
  """
698
698
  ...
699
699
 
700
- class _SandboxContainer:
700
+ class _SidecarContainer:
701
701
  """Handle to an additional container running in a Sandbox."""
702
702
 
703
703
  _result: typing.Optional[modal_proto.api_pb2.GenericResult]
@@ -720,7 +720,7 @@ class _SandboxContainer:
720
720
  @staticmethod
721
721
  def _from_container_info(
722
722
  sandbox: _Sandbox, container_info: modal_proto.task_command_router_pb2.TaskContainerInfo
723
- ) -> _SandboxContainer: ...
723
+ ) -> _SidecarContainer: ...
724
724
  async def _get_command_router(self) -> tuple[str, modal._utils.task_command_router_client.TaskCommandRouterClient]:
725
725
  """Get task ID and command router client."""
726
726
  ...
@@ -765,8 +765,8 @@ class _SandboxContainer:
765
765
  @typing.overload
766
766
  async def terminate(self, *, wait: typing.Literal[False] = False) -> None: ...
767
767
 
768
- class _SandboxContainerManager:
769
- """Creates and manages additional containers in a Sandbox."""
768
+ class _SidecarManager:
769
+ """Creates and manages sidecar containers in a Sandbox."""
770
770
  def __init__(self, sandbox: _Sandbox) -> None:
771
771
  """Initialize self. See help(type(self)) for accurate signature."""
772
772
  ...
@@ -783,11 +783,11 @@ class _SandboxContainerManager:
783
783
  env: typing.Optional[dict[str, str]] = None,
784
784
  secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
785
785
  workdir: typing.Optional[str] = None,
786
- ) -> _SandboxContainer: ...
787
- async def get(self, *, name: str, include_terminated: bool = False) -> _SandboxContainer: ...
788
- async def list(self, include_terminated: bool = False) -> list[_SandboxContainer]: ...
786
+ ) -> _SidecarContainer: ...
787
+ async def get(self, *, name: str, include_terminated: bool = False) -> _SidecarContainer: ...
788
+ async def list(self, include_terminated: bool = False) -> list[_SidecarContainer]: ...
789
789
 
790
- class SandboxContainer:
790
+ class SidecarContainer:
791
791
  """Handle to an additional container running in a Sandbox."""
792
792
 
793
793
  _result: typing.Optional[modal_proto.api_pb2.GenericResult]
@@ -807,7 +807,7 @@ class SandboxContainer:
807
807
  @staticmethod
808
808
  def _from_container_info(
809
809
  sandbox: Sandbox, container_info: modal_proto.task_command_router_pb2.TaskContainerInfo
810
- ) -> SandboxContainer: ...
810
+ ) -> SidecarContainer: ...
811
811
 
812
812
  class ___get_command_router_spec(typing_extensions.Protocol):
813
813
  def __call__(self, /) -> tuple[str, modal._utils.task_command_router_client.TaskCommandRouterClient]:
@@ -913,8 +913,8 @@ class SandboxContainer:
913
913
 
914
914
  terminate: __terminate_spec
915
915
 
916
- class SandboxContainerManager:
917
- """Creates and manages additional containers in a Sandbox."""
916
+ class SidecarManager:
917
+ """Creates and manages sidecar containers in a Sandbox."""
918
918
  def __init__(self, sandbox: Sandbox) -> None: ...
919
919
 
920
920
  class ___get_command_router_spec(typing_extensions.Protocol):
@@ -938,7 +938,7 @@ class SandboxContainerManager:
938
938
  env: typing.Optional[dict[str, str]] = None,
939
939
  secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
940
940
  workdir: typing.Optional[str] = None,
941
- ) -> SandboxContainer: ...
941
+ ) -> SidecarContainer: ...
942
942
  async def aio(
943
943
  self,
944
944
  /,
@@ -948,19 +948,19 @@ class SandboxContainerManager:
948
948
  env: typing.Optional[dict[str, str]] = None,
949
949
  secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
950
950
  workdir: typing.Optional[str] = None,
951
- ) -> SandboxContainer: ...
951
+ ) -> SidecarContainer: ...
952
952
 
953
953
  create: __create_spec
954
954
 
955
955
  class __get_spec(typing_extensions.Protocol):
956
- def __call__(self, /, *, name: str, include_terminated: bool = False) -> SandboxContainer: ...
957
- async def aio(self, /, *, name: str, include_terminated: bool = False) -> SandboxContainer: ...
956
+ def __call__(self, /, *, name: str, include_terminated: bool = False) -> SidecarContainer: ...
957
+ async def aio(self, /, *, name: str, include_terminated: bool = False) -> SidecarContainer: ...
958
958
 
959
959
  get: __get_spec
960
960
 
961
961
  class __list_spec(typing_extensions.Protocol):
962
- def __call__(self, /, include_terminated: bool = False) -> list[SandboxContainer]: ...
963
- async def aio(self, /, include_terminated: bool = False) -> list[SandboxContainer]: ...
962
+ def __call__(self, /, include_terminated: bool = False) -> list[SidecarContainer]: ...
963
+ async def aio(self, /, include_terminated: bool = False) -> list[SidecarContainer]: ...
964
964
 
965
965
  list: __list_spec
966
966
 
@@ -1760,8 +1760,8 @@ class Sandbox(modal.object.Object):
1760
1760
  _get_command_router_client: ___get_command_router_client_spec
1761
1761
 
1762
1762
  @property
1763
- def _experimental_containers(self) -> SandboxContainerManager:
1764
- """Manage additional containers running in this Sandbox."""
1763
+ def _experimental_sidecars(self) -> SidecarManager:
1764
+ """Manage sidecar containers running in this Sandbox."""
1765
1765
  ...
1766
1766
 
1767
1767
  class __exec_spec(typing_extensions.Protocol):
@@ -2113,3 +2113,5 @@ class Sandbox(modal.object.Object):
2113
2113
  list: typing.ClassVar[__list_spec]
2114
2114
 
2115
2115
  _default_image: modal.image._Image
2116
+
2117
+ _MAIN_CONTAINER_NAME: str
@@ -87,14 +87,14 @@ class _SandboxFilesystem:
87
87
  """mdmd:namespace
88
88
  Namespace for Sandbox filesystem APIs."""
89
89
 
90
- _container: Union["modal.sandbox._Sandbox", "modal.sandbox._SandboxContainer"]
90
+ _container: Union["modal.sandbox._Sandbox", "modal.sandbox._SidecarContainer"]
91
91
 
92
- def __init__(self, container: Union["modal.sandbox._Sandbox", "modal.sandbox._SandboxContainer"]) -> None:
92
+ def __init__(self, container: Union["modal.sandbox._Sandbox", "modal.sandbox._SidecarContainer"]) -> None:
93
93
  """mdmd:hidden"""
94
- from modal.sandbox import _Sandbox, _SandboxContainer
94
+ from modal.sandbox import _Sandbox, _SidecarContainer
95
95
 
96
- # Use a weakref proxy to avoid circular references between Sandbox/SandboxContainer and SandboxFilesystem.
97
- self._container = cast(Union[_Sandbox, _SandboxContainer], weakref.proxy(container))
96
+ # Use a weakref proxy to avoid circular references between Sandbox/SidecarContainer and SandboxFilesystem.
97
+ self._container = cast(Union[_Sandbox, _SidecarContainer], weakref.proxy(container))
98
98
 
99
99
  async def copy_from_local(self, local_path: Union[str, os.PathLike], remote_path: str) -> None:
100
100
  """Copy a local file into the Sandbox.
@@ -80,9 +80,9 @@ class _SandboxFilesystem:
80
80
  Namespace for Sandbox filesystem APIs.
81
81
  """
82
82
 
83
- _container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SandboxContainer]
83
+ _container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SidecarContainer]
84
84
 
85
- def __init__(self, container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SandboxContainer]) -> None:
85
+ def __init__(self, container: typing.Union[modal.sandbox._Sandbox, modal.sandbox._SidecarContainer]) -> None:
86
86
  """mdmd:hidden"""
87
87
  ...
88
88
 
@@ -346,9 +346,9 @@ class SandboxFilesystem:
346
346
  Namespace for Sandbox filesystem APIs.
347
347
  """
348
348
 
349
- _container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SandboxContainer]
349
+ _container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SidecarContainer]
350
350
 
351
- def __init__(self, container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SandboxContainer]) -> None:
351
+ def __init__(self, container: typing.Union[modal.sandbox.Sandbox, modal.sandbox.SidecarContainer]) -> None:
352
352
  """mdmd:hidden"""
353
353
  ...
354
354
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.4.dev7
3
+ Version: 1.4.4.dev8
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.4.4.dev7"
4
+ __version__ = "1.4.4.dev8"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes