modal 1.2.5.dev25__tar.gz → 1.2.5.dev27__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 (202) hide show
  1. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/PKG-INFO +1 -1
  2. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/blob_utils.py +18 -5
  3. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/client.pyi +2 -2
  4. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/mount.py +14 -8
  5. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/volume.py +5 -1
  6. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/SOURCES.txt +0 -6
  8. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_version/__init__.py +1 -1
  9. modal-1.2.5.dev25/modal_proto/sandbox_router.proto +0 -145
  10. modal-1.2.5.dev25/modal_proto/sandbox_router_grpc.py +0 -105
  11. modal-1.2.5.dev25/modal_proto/sandbox_router_pb2.py +0 -149
  12. modal-1.2.5.dev25/modal_proto/sandbox_router_pb2.pyi +0 -333
  13. modal-1.2.5.dev25/modal_proto/sandbox_router_pb2_grpc.py +0 -203
  14. modal-1.2.5.dev25/modal_proto/sandbox_router_pb2_grpc.pyi +0 -75
  15. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/LICENSE +0 -0
  16. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/README.md +0 -0
  17. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/__init__.py +0 -0
  18. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/__main__.py +0 -0
  19. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_billing.py +0 -0
  20. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_clustered_functions.py +0 -0
  21. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_clustered_functions.pyi +0 -0
  22. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_container_entrypoint.py +0 -0
  23. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_functions.py +0 -0
  24. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_grpc_client.py +0 -0
  25. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_ipython.py +0 -0
  26. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_load_context.py +0 -0
  27. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_location.py +0 -0
  28. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_object.py +0 -0
  29. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_output.py +0 -0
  30. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_partial_function.py +0 -0
  31. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_pty.py +0 -0
  32. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_resolver.py +0 -0
  33. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_resources.py +0 -0
  34. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/__init__.py +0 -0
  35. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/asgi.py +0 -0
  36. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/container_io_manager.py +0 -0
  37. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/container_io_manager.pyi +0 -0
  38. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/execution_context.py +0 -0
  39. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/execution_context.pyi +0 -0
  40. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  41. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/telemetry.py +0 -0
  42. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/user_code_event_loop.py +0 -0
  43. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_runtime/user_code_imports.py +0 -0
  44. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_serialization.py +0 -0
  45. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_traceback.py +0 -0
  46. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_tunnel.py +0 -0
  47. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_tunnel.pyi +0 -0
  48. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_type_manager.py +0 -0
  49. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/__init__.py +0 -0
  50. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/app_utils.py +0 -0
  51. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/async_utils.py +0 -0
  52. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/auth_token_manager.py +0 -0
  53. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/bytes_io_segment_payload.py +0 -0
  54. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/deprecation.py +0 -0
  55. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/docker_utils.py +0 -0
  56. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/function_utils.py +0 -0
  57. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/git_utils.py +0 -0
  58. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/grpc_testing.py +0 -0
  59. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/grpc_utils.py +0 -0
  60. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/hash_utils.py +0 -0
  61. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/http_utils.py +0 -0
  62. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/jwt_utils.py +0 -0
  63. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/logger.py +0 -0
  64. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/mount_utils.py +0 -0
  65. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/name_utils.py +0 -0
  66. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/package_utils.py +0 -0
  67. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/pattern_utils.py +0 -0
  68. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/rand_pb_testing.py +0 -0
  69. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/shell_utils.py +0 -0
  70. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/task_command_router_client.py +0 -0
  71. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_utils/time_utils.py +0 -0
  72. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_vendor/__init__.py +0 -0
  73. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  74. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_vendor/cloudpickle.py +0 -0
  75. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_vendor/tblib.py +0 -0
  76. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/_watcher.py +0 -0
  77. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/app.py +0 -0
  78. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/app.pyi +0 -0
  79. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/billing.py +0 -0
  80. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/2023.12.312.txt +0 -0
  81. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/2023.12.txt +0 -0
  82. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/2024.04.txt +0 -0
  83. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/2024.10.txt +0 -0
  84. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/2025.06.txt +0 -0
  85. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/PREVIEW.txt +0 -0
  86. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/README.md +0 -0
  87. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/builder/base-images.json +0 -0
  88. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/call_graph.py +0 -0
  89. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/__init__.py +0 -0
  90. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/_download.py +0 -0
  91. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/_traceback.py +0 -0
  92. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/app.py +0 -0
  93. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/cluster.py +0 -0
  94. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/config.py +0 -0
  95. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/container.py +0 -0
  96. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/dict.py +0 -0
  97. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/entry_point.py +0 -0
  98. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/environment.py +0 -0
  99. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/import_refs.py +0 -0
  100. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/launch.py +0 -0
  101. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/network_file_system.py +0 -0
  102. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/profile.py +0 -0
  103. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/programs/__init__.py +0 -0
  104. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/programs/launch_instance_ssh.py +0 -0
  105. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/programs/run_jupyter.py +0 -0
  106. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/programs/run_marimo.py +0 -0
  107. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/programs/vscode.py +0 -0
  108. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/queues.py +0 -0
  109. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/run.py +0 -0
  110. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/secret.py +0 -0
  111. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/shell.py +0 -0
  112. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/token.py +0 -0
  113. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/utils.py +0 -0
  114. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cli/volume.py +0 -0
  115. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/client.py +0 -0
  116. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cloud_bucket_mount.py +0 -0
  117. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cloud_bucket_mount.pyi +0 -0
  118. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cls.py +0 -0
  119. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/cls.pyi +0 -0
  120. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/config.py +0 -0
  121. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/container_process.py +0 -0
  122. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/container_process.pyi +0 -0
  123. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/dict.py +0 -0
  124. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/dict.pyi +0 -0
  125. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/environments.py +0 -0
  126. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/environments.pyi +0 -0
  127. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/exception.py +0 -0
  128. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/experimental/__init__.py +0 -0
  129. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/experimental/flash.py +0 -0
  130. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/experimental/flash.pyi +0 -0
  131. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/experimental/ipython.py +0 -0
  132. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/file_io.py +0 -0
  133. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/file_io.pyi +0 -0
  134. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/file_pattern_matcher.py +0 -0
  135. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/functions.py +0 -0
  136. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/functions.pyi +0 -0
  137. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/gpu.py +0 -0
  138. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/image.py +0 -0
  139. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/image.pyi +0 -0
  140. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/io_streams.py +0 -0
  141. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/io_streams.pyi +0 -0
  142. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/mount.pyi +0 -0
  143. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/network_file_system.py +0 -0
  144. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/network_file_system.pyi +0 -0
  145. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/object.py +0 -0
  146. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/object.pyi +0 -0
  147. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/output.py +0 -0
  148. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/parallel_map.py +0 -0
  149. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/parallel_map.pyi +0 -0
  150. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/partial_function.py +0 -0
  151. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/partial_function.pyi +0 -0
  152. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/proxy.py +0 -0
  153. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/proxy.pyi +0 -0
  154. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/py.typed +0 -0
  155. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/queue.py +0 -0
  156. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/queue.pyi +0 -0
  157. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/retries.py +0 -0
  158. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/runner.py +0 -0
  159. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/runner.pyi +0 -0
  160. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/running_app.py +0 -0
  161. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/sandbox.py +0 -0
  162. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/sandbox.pyi +0 -0
  163. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/schedule.py +0 -0
  164. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/scheduler_placement.py +0 -0
  165. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/secret.py +0 -0
  166. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/secret.pyi +0 -0
  167. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/serving.py +0 -0
  168. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/serving.pyi +0 -0
  169. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/snapshot.py +0 -0
  170. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/snapshot.pyi +0 -0
  171. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/stream_type.py +0 -0
  172. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/token_flow.py +0 -0
  173. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/token_flow.pyi +0 -0
  174. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal/volume.pyi +0 -0
  175. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/dependency_links.txt +0 -0
  176. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/entry_points.txt +0 -0
  177. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/requires.txt +0 -0
  178. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal.egg-info/top_level.txt +0 -0
  179. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/__init__.py +0 -0
  180. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/gen_cli_docs.py +0 -0
  181. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/gen_reference_docs.py +0 -0
  182. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/mdmd/__init__.py +0 -0
  183. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/mdmd/mdmd.py +0 -0
  184. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_docs/mdmd/signatures.py +0 -0
  185. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/__init__.py +0 -0
  186. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api.proto +0 -0
  187. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api_grpc.py +0 -0
  188. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api_pb2.py +0 -0
  189. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api_pb2.pyi +0 -0
  190. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api_pb2_grpc.py +0 -0
  191. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/api_pb2_grpc.pyi +0 -0
  192. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/modal_api_grpc.py +0 -0
  193. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/py.typed +0 -0
  194. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router.proto +0 -0
  195. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router_grpc.py +0 -0
  196. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router_pb2.py +0 -0
  197. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router_pb2.pyi +0 -0
  198. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  199. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  200. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/modal_version/__main__.py +0 -0
  201. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/pyproject.toml +0 -0
  202. {modal-1.2.5.dev25 → modal-1.2.5.dev27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev25
3
+ Version: 1.2.5.dev27
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -371,11 +371,17 @@ class FileUploadSpec:
371
371
  mount_filename: str
372
372
 
373
373
  use_blob: bool
374
- content: Optional[bytes] # typically None if using blob, required otherwise
375
374
  sha256_hex: str
376
375
  md5_hex: str
377
376
  mode: int # file permission bits (last 12 bits of st_mode)
378
377
  size: int
378
+ content: Optional[bytes] = None # Set for very small files to avoid double-read
379
+
380
+ def read_content(self) -> bytes:
381
+ """Read content from source."""
382
+ with self.source() as fp:
383
+ fp.seek(0)
384
+ return fp.read()
379
385
 
380
386
 
381
387
  def _get_file_upload_spec(
@@ -384,6 +390,7 @@ def _get_file_upload_spec(
384
390
  mount_filename: PurePosixPath,
385
391
  mode: int,
386
392
  ) -> FileUploadSpec:
393
+ content = None
387
394
  with source() as fp:
388
395
  # Current position is ignored - we always upload from position 0
389
396
  fp.seek(0, os.SEEK_END)
@@ -394,12 +401,18 @@ def _get_file_upload_spec(
394
401
  # TODO(dano): remove the placeholder md5 once we stop requiring md5 for blobs
395
402
  md5_hex = "baadbaadbaadbaadbaadbaadbaadbaad" if size > MULTIPART_UPLOAD_THRESHOLD else None
396
403
  use_blob = True
397
- content = None
398
404
  hashes = get_upload_hashes(fp, md5_hex=md5_hex)
399
405
  else:
400
406
  use_blob = False
401
- content = fp.read()
402
- hashes = get_upload_hashes(content)
407
+ # For very small files (< 256 KiB), read content once and cache it
408
+ # This avoids double-read penalty while limiting memory usage
409
+ if size < 256 * 1024: # 256 KiB threshold
410
+ fp.seek(0)
411
+ content = fp.read()
412
+ hashes = get_upload_hashes(content)
413
+ else:
414
+ # For medium files (256 KiB - 4 MiB), compute hashes without caching content
415
+ hashes = get_upload_hashes(fp)
403
416
 
404
417
  return FileUploadSpec(
405
418
  source=source,
@@ -407,11 +420,11 @@ def _get_file_upload_spec(
407
420
  source_is_path=isinstance(source_description, Path),
408
421
  mount_filename=mount_filename.as_posix(),
409
422
  use_blob=use_blob,
410
- content=content,
411
423
  sha256_hex=hashes.sha256_hex(),
412
424
  md5_hex=hashes.md5_hex(),
413
425
  mode=mode & 0o7777,
414
426
  size=size,
427
+ content=content,
415
428
  )
416
429
 
417
430
 
@@ -32,7 +32,7 @@ class _Client:
32
32
  server_url: str,
33
33
  client_type: int,
34
34
  credentials: typing.Optional[tuple[str, str]],
35
- version: str = "1.2.5.dev25",
35
+ version: str = "1.2.5.dev27",
36
36
  ):
37
37
  """mdmd:hidden
38
38
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.2.5.dev25",
166
+ version: str = "1.2.5.dev27",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -466,16 +466,18 @@ class _Mount(_Object, type_prefix="mo"):
466
466
  loop = asyncio.get_event_loop()
467
467
  with concurrent.futures.ThreadPoolExecutor() as exe:
468
468
  all_files = await loop.run_in_executor(exe, _select_files, entries)
469
+ logger.debug(f"Computing checksums for {len(all_files)} files using {exe._max_workers} worker threads")
469
470
 
470
- futs = []
471
+ # Yield FileUploadSpec objects lazily as they're consumed by async_map downstream.
472
+ # async_map's concurrency limit provides natural backpressure, so we don't need
473
+ # a separate semaphore here. This keeps memory bounded without creating all tasks upfront.
471
474
  for local_filename, remote_filename in all_files:
472
- logger.debug(f"Mounting {local_filename} as {remote_filename}")
473
- futs.append(loop.run_in_executor(exe, get_file_upload_spec_from_path, local_filename, remote_filename))
474
-
475
- logger.debug(f"Computing checksums for {len(futs)} files using {exe._max_workers} worker threads")
476
- for fut in asyncio.as_completed(futs):
477
475
  try:
478
- yield await fut
476
+ logger.debug(f"Mounting {local_filename} as {remote_filename}")
477
+ file_spec = await loop.run_in_executor(
478
+ exe, get_file_upload_spec_from_path, local_filename, remote_filename
479
+ )
480
+ yield file_spec
479
481
  except FileNotFoundError as exc:
480
482
  # Can happen with temporary files (e.g. emacs will write temp files and delete them quickly)
481
483
  logger.info(f"Ignoring file not found: {exc}")
@@ -547,7 +549,11 @@ class _Mount(_Object, type_prefix="mo"):
547
549
  logger.debug(
548
550
  f"Uploading file {file_spec.source_description} to {remote_filename} ({file_spec.size} bytes)"
549
551
  )
550
- request2 = api_pb2.MountPutFileRequest(data=file_spec.content, sha256_hex=file_spec.sha256_hex)
552
+ if file_spec.content is None:
553
+ content = await asyncio.to_thread(file_spec.read_content)
554
+ else:
555
+ content = file_spec.content
556
+ request2 = api_pb2.MountPutFileRequest(data=content, sha256_hex=file_spec.sha256_hex)
551
557
 
552
558
  start_time = time.monotonic()
553
559
  while time.monotonic() - start_time < MOUNT_PUT_FILE_CLIENT_TIMEOUT:
@@ -1056,7 +1056,11 @@ class _VolumeUploadContextManager(_AbstractVolumeUploadContextManager):
1056
1056
  logger.debug(
1057
1057
  f"Uploading file {file_spec.source_description} to {remote_filename} ({file_spec.size} bytes)"
1058
1058
  )
1059
- request2 = api_pb2.MountPutFileRequest(data=file_spec.content, sha256_hex=file_spec.sha256_hex)
1059
+ if file_spec.content is None:
1060
+ content = await asyncio.to_thread(file_spec.read_content)
1061
+ else:
1062
+ content = file_spec.content
1063
+ request2 = api_pb2.MountPutFileRequest(data=content, sha256_hex=file_spec.sha256_hex)
1060
1064
  self._progress_cb(task_id=progress_task_id, complete=True)
1061
1065
 
1062
1066
  while (time.monotonic() - start_time) < VOLUME_PUT_FILE_CLIENT_TIMEOUT:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev25
3
+ Version: 1.2.5.dev27
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -184,12 +184,6 @@ modal_proto/api_pb2_grpc.py
184
184
  modal_proto/api_pb2_grpc.pyi
185
185
  modal_proto/modal_api_grpc.py
186
186
  modal_proto/py.typed
187
- modal_proto/sandbox_router.proto
188
- modal_proto/sandbox_router_grpc.py
189
- modal_proto/sandbox_router_pb2.py
190
- modal_proto/sandbox_router_pb2.pyi
191
- modal_proto/sandbox_router_pb2_grpc.py
192
- modal_proto/sandbox_router_pb2_grpc.pyi
193
187
  modal_proto/task_command_router.proto
194
188
  modal_proto/task_command_router_grpc.py
195
189
  modal_proto/task_command_router_pb2.py
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.2.5.dev25"
4
+ __version__ = "1.2.5.dev27"
@@ -1,145 +0,0 @@
1
- syntax = "proto3";
2
-
3
- option go_package = "github.com/modal-labs/modal/go/proto";
4
-
5
- import "modal_proto/api.proto";
6
-
7
- package modal.sandbox_router;
8
-
9
- enum SandboxExecStderrConfig {
10
- // The output will be discarded.
11
- SANDBOX_EXEC_STDERR_CONFIG_DEVNULL = 0;
12
- // The output will be streamed to the client.
13
- SANDBOX_EXEC_STDERR_CONFIG_PIPE = 1;
14
- // A special value that can be used to indicate that the stderr stream should
15
- // be merged with the stdout stream.
16
- SANDBOX_EXEC_STDERR_CONFIG_STDOUT = 2;
17
- }
18
-
19
- enum SandboxExecStdioFileDescriptor {
20
- // Read from stdout.
21
- SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDOUT = 0;
22
- // Read from stderr.
23
- SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDERR = 1;
24
- }
25
-
26
- enum SandboxExecStdoutConfig {
27
- // The output will be discarded.
28
- SANDBOX_EXEC_STDOUT_CONFIG_DEVNULL = 0;
29
- // The output will be streamed to the client.
30
- SANDBOX_EXEC_STDOUT_CONFIG_PIPE = 1;
31
- }
32
-
33
- message SandboxExecPollRequest {
34
- // The task ID of the sandbox running the exec'd command.
35
- string task_id = 1;
36
- // The execution ID of the command to wait on.
37
- string exec_id = 2;
38
- }
39
-
40
- // The response to a SandboxExecPollRequest. If the exec'd command has not
41
- // completed, exit_status will be unset.
42
- message SandboxExecPollResponse {
43
- oneof exit_status {
44
- // The exit code of the command.
45
- int32 code = 1;
46
- // The signal that terminated the command.
47
- int32 signal = 2;
48
- }
49
- // TODO(saltzm): Give a way for the user to distinguish between normal exit
50
- // and termination by Modal (due to sandbox timeout, exec exceeded deadline, etc.)
51
- }
52
-
53
- message SandboxExecStartRequest {
54
- // The task ID of the sandbox to execute the command in.
55
- string task_id = 1;
56
- // Execution ID. This ID will be used to identify the execution for other
57
- // requests and ensure exec commands are idempotent.
58
- string exec_id = 2;
59
- // Command arguments to execute.
60
- repeated string command_args= 3;
61
- // Configures how the stdout of the command will be handled.
62
- SandboxExecStdoutConfig stdout_config = 4;
63
- // Configures how the stderr of the command will be handled.
64
- SandboxExecStderrConfig stderr_config = 5;
65
- // Timeout in seconds for the exec'd command to exit. If the command does not
66
- // exit within this duration, the command will be killed. This is NOT the
67
- // timeout for the ExecStartRequest RPC to complete.
68
- optional uint32 timeout_secs = 6;
69
- // Working directory for the command.
70
- optional string workdir = 7;
71
- // Secret IDs to mount into the sandbox.
72
- repeated string secret_ids = 8;
73
- // PTY info for the command.
74
- optional modal.client.PTYInfo pty_info = 9;
75
- // Enable debugging capabilities on the container runtime. Used only for
76
- // internal debugging.
77
- bool runtime_debug = 10;
78
- }
79
-
80
- message SandboxExecStartResponse { }
81
-
82
- message SandboxExecStdinWriteRequest {
83
- // The task ID of the sandbox running the exec'd command.
84
- string task_id = 1;
85
- // The execution ID of the command to write to.
86
- string exec_id = 2;
87
- // The offset to start writing to. This is used to resume writing from the
88
- // last write position if the connection is closed and reopened.
89
- uint64 offset = 3;
90
- bytes data = 4;
91
- // If true, close the stdin stream after writing any provided data.
92
- // This signals EOF to the exec'd process.
93
- bool eof = 5;
94
- }
95
-
96
- message SandboxExecStdinWriteResponse { }
97
-
98
-
99
- message SandboxExecStdioReadRequest {
100
- // The task ID of the sandbox running the exec'd command.
101
- string task_id = 1;
102
- // The execution ID of the command to read from.
103
- string exec_id = 2;
104
- // The offset to start reading from. This is used to resume reading from the
105
- // last read position if the connection is closed and reopened.
106
- uint64 offset = 3;
107
- // Which file descriptor to read from.
108
- SandboxExecStdioFileDescriptor file_descriptor = 4;
109
- }
110
-
111
- message SandboxExecStdioReadResponse {
112
- // The data read from the file descriptor.
113
- bytes data = 1;
114
- }
115
-
116
- message SandboxExecWaitRequest {
117
- // The task ID of the sandbox running the exec'd command.
118
- string task_id = 1;
119
- // The execution ID of the command to wait on.
120
- string exec_id = 2;
121
- }
122
-
123
- message SandboxExecWaitResponse {
124
- oneof exit_status {
125
- // The exit code of the command.
126
- int32 code = 1;
127
- // The signal that terminated the command.
128
- int32 signal = 2;
129
- }
130
- // TODO(saltzm): Give a way for the user to distinguish between normal exit
131
- // and termination by Modal (due to sandbox timeout, exec exceeded deadline, etc.)
132
- }
133
-
134
- service SandboxRouter {
135
- // Poll for the exit status of an exec'd command.
136
- rpc SandboxExecPoll(SandboxExecPollRequest) returns (SandboxExecPollResponse);
137
- // Execute a command in the sandbox.
138
- rpc SandboxExecStart(SandboxExecStartRequest) returns (SandboxExecStartResponse);
139
- // Write to the stdin stream of an exec'd command.
140
- rpc SandboxExecStdinWrite(SandboxExecStdinWriteRequest) returns (SandboxExecStdinWriteResponse);
141
- // Get a stream of output from the stdout or stderr stream of an exec'd command.
142
- rpc SandboxExecStdioRead(SandboxExecStdioReadRequest) returns (stream SandboxExecStdioReadResponse);
143
- // Wait for an exec'd command to exit and return the exit code.
144
- rpc SandboxExecWait(SandboxExecWaitRequest) returns (SandboxExecWaitResponse);
145
- }
@@ -1,105 +0,0 @@
1
- # Generated by the Protocol Buffers compiler. DO NOT EDIT!
2
- # source: modal_proto/sandbox_router.proto
3
- # plugin: grpclib.plugin.main
4
- import abc
5
- import typing
6
-
7
- import grpclib.const
8
- import grpclib.client
9
- if typing.TYPE_CHECKING:
10
- import grpclib.server
11
-
12
- import modal_proto.api_pb2
13
- import modal_proto.sandbox_router_pb2
14
-
15
-
16
- class SandboxRouterBase(abc.ABC):
17
-
18
- @abc.abstractmethod
19
- async def SandboxExecPoll(self, stream: 'grpclib.server.Stream[modal_proto.sandbox_router_pb2.SandboxExecPollRequest, modal_proto.sandbox_router_pb2.SandboxExecPollResponse]') -> None:
20
- pass
21
-
22
- @abc.abstractmethod
23
- async def SandboxExecStart(self, stream: 'grpclib.server.Stream[modal_proto.sandbox_router_pb2.SandboxExecStartRequest, modal_proto.sandbox_router_pb2.SandboxExecStartResponse]') -> None:
24
- pass
25
-
26
- @abc.abstractmethod
27
- async def SandboxExecStdinWrite(self, stream: 'grpclib.server.Stream[modal_proto.sandbox_router_pb2.SandboxExecStdinWriteRequest, modal_proto.sandbox_router_pb2.SandboxExecStdinWriteResponse]') -> None:
28
- pass
29
-
30
- @abc.abstractmethod
31
- async def SandboxExecStdioRead(self, stream: 'grpclib.server.Stream[modal_proto.sandbox_router_pb2.SandboxExecStdioReadRequest, modal_proto.sandbox_router_pb2.SandboxExecStdioReadResponse]') -> None:
32
- pass
33
-
34
- @abc.abstractmethod
35
- async def SandboxExecWait(self, stream: 'grpclib.server.Stream[modal_proto.sandbox_router_pb2.SandboxExecWaitRequest, modal_proto.sandbox_router_pb2.SandboxExecWaitResponse]') -> None:
36
- pass
37
-
38
- def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
39
- return {
40
- '/modal.sandbox_router.SandboxRouter/SandboxExecPoll': grpclib.const.Handler(
41
- self.SandboxExecPoll,
42
- grpclib.const.Cardinality.UNARY_UNARY,
43
- modal_proto.sandbox_router_pb2.SandboxExecPollRequest,
44
- modal_proto.sandbox_router_pb2.SandboxExecPollResponse,
45
- ),
46
- '/modal.sandbox_router.SandboxRouter/SandboxExecStart': grpclib.const.Handler(
47
- self.SandboxExecStart,
48
- grpclib.const.Cardinality.UNARY_UNARY,
49
- modal_proto.sandbox_router_pb2.SandboxExecStartRequest,
50
- modal_proto.sandbox_router_pb2.SandboxExecStartResponse,
51
- ),
52
- '/modal.sandbox_router.SandboxRouter/SandboxExecStdinWrite': grpclib.const.Handler(
53
- self.SandboxExecStdinWrite,
54
- grpclib.const.Cardinality.UNARY_UNARY,
55
- modal_proto.sandbox_router_pb2.SandboxExecStdinWriteRequest,
56
- modal_proto.sandbox_router_pb2.SandboxExecStdinWriteResponse,
57
- ),
58
- '/modal.sandbox_router.SandboxRouter/SandboxExecStdioRead': grpclib.const.Handler(
59
- self.SandboxExecStdioRead,
60
- grpclib.const.Cardinality.UNARY_STREAM,
61
- modal_proto.sandbox_router_pb2.SandboxExecStdioReadRequest,
62
- modal_proto.sandbox_router_pb2.SandboxExecStdioReadResponse,
63
- ),
64
- '/modal.sandbox_router.SandboxRouter/SandboxExecWait': grpclib.const.Handler(
65
- self.SandboxExecWait,
66
- grpclib.const.Cardinality.UNARY_UNARY,
67
- modal_proto.sandbox_router_pb2.SandboxExecWaitRequest,
68
- modal_proto.sandbox_router_pb2.SandboxExecWaitResponse,
69
- ),
70
- }
71
-
72
-
73
- class SandboxRouterStub:
74
-
75
- def __init__(self, channel: grpclib.client.Channel) -> None:
76
- self.SandboxExecPoll = grpclib.client.UnaryUnaryMethod(
77
- channel,
78
- '/modal.sandbox_router.SandboxRouter/SandboxExecPoll',
79
- modal_proto.sandbox_router_pb2.SandboxExecPollRequest,
80
- modal_proto.sandbox_router_pb2.SandboxExecPollResponse,
81
- )
82
- self.SandboxExecStart = grpclib.client.UnaryUnaryMethod(
83
- channel,
84
- '/modal.sandbox_router.SandboxRouter/SandboxExecStart',
85
- modal_proto.sandbox_router_pb2.SandboxExecStartRequest,
86
- modal_proto.sandbox_router_pb2.SandboxExecStartResponse,
87
- )
88
- self.SandboxExecStdinWrite = grpclib.client.UnaryUnaryMethod(
89
- channel,
90
- '/modal.sandbox_router.SandboxRouter/SandboxExecStdinWrite',
91
- modal_proto.sandbox_router_pb2.SandboxExecStdinWriteRequest,
92
- modal_proto.sandbox_router_pb2.SandboxExecStdinWriteResponse,
93
- )
94
- self.SandboxExecStdioRead = grpclib.client.UnaryStreamMethod(
95
- channel,
96
- '/modal.sandbox_router.SandboxRouter/SandboxExecStdioRead',
97
- modal_proto.sandbox_router_pb2.SandboxExecStdioReadRequest,
98
- modal_proto.sandbox_router_pb2.SandboxExecStdioReadResponse,
99
- )
100
- self.SandboxExecWait = grpclib.client.UnaryUnaryMethod(
101
- channel,
102
- '/modal.sandbox_router.SandboxRouter/SandboxExecWait',
103
- modal_proto.sandbox_router_pb2.SandboxExecWaitRequest,
104
- modal_proto.sandbox_router_pb2.SandboxExecWaitResponse,
105
- )
@@ -1,149 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Generated by the protocol buffer compiler. DO NOT EDIT!
3
- # source: modal_proto/sandbox_router.proto
4
- """Generated protocol buffer code."""
5
- from google.protobuf.internal import enum_type_wrapper
6
- from google.protobuf import descriptor as _descriptor
7
- from google.protobuf import descriptor_pool as _descriptor_pool
8
- from google.protobuf import message as _message
9
- from google.protobuf import reflection as _reflection
10
- from google.protobuf import symbol_database as _symbol_database
11
- # @@protoc_insertion_point(imports)
12
-
13
- _sym_db = _symbol_database.Default()
14
-
15
-
16
- from modal_proto import api_pb2 as modal__proto_dot_api__pb2
17
-
18
-
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n modal_proto/sandbox_router.proto\x12\x14modal.sandbox_router\x1a\x15modal_proto/api.proto\":\n\x16SandboxExecPollRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\"J\n\x17SandboxExecPollResponse\x12\x0e\n\x04\x63ode\x18\x01 \x01(\x05H\x00\x12\x10\n\x06signal\x18\x02 \x01(\x05H\x00\x42\r\n\x0b\x65xit_status\"\x91\x03\n\x17SandboxExecStartRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\x12\x14\n\x0c\x63ommand_args\x18\x03 \x03(\t\x12\x44\n\rstdout_config\x18\x04 \x01(\x0e\x32-.modal.sandbox_router.SandboxExecStdoutConfig\x12\x44\n\rstderr_config\x18\x05 \x01(\x0e\x32-.modal.sandbox_router.SandboxExecStderrConfig\x12\x19\n\x0ctimeout_secs\x18\x06 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07workdir\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x12\n\nsecret_ids\x18\x08 \x03(\t\x12,\n\x08pty_info\x18\t \x01(\x0b\x32\x15.modal.client.PTYInfoH\x02\x88\x01\x01\x12\x15\n\rruntime_debug\x18\n \x01(\x08\x42\x0f\n\r_timeout_secsB\n\n\x08_workdirB\x0b\n\t_pty_info\"\x1a\n\x18SandboxExecStartResponse\"k\n\x1cSandboxExecStdinWriteRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x04\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12\x0b\n\x03\x65of\x18\x05 \x01(\x08\"\x1f\n\x1dSandboxExecStdinWriteResponse\"\x9e\x01\n\x1bSandboxExecStdioReadRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\x12\x0e\n\x06offset\x18\x03 \x01(\x04\x12M\n\x0f\x66ile_descriptor\x18\x04 \x01(\x0e\x32\x34.modal.sandbox_router.SandboxExecStdioFileDescriptor\",\n\x1cSandboxExecStdioReadResponse\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\":\n\x16SandboxExecWaitRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x0f\n\x07\x65xec_id\x18\x02 \x01(\t\"J\n\x17SandboxExecWaitResponse\x12\x0e\n\x04\x63ode\x18\x01 \x01(\x05H\x00\x12\x10\n\x06signal\x18\x02 \x01(\x05H\x00\x42\r\n\x0b\x65xit_status*\x8d\x01\n\x17SandboxExecStderrConfig\x12&\n\"SANDBOX_EXEC_STDERR_CONFIG_DEVNULL\x10\x00\x12#\n\x1fSANDBOX_EXEC_STDERR_CONFIG_PIPE\x10\x01\x12%\n!SANDBOX_EXEC_STDERR_CONFIG_STDOUT\x10\x02*~\n\x1eSandboxExecStdioFileDescriptor\x12-\n)SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDOUT\x10\x00\x12-\n)SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDERR\x10\x01*f\n\x17SandboxExecStdoutConfig\x12&\n\"SANDBOX_EXEC_STDOUT_CONFIG_DEVNULL\x10\x00\x12#\n\x1fSANDBOX_EXEC_STDOUT_CONFIG_PIPE\x10\x01\x32\xe6\x04\n\rSandboxRouter\x12n\n\x0fSandboxExecPoll\x12,.modal.sandbox_router.SandboxExecPollRequest\x1a-.modal.sandbox_router.SandboxExecPollResponse\x12q\n\x10SandboxExecStart\x12-.modal.sandbox_router.SandboxExecStartRequest\x1a..modal.sandbox_router.SandboxExecStartResponse\x12\x80\x01\n\x15SandboxExecStdinWrite\x12\x32.modal.sandbox_router.SandboxExecStdinWriteRequest\x1a\x33.modal.sandbox_router.SandboxExecStdinWriteResponse\x12\x7f\n\x14SandboxExecStdioRead\x12\x31.modal.sandbox_router.SandboxExecStdioReadRequest\x1a\x32.modal.sandbox_router.SandboxExecStdioReadResponse0\x01\x12n\n\x0fSandboxExecWait\x12,.modal.sandbox_router.SandboxExecWaitRequest\x1a-.modal.sandbox_router.SandboxExecWaitResponseB&Z$github.com/modal-labs/modal/go/protob\x06proto3')
20
-
21
- _SANDBOXEXECSTDERRCONFIG = DESCRIPTOR.enum_types_by_name['SandboxExecStderrConfig']
22
- SandboxExecStderrConfig = enum_type_wrapper.EnumTypeWrapper(_SANDBOXEXECSTDERRCONFIG)
23
- _SANDBOXEXECSTDIOFILEDESCRIPTOR = DESCRIPTOR.enum_types_by_name['SandboxExecStdioFileDescriptor']
24
- SandboxExecStdioFileDescriptor = enum_type_wrapper.EnumTypeWrapper(_SANDBOXEXECSTDIOFILEDESCRIPTOR)
25
- _SANDBOXEXECSTDOUTCONFIG = DESCRIPTOR.enum_types_by_name['SandboxExecStdoutConfig']
26
- SandboxExecStdoutConfig = enum_type_wrapper.EnumTypeWrapper(_SANDBOXEXECSTDOUTCONFIG)
27
- SANDBOX_EXEC_STDERR_CONFIG_DEVNULL = 0
28
- SANDBOX_EXEC_STDERR_CONFIG_PIPE = 1
29
- SANDBOX_EXEC_STDERR_CONFIG_STDOUT = 2
30
- SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDOUT = 0
31
- SANDBOX_EXEC_STDIO_FILE_DESCRIPTOR_STDERR = 1
32
- SANDBOX_EXEC_STDOUT_CONFIG_DEVNULL = 0
33
- SANDBOX_EXEC_STDOUT_CONFIG_PIPE = 1
34
-
35
-
36
- _SANDBOXEXECPOLLREQUEST = DESCRIPTOR.message_types_by_name['SandboxExecPollRequest']
37
- _SANDBOXEXECPOLLRESPONSE = DESCRIPTOR.message_types_by_name['SandboxExecPollResponse']
38
- _SANDBOXEXECSTARTREQUEST = DESCRIPTOR.message_types_by_name['SandboxExecStartRequest']
39
- _SANDBOXEXECSTARTRESPONSE = DESCRIPTOR.message_types_by_name['SandboxExecStartResponse']
40
- _SANDBOXEXECSTDINWRITEREQUEST = DESCRIPTOR.message_types_by_name['SandboxExecStdinWriteRequest']
41
- _SANDBOXEXECSTDINWRITERESPONSE = DESCRIPTOR.message_types_by_name['SandboxExecStdinWriteResponse']
42
- _SANDBOXEXECSTDIOREADREQUEST = DESCRIPTOR.message_types_by_name['SandboxExecStdioReadRequest']
43
- _SANDBOXEXECSTDIOREADRESPONSE = DESCRIPTOR.message_types_by_name['SandboxExecStdioReadResponse']
44
- _SANDBOXEXECWAITREQUEST = DESCRIPTOR.message_types_by_name['SandboxExecWaitRequest']
45
- _SANDBOXEXECWAITRESPONSE = DESCRIPTOR.message_types_by_name['SandboxExecWaitResponse']
46
- SandboxExecPollRequest = _reflection.GeneratedProtocolMessageType('SandboxExecPollRequest', (_message.Message,), {
47
- 'DESCRIPTOR' : _SANDBOXEXECPOLLREQUEST,
48
- '__module__' : 'modal_proto.sandbox_router_pb2'
49
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecPollRequest)
50
- })
51
- _sym_db.RegisterMessage(SandboxExecPollRequest)
52
-
53
- SandboxExecPollResponse = _reflection.GeneratedProtocolMessageType('SandboxExecPollResponse', (_message.Message,), {
54
- 'DESCRIPTOR' : _SANDBOXEXECPOLLRESPONSE,
55
- '__module__' : 'modal_proto.sandbox_router_pb2'
56
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecPollResponse)
57
- })
58
- _sym_db.RegisterMessage(SandboxExecPollResponse)
59
-
60
- SandboxExecStartRequest = _reflection.GeneratedProtocolMessageType('SandboxExecStartRequest', (_message.Message,), {
61
- 'DESCRIPTOR' : _SANDBOXEXECSTARTREQUEST,
62
- '__module__' : 'modal_proto.sandbox_router_pb2'
63
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStartRequest)
64
- })
65
- _sym_db.RegisterMessage(SandboxExecStartRequest)
66
-
67
- SandboxExecStartResponse = _reflection.GeneratedProtocolMessageType('SandboxExecStartResponse', (_message.Message,), {
68
- 'DESCRIPTOR' : _SANDBOXEXECSTARTRESPONSE,
69
- '__module__' : 'modal_proto.sandbox_router_pb2'
70
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStartResponse)
71
- })
72
- _sym_db.RegisterMessage(SandboxExecStartResponse)
73
-
74
- SandboxExecStdinWriteRequest = _reflection.GeneratedProtocolMessageType('SandboxExecStdinWriteRequest', (_message.Message,), {
75
- 'DESCRIPTOR' : _SANDBOXEXECSTDINWRITEREQUEST,
76
- '__module__' : 'modal_proto.sandbox_router_pb2'
77
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStdinWriteRequest)
78
- })
79
- _sym_db.RegisterMessage(SandboxExecStdinWriteRequest)
80
-
81
- SandboxExecStdinWriteResponse = _reflection.GeneratedProtocolMessageType('SandboxExecStdinWriteResponse', (_message.Message,), {
82
- 'DESCRIPTOR' : _SANDBOXEXECSTDINWRITERESPONSE,
83
- '__module__' : 'modal_proto.sandbox_router_pb2'
84
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStdinWriteResponse)
85
- })
86
- _sym_db.RegisterMessage(SandboxExecStdinWriteResponse)
87
-
88
- SandboxExecStdioReadRequest = _reflection.GeneratedProtocolMessageType('SandboxExecStdioReadRequest', (_message.Message,), {
89
- 'DESCRIPTOR' : _SANDBOXEXECSTDIOREADREQUEST,
90
- '__module__' : 'modal_proto.sandbox_router_pb2'
91
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStdioReadRequest)
92
- })
93
- _sym_db.RegisterMessage(SandboxExecStdioReadRequest)
94
-
95
- SandboxExecStdioReadResponse = _reflection.GeneratedProtocolMessageType('SandboxExecStdioReadResponse', (_message.Message,), {
96
- 'DESCRIPTOR' : _SANDBOXEXECSTDIOREADRESPONSE,
97
- '__module__' : 'modal_proto.sandbox_router_pb2'
98
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecStdioReadResponse)
99
- })
100
- _sym_db.RegisterMessage(SandboxExecStdioReadResponse)
101
-
102
- SandboxExecWaitRequest = _reflection.GeneratedProtocolMessageType('SandboxExecWaitRequest', (_message.Message,), {
103
- 'DESCRIPTOR' : _SANDBOXEXECWAITREQUEST,
104
- '__module__' : 'modal_proto.sandbox_router_pb2'
105
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecWaitRequest)
106
- })
107
- _sym_db.RegisterMessage(SandboxExecWaitRequest)
108
-
109
- SandboxExecWaitResponse = _reflection.GeneratedProtocolMessageType('SandboxExecWaitResponse', (_message.Message,), {
110
- 'DESCRIPTOR' : _SANDBOXEXECWAITRESPONSE,
111
- '__module__' : 'modal_proto.sandbox_router_pb2'
112
- # @@protoc_insertion_point(class_scope:modal.sandbox_router.SandboxExecWaitResponse)
113
- })
114
- _sym_db.RegisterMessage(SandboxExecWaitResponse)
115
-
116
- _SANDBOXROUTER = DESCRIPTOR.services_by_name['SandboxRouter']
117
- if _descriptor._USE_C_DESCRIPTORS == False:
118
-
119
- DESCRIPTOR._options = None
120
- DESCRIPTOR._serialized_options = b'Z$github.com/modal-labs/modal/go/proto'
121
- _SANDBOXEXECSTDERRCONFIG._serialized_start=1135
122
- _SANDBOXEXECSTDERRCONFIG._serialized_end=1276
123
- _SANDBOXEXECSTDIOFILEDESCRIPTOR._serialized_start=1278
124
- _SANDBOXEXECSTDIOFILEDESCRIPTOR._serialized_end=1404
125
- _SANDBOXEXECSTDOUTCONFIG._serialized_start=1406
126
- _SANDBOXEXECSTDOUTCONFIG._serialized_end=1508
127
- _SANDBOXEXECPOLLREQUEST._serialized_start=81
128
- _SANDBOXEXECPOLLREQUEST._serialized_end=139
129
- _SANDBOXEXECPOLLRESPONSE._serialized_start=141
130
- _SANDBOXEXECPOLLRESPONSE._serialized_end=215
131
- _SANDBOXEXECSTARTREQUEST._serialized_start=218
132
- _SANDBOXEXECSTARTREQUEST._serialized_end=619
133
- _SANDBOXEXECSTARTRESPONSE._serialized_start=621
134
- _SANDBOXEXECSTARTRESPONSE._serialized_end=647
135
- _SANDBOXEXECSTDINWRITEREQUEST._serialized_start=649
136
- _SANDBOXEXECSTDINWRITEREQUEST._serialized_end=756
137
- _SANDBOXEXECSTDINWRITERESPONSE._serialized_start=758
138
- _SANDBOXEXECSTDINWRITERESPONSE._serialized_end=789
139
- _SANDBOXEXECSTDIOREADREQUEST._serialized_start=792
140
- _SANDBOXEXECSTDIOREADREQUEST._serialized_end=950
141
- _SANDBOXEXECSTDIOREADRESPONSE._serialized_start=952
142
- _SANDBOXEXECSTDIOREADRESPONSE._serialized_end=996
143
- _SANDBOXEXECWAITREQUEST._serialized_start=998
144
- _SANDBOXEXECWAITREQUEST._serialized_end=1056
145
- _SANDBOXEXECWAITRESPONSE._serialized_start=1058
146
- _SANDBOXEXECWAITRESPONSE._serialized_end=1132
147
- _SANDBOXROUTER._serialized_start=1511
148
- _SANDBOXROUTER._serialized_end=2125
149
- # @@protoc_insertion_point(module_scope)